@design.estate/dees-catalog 6.6.0 → 6.7.0

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.
@@ -61239,6 +61239,247 @@ var init_plugins4 = __esm({
61239
61239
  }
61240
61240
  });
61241
61241
 
61242
+ // ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.demo.ts
61243
+ var demoFunc;
61244
+ var init_dees_contextmenu_demo = __esm({
61245
+ "ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.demo.ts"() {
61246
+ init_dist_ts26();
61247
+ init_plugins4();
61248
+ init_dees_contextmenu();
61249
+ demoFunc = /* @__PURE__ */ __name(() => b2`
61250
+ <style>
61251
+ .withMargin {
61252
+ display: block;
61253
+ margin: 20px;
61254
+ }
61255
+ .demo-container {
61256
+ display: flex;
61257
+ flex-direction: column;
61258
+ gap: 20px;
61259
+ padding: 20px;
61260
+ min-height: 400px;
61261
+ }
61262
+ .demo-area {
61263
+ padding: 40px;
61264
+ border-radius: 8px;
61265
+ text-align: center;
61266
+ cursor: context-menu;
61267
+ transition: background 0.2s;
61268
+ }
61269
+ .demo-area:hover {
61270
+ background: rgba(0, 0, 0, 0.02);
61271
+ }
61272
+ </style>
61273
+ <div class="demo-container">
61274
+ <dees-panel heading="Basic Context Menu with Nested Submenus">
61275
+ <div class="demo-area" @contextmenu=${(eventArg) => {
61276
+ DeesContextmenu.openContextMenuWithOptions(eventArg, [
61277
+ {
61278
+ name: "File",
61279
+ iconName: "fileText",
61280
+ action: /* @__PURE__ */ __name(async () => {
61281
+ }, "action"),
61282
+ // Parent items with submenus still need an action
61283
+ submenu: [
61284
+ { name: "New", iconName: "filePlus", shortcut: "Cmd+N", action: /* @__PURE__ */ __name(async () => console.log("New file"), "action") },
61285
+ { name: "Open", iconName: "folderOpen", shortcut: "Cmd+O", action: /* @__PURE__ */ __name(async () => console.log("Open file"), "action") },
61286
+ { name: "Save", iconName: "save", shortcut: "Cmd+S", action: /* @__PURE__ */ __name(async () => console.log("Save"), "action") },
61287
+ { divider: true },
61288
+ { name: "Export as PDF", iconName: "download", action: /* @__PURE__ */ __name(async () => console.log("Export PDF"), "action") },
61289
+ { name: "Export as HTML", iconName: "code", action: /* @__PURE__ */ __name(async () => console.log("Export HTML"), "action") }
61290
+ ]
61291
+ },
61292
+ {
61293
+ name: "Edit",
61294
+ iconName: "edit3",
61295
+ action: /* @__PURE__ */ __name(async () => {
61296
+ }, "action"),
61297
+ // Parent items with submenus still need an action
61298
+ submenu: [
61299
+ { name: "Cut", iconName: "scissors", shortcut: "Cmd+X", action: /* @__PURE__ */ __name(async () => console.log("Cut"), "action") },
61300
+ { name: "Copy", iconName: "copy", shortcut: "Cmd+C", action: /* @__PURE__ */ __name(async () => console.log("Copy"), "action") },
61301
+ { name: "Paste", iconName: "clipboard", shortcut: "Cmd+V", action: /* @__PURE__ */ __name(async () => console.log("Paste"), "action") },
61302
+ { divider: true },
61303
+ { name: "Find", iconName: "search", shortcut: "Cmd+F", action: /* @__PURE__ */ __name(async () => console.log("Find"), "action") },
61304
+ { name: "Replace", iconName: "repeat", shortcut: "Cmd+H", action: /* @__PURE__ */ __name(async () => console.log("Replace"), "action") }
61305
+ ]
61306
+ },
61307
+ {
61308
+ name: "View",
61309
+ iconName: "eye",
61310
+ action: /* @__PURE__ */ __name(async () => {
61311
+ }, "action"),
61312
+ // Parent items with submenus still need an action
61313
+ submenu: [
61314
+ { name: "Zoom In", iconName: "zoomIn", shortcut: "Cmd++", action: /* @__PURE__ */ __name(async () => console.log("Zoom in"), "action") },
61315
+ { name: "Zoom Out", iconName: "zoomOut", shortcut: "Cmd+-", action: /* @__PURE__ */ __name(async () => console.log("Zoom out"), "action") },
61316
+ { name: "Reset Zoom", iconName: "maximize2", shortcut: "Cmd+0", action: /* @__PURE__ */ __name(async () => console.log("Reset zoom"), "action") },
61317
+ { divider: true },
61318
+ { name: "Full Screen", iconName: "maximize", shortcut: "F11", action: /* @__PURE__ */ __name(async () => console.log("Full screen"), "action") }
61319
+ ]
61320
+ },
61321
+ { divider: true },
61322
+ {
61323
+ name: "Settings",
61324
+ iconName: "settings",
61325
+ action: /* @__PURE__ */ __name(async () => console.log("Settings"), "action")
61326
+ },
61327
+ {
61328
+ name: "Help",
61329
+ iconName: "helpCircle",
61330
+ action: /* @__PURE__ */ __name(async () => {
61331
+ }, "action"),
61332
+ // Parent items with submenus still need an action
61333
+ submenu: [
61334
+ { name: "Documentation", iconName: "book", action: /* @__PURE__ */ __name(async () => console.log("Documentation"), "action") },
61335
+ { name: "Keyboard Shortcuts", iconName: "keyboard", action: /* @__PURE__ */ __name(async () => console.log("Shortcuts"), "action") },
61336
+ { divider: true },
61337
+ { name: "About", iconName: "info", action: /* @__PURE__ */ __name(async () => console.log("About"), "action") }
61338
+ ]
61339
+ }
61340
+ ]);
61341
+ }}>
61342
+ <h3>Right-click anywhere in this area</h3>
61343
+ <p>A context menu with nested submenus will appear</p>
61344
+ </div>
61345
+ </dees-panel>
61346
+ <dees-panel heading="Component-Specific Context Menu">
61347
+ <dees-button style="margin: 20px;" @contextmenu=${(eventArg) => {
61348
+ DeesContextmenu.openContextMenuWithOptions(eventArg, [
61349
+ {
61350
+ name: "Button Actions",
61351
+ iconName: "mousePointer",
61352
+ action: /* @__PURE__ */ __name(async () => {
61353
+ }, "action"),
61354
+ // Parent items with submenus still need an action
61355
+ submenu: [
61356
+ { name: "Click", iconName: "mouse", action: /* @__PURE__ */ __name(async () => console.log("Click action"), "action") },
61357
+ { name: "Double Click", iconName: "zap", action: /* @__PURE__ */ __name(async () => console.log("Double click"), "action") },
61358
+ { name: "Long Press", iconName: "clock", action: /* @__PURE__ */ __name(async () => console.log("Long press"), "action") }
61359
+ ]
61360
+ },
61361
+ {
61362
+ name: "Button State",
61363
+ iconName: "toggleLeft",
61364
+ action: /* @__PURE__ */ __name(async () => {
61365
+ }, "action"),
61366
+ // Parent items with submenus still need an action
61367
+ submenu: [
61368
+ { name: "Enable", iconName: "checkCircle", action: /* @__PURE__ */ __name(async () => console.log("Enable"), "action") },
61369
+ { name: "Disable", iconName: "xCircle", action: /* @__PURE__ */ __name(async () => console.log("Disable"), "action") },
61370
+ { divider: true },
61371
+ { name: "Show", iconName: "eye", action: /* @__PURE__ */ __name(async () => console.log("Show"), "action") },
61372
+ { name: "Hide", iconName: "eyeOff", action: /* @__PURE__ */ __name(async () => console.log("Hide"), "action") }
61373
+ ]
61374
+ },
61375
+ { divider: true },
61376
+ {
61377
+ name: "Disabled Action",
61378
+ iconName: "ban",
61379
+ disabled: true,
61380
+ action: /* @__PURE__ */ __name(async () => console.log("This should not run"), "action")
61381
+ },
61382
+ {
61383
+ name: "Properties",
61384
+ iconName: "settings",
61385
+ action: /* @__PURE__ */ __name(async () => console.log("Button properties"), "action")
61386
+ }
61387
+ ]);
61388
+ }}>Right-click on this button</dees-button>
61389
+ </dees-panel>
61390
+
61391
+ <dees-panel heading="Advanced Context Menu Example">
61392
+ <div class="demo-area" @contextmenu=${(eventArg) => {
61393
+ DeesContextmenu.openContextMenuWithOptions(eventArg, [
61394
+ {
61395
+ name: "Format",
61396
+ iconName: "type",
61397
+ action: /* @__PURE__ */ __name(async () => {
61398
+ }, "action"),
61399
+ // Parent items with submenus still need an action
61400
+ submenu: [
61401
+ { name: "Bold", iconName: "bold", shortcut: "Cmd+B", action: /* @__PURE__ */ __name(async () => console.log("Bold"), "action") },
61402
+ { name: "Italic", iconName: "italic", shortcut: "Cmd+I", action: /* @__PURE__ */ __name(async () => console.log("Italic"), "action") },
61403
+ { name: "Underline", iconName: "underline", shortcut: "Cmd+U", action: /* @__PURE__ */ __name(async () => console.log("Underline"), "action") },
61404
+ { divider: true },
61405
+ { name: "Font Size", iconName: "type", action: /* @__PURE__ */ __name(async () => console.log("Font size menu"), "action") },
61406
+ { name: "Font Color", iconName: "palette", action: /* @__PURE__ */ __name(async () => console.log("Font color menu"), "action") }
61407
+ ]
61408
+ },
61409
+ {
61410
+ name: "Transform",
61411
+ iconName: "shuffle",
61412
+ action: /* @__PURE__ */ __name(async () => {
61413
+ }, "action"),
61414
+ // Parent items with submenus still need an action
61415
+ submenu: [
61416
+ { name: "To Uppercase", iconName: "arrowUp", action: /* @__PURE__ */ __name(async () => console.log("Uppercase"), "action") },
61417
+ { name: "To Lowercase", iconName: "arrowDown", action: /* @__PURE__ */ __name(async () => console.log("Lowercase"), "action") },
61418
+ { name: "Capitalize", iconName: "type", action: /* @__PURE__ */ __name(async () => console.log("Capitalize"), "action") }
61419
+ ]
61420
+ },
61421
+ { divider: true },
61422
+ {
61423
+ name: "Delete",
61424
+ iconName: "trash2",
61425
+ action: /* @__PURE__ */ __name(async () => console.log("Delete"), "action")
61426
+ }
61427
+ ]);
61428
+ }}>
61429
+ <h3>Advanced Nested Menu Example</h3>
61430
+ <p>This shows deeply nested submenus and various formatting options</p>
61431
+ </div>
61432
+ </dees-panel>
61433
+
61434
+ <dees-panel heading="Static Context Menu (Always Visible)">
61435
+ <dees-contextmenu
61436
+ class="withMargin"
61437
+ .menuItems=${[
61438
+ {
61439
+ name: "Project",
61440
+ iconName: "folder",
61441
+ action: /* @__PURE__ */ __name(async () => {
61442
+ }, "action"),
61443
+ // Parent items with submenus still need an action
61444
+ submenu: [
61445
+ { name: "New Project", iconName: "folderPlus", shortcut: "Cmd+Shift+N", action: /* @__PURE__ */ __name(async () => console.log("New project"), "action") },
61446
+ { name: "Open Project", iconName: "folderOpen", shortcut: "Cmd+Shift+O", action: /* @__PURE__ */ __name(async () => console.log("Open project"), "action") },
61447
+ { divider: true },
61448
+ { name: "Recent Projects", iconName: "clock", action: /* @__PURE__ */ __name(async () => {
61449
+ }, "action"), submenu: [
61450
+ { name: "Project Alpha", action: /* @__PURE__ */ __name(async () => console.log("Open Alpha"), "action") },
61451
+ { name: "Project Beta", action: /* @__PURE__ */ __name(async () => console.log("Open Beta"), "action") },
61452
+ { name: "Project Gamma", action: /* @__PURE__ */ __name(async () => console.log("Open Gamma"), "action") }
61453
+ ] }
61454
+ ]
61455
+ },
61456
+ {
61457
+ name: "Tools",
61458
+ iconName: "tool",
61459
+ action: /* @__PURE__ */ __name(async () => {
61460
+ }, "action"),
61461
+ // Parent items with submenus still need an action
61462
+ submenu: [
61463
+ { name: "Terminal", iconName: "terminal", shortcut: "Cmd+T", action: /* @__PURE__ */ __name(async () => console.log("Terminal"), "action") },
61464
+ { name: "Console", iconName: "monitor", shortcut: "Cmd+K", action: /* @__PURE__ */ __name(async () => console.log("Console"), "action") },
61465
+ { divider: true },
61466
+ { name: "Extensions", iconName: "package", action: /* @__PURE__ */ __name(async () => console.log("Extensions"), "action") }
61467
+ ]
61468
+ },
61469
+ { divider: true },
61470
+ {
61471
+ name: "Preferences",
61472
+ iconName: "sliders",
61473
+ action: /* @__PURE__ */ __name(async () => console.log("Preferences"), "action")
61474
+ }
61475
+ ]}
61476
+ ></dees-contextmenu>
61477
+ </dees-panel>
61478
+ </div>
61479
+ `, "demoFunc");
61480
+ }
61481
+ });
61482
+
61242
61483
  // ts_web/elements/00group-overlay/dees-windowlayer/dees-windowlayer.ts
61243
61484
  var _visible_dec, _contentZIndex_dec, _backdropZIndex_dec, _options_dec, _a, _DeesWindowLayer_decorators, _init, _options, _backdropZIndex, _contentZIndex, _visible, _protectedElements, _protectedSelector, _DeesWindowLayer, DeesWindowLayer;
61244
61485
  var init_dees_windowlayer = __esm({
@@ -94849,6 +95090,400 @@ var init_dees_icon = __esm({
94849
95090
  }
94850
95091
  });
94851
95092
 
95093
+ // ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts
95094
+ var dees_contextmenu_exports = {};
95095
+ __export(dees_contextmenu_exports, {
95096
+ DeesContextmenu: () => DeesContextmenu
95097
+ });
95098
+ var _menuItems_dec, _a3, _DeesContextmenu_decorators, _init3, _menuItems, _DeesContextmenu, DeesContextmenu;
95099
+ var init_dees_contextmenu = __esm({
95100
+ "ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts"() {
95101
+ init_plugins4();
95102
+ init_dees_contextmenu_demo();
95103
+ init_dist_ts26();
95104
+ init_dist_ts25();
95105
+ init_dees_windowlayer();
95106
+ init_zindex();
95107
+ init_dees_icon();
95108
+ init_theme();
95109
+ _DeesContextmenu_decorators = [customElement("dees-contextmenu")];
95110
+ _DeesContextmenu = class _DeesContextmenu extends (_a3 = DeesElement, _menuItems_dec = [n5({
95111
+ type: Array
95112
+ })], _a3) {
95113
+ constructor() {
95114
+ super();
95115
+ __privateAdd(this, _menuItems, __runInitializers(_init3, 8, this, [])), __runInitializers(_init3, 11, this);
95116
+ __publicField(this, "windowLayer");
95117
+ __publicField(this, "submenu", null);
95118
+ __publicField(this, "submenuTimeout", null);
95119
+ __publicField(this, "parentMenu", null);
95120
+ __publicField(this, "isDestroying", false);
95121
+ __publicField(this, "handleKeydown", /* @__PURE__ */ __name((event) => {
95122
+ const menuItems = Array.from(this.shadowRoot.querySelectorAll(".menuitem:not(.disabled)"));
95123
+ const currentIndex = menuItems.findIndex((item) => item.matches(":hover"));
95124
+ switch (event.key) {
95125
+ case "ArrowDown":
95126
+ event.preventDefault();
95127
+ const nextIndex = currentIndex + 1 < menuItems.length ? currentIndex + 1 : 0;
95128
+ menuItems[nextIndex].dispatchEvent(new MouseEvent("mouseenter"));
95129
+ break;
95130
+ case "ArrowUp":
95131
+ event.preventDefault();
95132
+ const prevIndex = currentIndex - 1 >= 0 ? currentIndex - 1 : menuItems.length - 1;
95133
+ menuItems[prevIndex].dispatchEvent(new MouseEvent("mouseenter"));
95134
+ break;
95135
+ case "Enter":
95136
+ event.preventDefault();
95137
+ if (currentIndex >= 0) {
95138
+ menuItems[currentIndex].click();
95139
+ }
95140
+ break;
95141
+ case "Escape":
95142
+ event.preventDefault();
95143
+ this.destroy();
95144
+ break;
95145
+ }
95146
+ }, "handleKeydown"));
95147
+ this.tabIndex = 0;
95148
+ }
95149
+ // Add a global event listener for the right-click context menu
95150
+ static initializeGlobalListener() {
95151
+ document.addEventListener("contextmenu", (event) => {
95152
+ if (this.contextMenuDeactivated) {
95153
+ return;
95154
+ }
95155
+ event.preventDefault();
95156
+ _DeesContextmenu.accumulatedMenuItems = [];
95157
+ const path2 = event.composedPath();
95158
+ for (const element4 of path2) {
95159
+ if (element4.getContextMenuItems) {
95160
+ const items = element4.getContextMenuItems();
95161
+ if (items && items.length > 0) {
95162
+ if (_DeesContextmenu.accumulatedMenuItems.length > 0) {
95163
+ _DeesContextmenu.accumulatedMenuItems.push({ divider: true });
95164
+ }
95165
+ _DeesContextmenu.accumulatedMenuItems.push(...items);
95166
+ }
95167
+ }
95168
+ }
95169
+ _DeesContextmenu.openContextMenuWithOptions(event, _DeesContextmenu.accumulatedMenuItems);
95170
+ });
95171
+ }
95172
+ // allows opening of a contextmenu with options
95173
+ static async openContextMenuWithOptions(eventArg, menuItemsArg) {
95174
+ if (this.contextMenuDeactivated) {
95175
+ return;
95176
+ }
95177
+ eventArg.preventDefault();
95178
+ eventArg.stopPropagation();
95179
+ const contextMenu = new _DeesContextmenu();
95180
+ contextMenu.style.position = "fixed";
95181
+ contextMenu.style.zIndex = String(zIndexLayers.overlay.contextMenu);
95182
+ contextMenu.style.visibility = "hidden";
95183
+ contextMenu.menuItems = menuItemsArg;
95184
+ contextMenu.windowLayer = await DeesWindowLayer.createAndShow({ dimmed: false, dismissOnOutsidePress: true });
95185
+ contextMenu.windowLayer.protectedSelector = "dees-contextmenu";
95186
+ contextMenu.windowLayer.addEventListener("click", async (event) => {
95187
+ const clickedElement = event.target;
95188
+ const isContextMenu = clickedElement.closest("dees-contextmenu");
95189
+ if (!isContextMenu) {
95190
+ await contextMenu.destroy();
95191
+ }
95192
+ });
95193
+ document.body.append(contextMenu);
95194
+ await domtools_pluginexports_exports.smartdelay.delayFor(0);
95195
+ const rect = contextMenu.getBoundingClientRect();
95196
+ const windowWidth = window.innerWidth;
95197
+ const windowHeight = window.innerHeight;
95198
+ let top = eventArg.clientY;
95199
+ let left = eventArg.clientX;
95200
+ if (left + rect.width > windowWidth) {
95201
+ left = windowWidth - rect.width - 10;
95202
+ }
95203
+ if (top + rect.height > windowHeight) {
95204
+ top = windowHeight - rect.height - 10;
95205
+ }
95206
+ if (left < 10) left = 10;
95207
+ if (top < 10) top = 10;
95208
+ contextMenu.style.top = `${top}px`;
95209
+ contextMenu.style.left = `${left}px`;
95210
+ contextMenu.style.visibility = "visible";
95211
+ return contextMenu;
95212
+ }
95213
+ render() {
95214
+ return b2`
95215
+ <div class="mainbox">
95216
+ ${this.menuItems.map((menuItemArg) => {
95217
+ if ("divider" in menuItemArg && menuItemArg.divider) {
95218
+ return b2`<div class="menu-divider"></div>`;
95219
+ }
95220
+ const menuItem = menuItemArg;
95221
+ const hasSubmenu = menuItem.submenu && menuItem.submenu.length > 0;
95222
+ return b2`
95223
+ <div
95224
+ class="menuitem ${menuItem.disabled ? "disabled" : ""} ${hasSubmenu ? "has-submenu" : ""}"
95225
+ @click=${() => !menuItem.disabled && !hasSubmenu && this.handleClick(menuItem)}
95226
+ @mouseenter=${() => this.handleMenuItemHover(menuItem, hasSubmenu)}
95227
+ @mouseleave=${() => this.handleMenuItemLeave()}
95228
+ >
95229
+ ${menuItem.iconName ? b2`
95230
+ <dees-icon .icon="${menuItem.iconName}"></dees-icon>
95231
+ ` : ""}
95232
+ <span class="menuitem-text">${menuItem.name}</span>
95233
+ ${menuItem.shortcut && !hasSubmenu ? b2`
95234
+ <span class="menuitem-shortcut">${menuItem.shortcut}</span>
95235
+ ` : ""}
95236
+ </div>
95237
+ `;
95238
+ })}
95239
+ ${this.menuItems.length === 0 ? b2`
95240
+ <div class="menuitem" @click=${() => {
95241
+ _DeesContextmenu.contextMenuDeactivated = true;
95242
+ this.destroy();
95243
+ }}>
95244
+ <dees-icon .icon="lucide:x"></dees-icon>
95245
+ <span class="menuitem-text">Allow native context</span>
95246
+ </div>
95247
+ ` : b2``}
95248
+ </div>
95249
+ `;
95250
+ }
95251
+ async firstUpdated() {
95252
+ this.focus();
95253
+ this.addEventListener("keydown", this.handleKeydown);
95254
+ }
95255
+ async handleClick(menuItem) {
95256
+ menuItem.action();
95257
+ await this.destroyAll();
95258
+ }
95259
+ async handleMenuItemHover(menuItem, hasSubmenu) {
95260
+ if (this.submenuTimeout) {
95261
+ clearTimeout(this.submenuTimeout);
95262
+ this.submenuTimeout = null;
95263
+ }
95264
+ if (this.submenu) {
95265
+ await this.hideSubmenu();
95266
+ }
95267
+ if (hasSubmenu && menuItem.submenu) {
95268
+ this.submenuTimeout = setTimeout(() => {
95269
+ this.showSubmenu(menuItem);
95270
+ }, 200);
95271
+ }
95272
+ }
95273
+ handleMenuItemLeave() {
95274
+ if (this.submenuTimeout) {
95275
+ clearTimeout(this.submenuTimeout);
95276
+ }
95277
+ this.submenuTimeout = setTimeout(() => {
95278
+ if (this.submenu && !this.submenu.matches(":hover")) {
95279
+ this.hideSubmenu();
95280
+ }
95281
+ }, 300);
95282
+ }
95283
+ async showSubmenu(menuItem) {
95284
+ if (!menuItem.submenu || menuItem.submenu.length === 0) return;
95285
+ const menuItems = Array.from(this.shadowRoot.querySelectorAll(".menuitem"));
95286
+ const menuItemElement = menuItems.find((el) => el.querySelector(".menuitem-text")?.textContent === menuItem.name);
95287
+ if (!menuItemElement) return;
95288
+ this.submenu = new _DeesContextmenu();
95289
+ this.submenu.menuItems = menuItem.submenu;
95290
+ this.submenu.parentMenu = this;
95291
+ this.submenu.style.position = "fixed";
95292
+ this.submenu.style.zIndex = String(parseInt(this.style.zIndex) + 1);
95293
+ this.submenu.style.opacity = "0";
95294
+ this.submenu.style.transform = "scale(0.95)";
95295
+ document.body.append(this.submenu);
95296
+ await domtools_pluginexports_exports.smartdelay.delayFor(0);
95297
+ const itemRect = menuItemElement.getBoundingClientRect();
95298
+ const menuRect = this.getBoundingClientRect();
95299
+ const submenuRect = this.submenu.getBoundingClientRect();
95300
+ const windowWidth = window.innerWidth;
95301
+ let left = menuRect.right - 4;
95302
+ let top = itemRect.top;
95303
+ if (left + submenuRect.width > windowWidth - 10) {
95304
+ left = menuRect.left - submenuRect.width + 4;
95305
+ }
95306
+ if (top + submenuRect.height > window.innerHeight - 10) {
95307
+ top = window.innerHeight - submenuRect.height - 10;
95308
+ }
95309
+ this.submenu.style.left = `${left}px`;
95310
+ this.submenu.style.top = `${top}px`;
95311
+ await domtools_pluginexports_exports.smartdelay.delayFor(0);
95312
+ this.submenu.style.opacity = "1";
95313
+ this.submenu.style.transform = "scale(1)";
95314
+ this.submenu.addEventListener("mouseenter", () => {
95315
+ if (this.submenuTimeout) {
95316
+ clearTimeout(this.submenuTimeout);
95317
+ this.submenuTimeout = null;
95318
+ }
95319
+ });
95320
+ this.submenu.addEventListener("mouseleave", () => {
95321
+ this.handleMenuItemLeave();
95322
+ });
95323
+ }
95324
+ async hideSubmenu() {
95325
+ if (!this.submenu) return;
95326
+ await this.submenu.destroy();
95327
+ this.submenu = null;
95328
+ }
95329
+ async destroy() {
95330
+ if (this.isDestroying) {
95331
+ return;
95332
+ }
95333
+ this.isDestroying = true;
95334
+ if (this.submenuTimeout) {
95335
+ clearTimeout(this.submenuTimeout);
95336
+ this.submenuTimeout = null;
95337
+ }
95338
+ if (this.submenu) {
95339
+ await this.submenu.destroy();
95340
+ this.submenu = null;
95341
+ }
95342
+ if (this.windowLayer && !this.parentMenu) {
95343
+ this.windowLayer.destroy();
95344
+ }
95345
+ this.style.visibility = "hidden";
95346
+ if (this.parentElement) {
95347
+ this.parentElement.removeChild(this);
95348
+ }
95349
+ }
95350
+ /**
95351
+ * Destroys this menu and all parent menus in the chain
95352
+ */
95353
+ async destroyAll() {
95354
+ let rootMenu = this;
95355
+ while (rootMenu.parentMenu) {
95356
+ rootMenu = rootMenu.parentMenu;
95357
+ }
95358
+ await rootMenu.destroy();
95359
+ }
95360
+ };
95361
+ _init3 = __decoratorStart(_a3);
95362
+ _menuItems = new WeakMap();
95363
+ __decorateElement(_init3, 4, "menuItems", _menuItems_dec, _DeesContextmenu, _menuItems);
95364
+ _DeesContextmenu = __decorateElement(_init3, 0, "DeesContextmenu", _DeesContextmenu_decorators, _DeesContextmenu);
95365
+ __name(_DeesContextmenu, "DeesContextmenu");
95366
+ // DEMO
95367
+ __publicField(_DeesContextmenu, "demo", demoFunc);
95368
+ __publicField(_DeesContextmenu, "demoGroups", ["Overlay"]);
95369
+ // STATIC
95370
+ // This will store all the accumulated menu items
95371
+ __publicField(_DeesContextmenu, "contextMenuDeactivated", false);
95372
+ __publicField(_DeesContextmenu, "accumulatedMenuItems", []);
95373
+ /**
95374
+ * STATIC STYLES
95375
+ */
95376
+ __publicField(_DeesContextmenu, "styles", [
95377
+ themeDefaultStyles,
95378
+ cssManager.defaultStyles,
95379
+ i`
95380
+ :host {
95381
+ display: block;
95382
+ transition:
95383
+ opacity var(--dees-transition-default) var(--dees-ease-standard),
95384
+ transform var(--dees-transition-default) var(--dees-ease-standard),
95385
+ left var(--dees-transition-default) var(--dees-ease-spring),
95386
+ top var(--dees-transition-default) var(--dees-ease-spring);
95387
+ outline: none;
95388
+ }
95389
+
95390
+ .mainbox {
95391
+ min-width: 200px;
95392
+ max-width: 280px;
95393
+ background: var(--dees-material-regular-bg);
95394
+ -webkit-backdrop-filter: var(--dees-material-regular-filter);
95395
+ backdrop-filter: var(--dees-material-regular-filter);
95396
+ border: 1px solid var(--dees-color-border-default);
95397
+ border-radius: var(--dees-radius-lg);
95398
+ box-shadow: var(--dees-shadow-lg);
95399
+ user-select: none;
95400
+ padding: var(--dees-spacing-xs) 0;
95401
+ font-size: var(--dees-font-control-size-sm);
95402
+ color: var(--dees-color-text-primary);
95403
+ }
95404
+
95405
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
95406
+ .mainbox {
95407
+ background: var(--dees-material-regular-bg-opaque);
95408
+ }
95409
+ }
95410
+
95411
+ @media (prefers-reduced-transparency: reduce) {
95412
+ .mainbox {
95413
+ background: var(--dees-material-regular-bg-opaque);
95414
+ -webkit-backdrop-filter: none;
95415
+ backdrop-filter: none;
95416
+ }
95417
+ }
95418
+
95419
+ .menuitem {
95420
+ display: flex;
95421
+ align-items: center;
95422
+ gap: var(--dees-spacing-sm);
95423
+ padding: var(--dees-spacing-sm) var(--dees-spacing-md);
95424
+ cursor: default;
95425
+ transition: background var(--dees-transition-fast) var(--dees-ease-standard);
95426
+ line-height: 1;
95427
+ position: relative;
95428
+ }
95429
+
95430
+ .menuitem:hover {
95431
+ background: var(--dees-color-active);
95432
+ }
95433
+
95434
+ .menuitem.has-submenu::after {
95435
+ content: '›';
95436
+ position: absolute;
95437
+ right: var(--dees-spacing-sm);
95438
+ font-size: 16px;
95439
+ color: var(--dees-color-text-secondary);
95440
+ }
95441
+
95442
+ .menuitem:active:not(.has-submenu) {
95443
+ background: var(--dees-color-pressed);
95444
+ }
95445
+
95446
+ .menuitem.disabled {
95447
+ opacity: 0.5;
95448
+ cursor: not-allowed;
95449
+ pointer-events: none;
95450
+ }
95451
+
95452
+ .menuitem dees-icon {
95453
+ font-size: 14px;
95454
+ color: var(--dees-color-text-secondary);
95455
+ }
95456
+
95457
+ .menuitem-text {
95458
+ flex: 1;
95459
+ }
95460
+
95461
+ .menuitem-shortcut {
95462
+ font-size: var(--dees-font-caption2-size);
95463
+ color: var(--dees-color-text-secondary);
95464
+ margin-left: auto;
95465
+ }
95466
+
95467
+ .menu-divider {
95468
+ height: 1px;
95469
+ background: var(--dees-color-border-default);
95470
+ margin: var(--dees-spacing-xs) 0;
95471
+ }
95472
+
95473
+ @media (prefers-reduced-motion: reduce) {
95474
+ :host,
95475
+ .menuitem {
95476
+ transition: none;
95477
+ }
95478
+ }
95479
+ `
95480
+ ]);
95481
+ __runInitializers(_init3, 1, _DeesContextmenu);
95482
+ DeesContextmenu = _DeesContextmenu;
95483
+ DeesContextmenu.initializeGlobalListener();
95484
+ }
95485
+ });
95486
+
94852
95487
  // ts_web/elements/00colors.ts
94853
95488
  var colors_exports = {};
94854
95489
  __export(colors_exports, {
@@ -121568,626 +122203,6 @@ var init_dees_workspace_terminal = __esm({
121568
122203
  }
121569
122204
  });
121570
122205
 
121571
- // ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.demo.ts
121572
- init_dist_ts26();
121573
- init_plugins4();
121574
- var demoFunc = /* @__PURE__ */ __name(() => b2`
121575
- <style>
121576
- .withMargin {
121577
- display: block;
121578
- margin: 20px;
121579
- }
121580
- .demo-container {
121581
- display: flex;
121582
- flex-direction: column;
121583
- gap: 20px;
121584
- padding: 20px;
121585
- min-height: 400px;
121586
- }
121587
- .demo-area {
121588
- padding: 40px;
121589
- border-radius: 8px;
121590
- text-align: center;
121591
- cursor: context-menu;
121592
- transition: background 0.2s;
121593
- }
121594
- .demo-area:hover {
121595
- background: rgba(0, 0, 0, 0.02);
121596
- }
121597
- </style>
121598
- <div class="demo-container">
121599
- <dees-panel heading="Basic Context Menu with Nested Submenus">
121600
- <div class="demo-area" @contextmenu=${(eventArg) => {
121601
- DeesContextmenu.openContextMenuWithOptions(eventArg, [
121602
- {
121603
- name: "File",
121604
- iconName: "fileText",
121605
- action: /* @__PURE__ */ __name(async () => {
121606
- }, "action"),
121607
- // Parent items with submenus still need an action
121608
- submenu: [
121609
- { name: "New", iconName: "filePlus", shortcut: "Cmd+N", action: /* @__PURE__ */ __name(async () => console.log("New file"), "action") },
121610
- { name: "Open", iconName: "folderOpen", shortcut: "Cmd+O", action: /* @__PURE__ */ __name(async () => console.log("Open file"), "action") },
121611
- { name: "Save", iconName: "save", shortcut: "Cmd+S", action: /* @__PURE__ */ __name(async () => console.log("Save"), "action") },
121612
- { divider: true },
121613
- { name: "Export as PDF", iconName: "download", action: /* @__PURE__ */ __name(async () => console.log("Export PDF"), "action") },
121614
- { name: "Export as HTML", iconName: "code", action: /* @__PURE__ */ __name(async () => console.log("Export HTML"), "action") }
121615
- ]
121616
- },
121617
- {
121618
- name: "Edit",
121619
- iconName: "edit3",
121620
- action: /* @__PURE__ */ __name(async () => {
121621
- }, "action"),
121622
- // Parent items with submenus still need an action
121623
- submenu: [
121624
- { name: "Cut", iconName: "scissors", shortcut: "Cmd+X", action: /* @__PURE__ */ __name(async () => console.log("Cut"), "action") },
121625
- { name: "Copy", iconName: "copy", shortcut: "Cmd+C", action: /* @__PURE__ */ __name(async () => console.log("Copy"), "action") },
121626
- { name: "Paste", iconName: "clipboard", shortcut: "Cmd+V", action: /* @__PURE__ */ __name(async () => console.log("Paste"), "action") },
121627
- { divider: true },
121628
- { name: "Find", iconName: "search", shortcut: "Cmd+F", action: /* @__PURE__ */ __name(async () => console.log("Find"), "action") },
121629
- { name: "Replace", iconName: "repeat", shortcut: "Cmd+H", action: /* @__PURE__ */ __name(async () => console.log("Replace"), "action") }
121630
- ]
121631
- },
121632
- {
121633
- name: "View",
121634
- iconName: "eye",
121635
- action: /* @__PURE__ */ __name(async () => {
121636
- }, "action"),
121637
- // Parent items with submenus still need an action
121638
- submenu: [
121639
- { name: "Zoom In", iconName: "zoomIn", shortcut: "Cmd++", action: /* @__PURE__ */ __name(async () => console.log("Zoom in"), "action") },
121640
- { name: "Zoom Out", iconName: "zoomOut", shortcut: "Cmd+-", action: /* @__PURE__ */ __name(async () => console.log("Zoom out"), "action") },
121641
- { name: "Reset Zoom", iconName: "maximize2", shortcut: "Cmd+0", action: /* @__PURE__ */ __name(async () => console.log("Reset zoom"), "action") },
121642
- { divider: true },
121643
- { name: "Full Screen", iconName: "maximize", shortcut: "F11", action: /* @__PURE__ */ __name(async () => console.log("Full screen"), "action") }
121644
- ]
121645
- },
121646
- { divider: true },
121647
- {
121648
- name: "Settings",
121649
- iconName: "settings",
121650
- action: /* @__PURE__ */ __name(async () => console.log("Settings"), "action")
121651
- },
121652
- {
121653
- name: "Help",
121654
- iconName: "helpCircle",
121655
- action: /* @__PURE__ */ __name(async () => {
121656
- }, "action"),
121657
- // Parent items with submenus still need an action
121658
- submenu: [
121659
- { name: "Documentation", iconName: "book", action: /* @__PURE__ */ __name(async () => console.log("Documentation"), "action") },
121660
- { name: "Keyboard Shortcuts", iconName: "keyboard", action: /* @__PURE__ */ __name(async () => console.log("Shortcuts"), "action") },
121661
- { divider: true },
121662
- { name: "About", iconName: "info", action: /* @__PURE__ */ __name(async () => console.log("About"), "action") }
121663
- ]
121664
- }
121665
- ]);
121666
- }}>
121667
- <h3>Right-click anywhere in this area</h3>
121668
- <p>A context menu with nested submenus will appear</p>
121669
- </div>
121670
- </dees-panel>
121671
- <dees-panel heading="Component-Specific Context Menu">
121672
- <dees-button style="margin: 20px;" @contextmenu=${(eventArg) => {
121673
- DeesContextmenu.openContextMenuWithOptions(eventArg, [
121674
- {
121675
- name: "Button Actions",
121676
- iconName: "mousePointer",
121677
- action: /* @__PURE__ */ __name(async () => {
121678
- }, "action"),
121679
- // Parent items with submenus still need an action
121680
- submenu: [
121681
- { name: "Click", iconName: "mouse", action: /* @__PURE__ */ __name(async () => console.log("Click action"), "action") },
121682
- { name: "Double Click", iconName: "zap", action: /* @__PURE__ */ __name(async () => console.log("Double click"), "action") },
121683
- { name: "Long Press", iconName: "clock", action: /* @__PURE__ */ __name(async () => console.log("Long press"), "action") }
121684
- ]
121685
- },
121686
- {
121687
- name: "Button State",
121688
- iconName: "toggleLeft",
121689
- action: /* @__PURE__ */ __name(async () => {
121690
- }, "action"),
121691
- // Parent items with submenus still need an action
121692
- submenu: [
121693
- { name: "Enable", iconName: "checkCircle", action: /* @__PURE__ */ __name(async () => console.log("Enable"), "action") },
121694
- { name: "Disable", iconName: "xCircle", action: /* @__PURE__ */ __name(async () => console.log("Disable"), "action") },
121695
- { divider: true },
121696
- { name: "Show", iconName: "eye", action: /* @__PURE__ */ __name(async () => console.log("Show"), "action") },
121697
- { name: "Hide", iconName: "eyeOff", action: /* @__PURE__ */ __name(async () => console.log("Hide"), "action") }
121698
- ]
121699
- },
121700
- { divider: true },
121701
- {
121702
- name: "Disabled Action",
121703
- iconName: "ban",
121704
- disabled: true,
121705
- action: /* @__PURE__ */ __name(async () => console.log("This should not run"), "action")
121706
- },
121707
- {
121708
- name: "Properties",
121709
- iconName: "settings",
121710
- action: /* @__PURE__ */ __name(async () => console.log("Button properties"), "action")
121711
- }
121712
- ]);
121713
- }}>Right-click on this button</dees-button>
121714
- </dees-panel>
121715
-
121716
- <dees-panel heading="Advanced Context Menu Example">
121717
- <div class="demo-area" @contextmenu=${(eventArg) => {
121718
- DeesContextmenu.openContextMenuWithOptions(eventArg, [
121719
- {
121720
- name: "Format",
121721
- iconName: "type",
121722
- action: /* @__PURE__ */ __name(async () => {
121723
- }, "action"),
121724
- // Parent items with submenus still need an action
121725
- submenu: [
121726
- { name: "Bold", iconName: "bold", shortcut: "Cmd+B", action: /* @__PURE__ */ __name(async () => console.log("Bold"), "action") },
121727
- { name: "Italic", iconName: "italic", shortcut: "Cmd+I", action: /* @__PURE__ */ __name(async () => console.log("Italic"), "action") },
121728
- { name: "Underline", iconName: "underline", shortcut: "Cmd+U", action: /* @__PURE__ */ __name(async () => console.log("Underline"), "action") },
121729
- { divider: true },
121730
- { name: "Font Size", iconName: "type", action: /* @__PURE__ */ __name(async () => console.log("Font size menu"), "action") },
121731
- { name: "Font Color", iconName: "palette", action: /* @__PURE__ */ __name(async () => console.log("Font color menu"), "action") }
121732
- ]
121733
- },
121734
- {
121735
- name: "Transform",
121736
- iconName: "shuffle",
121737
- action: /* @__PURE__ */ __name(async () => {
121738
- }, "action"),
121739
- // Parent items with submenus still need an action
121740
- submenu: [
121741
- { name: "To Uppercase", iconName: "arrowUp", action: /* @__PURE__ */ __name(async () => console.log("Uppercase"), "action") },
121742
- { name: "To Lowercase", iconName: "arrowDown", action: /* @__PURE__ */ __name(async () => console.log("Lowercase"), "action") },
121743
- { name: "Capitalize", iconName: "type", action: /* @__PURE__ */ __name(async () => console.log("Capitalize"), "action") }
121744
- ]
121745
- },
121746
- { divider: true },
121747
- {
121748
- name: "Delete",
121749
- iconName: "trash2",
121750
- action: /* @__PURE__ */ __name(async () => console.log("Delete"), "action")
121751
- }
121752
- ]);
121753
- }}>
121754
- <h3>Advanced Nested Menu Example</h3>
121755
- <p>This shows deeply nested submenus and various formatting options</p>
121756
- </div>
121757
- </dees-panel>
121758
-
121759
- <dees-panel heading="Static Context Menu (Always Visible)">
121760
- <dees-contextmenu
121761
- class="withMargin"
121762
- .menuItems=${[
121763
- {
121764
- name: "Project",
121765
- iconName: "folder",
121766
- action: /* @__PURE__ */ __name(async () => {
121767
- }, "action"),
121768
- // Parent items with submenus still need an action
121769
- submenu: [
121770
- { name: "New Project", iconName: "folderPlus", shortcut: "Cmd+Shift+N", action: /* @__PURE__ */ __name(async () => console.log("New project"), "action") },
121771
- { name: "Open Project", iconName: "folderOpen", shortcut: "Cmd+Shift+O", action: /* @__PURE__ */ __name(async () => console.log("Open project"), "action") },
121772
- { divider: true },
121773
- { name: "Recent Projects", iconName: "clock", action: /* @__PURE__ */ __name(async () => {
121774
- }, "action"), submenu: [
121775
- { name: "Project Alpha", action: /* @__PURE__ */ __name(async () => console.log("Open Alpha"), "action") },
121776
- { name: "Project Beta", action: /* @__PURE__ */ __name(async () => console.log("Open Beta"), "action") },
121777
- { name: "Project Gamma", action: /* @__PURE__ */ __name(async () => console.log("Open Gamma"), "action") }
121778
- ] }
121779
- ]
121780
- },
121781
- {
121782
- name: "Tools",
121783
- iconName: "tool",
121784
- action: /* @__PURE__ */ __name(async () => {
121785
- }, "action"),
121786
- // Parent items with submenus still need an action
121787
- submenu: [
121788
- { name: "Terminal", iconName: "terminal", shortcut: "Cmd+T", action: /* @__PURE__ */ __name(async () => console.log("Terminal"), "action") },
121789
- { name: "Console", iconName: "monitor", shortcut: "Cmd+K", action: /* @__PURE__ */ __name(async () => console.log("Console"), "action") },
121790
- { divider: true },
121791
- { name: "Extensions", iconName: "package", action: /* @__PURE__ */ __name(async () => console.log("Extensions"), "action") }
121792
- ]
121793
- },
121794
- { divider: true },
121795
- {
121796
- name: "Preferences",
121797
- iconName: "sliders",
121798
- action: /* @__PURE__ */ __name(async () => console.log("Preferences"), "action")
121799
- }
121800
- ]}
121801
- ></dees-contextmenu>
121802
- </dees-panel>
121803
- </div>
121804
- `, "demoFunc");
121805
-
121806
- // ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts
121807
- init_plugins4();
121808
- init_dist_ts26();
121809
- init_dist_ts25();
121810
- init_dees_windowlayer();
121811
- init_zindex();
121812
- init_dees_icon();
121813
- init_theme();
121814
- var _menuItems_dec, _a3, _DeesContextmenu_decorators, _init3, _menuItems;
121815
- _DeesContextmenu_decorators = [customElement("dees-contextmenu")];
121816
- var _DeesContextmenu = class _DeesContextmenu extends (_a3 = DeesElement, _menuItems_dec = [n5({
121817
- type: Array
121818
- })], _a3) {
121819
- constructor() {
121820
- super();
121821
- __privateAdd(this, _menuItems, __runInitializers(_init3, 8, this, [])), __runInitializers(_init3, 11, this);
121822
- __publicField(this, "windowLayer");
121823
- __publicField(this, "submenu", null);
121824
- __publicField(this, "submenuTimeout", null);
121825
- __publicField(this, "parentMenu", null);
121826
- __publicField(this, "isDestroying", false);
121827
- __publicField(this, "handleKeydown", /* @__PURE__ */ __name((event) => {
121828
- const menuItems = Array.from(this.shadowRoot.querySelectorAll(".menuitem:not(.disabled)"));
121829
- const currentIndex = menuItems.findIndex((item) => item.matches(":hover"));
121830
- switch (event.key) {
121831
- case "ArrowDown":
121832
- event.preventDefault();
121833
- const nextIndex = currentIndex + 1 < menuItems.length ? currentIndex + 1 : 0;
121834
- menuItems[nextIndex].dispatchEvent(new MouseEvent("mouseenter"));
121835
- break;
121836
- case "ArrowUp":
121837
- event.preventDefault();
121838
- const prevIndex = currentIndex - 1 >= 0 ? currentIndex - 1 : menuItems.length - 1;
121839
- menuItems[prevIndex].dispatchEvent(new MouseEvent("mouseenter"));
121840
- break;
121841
- case "Enter":
121842
- event.preventDefault();
121843
- if (currentIndex >= 0) {
121844
- menuItems[currentIndex].click();
121845
- }
121846
- break;
121847
- case "Escape":
121848
- event.preventDefault();
121849
- this.destroy();
121850
- break;
121851
- }
121852
- }, "handleKeydown"));
121853
- this.tabIndex = 0;
121854
- }
121855
- // Add a global event listener for the right-click context menu
121856
- static initializeGlobalListener() {
121857
- document.addEventListener("contextmenu", (event) => {
121858
- if (this.contextMenuDeactivated) {
121859
- return;
121860
- }
121861
- event.preventDefault();
121862
- _DeesContextmenu.accumulatedMenuItems = [];
121863
- const path2 = event.composedPath();
121864
- for (const element4 of path2) {
121865
- if (element4.getContextMenuItems) {
121866
- const items = element4.getContextMenuItems();
121867
- if (items && items.length > 0) {
121868
- if (_DeesContextmenu.accumulatedMenuItems.length > 0) {
121869
- _DeesContextmenu.accumulatedMenuItems.push({ divider: true });
121870
- }
121871
- _DeesContextmenu.accumulatedMenuItems.push(...items);
121872
- }
121873
- }
121874
- }
121875
- _DeesContextmenu.openContextMenuWithOptions(event, _DeesContextmenu.accumulatedMenuItems);
121876
- });
121877
- }
121878
- // allows opening of a contextmenu with options
121879
- static async openContextMenuWithOptions(eventArg, menuItemsArg) {
121880
- if (this.contextMenuDeactivated) {
121881
- return;
121882
- }
121883
- eventArg.preventDefault();
121884
- eventArg.stopPropagation();
121885
- const contextMenu = new _DeesContextmenu();
121886
- contextMenu.style.position = "fixed";
121887
- contextMenu.style.zIndex = String(zIndexLayers.overlay.contextMenu);
121888
- contextMenu.style.visibility = "hidden";
121889
- contextMenu.menuItems = menuItemsArg;
121890
- contextMenu.windowLayer = await DeesWindowLayer.createAndShow({ dimmed: false, dismissOnOutsidePress: true });
121891
- contextMenu.windowLayer.protectedSelector = "dees-contextmenu";
121892
- contextMenu.windowLayer.addEventListener("click", async (event) => {
121893
- const clickedElement = event.target;
121894
- const isContextMenu = clickedElement.closest("dees-contextmenu");
121895
- if (!isContextMenu) {
121896
- await contextMenu.destroy();
121897
- }
121898
- });
121899
- document.body.append(contextMenu);
121900
- await domtools_pluginexports_exports.smartdelay.delayFor(0);
121901
- const rect = contextMenu.getBoundingClientRect();
121902
- const windowWidth = window.innerWidth;
121903
- const windowHeight = window.innerHeight;
121904
- let top = eventArg.clientY;
121905
- let left = eventArg.clientX;
121906
- if (left + rect.width > windowWidth) {
121907
- left = windowWidth - rect.width - 10;
121908
- }
121909
- if (top + rect.height > windowHeight) {
121910
- top = windowHeight - rect.height - 10;
121911
- }
121912
- if (left < 10) left = 10;
121913
- if (top < 10) top = 10;
121914
- contextMenu.style.top = `${top}px`;
121915
- contextMenu.style.left = `${left}px`;
121916
- contextMenu.style.visibility = "visible";
121917
- return contextMenu;
121918
- }
121919
- render() {
121920
- return b2`
121921
- <div class="mainbox">
121922
- ${this.menuItems.map((menuItemArg) => {
121923
- if ("divider" in menuItemArg && menuItemArg.divider) {
121924
- return b2`<div class="menu-divider"></div>`;
121925
- }
121926
- const menuItem = menuItemArg;
121927
- const hasSubmenu = menuItem.submenu && menuItem.submenu.length > 0;
121928
- return b2`
121929
- <div
121930
- class="menuitem ${menuItem.disabled ? "disabled" : ""} ${hasSubmenu ? "has-submenu" : ""}"
121931
- @click=${() => !menuItem.disabled && !hasSubmenu && this.handleClick(menuItem)}
121932
- @mouseenter=${() => this.handleMenuItemHover(menuItem, hasSubmenu)}
121933
- @mouseleave=${() => this.handleMenuItemLeave()}
121934
- >
121935
- ${menuItem.iconName ? b2`
121936
- <dees-icon .icon="${menuItem.iconName}"></dees-icon>
121937
- ` : ""}
121938
- <span class="menuitem-text">${menuItem.name}</span>
121939
- ${menuItem.shortcut && !hasSubmenu ? b2`
121940
- <span class="menuitem-shortcut">${menuItem.shortcut}</span>
121941
- ` : ""}
121942
- </div>
121943
- `;
121944
- })}
121945
- ${this.menuItems.length === 0 ? b2`
121946
- <div class="menuitem" @click=${() => {
121947
- _DeesContextmenu.contextMenuDeactivated = true;
121948
- this.destroy();
121949
- }}>
121950
- <dees-icon .icon="lucide:x"></dees-icon>
121951
- <span class="menuitem-text">Allow native context</span>
121952
- </div>
121953
- ` : b2``}
121954
- </div>
121955
- `;
121956
- }
121957
- async firstUpdated() {
121958
- this.focus();
121959
- this.addEventListener("keydown", this.handleKeydown);
121960
- }
121961
- async handleClick(menuItem) {
121962
- menuItem.action();
121963
- await this.destroyAll();
121964
- }
121965
- async handleMenuItemHover(menuItem, hasSubmenu) {
121966
- if (this.submenuTimeout) {
121967
- clearTimeout(this.submenuTimeout);
121968
- this.submenuTimeout = null;
121969
- }
121970
- if (this.submenu) {
121971
- await this.hideSubmenu();
121972
- }
121973
- if (hasSubmenu && menuItem.submenu) {
121974
- this.submenuTimeout = setTimeout(() => {
121975
- this.showSubmenu(menuItem);
121976
- }, 200);
121977
- }
121978
- }
121979
- handleMenuItemLeave() {
121980
- if (this.submenuTimeout) {
121981
- clearTimeout(this.submenuTimeout);
121982
- }
121983
- this.submenuTimeout = setTimeout(() => {
121984
- if (this.submenu && !this.submenu.matches(":hover")) {
121985
- this.hideSubmenu();
121986
- }
121987
- }, 300);
121988
- }
121989
- async showSubmenu(menuItem) {
121990
- if (!menuItem.submenu || menuItem.submenu.length === 0) return;
121991
- const menuItems = Array.from(this.shadowRoot.querySelectorAll(".menuitem"));
121992
- const menuItemElement = menuItems.find((el) => el.querySelector(".menuitem-text")?.textContent === menuItem.name);
121993
- if (!menuItemElement) return;
121994
- this.submenu = new _DeesContextmenu();
121995
- this.submenu.menuItems = menuItem.submenu;
121996
- this.submenu.parentMenu = this;
121997
- this.submenu.style.position = "fixed";
121998
- this.submenu.style.zIndex = String(parseInt(this.style.zIndex) + 1);
121999
- this.submenu.style.opacity = "0";
122000
- this.submenu.style.transform = "scale(0.95)";
122001
- document.body.append(this.submenu);
122002
- await domtools_pluginexports_exports.smartdelay.delayFor(0);
122003
- const itemRect = menuItemElement.getBoundingClientRect();
122004
- const menuRect = this.getBoundingClientRect();
122005
- const submenuRect = this.submenu.getBoundingClientRect();
122006
- const windowWidth = window.innerWidth;
122007
- let left = menuRect.right - 4;
122008
- let top = itemRect.top;
122009
- if (left + submenuRect.width > windowWidth - 10) {
122010
- left = menuRect.left - submenuRect.width + 4;
122011
- }
122012
- if (top + submenuRect.height > window.innerHeight - 10) {
122013
- top = window.innerHeight - submenuRect.height - 10;
122014
- }
122015
- this.submenu.style.left = `${left}px`;
122016
- this.submenu.style.top = `${top}px`;
122017
- await domtools_pluginexports_exports.smartdelay.delayFor(0);
122018
- this.submenu.style.opacity = "1";
122019
- this.submenu.style.transform = "scale(1)";
122020
- this.submenu.addEventListener("mouseenter", () => {
122021
- if (this.submenuTimeout) {
122022
- clearTimeout(this.submenuTimeout);
122023
- this.submenuTimeout = null;
122024
- }
122025
- });
122026
- this.submenu.addEventListener("mouseleave", () => {
122027
- this.handleMenuItemLeave();
122028
- });
122029
- }
122030
- async hideSubmenu() {
122031
- if (!this.submenu) return;
122032
- await this.submenu.destroy();
122033
- this.submenu = null;
122034
- }
122035
- async destroy() {
122036
- if (this.isDestroying) {
122037
- return;
122038
- }
122039
- this.isDestroying = true;
122040
- if (this.submenuTimeout) {
122041
- clearTimeout(this.submenuTimeout);
122042
- this.submenuTimeout = null;
122043
- }
122044
- if (this.submenu) {
122045
- await this.submenu.destroy();
122046
- this.submenu = null;
122047
- }
122048
- if (this.windowLayer && !this.parentMenu) {
122049
- this.windowLayer.destroy();
122050
- }
122051
- this.style.visibility = "hidden";
122052
- if (this.parentElement) {
122053
- this.parentElement.removeChild(this);
122054
- }
122055
- }
122056
- /**
122057
- * Destroys this menu and all parent menus in the chain
122058
- */
122059
- async destroyAll() {
122060
- let rootMenu = this;
122061
- while (rootMenu.parentMenu) {
122062
- rootMenu = rootMenu.parentMenu;
122063
- }
122064
- await rootMenu.destroy();
122065
- }
122066
- };
122067
- _init3 = __decoratorStart(_a3);
122068
- _menuItems = new WeakMap();
122069
- __decorateElement(_init3, 4, "menuItems", _menuItems_dec, _DeesContextmenu, _menuItems);
122070
- _DeesContextmenu = __decorateElement(_init3, 0, "DeesContextmenu", _DeesContextmenu_decorators, _DeesContextmenu);
122071
- __name(_DeesContextmenu, "DeesContextmenu");
122072
- // DEMO
122073
- __publicField(_DeesContextmenu, "demo", demoFunc);
122074
- __publicField(_DeesContextmenu, "demoGroups", ["Overlay"]);
122075
- // STATIC
122076
- // This will store all the accumulated menu items
122077
- __publicField(_DeesContextmenu, "contextMenuDeactivated", false);
122078
- __publicField(_DeesContextmenu, "accumulatedMenuItems", []);
122079
- /**
122080
- * STATIC STYLES
122081
- */
122082
- __publicField(_DeesContextmenu, "styles", [
122083
- themeDefaultStyles,
122084
- cssManager.defaultStyles,
122085
- i`
122086
- :host {
122087
- display: block;
122088
- transition:
122089
- opacity var(--dees-transition-default) var(--dees-ease-standard),
122090
- transform var(--dees-transition-default) var(--dees-ease-standard),
122091
- left var(--dees-transition-default) var(--dees-ease-spring),
122092
- top var(--dees-transition-default) var(--dees-ease-spring);
122093
- outline: none;
122094
- }
122095
-
122096
- .mainbox {
122097
- min-width: 200px;
122098
- max-width: 280px;
122099
- background: var(--dees-material-regular-bg);
122100
- -webkit-backdrop-filter: var(--dees-material-regular-filter);
122101
- backdrop-filter: var(--dees-material-regular-filter);
122102
- border: 1px solid var(--dees-color-border-default);
122103
- border-radius: var(--dees-radius-lg);
122104
- box-shadow: var(--dees-shadow-lg);
122105
- user-select: none;
122106
- padding: var(--dees-spacing-xs) 0;
122107
- font-size: var(--dees-font-control-size-sm);
122108
- color: var(--dees-color-text-primary);
122109
- }
122110
-
122111
- @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
122112
- .mainbox {
122113
- background: var(--dees-material-regular-bg-opaque);
122114
- }
122115
- }
122116
-
122117
- @media (prefers-reduced-transparency: reduce) {
122118
- .mainbox {
122119
- background: var(--dees-material-regular-bg-opaque);
122120
- -webkit-backdrop-filter: none;
122121
- backdrop-filter: none;
122122
- }
122123
- }
122124
-
122125
- .menuitem {
122126
- display: flex;
122127
- align-items: center;
122128
- gap: var(--dees-spacing-sm);
122129
- padding: var(--dees-spacing-sm) var(--dees-spacing-md);
122130
- cursor: default;
122131
- transition: background var(--dees-transition-fast) var(--dees-ease-standard);
122132
- line-height: 1;
122133
- position: relative;
122134
- }
122135
-
122136
- .menuitem:hover {
122137
- background: var(--dees-color-active);
122138
- }
122139
-
122140
- .menuitem.has-submenu::after {
122141
- content: '›';
122142
- position: absolute;
122143
- right: var(--dees-spacing-sm);
122144
- font-size: 16px;
122145
- color: var(--dees-color-text-secondary);
122146
- }
122147
-
122148
- .menuitem:active:not(.has-submenu) {
122149
- background: var(--dees-color-pressed);
122150
- }
122151
-
122152
- .menuitem.disabled {
122153
- opacity: 0.5;
122154
- cursor: not-allowed;
122155
- pointer-events: none;
122156
- }
122157
-
122158
- .menuitem dees-icon {
122159
- font-size: 14px;
122160
- color: var(--dees-color-text-secondary);
122161
- }
122162
-
122163
- .menuitem-text {
122164
- flex: 1;
122165
- }
122166
-
122167
- .menuitem-shortcut {
122168
- font-size: var(--dees-font-caption2-size);
122169
- color: var(--dees-color-text-secondary);
122170
- margin-left: auto;
122171
- }
122172
-
122173
- .menu-divider {
122174
- height: 1px;
122175
- background: var(--dees-color-border-default);
122176
- margin: var(--dees-spacing-xs) 0;
122177
- }
122178
-
122179
- @media (prefers-reduced-motion: reduce) {
122180
- :host,
122181
- .menuitem {
122182
- transition: none;
122183
- }
122184
- }
122185
- `
122186
- ]);
122187
- __runInitializers(_init3, 1, _DeesContextmenu);
122188
- var DeesContextmenu = _DeesContextmenu;
122189
- DeesContextmenu.initializeGlobalListener();
122190
-
122191
122206
  // node_modules/.pnpm/@design.estate+dees-element@2.4.0/node_modules/@design.estate/dees-element/dist_ts_demotools/demotools.js
122192
122207
  init_dist_ts26();
122193
122208
  var __esDecorate3 = function(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
@@ -122336,6 +122351,7 @@ var demoFunc3 = /* @__PURE__ */ __name(() => {
122336
122351
  // ts_web/elements/00group-appui/dees-appui-activitylog/dees-appui-activitylog.ts
122337
122352
  init_dist_ts26();
122338
122353
  init_dist_ts25();
122354
+ init_dees_contextmenu();
122339
122355
  init_dees_icon();
122340
122356
  init_theme();
122341
122357
  var _filterCriteria_dec, _searchQuery_dec, _entries_dec, _a4, _DeesAppuiActivitylog_decorators, _init4, _entries, _searchQuery, _filterCriteria;
@@ -124167,6 +124183,7 @@ init_dist_ts26();
124167
124183
  init_dist_ts25();
124168
124184
  init_plugins4();
124169
124185
  init_dees_icon();
124186
+ init_dees_contextmenu();
124170
124187
  var _isProfileDropdownOpen_dec, _focusedDropdownItem_dec, _focusedItem_dec, _openDropdowns_dec, _activeMenu_dec, _activityLogActive_dec, _activityLogCount_dec, _showActivityLogToggle_dec, _showSearch_dec, _profileMenuItems_dec, _user_dec2, _showWindowControls_dec, _breadcrumbSeparator_dec, _breadcrumbs_dec, _menuItems_dec3, _a7, _DeesAppuiBar_decorators, _init7, _menuItems3, _breadcrumbs, _breadcrumbSeparator, _showWindowControls, _user2, _profileMenuItems, _showSearch, _showActivityLogToggle, _activityLogCount, _activityLogActive, _activeMenu, _openDropdowns, _focusedItem, _focusedDropdownItem, _isProfileDropdownOpen;
124171
124188
  _DeesAppuiBar_decorators = [customElement("dees-appui-appbar")];
124172
124189
  var _DeesAppuiBar = class _DeesAppuiBar extends (_a7 = DeesElement, _menuItems_dec3 = [n5({ type: Array })], _breadcrumbs_dec = [n5({ type: String })], _breadcrumbSeparator_dec = [n5({ type: String })], _showWindowControls_dec = [n5({ type: Boolean })], _user_dec2 = [n5({ type: Object })], _profileMenuItems_dec = [n5({ type: Array })], _showSearch_dec = [n5({ type: Boolean })], _showActivityLogToggle_dec = [n5({ type: Boolean })], _activityLogCount_dec = [n5({ type: Number })], _activityLogActive_dec = [n5({ type: Boolean })], _activeMenu_dec = [r5()], _openDropdowns_dec = [r5()], _focusedItem_dec = [r5()], _focusedDropdownItem_dec = [r5()], _isProfileDropdownOpen_dec = [r5()], _a7) {
@@ -124893,6 +124910,7 @@ var demoFunc5 = /* @__PURE__ */ __name(() => {
124893
124910
  init_dist_ts26();
124894
124911
  init_theme();
124895
124912
  init_dees_icon();
124913
+ init_dees_contextmenu();
124896
124914
  var _actions_dec, _widgets_dec, _a9, _DeesAppuiBottombar_decorators, _init8, _widgets, _actions;
124897
124915
  _DeesAppuiBottombar_decorators = [customElement("dees-appui-bottombar")];
124898
124916
  var _DeesAppuiBottombar = class _DeesAppuiBottombar extends (_a9 = DeesElement, _widgets_dec = [r5()], _actions_dec = [r5()], _a9) {
@@ -130062,6 +130080,7 @@ var demoFunc13 = /* @__PURE__ */ __name(() => b2`
130062
130080
  init_colors();
130063
130081
  init_dist_ts26();
130064
130082
  init_theme();
130083
+ init_dees_contextmenu();
130065
130084
  var _autocomplete_dec, _validConfirmed_dec, _vintegrated_dec, _validationFunction_dec, _validationText_dec, _validationState_dec, _showPasswordBool_dec, _isPasswordBool_dec, _value_dec4, _a21, _DeesInputText_decorators, _init19, _value4, _isPasswordBool, _showPasswordBool, _validationState, _validationText, _validationFunction, _vintegrated, _validConfirmed, _autocomplete;
130066
130085
  _DeesInputText_decorators = [customElement("dees-input-text")];
130067
130086
  var _DeesInputText = class _DeesInputText extends (_a21 = DeesInputBase, _value_dec4 = [n5({
@@ -148046,6 +148065,7 @@ var WysiwygHistory = class {
148046
148065
 
148047
148066
  // ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.ts
148048
148067
  init_dist_ts26();
148068
+ init_dees_contextmenu();
148049
148069
  init_theme();
148050
148070
  var _wysiwygComponent_dec, _handlers_dec, _isSelected_dec, _block_dec, _a39, _DeesWysiwygBlock_decorators, _init36, _block, _isSelected, _handlers, _wysiwygComponent;
148051
148071
  _DeesWysiwygBlock_decorators = [customElement("dees-wysiwyg-block")];
@@ -151952,6 +151972,7 @@ __name(compileLucenePredicate, "compileLucenePredicate");
151952
151972
  // ts_web/elements/00group-dataview/dees-table/dees-table.ts
151953
151973
  init_plugins4();
151954
151974
  init_dist_ts26();
151975
+ init_dees_contextmenu();
151955
151976
  init_dees_modal();
151956
151977
  init_dist_ts25();
151957
151978
  init_dees_icon();
@@ -155662,6 +155683,7 @@ var DeesButton = _DeesButton;
155662
155683
  init_plugins4();
155663
155684
  init_dist_ts26();
155664
155685
  init_dees_icon();
155686
+ init_dees_contextmenu();
155665
155687
  init_theme();
155666
155688
  init_dees_tile();
155667
155689
  var _gridActions_dec, _gap_dec, _minTileWidth_dec, _tiles_dec, _a45, _DeesStatsGrid_decorators, _init42, _tiles, _minTileWidth, _gap, _gridActions;
@@ -157938,6 +157960,7 @@ var demoFunc33 = /* @__PURE__ */ __name(() => b2`
157938
157960
  init_plugins4();
157939
157961
  init_zindex();
157940
157962
  init_dist_ts26();
157963
+ init_dees_contextmenu();
157941
157964
  init_theme();
157942
157965
  var _collapsed_dec, _selectedTab_dec, _tabs_dec, _bottomTabs_dec, _menuGroups_dec, _logoText_dec, _logoIcon_dec, _a47, _DeesAppuiMainmenu_decorators, _init47, _logoIcon, _logoText, _menuGroups, _bottomTabs, _tabs, _selectedTab, _collapsed;
157943
157966
  _DeesAppuiMainmenu_decorators = [customElement("dees-appui-mainmenu")];
@@ -158516,6 +158539,7 @@ var demoFunc34 = /* @__PURE__ */ __name(() => b2`
158516
158539
 
158517
158540
  // ts_web/elements/00group-appui/dees-appui-secondarymenu/dees-appui-secondarymenu.ts
158518
158541
  init_plugins4();
158542
+ init_dees_contextmenu();
158519
158543
  init_dees_icon();
158520
158544
  init_dist_ts26();
158521
158545
  init_theme();
@@ -166560,6 +166584,7 @@ var toUnifiedDiff = /* @__PURE__ */ __name((rows, options2 = {}) => {
166560
166584
  init_dist_ts26();
166561
166585
  init_theme();
166562
166586
  init_dist_ts12();
166587
+ init_dees_contextmenu();
166563
166588
  init_services();
166564
166589
  init_dees_tile();
166565
166590
  init_dees_icon();
@@ -167470,6 +167495,7 @@ init_colors();
167470
167495
  init_plugins4();
167471
167496
  init_dist_ts26();
167472
167497
  init_dist_ts23();
167498
+ init_dees_contextmenu();
167473
167499
  init_theme();
167474
167500
  init_dees_tile();
167475
167501
  var _copied_dec2, _statusObject_dec, _a64, _DeesDataviewStatusobject_decorators, _init65, _statusObject, _copied2;
@@ -168252,6 +168278,7 @@ __name(getPathSegments, "getPathSegments");
168252
168278
 
168253
168279
  // ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-columns.ts
168254
168280
  init_dist_ts26();
168281
+ init_dees_contextmenu();
168255
168282
  init_theme();
168256
168283
  var _draggedItem_dec, _renameError_dec, _renameInProgress_dec, _renameName_dec, _renameSource_dec, _showRenameDialog_dec, _movePickerLoading_dec, _movePickerPrefixes_dec, _movePickerCurrentPrefix_dec, _movePickerSource_dec, _showMovePickerDialog_dec, _moveError_dec, _moveInProgress_dec, _moveDestination_dec, _moveSource_dec, _showMoveDialog_dec, _uploadProgress_dec, _uploading_dec, _dragOverFolderPrefix_dec, _dragOverColumnIndex_dec, _createDialogName_dec, _createDialogPrefix_dec, _createDialogType_dec, _showCreateDialog_dec, _loading_dec, _columns_dec2, _refreshKey_dec, _currentPrefix_dec, _bucketName_dec, _dataProvider_dec, _a66, _DeesStorageColumns_decorators, _init67, _dataProvider, _bucketName, _currentPrefix, _refreshKey, _columns2, _loading, _showCreateDialog, _createDialogType, _createDialogPrefix, _createDialogName, _dragOverColumnIndex, _dragOverFolderPrefix, _uploading, _uploadProgress, _showMoveDialog, _moveSource, _moveDestination, _moveInProgress, _moveError, _showMovePickerDialog, _movePickerSource, _movePickerCurrentPrefix, _movePickerPrefixes, _movePickerLoading, _showRenameDialog, _renameSource, _renameName, _renameInProgress, _renameError, _draggedItem;
168257
168284
  _DeesStorageColumns_decorators = [customElement("dees-storage-columns")];
@@ -169764,6 +169791,7 @@ var DeesStorageColumns = _DeesStorageColumns;
169764
169791
 
169765
169792
  // ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.ts
169766
169793
  init_dist_ts26();
169794
+ init_dees_contextmenu();
169767
169795
  init_theme();
169768
169796
  var _renameError_dec2, _renameInProgress_dec2, _renameName_dec2, _renameSource_dec2, _showRenameDialog_dec2, _movePickerLoading_dec2, _movePickerPrefixes_dec2, _movePickerCurrentPrefix_dec2, _movePickerSource_dec2, _showMovePickerDialog_dec2, _moveError_dec2, _moveInProgress_dec2, _moveDestination_dec2, _moveSource_dec2, _showMoveDialog_dec2, _createDialogName_dec2, _createDialogPrefix_dec2, _createDialogType_dec2, _showCreateDialog_dec2, _filterText_dec2, _selectedKey_dec, _loading_dec2, _prefixes_dec, _allKeys_dec, _refreshKey_dec2, _currentPrefix_dec2, _bucketName_dec2, _dataProvider_dec2, _a67, _DeesStorageKeys_decorators, _init68, _dataProvider2, _bucketName2, _currentPrefix2, _refreshKey2, _allKeys, _prefixes, _loading2, _selectedKey, _filterText2, _showCreateDialog2, _createDialogType2, _createDialogPrefix2, _createDialogName2, _showMoveDialog2, _moveSource2, _moveDestination2, _moveInProgress2, _moveError2, _showMovePickerDialog2, _movePickerSource2, _movePickerCurrentPrefix2, _movePickerPrefixes2, _movePickerLoading2, _showRenameDialog2, _renameSource2, _renameName2, _renameInProgress2, _renameError2;
169769
169797
  _DeesStorageKeys_decorators = [customElement("dees-storage-keys")];
@@ -182101,6 +182129,40 @@ var demoGroups = [
182101
182129
  { id: "active", name: "Active work", sessionIds: ["session-0", "session-1", "session-2"] },
182102
182130
  { id: "review", name: "Review", sessionIds: ["session-3", "session-4"] }
182103
182131
  ];
182132
+ var demoResources = [
182133
+ {
182134
+ id: "terminal:build",
182135
+ kind: "terminal",
182136
+ title: "Build shell",
182137
+ icon: "lucide:Terminal",
182138
+ preview: "pnpm run build",
182139
+ updatedAt: Date.now() - 9e4,
182140
+ state: "ready"
182141
+ },
182142
+ {
182143
+ id: "file:release-notes",
182144
+ kind: "file",
182145
+ title: "Release notes",
182146
+ icon: "lucide:FileText",
182147
+ preview: "6.7.0 controlled resource draft",
182148
+ updatedAt: Date.now() - 18e4
182149
+ },
182150
+ {
182151
+ id: "browser:preview",
182152
+ kind: "browser",
182153
+ title: "Documentation preview",
182154
+ icon: "lucide:Globe",
182155
+ preview: "localhost:3000",
182156
+ updatedAt: Date.now() - 24e4
182157
+ }
182158
+ ];
182159
+ var demoResourceAssociations = [
182160
+ { resourceId: "terminal:build", sessionId: "session-0" },
182161
+ { resourceId: "file:release-notes", sessionId: "session-0" }
182162
+ ];
182163
+ var demoResourceEligibleSessionIds = Object.fromEntries(
182164
+ demoResources.map((resource) => [resource.id, ["session-0", "session-1", "session-2"]])
182165
+ );
182104
182166
  var handleSessionSelect = /* @__PURE__ */ __name((event) => {
182105
182167
  const list5 = event.currentTarget;
182106
182168
  list5.selectedSessionId = event.detail.session.id;
@@ -182120,6 +182182,60 @@ var handleSessionMove = /* @__PURE__ */ __name((event) => {
182120
182182
  list5.groups = groups;
182121
182183
  list5.ungroupedSessionIds = ungroupedSessionIds;
182122
182184
  }, "handleSessionMove");
182185
+ var handleResourceAssociation = /* @__PURE__ */ __name((event) => {
182186
+ const list5 = event.currentTarget;
182187
+ const next2 = list5.resourceAssociations.filter(
182188
+ (association2) => association2.resourceId !== event.detail.resource.id
182189
+ );
182190
+ if (event.detail.toSessionId) {
182191
+ next2.push({
182192
+ resourceId: event.detail.resource.id,
182193
+ sessionId: event.detail.toSessionId
182194
+ });
182195
+ }
182196
+ list5.resourceAssociations = next2;
182197
+ }, "handleResourceAssociation");
182198
+ var handleResourceContext = /* @__PURE__ */ __name(async (event) => {
182199
+ const list5 = event.currentTarget;
182200
+ const { DeesContextmenu: DeesContextmenu2 } = await Promise.resolve().then(() => (init_dees_contextmenu(), dees_contextmenu_exports));
182201
+ const currentSessionId = event.detail.sessionId;
182202
+ const eligibleSessionIds = ["session-0", "session-1", "session-2"];
182203
+ const menu = await DeesContextmenu2.openContextMenuWithOptions(
182204
+ new MouseEvent("contextmenu", {
182205
+ clientX: event.detail.clientX,
182206
+ clientY: event.detail.clientY
182207
+ }),
182208
+ [
182209
+ ...eligibleSessionIds.filter((sessionId) => sessionId !== currentSessionId).map((sessionId) => ({
182210
+ name: `${currentSessionId ? "Reassign" : "Attach"} to ${demoSessions.find((session) => session.id === sessionId)?.title}`,
182211
+ iconName: "lucide:Link",
182212
+ action: /* @__PURE__ */ __name(async () => {
182213
+ event.detail.requestAssociation(sessionId);
182214
+ event.detail.close();
182215
+ }, "action")
182216
+ })),
182217
+ ...currentSessionId ? [{
182218
+ name: "Detach",
182219
+ iconName: "lucide:Unlink",
182220
+ action: /* @__PURE__ */ __name(async () => {
182221
+ event.detail.requestAssociation(null);
182222
+ event.detail.close();
182223
+ }, "action")
182224
+ }] : []
182225
+ ]
182226
+ );
182227
+ if (!menu) {
182228
+ event.detail.close();
182229
+ } else {
182230
+ const observer = new MutationObserver(() => {
182231
+ if (menu.isConnected) return;
182232
+ observer.disconnect();
182233
+ event.detail.close();
182234
+ });
182235
+ observer.observe(document.body, { childList: true });
182236
+ }
182237
+ list5.selectedResourceId = event.detail.resource.id;
182238
+ }, "handleResourceContext");
182123
182239
  var openModal = /* @__PURE__ */ __name(async () => {
182124
182240
  const { DeesModal: DeesModal2 } = await Promise.resolve().then(() => (init_dees_modal(), dees_modal_exports));
182125
182241
  const content3 = document.createElement("dees-harness-session-list");
@@ -182157,15 +182273,26 @@ var demoFunc65 = /* @__PURE__ */ __name(() => b2`
182157
182273
  </style>
182158
182274
  <div class="sessionDemo">
182159
182275
  <dees-button @clicked=${openModal}>Open in a DeesModal</dees-button>
182160
- <div class="demoHint">Drag the grip to reorder conversations or move them between groups.</div>
182276
+ <div class="demoHint">
182277
+ Use a conversation grip to reorder sessions. Use a resource grip to associate it with a
182278
+ session, or open Actions with click, ContextMenu, or Shift+F10 for attach, reassign, and detach.
182279
+ </div>
182161
182280
  <dees-harness-session-list
182162
182281
  .sessions=${demoSessions}
182163
182282
  .groups=${demoGroups}
182164
182283
  .ungroupedSessionIds=${demoSessions.slice(5).map((session) => session.id)}
182284
+ .resources=${demoResources}
182285
+ .resourceAssociations=${demoResourceAssociations}
182286
+ .eligibleSessionIdsByResourceId=${demoResourceEligibleSessionIds}
182165
182287
  .enableGrouping=${true}
182166
182288
  selectedSessionId="session-2"
182167
182289
  @harness-session-select=${handleSessionSelect}
182168
182290
  @harness-session-move=${handleSessionMove}
182291
+ @harness-resource-select=${(event) => {
182292
+ event.currentTarget.selectedResourceId = event.detail.resource.id;
182293
+ }}
182294
+ @harness-resource-context=${handleResourceContext}
182295
+ @harness-resource-association-request=${handleResourceAssociation}
182169
182296
  ></dees-harness-session-list>
182170
182297
  </div>
182171
182298
  `, "demoFunc");
@@ -182174,12 +182301,12 @@ var demoFunc65 = /* @__PURE__ */ __name(() => b2`
182174
182301
  init_dist_ts26();
182175
182302
  init_theme();
182176
182303
  init_dees_icon();
182177
- var _moveAnnouncement_dec, _bottomScrollShadowVisible_dec, _topScrollShadowVisible_dec, _collapsedGroupIds_dec, _expandedSessionIds_dec, _draggedItemHeight_dec, _dropSlot_dec, _draggingSessionId_dec, _search_dec, _ungroupedSessionIds_dec, _enableGrouping_dec, _groups_dec2, _emptyText_dec2, _loading_dec4, _selectedSessionId_dec, _sessions_dec, _a91, _DeesHarnessSessionList_decorators, _init92, _sessions, _selectedSessionId, _loading4, _emptyText2, _groups2, _enableGrouping, _ungroupedSessionIds, _search, _draggingSessionId, _dropSlot, _draggedItemHeight, _expandedSessionIds, _collapsedGroupIds, _topScrollShadowVisible, _bottomScrollShadowVisible, _moveAnnouncement;
182304
+ var _resourceContextResourceId_dec, _moveAnnouncement_dec, _bottomScrollShadowVisible_dec, _topScrollShadowVisible_dec, _collapsedGroupIds_dec, _expandedSessionIds_dec, _draggedItemHeight_dec, _dropSlot_dec, _resourceDropTargetSessionId_dec, _draggingResourceId_dec, _draggingSessionId_dec, _search_dec, _eligibleSessionIdsByResourceId_dec, _selectedResourceId_dec, _resourceAssociations_dec, _resources_dec, _ungroupedSessionIds_dec, _enableGrouping_dec, _groups_dec2, _emptyText_dec2, _loading_dec4, _selectedSessionId_dec, _sessions_dec, _a91, _DeesHarnessSessionList_decorators, _init92, _sessions, _selectedSessionId, _loading4, _emptyText2, _groups2, _enableGrouping, _ungroupedSessionIds, _resources, _resourceAssociations, _selectedResourceId, _eligibleSessionIdsByResourceId, _search, _draggingSessionId, _draggingResourceId, _resourceDropTargetSessionId, _dropSlot, _draggedItemHeight, _expandedSessionIds, _collapsedGroupIds, _topScrollShadowVisible, _bottomScrollShadowVisible, _moveAnnouncement, _resourceContextResourceId;
182178
182305
  var { repeat: repeat6 } = directives_exports;
182179
182306
  var dragAutoScrollMaxPixelsPerSecond = 900;
182180
182307
  var dragThresholdPixels = 4;
182181
182308
  _DeesHarnessSessionList_decorators = [customElement("dees-harness-session-list")];
182182
- var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = DeesElement, _sessions_dec = [n5({ attribute: false })], _selectedSessionId_dec = [n5()], _loading_dec4 = [n5({ type: Boolean })], _emptyText_dec2 = [n5()], _groups_dec2 = [n5({ attribute: false })], _enableGrouping_dec = [n5({ type: Boolean })], _ungroupedSessionIds_dec = [n5({ attribute: false })], _search_dec = [r5()], _draggingSessionId_dec = [r5()], _dropSlot_dec = [r5()], _draggedItemHeight_dec = [r5()], _expandedSessionIds_dec = [r5()], _collapsedGroupIds_dec = [r5()], _topScrollShadowVisible_dec = [r5()], _bottomScrollShadowVisible_dec = [r5()], _moveAnnouncement_dec = [r5()], _a91) {
182309
+ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = DeesElement, _sessions_dec = [n5({ attribute: false })], _selectedSessionId_dec = [n5()], _loading_dec4 = [n5({ type: Boolean })], _emptyText_dec2 = [n5()], _groups_dec2 = [n5({ attribute: false })], _enableGrouping_dec = [n5({ type: Boolean })], _ungroupedSessionIds_dec = [n5({ attribute: false })], _resources_dec = [n5({ attribute: false })], _resourceAssociations_dec = [n5({ attribute: false })], _selectedResourceId_dec = [n5()], _eligibleSessionIdsByResourceId_dec = [n5({ attribute: false })], _search_dec = [r5()], _draggingSessionId_dec = [r5()], _draggingResourceId_dec = [r5()], _resourceDropTargetSessionId_dec = [r5()], _dropSlot_dec = [r5()], _draggedItemHeight_dec = [r5()], _expandedSessionIds_dec = [r5()], _collapsedGroupIds_dec = [r5()], _topScrollShadowVisible_dec = [r5()], _bottomScrollShadowVisible_dec = [r5()], _moveAnnouncement_dec = [r5()], _resourceContextResourceId_dec = [r5()], _a91) {
182183
182310
  constructor() {
182184
182311
  super(...arguments);
182185
182312
  __privateAdd(this, _sessions, __runInitializers(_init92, 8, this, [])), __runInitializers(_init92, 11, this);
@@ -182189,18 +182316,29 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182189
182316
  __privateAdd(this, _groups2, __runInitializers(_init92, 24, this, [])), __runInitializers(_init92, 27, this);
182190
182317
  __privateAdd(this, _enableGrouping, __runInitializers(_init92, 28, this, false)), __runInitializers(_init92, 31, this);
182191
182318
  __privateAdd(this, _ungroupedSessionIds, __runInitializers(_init92, 32, this, [])), __runInitializers(_init92, 35, this);
182192
- __privateAdd(this, _search, __runInitializers(_init92, 36, this, "")), __runInitializers(_init92, 39, this);
182193
- __privateAdd(this, _draggingSessionId, __runInitializers(_init92, 40, this, "")), __runInitializers(_init92, 43, this);
182194
- __privateAdd(this, _dropSlot, __runInitializers(_init92, 44, this)), __runInitializers(_init92, 47, this);
182195
- __privateAdd(this, _draggedItemHeight, __runInitializers(_init92, 48, this, 0)), __runInitializers(_init92, 51, this);
182196
- __privateAdd(this, _expandedSessionIds, __runInitializers(_init92, 52, this, /* @__PURE__ */ new Set())), __runInitializers(_init92, 55, this);
182197
- __privateAdd(this, _collapsedGroupIds, __runInitializers(_init92, 56, this, /* @__PURE__ */ new Set())), __runInitializers(_init92, 59, this);
182198
- __privateAdd(this, _topScrollShadowVisible, __runInitializers(_init92, 60, this, false)), __runInitializers(_init92, 63, this);
182199
- __privateAdd(this, _bottomScrollShadowVisible, __runInitializers(_init92, 64, this, false)), __runInitializers(_init92, 67, this);
182200
- __privateAdd(this, _moveAnnouncement, __runInitializers(_init92, 68, this, "")), __runInitializers(_init92, 71, this);
182319
+ __privateAdd(this, _resources, __runInitializers(_init92, 36, this, [])), __runInitializers(_init92, 39, this);
182320
+ __privateAdd(this, _resourceAssociations, __runInitializers(_init92, 40, this, [])), __runInitializers(_init92, 43, this);
182321
+ __privateAdd(this, _selectedResourceId, __runInitializers(_init92, 44, this, "")), __runInitializers(_init92, 47, this);
182322
+ __privateAdd(this, _eligibleSessionIdsByResourceId, __runInitializers(_init92, 48, this, {})), __runInitializers(_init92, 51, this);
182323
+ __privateAdd(this, _search, __runInitializers(_init92, 52, this, "")), __runInitializers(_init92, 55, this);
182324
+ __privateAdd(this, _draggingSessionId, __runInitializers(_init92, 56, this, "")), __runInitializers(_init92, 59, this);
182325
+ __privateAdd(this, _draggingResourceId, __runInitializers(_init92, 60, this, "")), __runInitializers(_init92, 63, this);
182326
+ __privateAdd(this, _resourceDropTargetSessionId, __runInitializers(_init92, 64, this, "")), __runInitializers(_init92, 67, this);
182327
+ __privateAdd(this, _dropSlot, __runInitializers(_init92, 68, this)), __runInitializers(_init92, 71, this);
182328
+ __privateAdd(this, _draggedItemHeight, __runInitializers(_init92, 72, this, 0)), __runInitializers(_init92, 75, this);
182329
+ __privateAdd(this, _expandedSessionIds, __runInitializers(_init92, 76, this, /* @__PURE__ */ new Set())), __runInitializers(_init92, 79, this);
182330
+ __privateAdd(this, _collapsedGroupIds, __runInitializers(_init92, 80, this, /* @__PURE__ */ new Set())), __runInitializers(_init92, 83, this);
182331
+ __privateAdd(this, _topScrollShadowVisible, __runInitializers(_init92, 84, this, false)), __runInitializers(_init92, 87, this);
182332
+ __privateAdd(this, _bottomScrollShadowVisible, __runInitializers(_init92, 88, this, false)), __runInitializers(_init92, 91, this);
182333
+ __privateAdd(this, _moveAnnouncement, __runInitializers(_init92, 92, this, "")), __runInitializers(_init92, 95, this);
182334
+ __privateAdd(this, _resourceContextResourceId, __runInitializers(_init92, 96, this, "")), __runInitializers(_init92, 99, this);
182201
182335
  __publicField(this, "reflowGeneration", 0);
182202
182336
  __publicField(this, "reflowAnimations", /* @__PURE__ */ new Set());
182203
182337
  __publicField(this, "pointerDragGesture");
182338
+ __publicField(this, "pendingResourceAssociationRequest");
182339
+ __publicField(this, "resourceContextFocusTarget");
182340
+ __publicField(this, "resourceContextFocusClass", "");
182341
+ __publicField(this, "resourceContextGeneration", 0);
182204
182342
  __publicField(this, "keyboardMoveFocus");
182205
182343
  __publicField(this, "scrollResizeObserver");
182206
182344
  __publicField(this, "observedScrollContainer");
@@ -182221,8 +182359,16 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182221
182359
  eventArg.clientX - gesture.startClientX,
182222
182360
  eventArg.clientY - gesture.startClientY
182223
182361
  ) < dragThresholdPixels) return;
182224
- if (gesture.phase === "pending" && !this.startPointerDrag(eventArg, gesture)) return;
182362
+ if (gesture.phase === "pending" && !(gesture.type === "session" ? this.startPointerDrag(eventArg, gesture) : this.startResourcePointerDrag(eventArg, gesture))) return;
182225
182363
  eventArg.preventDefault();
182364
+ if (gesture.type === "resource") {
182365
+ this.moveResourceDragPreview(eventArg.clientX, eventArg.clientY, gesture);
182366
+ this.dragAutoScrollClientX = eventArg.clientX;
182367
+ this.dragAutoScrollClientY = eventArg.clientY;
182368
+ this.updateDragAutoScrollVelocity();
182369
+ this.updateResourceDropTargetFromPointer(eventArg.clientX, eventArg.clientY);
182370
+ return;
182371
+ }
182226
182372
  this.moveDragPreview(eventArg.clientX, eventArg.clientY, gesture);
182227
182373
  this.dragAutoScrollClientX = eventArg.clientX;
182228
182374
  this.dragAutoScrollClientY = eventArg.clientY;
@@ -182233,6 +182379,14 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182233
182379
  const gesture = this.pointerDragGesture;
182234
182380
  if (!gesture || eventArg.pointerId !== gesture.pointerId) return;
182235
182381
  if (gesture.phase === "active") {
182382
+ if (gesture.type === "resource") {
182383
+ this.dragAutoScrollClientX = eventArg.clientX;
182384
+ this.dragAutoScrollClientY = eventArg.clientY;
182385
+ this.moveResourceDragPreview(eventArg.clientX, eventArg.clientY, gesture);
182386
+ this.updateResourceDropTargetFromPointer(eventArg.clientX, eventArg.clientY);
182387
+ this.finishPointerDrag(true);
182388
+ return;
182389
+ }
182236
182390
  this.dragAutoScrollClientX = eventArg.clientX;
182237
182391
  this.dragAutoScrollClientY = eventArg.clientY;
182238
182392
  this.moveDragPreview(eventArg.clientX, eventArg.clientY, gesture);
@@ -182260,7 +182414,8 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182260
182414
  __publicField(this, "runDragAutoScroll", /* @__PURE__ */ __name((timestampArg) => {
182261
182415
  this.dragAutoScrollFrame = void 0;
182262
182416
  const container = this.scrollContainer;
182263
- if (!container || !this.draggingSessionId || this.dragAutoScrollVelocity === 0) return;
182417
+ const gesture = this.pointerDragGesture;
182418
+ if (!container || gesture?.phase !== "active" || this.dragAutoScrollVelocity === 0) return;
182264
182419
  const elapsedMs = Math.min(34, Math.max(0, timestampArg - this.dragAutoScrollLastFrame));
182265
182420
  this.dragAutoScrollLastFrame = timestampArg;
182266
182421
  const previousScrollTop = container.scrollTop;
@@ -182271,7 +182426,14 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182271
182426
  this.stopDragAutoScroll();
182272
182427
  return;
182273
182428
  }
182274
- this.updateDropSlotFromPointer();
182429
+ if (gesture.type === "resource") {
182430
+ this.updateResourceDropTargetFromPointer(
182431
+ this.dragAutoScrollClientX,
182432
+ this.dragAutoScrollClientY
182433
+ );
182434
+ } else {
182435
+ this.updateDropSlotFromPointer();
182436
+ }
182275
182437
  this.dragAutoScrollFrame = requestAnimationFrame(this.runDragAutoScroll);
182276
182438
  }, "runDragAutoScroll"));
182277
182439
  __publicField(this, "syncScrollShadowState", /* @__PURE__ */ __name(() => {
@@ -182286,6 +182448,48 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182286
182448
  get sessionsById() {
182287
182449
  return new Map(this.sessions.map((session) => [session.id, session]));
182288
182450
  }
182451
+ get resourcesById() {
182452
+ const result = /* @__PURE__ */ new Map();
182453
+ for (const resource of this.resources) {
182454
+ if (!resource.id || !resource.kind || !resource.title || result.has(resource.id)) continue;
182455
+ result.set(resource.id, resource);
182456
+ }
182457
+ return result;
182458
+ }
182459
+ /** First valid record wins; unknown and duplicate records remain untouched but are not projected. */
182460
+ get acceptedResourceAssociations() {
182461
+ const resourcesById = this.resourcesById;
182462
+ const sessionsById = this.sessionsById;
182463
+ const result = /* @__PURE__ */ new Map();
182464
+ for (const association2 of this.resourceAssociations) {
182465
+ if (!resourcesById.has(association2.resourceId) || !sessionsById.has(association2.sessionId) || result.has(association2.resourceId)) continue;
182466
+ result.set(association2.resourceId, association2.sessionId);
182467
+ }
182468
+ return result;
182469
+ }
182470
+ get acceptedResources() {
182471
+ return [...this.resourcesById.values()];
182472
+ }
182473
+ resourceMatchesSearch(resourceArg, queryArg) {
182474
+ return [resourceArg.id, resourceArg.kind, resourceArg.title, resourceArg.preview].filter(Boolean).join(" ").toLowerCase().includes(queryArg);
182475
+ }
182476
+ sessionMatchesSearch(sessionArg, queryArg) {
182477
+ return [sessionArg.title, sessionArg.preview, sessionArg.id].filter(Boolean).join(" ").toLowerCase().includes(queryArg);
182478
+ }
182479
+ resourcesForSession(sessionArg) {
182480
+ const associations = this.acceptedResourceAssociations;
182481
+ const associated = this.acceptedResources.filter(
182482
+ (resource) => associations.get(resource.id) === sessionArg.id
182483
+ );
182484
+ const query3 = this.search.trim().toLowerCase();
182485
+ if (!query3 || this.sessionMatchesSearch(sessionArg, query3)) return associated;
182486
+ return associated.filter((resource) => this.resourceMatchesSearch(resource, query3));
182487
+ }
182488
+ get unattachedResources() {
182489
+ const associations = this.acceptedResourceAssociations;
182490
+ const query3 = this.search.trim().toLowerCase();
182491
+ return this.acceptedResources.filter((resource) => !associations.has(resource.id) && (!query3 || this.resourceMatchesSearch(resource, query3)));
182492
+ }
182289
182493
  get groupedSessionIds() {
182290
182494
  const ids = /* @__PURE__ */ new Set();
182291
182495
  for (const group of this.groups) {
@@ -182315,17 +182519,64 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182315
182519
  }
182316
182520
  get filteredSessions() {
182317
182521
  const query3 = this.search.trim().toLowerCase();
182522
+ const associations = this.acceptedResourceAssociations;
182523
+ const matchingAttachedSessionIds = new Set(
182524
+ this.acceptedResources.filter((resource) => query3 && this.resourceMatchesSearch(resource, query3)).map((resource) => associations.get(resource.id)).filter((sessionId) => sessionId !== void 0)
182525
+ );
182318
182526
  const sorted = [...this.sessions].sort(
182319
182527
  (left, right) => (right.updatedAt ?? right.createdAt ?? 0) - (left.updatedAt ?? left.createdAt ?? 0)
182320
182528
  );
182321
182529
  if (!query3) return sorted;
182322
182530
  return sorted.filter(
182323
- (session) => [session.title, session.preview, session.id].filter(Boolean).join(" ").toLowerCase().includes(query3)
182531
+ (session) => this.sessionMatchesSearch(session, query3) || matchingAttachedSessionIds.has(session.id)
182324
182532
  );
182325
182533
  }
182326
182534
  focusSearch() {
182327
182535
  this.shadowRoot?.querySelector(".searchRow input")?.focus();
182328
182536
  }
182537
+ requestResourceAssociation(resourceIdArg, toSessionIdArg, sourceArg = "action") {
182538
+ const resource = this.resourcesById.get(resourceIdArg);
182539
+ if (!resource) return false;
182540
+ const fromSessionId = this.acceptedResourceAssociations.get(resourceIdArg) ?? null;
182541
+ if (fromSessionId === toSessionIdArg) return false;
182542
+ if (toSessionIdArg !== null && (!this.sessionsById.has(toSessionIdArg) || !this.isResourceTargetEligible(resourceIdArg, toSessionIdArg))) return false;
182543
+ if (toSessionIdArg === null && fromSessionId === null) return false;
182544
+ const detail = fromSessionId === null ? {
182545
+ intent: "attach",
182546
+ resource,
182547
+ fromSessionId: null,
182548
+ toSessionId: toSessionIdArg,
182549
+ source: sourceArg
182550
+ } : toSessionIdArg === null ? {
182551
+ intent: "detach",
182552
+ resource,
182553
+ fromSessionId,
182554
+ toSessionId: null,
182555
+ source: sourceArg
182556
+ } : {
182557
+ intent: "reassign",
182558
+ resource,
182559
+ fromSessionId,
182560
+ toSessionId: toSessionIdArg,
182561
+ source: sourceArg
182562
+ };
182563
+ this.pendingResourceAssociationRequest = {
182564
+ resourceId: resource.id,
182565
+ resourceTitle: resource.title || resource.id,
182566
+ fromSessionId,
182567
+ toSessionId: toSessionIdArg,
182568
+ intent: detail.intent
182569
+ };
182570
+ this.moveAnnouncement = this.resourceAssociationAnnouncement(detail, false);
182571
+ this.dispatchEvent(
182572
+ new CustomEvent("harness-resource-association-request", {
182573
+ detail,
182574
+ bubbles: true,
182575
+ composed: true
182576
+ })
182577
+ );
182578
+ return true;
182579
+ }
182329
182580
  updated(changedProperties) {
182330
182581
  super.updated(changedProperties);
182331
182582
  this.observeScrollGeometry();
@@ -182334,16 +182585,32 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182334
182585
  if (this.pointerDragGesture && (!this.pointerDragGesture.source.isConnected || !this.pointerDragGesture.handle.isConnected)) {
182335
182586
  this.finishPointerDrag(false);
182336
182587
  }
182337
- if (!changedProperties.has("sessions")) return;
182338
- const knownIds = new Set(this.sessions.map((session) => session.id));
182339
- if (this.pointerDragGesture && !knownIds.has(this.pointerDragGesture.sessionId)) {
182340
- this.finishPointerDrag(false);
182588
+ if (changedProperties.has("sessions")) {
182589
+ const knownIds = new Set(this.sessions.map((session) => session.id));
182590
+ if (this.pointerDragGesture?.type === "session" && !knownIds.has(this.pointerDragGesture.sessionId)) {
182591
+ this.finishPointerDrag(false);
182592
+ }
182593
+ const nextExpanded = new Set(
182594
+ [...this.expandedSessionIds].filter((sessionId) => knownIds.has(sessionId))
182595
+ );
182596
+ if (nextExpanded.size !== this.expandedSessionIds.size || [...nextExpanded].some((sessionId) => !this.expandedSessionIds.has(sessionId))) {
182597
+ this.expandedSessionIds = nextExpanded;
182598
+ }
182341
182599
  }
182342
- const nextExpanded = new Set(
182343
- [...this.expandedSessionIds].filter((sessionId) => knownIds.has(sessionId))
182344
- );
182345
- if (nextExpanded.size !== this.expandedSessionIds.size || [...nextExpanded].some((sessionId) => !this.expandedSessionIds.has(sessionId))) {
182346
- this.expandedSessionIds = nextExpanded;
182600
+ if (changedProperties.has("resources") || changedProperties.has("resourceAssociations")) {
182601
+ const gesture = this.pointerDragGesture;
182602
+ if (gesture?.type === "resource") {
182603
+ const currentSessionId = this.acceptedResourceAssociations.get(gesture.resourceId) ?? null;
182604
+ if (!this.resourcesById.has(gesture.resourceId) || currentSessionId !== gesture.fromSessionId) {
182605
+ this.finishPointerDrag(false);
182606
+ }
182607
+ }
182608
+ if (this.resourceContextResourceId && !this.resourcesById.has(this.resourceContextResourceId)) this.closeResourceContext(this.resourceContextGeneration);
182609
+ this.reconcilePendingResourceAssociation();
182610
+ }
182611
+ if (changedProperties.has("eligibleSessionIdsByResourceId")) {
182612
+ const gesture = this.pointerDragGesture;
182613
+ if (gesture?.type === "resource") this.finishPointerDrag(false);
182347
182614
  }
182348
182615
  }
182349
182616
  async connectedCallback() {
@@ -182355,6 +182622,7 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182355
182622
  }
182356
182623
  async disconnectedCallback() {
182357
182624
  this.finishPointerDrag(false);
182625
+ this.clearResourceContextState();
182358
182626
  this.scrollResizeObserver?.disconnect();
182359
182627
  this.scrollResizeObserver = void 0;
182360
182628
  this.observedScrollContainer = void 0;
@@ -182367,7 +182635,8 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182367
182635
  <div class="searchRow">
182368
182636
  <dees-icon class="searchIcon" icon="lucide:Search" iconSize="13"></dees-icon>
182369
182637
  <input
182370
- placeholder="Search conversations"
182638
+ placeholder=${this.acceptedResources.length ? "Search conversations and resources" : "Search conversations"}
182639
+ aria-label=${this.acceptedResources.length ? "Search conversations and resources" : "Search conversations"}
182371
182640
  .value=${this.search}
182372
182641
  @input=${(event) => {
182373
182642
  this.search = event.currentTarget.value;
@@ -182410,9 +182679,10 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182410
182679
  }
182411
182680
  renderFlatList() {
182412
182681
  const sessions = this.filteredSessions;
182413
- if (!sessions.length) {
182682
+ const unattachedResources = this.unattachedResources;
182683
+ if (!sessions.length && !unattachedResources.length) {
182414
182684
  return b2`<div class="emptyNote">
182415
- ${this.sessions.length ? "No conversations match this search." : this.emptyText}
182685
+ ${this.acceptedResources.length ? this.sessions.length ? "No conversations or resources match this search." : "No resources match this search." : this.sessions.length ? "No conversations match this search." : this.emptyText}
182416
182686
  </div>`;
182417
182687
  }
182418
182688
  return b2`
@@ -182423,12 +182693,14 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182423
182693
  (session) => this.renderItem(session, null, -1)
182424
182694
  )}
182425
182695
  </div>
182696
+ ${this.renderUnattachedResources(unattachedResources)}
182426
182697
  `;
182427
182698
  }
182428
182699
  renderGroupedList() {
182429
182700
  const byId = this.sessionsById;
182430
182701
  const ungrouped = this.ungroupedSessions;
182431
- if (!this.sessions.length && !this.groups.length) {
182702
+ const unattachedResources = this.unattachedResources;
182703
+ if (!this.sessions.length && !this.groups.length && !unattachedResources.length) {
182432
182704
  return b2`<div class="emptyNote">${this.emptyText}</div>`;
182433
182705
  }
182434
182706
  return b2`
@@ -182478,6 +182750,7 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182478
182750
  </button>
182479
182751
  ` : ""}
182480
182752
  ${this.renderSection(ungrouped, null)}
182753
+ ${this.renderUnattachedResources(unattachedResources)}
182481
182754
  `;
182482
182755
  }
182483
182756
  renderSection(sessions, groupId) {
@@ -182537,9 +182810,11 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182537
182810
  const state5 = session.state ?? "normal";
182538
182811
  const detailsId = `session-details-${session.id}`;
182539
182812
  const dropIndex = index3 < 0 ? 0 : index3;
182813
+ const resources = this.resourcesForSession(session);
182814
+ const isResourceDropTarget = this.resourceDropTargetSessionId === session.id;
182540
182815
  return b2`
182541
182816
  <article
182542
- class="item state-${state5} ${expanded ? "expanded" : ""} ${session.id === this.selectedSessionId ? "selected" : ""} ${this.draggingSessionId === session.id ? "dragging" : ""}"
182817
+ class="item state-${state5} ${expanded ? "expanded" : ""} ${session.id === this.selectedSessionId ? "selected" : ""} ${this.draggingSessionId === session.id ? "dragging" : ""} ${isResourceDropTarget ? "resourceDropTarget" : ""}"
182543
182818
  data-session-id=${session.id}
182544
182819
  data-drop-group-id=${groupId ?? ""}
182545
182820
  data-drop-index=${dropIndex}
@@ -182620,6 +182895,16 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182620
182895
  <dees-icon icon="lucide:ChevronDown" iconSize="15"></dees-icon>
182621
182896
  </button>
182622
182897
  </div>
182898
+ ${isResourceDropTarget ? b2`<div class="resourceDropLabel">Associate resource with ${session.title || session.id}</div>` : ""}
182899
+ ${resources.length ? b2`
182900
+ <ul class="resourceChildren" aria-label=${`Resources for ${session.title || session.id}`}>
182901
+ ${repeat6(
182902
+ resources,
182903
+ (resource) => resource.id,
182904
+ (resource) => this.renderResource(resource, session.id)
182905
+ )}
182906
+ </ul>
182907
+ ` : ""}
182623
182908
  ${expanded ? b2`
182624
182909
  <div class="itemDetails" id=${detailsId}>
182625
182910
  <div class="stateLine">
@@ -182636,6 +182921,113 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182636
182921
  </article>
182637
182922
  `;
182638
182923
  }
182924
+ renderUnattachedResources(resourcesArg) {
182925
+ if (!resourcesArg.length) return b2``;
182926
+ return b2`
182927
+ <section class="resourceSection" aria-labelledby="unattached-resources-heading">
182928
+ <h2 class="resourceSectionTitle" id="unattached-resources-heading">Resources</h2>
182929
+ <ul class="resourceList" aria-label="Unattached resources">
182930
+ ${repeat6(
182931
+ resourcesArg,
182932
+ (resource) => resource.id,
182933
+ (resource) => this.renderResource(resource, null)
182934
+ )}
182935
+ </ul>
182936
+ </section>
182937
+ `;
182938
+ }
182939
+ renderResource(resourceArg, sessionIdArg) {
182940
+ const selected = resourceArg.id === this.selectedResourceId;
182941
+ const dragging = resourceArg.id === this.draggingResourceId;
182942
+ const eligibleTargetCount = this.eligibleSessionIds(resourceArg.id).filter(
182943
+ (sessionId) => sessionId !== sessionIdArg
182944
+ ).length;
182945
+ const contextOpen = resourceArg.id === this.resourceContextResourceId;
182946
+ return b2`
182947
+ <li
182948
+ class="resourceRow ${selected ? "selected" : ""} ${dragging ? "resourceDragging" : ""}"
182949
+ data-resource-id=${resourceArg.id}
182950
+ data-resource-session-id=${sessionIdArg ?? ""}
182951
+ @dblclick=${(event) => {
182952
+ event.stopPropagation();
182953
+ if (this.eventTargetsResourceControl(event)) return;
182954
+ this.emitResource("harness-resource-open", resourceArg, sessionIdArg);
182955
+ }}
182956
+ @contextmenu=${(event) => {
182957
+ event.preventDefault();
182958
+ event.stopPropagation();
182959
+ const focusTarget = event.composedPath().find((target) => target instanceof HTMLElement && target.matches("button:not(:disabled)")) ?? event.currentTarget.querySelector(".resourcePrimary") ?? event.currentTarget;
182960
+ this.emitResourceContext(event, resourceArg, sessionIdArg, "pointer", focusTarget);
182961
+ }}
182962
+ >
182963
+ <button
182964
+ class="resourceDragHandle"
182965
+ type="button"
182966
+ title=${eligibleTargetCount ? "Drag to associate with an eligible conversation" : "No eligible conversations"}
182967
+ aria-label=${`Associate ${resourceArg.title || resourceArg.id} by dragging`}
182968
+ aria-keyshortcuts="ContextMenu Shift+F10"
182969
+ ?disabled=${eligibleTargetCount === 0}
182970
+ @pointerdown=${(event) => {
182971
+ this.handleResourcePointerDown(event, resourceArg, sessionIdArg);
182972
+ }}
182973
+ @pointermove=${this.handlePointerMove}
182974
+ @pointerup=${this.handlePointerUp}
182975
+ @pointercancel=${this.handlePointerCancel}
182976
+ @lostpointercapture=${this.handleLostPointerCapture}
182977
+ @keydown=${(event) => {
182978
+ this.handleResourceContextKey(event, resourceArg, sessionIdArg);
182979
+ }}
182980
+ >
182981
+ <dees-icon icon="lucide:GripVertical" iconSize="13"></dees-icon>
182982
+ </button>
182983
+ <button
182984
+ class="resourcePrimary"
182985
+ type="button"
182986
+ aria-current=${selected ? "true" : "false"}
182987
+ @click=${() => this.emitResource("harness-resource-select", resourceArg, sessionIdArg)}
182988
+ @keydown=${(event) => {
182989
+ if (event.key === "Enter") {
182990
+ event.preventDefault();
182991
+ this.emitResource("harness-resource-open", resourceArg, sessionIdArg);
182992
+ return;
182993
+ }
182994
+ this.handleResourceContextKey(event, resourceArg, sessionIdArg);
182995
+ }}
182996
+ >
182997
+ <dees-icon
182998
+ class="resourceIcon"
182999
+ icon=${resourceArg.icon || "lucide:Box"}
183000
+ iconSize="14"
183001
+ ></dees-icon>
183002
+ <span class="resourceCopy">
183003
+ <span class="resourceTitle">${resourceArg.title || resourceArg.id}</span>
183004
+ ${resourceArg.preview ? b2`<span class="resourcePreview">${resourceArg.preview}</span>` : ""}
183005
+ <span class="resourceMeta">
183006
+ ${resourceArg.kind}${resourceArg.state ? ` \xB7 ${resourceArg.state}` : ""}${resourceArg.updatedAt || resourceArg.createdAt ? ` \xB7 ${harnessFormatRelativeTime(resourceArg.updatedAt ?? resourceArg.createdAt)}` : ""}
183007
+ </span>
183008
+ </span>
183009
+ </button>
183010
+ <button
183011
+ class="resourceActions"
183012
+ type="button"
183013
+ title="Resource actions"
183014
+ aria-label=${`Actions for ${resourceArg.title || resourceArg.id}`}
183015
+ aria-haspopup="menu"
183016
+ aria-expanded=${contextOpen ? "true" : "false"}
183017
+ aria-keyshortcuts="ContextMenu Shift+F10"
183018
+ @click=${(event) => {
183019
+ event.stopPropagation();
183020
+ this.emitResourceContext(event, resourceArg, sessionIdArg, "action", event.currentTarget);
183021
+ }}
183022
+ @keydown=${(event) => {
183023
+ this.handleResourceContextKey(event, resourceArg, sessionIdArg);
183024
+ }}
183025
+ >
183026
+ <dees-icon icon="lucide:Ellipsis" iconSize="15"></dees-icon>
183027
+ </button>
183028
+ </li>
183029
+ `;
183030
+ }
182639
183031
  eventTargetsExpandToggle(event) {
182640
183032
  return event.composedPath().some(
182641
183033
  (target) => target instanceof HTMLElement && target.classList.contains("expandToggle")
@@ -182646,6 +183038,11 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182646
183038
  (target) => target instanceof HTMLElement && target.classList.contains("dragHandle")
182647
183039
  );
182648
183040
  }
183041
+ eventTargetsResourceControl(event) {
183042
+ return event.composedPath().some(
183043
+ (target) => target instanceof HTMLElement && (target.classList.contains("resourceDragHandle") || target.classList.contains("resourceActions"))
183044
+ );
183045
+ }
182649
183046
  sessionStateLabel(state5) {
182650
183047
  switch (state5) {
182651
183048
  case "working":
@@ -182692,6 +183089,7 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182692
183089
  if (!source) return;
182693
183090
  const sourceRect = source.getBoundingClientRect();
182694
183091
  this.pointerDragGesture = {
183092
+ type: "session",
182695
183093
  pointerId: eventArg.pointerId,
182696
183094
  handle: handle3,
182697
183095
  source,
@@ -182712,6 +183110,33 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182712
183110
  this.finishPointerDrag(false);
182713
183111
  }
182714
183112
  }
183113
+ handleResourcePointerDown(eventArg, resourceArg, fromSessionIdArg) {
183114
+ if (this.pointerDragGesture || eventArg.button !== 0 || !eventArg.isPrimary || this.eligibleSessionIds(resourceArg.id).every((sessionId) => sessionId === fromSessionIdArg)) return;
183115
+ const handle3 = eventArg.currentTarget;
183116
+ const source = handle3.closest(".resourceRow");
183117
+ if (!source) return;
183118
+ const sourceRect = source.getBoundingClientRect();
183119
+ this.pointerDragGesture = {
183120
+ type: "resource",
183121
+ pointerId: eventArg.pointerId,
183122
+ handle: handle3,
183123
+ source,
183124
+ resourceId: resourceArg.id,
183125
+ fromSessionId: fromSessionIdArg,
183126
+ startClientX: eventArg.clientX,
183127
+ startClientY: eventArg.clientY,
183128
+ grabOffsetX: eventArg.clientX - sourceRect.left,
183129
+ grabOffsetY: eventArg.clientY - sourceRect.top,
183130
+ phase: "pending"
183131
+ };
183132
+ window.addEventListener("keydown", this.handleDragKeyDown, true);
183133
+ window.addEventListener("blur", this.handleDragWindowBlur);
183134
+ try {
183135
+ handle3.setPointerCapture(eventArg.pointerId);
183136
+ } catch {
183137
+ this.finishPointerDrag(false);
183138
+ }
183139
+ }
182715
183140
  startPointerDrag(eventArg, gestureArg) {
182716
183141
  const sourceRect = gestureArg.source.getBoundingClientRect();
182717
183142
  gestureArg.source.classList.add("dragging");
@@ -182737,6 +183162,23 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182737
183162
  };
182738
183163
  return true;
182739
183164
  }
183165
+ startResourcePointerDrag(eventArg, gestureArg) {
183166
+ const sourceRect = gestureArg.source.getBoundingClientRect();
183167
+ gestureArg.source.classList.add("resourceDragging");
183168
+ gestureArg.source.style.setProperty("--resource-drag-preview-width", `${sourceRect.width}px`);
183169
+ this.moveResourceDragPreview(eventArg.clientX, eventArg.clientY, gestureArg);
183170
+ gestureArg.source.setAttribute("popover", "manual");
183171
+ try {
183172
+ gestureArg.source.showPopover();
183173
+ } catch {
183174
+ this.finishPointerDrag(false);
183175
+ return false;
183176
+ }
183177
+ gestureArg.phase = "active";
183178
+ this.draggingResourceId = gestureArg.resourceId;
183179
+ this.resourceDropTargetSessionId = "";
183180
+ return true;
183181
+ }
182740
183182
  moveDragPreview(clientXArg, clientYArg, gestureArg) {
182741
183183
  gestureArg.source.style.setProperty(
182742
183184
  "--drag-preview-x",
@@ -182747,6 +183189,24 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182747
183189
  `${clientYArg - gestureArg.grabOffsetY}px`
182748
183190
  );
182749
183191
  }
183192
+ moveResourceDragPreview(clientXArg, clientYArg, gestureArg) {
183193
+ gestureArg.source.style.setProperty(
183194
+ "--resource-drag-preview-x",
183195
+ `${clientXArg - gestureArg.grabOffsetX}px`
183196
+ );
183197
+ gestureArg.source.style.setProperty(
183198
+ "--resource-drag-preview-y",
183199
+ `${clientYArg - gestureArg.grabOffsetY}px`
183200
+ );
183201
+ }
183202
+ updateResourceDropTargetFromPointer(clientXArg, clientYArg) {
183203
+ const gesture = this.pointerDragGesture;
183204
+ if (gesture?.type !== "resource" || gesture.phase !== "active") return;
183205
+ const hit = this.shadowRoot?.elementFromPoint(clientXArg, clientYArg);
183206
+ const target = hit?.closest(".item[data-session-id]");
183207
+ const sessionId = target?.dataset.sessionId ?? "";
183208
+ this.resourceDropTargetSessionId = sessionId && sessionId !== gesture.fromSessionId && this.isResourceTargetEligible(gesture.resourceId, sessionId) ? sessionId : "";
183209
+ }
182750
183210
  setDropSlot(groupIdArg, indexArg) {
182751
183211
  const current = this.dropSlot;
182752
183212
  if (current && current.groupId === groupIdArg && current.index === indexArg) return;
@@ -182764,7 +183224,8 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182764
183224
  }
182765
183225
  updateDragAutoScrollVelocity() {
182766
183226
  const container = this.scrollContainer;
182767
- if (!container || !this.draggingSessionId) return;
183227
+ const gesture = this.pointerDragGesture;
183228
+ if (!container || gesture?.phase !== "active") return;
182768
183229
  const rect = container.getBoundingClientRect();
182769
183230
  if (this.dragAutoScrollClientX < rect.left || this.dragAutoScrollClientX > rect.right) {
182770
183231
  this.stopDragAutoScroll();
@@ -182938,6 +183399,120 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182938
183399
  this.keyboardMoveFocus = void 0;
182939
183400
  }
182940
183401
  }
183402
+ eligibleSessionIds(resourceIdArg) {
183403
+ const knownSessionIds = new Set(this.sessions.map((session) => session.id));
183404
+ const result = [];
183405
+ const seen = /* @__PURE__ */ new Set();
183406
+ for (const sessionId of this.eligibleSessionIdsByResourceId[resourceIdArg] ?? []) {
183407
+ if (!knownSessionIds.has(sessionId) || seen.has(sessionId)) continue;
183408
+ seen.add(sessionId);
183409
+ result.push(sessionId);
183410
+ }
183411
+ return result;
183412
+ }
183413
+ isResourceTargetEligible(resourceIdArg, sessionIdArg) {
183414
+ return this.eligibleSessionIds(resourceIdArg).includes(sessionIdArg);
183415
+ }
183416
+ emitResource(nameArg, resourceArg, sessionIdArg) {
183417
+ const detail = {
183418
+ resource: resourceArg,
183419
+ sessionId: sessionIdArg
183420
+ };
183421
+ this.dispatchEvent(new CustomEvent(nameArg, { detail, bubbles: true, composed: true }));
183422
+ }
183423
+ handleResourceContextKey(eventArg, resourceArg, sessionIdArg) {
183424
+ if (!(eventArg.key === "ContextMenu" || eventArg.key === "F10" && eventArg.shiftKey)) return;
183425
+ eventArg.preventDefault();
183426
+ eventArg.stopPropagation();
183427
+ this.emitResourceContext(
183428
+ eventArg,
183429
+ resourceArg,
183430
+ sessionIdArg,
183431
+ "keyboard",
183432
+ eventArg.currentTarget
183433
+ );
183434
+ }
183435
+ emitResourceContext(eventArg, resourceArg, sessionIdArg, sourceArg, focusTargetArg) {
183436
+ const rect = focusTargetArg.getBoundingClientRect();
183437
+ const contextGeneration = ++this.resourceContextGeneration;
183438
+ this.resourceContextResourceId = resourceArg.id;
183439
+ this.resourceContextFocusTarget = focusTargetArg;
183440
+ this.resourceContextFocusClass = [
183441
+ "resourceActions",
183442
+ "resourcePrimary",
183443
+ "resourceDragHandle"
183444
+ ].find((className) => focusTargetArg.classList.contains(className)) ?? "resourcePrimary";
183445
+ const detail = {
183446
+ resource: resourceArg,
183447
+ sessionId: sessionIdArg,
183448
+ clientX: sourceArg === "pointer" && eventArg instanceof MouseEvent ? eventArg.clientX : rect.left + rect.width / 2,
183449
+ clientY: sourceArg === "pointer" && eventArg instanceof MouseEvent ? eventArg.clientY : rect.bottom,
183450
+ source: sourceArg,
183451
+ originalEvent: eventArg,
183452
+ requestAssociation: /* @__PURE__ */ __name((toSessionIdArg) => this.requestResourceAssociation(
183453
+ resourceArg.id,
183454
+ toSessionIdArg,
183455
+ sourceArg === "keyboard" ? "keyboard" : "action"
183456
+ ), "requestAssociation"),
183457
+ close: /* @__PURE__ */ __name(() => this.closeResourceContext(contextGeneration), "close")
183458
+ };
183459
+ this.dispatchEvent(
183460
+ new CustomEvent("harness-resource-context", { detail, bubbles: true, composed: true })
183461
+ );
183462
+ }
183463
+ closeResourceContext(contextGenerationArg) {
183464
+ if (!this.isConnected || contextGenerationArg !== this.resourceContextGeneration) return;
183465
+ const focusTarget = this.resourceContextFocusTarget;
183466
+ const resourceId = this.resourceContextResourceId;
183467
+ const focusClass = this.resourceContextFocusClass;
183468
+ this.clearResourceContextState();
183469
+ const closeGeneration = this.resourceContextGeneration;
183470
+ void this.updateComplete.then(() => {
183471
+ if (!this.isConnected || closeGeneration !== this.resourceContextGeneration) return;
183472
+ if (focusTarget?.isConnected) {
183473
+ focusTarget.focus();
183474
+ return;
183475
+ }
183476
+ const row = Array.from(
183477
+ this.shadowRoot?.querySelectorAll(".resourceRow[data-resource-id]") ?? []
183478
+ ).find((candidate) => candidate.dataset.resourceId === resourceId);
183479
+ row?.querySelector(`.${focusClass || "resourcePrimary"}`)?.focus();
183480
+ });
183481
+ }
183482
+ clearResourceContextState() {
183483
+ this.resourceContextGeneration += 1;
183484
+ this.resourceContextResourceId = "";
183485
+ this.resourceContextFocusTarget = void 0;
183486
+ this.resourceContextFocusClass = "";
183487
+ }
183488
+ reconcilePendingResourceAssociation() {
183489
+ const pending = this.pendingResourceAssociationRequest;
183490
+ if (!pending) return;
183491
+ if (!this.resourcesById.has(pending.resourceId)) {
183492
+ this.pendingResourceAssociationRequest = void 0;
183493
+ return;
183494
+ }
183495
+ const currentSessionId = this.acceptedResourceAssociations.get(pending.resourceId) ?? null;
183496
+ if (currentSessionId !== pending.toSessionId) {
183497
+ if (currentSessionId !== pending.fromSessionId) {
183498
+ const controlledSession = currentSessionId ? this.sessionsById.get(currentSessionId)?.title ?? currentSessionId : "unattached";
183499
+ this.moveAnnouncement = `Association request for ${pending.resourceTitle} was not applied; controlled association is ${controlledSession}.`;
183500
+ this.pendingResourceAssociationRequest = void 0;
183501
+ }
183502
+ return;
183503
+ }
183504
+ const fromSession = pending.fromSessionId ? this.sessionsById.get(pending.fromSessionId)?.title ?? pending.fromSessionId : "";
183505
+ const toSession = pending.toSessionId ? this.sessionsById.get(pending.toSessionId)?.title ?? pending.toSessionId : "";
183506
+ this.moveAnnouncement = pending.intent === "attach" ? `${pending.resourceTitle} is now attached to ${toSession}.` : pending.intent === "detach" ? `${pending.resourceTitle} is now detached from ${fromSession}.` : `${pending.resourceTitle} is now reassigned from ${fromSession} to ${toSession}.`;
183507
+ this.pendingResourceAssociationRequest = void 0;
183508
+ }
183509
+ resourceAssociationAnnouncement(detailArg, completedArg) {
183510
+ const resourceTitle = detailArg.resource.title || detailArg.resource.id;
183511
+ const fromTitle = detailArg.fromSessionId ? this.sessionsById.get(detailArg.fromSessionId)?.title ?? detailArg.fromSessionId : "";
183512
+ const toTitle = detailArg.toSessionId ? this.sessionsById.get(detailArg.toSessionId)?.title ?? detailArg.toSessionId : "";
183513
+ const verb = completedArg ? "completed" : "requested";
183514
+ return detailArg.intent === "attach" ? `Attach ${verb} for ${resourceTitle} to ${toTitle}.` : detailArg.intent === "detach" ? `Detach ${verb} for ${resourceTitle} from ${fromTitle}.` : `Reassign ${verb} for ${resourceTitle} from ${fromTitle} to ${toTitle}.`;
183515
+ }
182941
183516
  async animateCardReflow(previousRectsArg, generationArg) {
182942
183517
  await this.updateComplete;
182943
183518
  if (generationArg !== this.reflowGeneration || !this.isConnected || globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches) return;
@@ -182970,7 +183545,11 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182970
183545
  finishPointerDrag(commitArg) {
182971
183546
  const gesture = this.pointerDragGesture;
182972
183547
  if (!gesture) return;
182973
- const detail = commitArg && gesture.phase === "active" && this.dropSlot ? this.createMoveDetail(gesture.sessionId, this.dropSlot.groupId, this.dropSlot.index) : void 0;
183548
+ const sessionMoveDetail = gesture.type === "session" && commitArg && gesture.phase === "active" && this.dropSlot ? this.createMoveDetail(gesture.sessionId, this.dropSlot.groupId, this.dropSlot.index) : void 0;
183549
+ const resourceRequest = gesture.type === "resource" && commitArg && gesture.phase === "active" && this.resourceDropTargetSessionId ? {
183550
+ resourceId: gesture.resourceId,
183551
+ toSessionId: this.resourceDropTargetSessionId
183552
+ } : void 0;
182974
183553
  this.pointerDragGesture = void 0;
182975
183554
  window.removeEventListener("keydown", this.handleDragKeyDown, true);
182976
183555
  window.removeEventListener("blur", this.handleDragWindowBlur);
@@ -182979,14 +183558,19 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182979
183558
  this.cancelReflowAnimations();
182980
183559
  if (gesture.source.matches(":popover-open")) gesture.source.hidePopover();
182981
183560
  gesture.source.removeAttribute("popover");
182982
- gesture.source.classList.remove("dragging");
183561
+ gesture.source.classList.remove("dragging", "resourceDragging");
182983
183562
  for (const property2 of [
182984
183563
  "--drag-preview-width",
182985
183564
  "--drag-preview-height",
182986
183565
  "--drag-preview-x",
182987
- "--drag-preview-y"
183566
+ "--drag-preview-y",
183567
+ "--resource-drag-preview-width",
183568
+ "--resource-drag-preview-x",
183569
+ "--resource-drag-preview-y"
182988
183570
  ]) gesture.source.style.removeProperty(property2);
182989
183571
  this.draggingSessionId = "";
183572
+ this.draggingResourceId = "";
183573
+ this.resourceDropTargetSessionId = "";
182990
183574
  this.draggedItemHeight = 0;
182991
183575
  this.dropSlot = void 0;
182992
183576
  try {
@@ -182995,11 +183579,18 @@ var _DeesHarnessSessionList = class _DeesHarnessSessionList extends (_a91 = Dees
182995
183579
  }
182996
183580
  } catch {
182997
183581
  }
182998
- if (detail) {
183582
+ if (sessionMoveDetail) {
182999
183583
  this.dispatchEvent(
183000
- new CustomEvent("harness-session-move", { detail, bubbles: true, composed: true })
183584
+ new CustomEvent("harness-session-move", {
183585
+ detail: sessionMoveDetail,
183586
+ bubbles: true,
183587
+ composed: true
183588
+ })
183001
183589
  );
183002
183590
  }
183591
+ if (resourceRequest) {
183592
+ this.requestResourceAssociation(resourceRequest.resourceId, resourceRequest.toSessionId, "drop");
183593
+ }
183003
183594
  }
183004
183595
  emit(name, session) {
183005
183596
  this.dispatchEvent(new CustomEvent(name, { detail: { session }, bubbles: true, composed: true }));
@@ -183013,8 +183604,14 @@ _emptyText2 = new WeakMap();
183013
183604
  _groups2 = new WeakMap();
183014
183605
  _enableGrouping = new WeakMap();
183015
183606
  _ungroupedSessionIds = new WeakMap();
183607
+ _resources = new WeakMap();
183608
+ _resourceAssociations = new WeakMap();
183609
+ _selectedResourceId = new WeakMap();
183610
+ _eligibleSessionIdsByResourceId = new WeakMap();
183016
183611
  _search = new WeakMap();
183017
183612
  _draggingSessionId = new WeakMap();
183613
+ _draggingResourceId = new WeakMap();
183614
+ _resourceDropTargetSessionId = new WeakMap();
183018
183615
  _dropSlot = new WeakMap();
183019
183616
  _draggedItemHeight = new WeakMap();
183020
183617
  _expandedSessionIds = new WeakMap();
@@ -183022,6 +183619,7 @@ _collapsedGroupIds = new WeakMap();
183022
183619
  _topScrollShadowVisible = new WeakMap();
183023
183620
  _bottomScrollShadowVisible = new WeakMap();
183024
183621
  _moveAnnouncement = new WeakMap();
183622
+ _resourceContextResourceId = new WeakMap();
183025
183623
  __decorateElement(_init92, 4, "sessions", _sessions_dec, _DeesHarnessSessionList, _sessions);
183026
183624
  __decorateElement(_init92, 4, "selectedSessionId", _selectedSessionId_dec, _DeesHarnessSessionList, _selectedSessionId);
183027
183625
  __decorateElement(_init92, 4, "loading", _loading_dec4, _DeesHarnessSessionList, _loading4);
@@ -183029,8 +183627,14 @@ __decorateElement(_init92, 4, "emptyText", _emptyText_dec2, _DeesHarnessSessionL
183029
183627
  __decorateElement(_init92, 4, "groups", _groups_dec2, _DeesHarnessSessionList, _groups2);
183030
183628
  __decorateElement(_init92, 4, "enableGrouping", _enableGrouping_dec, _DeesHarnessSessionList, _enableGrouping);
183031
183629
  __decorateElement(_init92, 4, "ungroupedSessionIds", _ungroupedSessionIds_dec, _DeesHarnessSessionList, _ungroupedSessionIds);
183630
+ __decorateElement(_init92, 4, "resources", _resources_dec, _DeesHarnessSessionList, _resources);
183631
+ __decorateElement(_init92, 4, "resourceAssociations", _resourceAssociations_dec, _DeesHarnessSessionList, _resourceAssociations);
183632
+ __decorateElement(_init92, 4, "selectedResourceId", _selectedResourceId_dec, _DeesHarnessSessionList, _selectedResourceId);
183633
+ __decorateElement(_init92, 4, "eligibleSessionIdsByResourceId", _eligibleSessionIdsByResourceId_dec, _DeesHarnessSessionList, _eligibleSessionIdsByResourceId);
183032
183634
  __decorateElement(_init92, 4, "search", _search_dec, _DeesHarnessSessionList, _search);
183033
183635
  __decorateElement(_init92, 4, "draggingSessionId", _draggingSessionId_dec, _DeesHarnessSessionList, _draggingSessionId);
183636
+ __decorateElement(_init92, 4, "draggingResourceId", _draggingResourceId_dec, _DeesHarnessSessionList, _draggingResourceId);
183637
+ __decorateElement(_init92, 4, "resourceDropTargetSessionId", _resourceDropTargetSessionId_dec, _DeesHarnessSessionList, _resourceDropTargetSessionId);
183034
183638
  __decorateElement(_init92, 4, "dropSlot", _dropSlot_dec, _DeesHarnessSessionList, _dropSlot);
183035
183639
  __decorateElement(_init92, 4, "draggedItemHeight", _draggedItemHeight_dec, _DeesHarnessSessionList, _draggedItemHeight);
183036
183640
  __decorateElement(_init92, 4, "expandedSessionIds", _expandedSessionIds_dec, _DeesHarnessSessionList, _expandedSessionIds);
@@ -183038,6 +183642,7 @@ __decorateElement(_init92, 4, "collapsedGroupIds", _collapsedGroupIds_dec, _Dees
183038
183642
  __decorateElement(_init92, 4, "topScrollShadowVisible", _topScrollShadowVisible_dec, _DeesHarnessSessionList, _topScrollShadowVisible);
183039
183643
  __decorateElement(_init92, 4, "bottomScrollShadowVisible", _bottomScrollShadowVisible_dec, _DeesHarnessSessionList, _bottomScrollShadowVisible);
183040
183644
  __decorateElement(_init92, 4, "moveAnnouncement", _moveAnnouncement_dec, _DeesHarnessSessionList, _moveAnnouncement);
183645
+ __decorateElement(_init92, 4, "resourceContextResourceId", _resourceContextResourceId_dec, _DeesHarnessSessionList, _resourceContextResourceId);
183041
183646
  _DeesHarnessSessionList = __decorateElement(_init92, 0, "DeesHarnessSessionList", _DeesHarnessSessionList_decorators, _DeesHarnessSessionList);
183042
183647
  __name(_DeesHarnessSessionList, "DeesHarnessSessionList");
183043
183648
  __publicField(_DeesHarnessSessionList, "demo", demoFunc65);
@@ -183288,6 +183893,12 @@ __publicField(_DeesHarnessSessionList, "styles", [
183288
183893
  --card-accent: var(--session-error);
183289
183894
  }
183290
183895
 
183896
+ .item.resourceDropTarget {
183897
+ outline: 2px solid var(--dees-color-accent-primary);
183898
+ outline-offset: 2px;
183899
+ box-shadow: 0 0 0 5px var(--dees-color-focus-ring), var(--dees-shadow-lg);
183900
+ }
183901
+
183291
183902
  @keyframes attentionPulse {
183292
183903
  0%, 100% {
183293
183904
  background: color-mix(in srgb, var(--dees-color-bg-primary) 94%, var(--session-attention) 6%);
@@ -183462,6 +184073,183 @@ __publicField(_DeesHarnessSessionList, "styles", [
183462
184073
  font-size: var(--dees-font-caption2-size, 10px);
183463
184074
  }
183464
184075
 
184076
+ .resourceDropLabel {
184077
+ margin: 0 10px 10px;
184078
+ padding: 6px 9px;
184079
+ border-radius: var(--dees-radius-md);
184080
+ background: color-mix(in srgb, var(--dees-color-accent-primary) 14%, transparent);
184081
+ color: var(--dees-color-accent-primary);
184082
+ font-size: var(--dees-font-caption1-size, 11px);
184083
+ font-weight: 680;
184084
+ text-align: center;
184085
+ }
184086
+
184087
+ .resourceChildren {
184088
+ display: grid;
184089
+ gap: 4px;
184090
+ margin: 0 8px 8px 24px;
184091
+ padding: 0;
184092
+ list-style: none;
184093
+ }
184094
+
184095
+ .resourceSection {
184096
+ margin-top: var(--dees-spacing-md);
184097
+ }
184098
+
184099
+ .resourceSectionTitle {
184100
+ margin: 0 0 7px;
184101
+ padding: var(--dees-spacing-xs) 6px;
184102
+ color: var(--dees-color-text-secondary);
184103
+ font-size: var(--dees-font-caption1-size, 11px);
184104
+ font-weight: 650;
184105
+ letter-spacing: 0.05em;
184106
+ text-transform: uppercase;
184107
+ }
184108
+
184109
+ .resourceList {
184110
+ display: grid;
184111
+ gap: var(--dees-spacing-sm);
184112
+ margin: 0;
184113
+ padding: 0;
184114
+ list-style: none;
184115
+ }
184116
+
184117
+ .resourceRow {
184118
+ display: grid;
184119
+ grid-template-columns: 26px minmax(0, 1fr) 38px;
184120
+ min-width: 0;
184121
+ overflow: hidden;
184122
+ border: 1px solid var(--dees-color-border-subtle);
184123
+ border-radius: var(--dees-radius-lg);
184124
+ background: color-mix(in srgb, var(--dees-color-bg-secondary) 76%, transparent);
184125
+ color: var(--dees-color-text-primary);
184126
+ box-shadow: var(--dees-shadow-xs);
184127
+ box-sizing: border-box;
184128
+ }
184129
+
184130
+ .resourceRow.selected {
184131
+ border-color: var(--dees-color-accent-primary);
184132
+ background: color-mix(in srgb, var(--dees-color-accent-primary) 10%, var(--dees-color-bg-secondary));
184133
+ }
184134
+
184135
+ .resourceRow.resourceDragging {
184136
+ position: fixed;
184137
+ inset: 0 auto auto 0;
184138
+ width: var(--resource-drag-preview-width);
184139
+ max-width: none;
184140
+ margin: 0;
184141
+ opacity: 0.96;
184142
+ pointer-events: none;
184143
+ transform: translate3d(var(--resource-drag-preview-x), var(--resource-drag-preview-y), 0);
184144
+ box-shadow: var(--dees-shadow-xl);
184145
+ }
184146
+
184147
+ .resourceDragHandle,
184148
+ .resourcePrimary,
184149
+ .resourceActions {
184150
+ appearance: none;
184151
+ border: 0;
184152
+ background: transparent;
184153
+ color: inherit;
184154
+ font-family: inherit;
184155
+ }
184156
+
184157
+ .resourceDragHandle {
184158
+ display: grid;
184159
+ place-items: center;
184160
+ min-width: 26px;
184161
+ padding: 0;
184162
+ color: var(--dees-color-text-muted);
184163
+ cursor: grab;
184164
+ touch-action: none;
184165
+ }
184166
+
184167
+ .resourceDragHandle:disabled {
184168
+ opacity: 0.35;
184169
+ cursor: default;
184170
+ }
184171
+
184172
+ .resourceDragHandle:not(:disabled):active {
184173
+ cursor: grabbing;
184174
+ }
184175
+
184176
+ .resourcePrimary {
184177
+ display: flex;
184178
+ min-width: 0;
184179
+ min-height: 38px;
184180
+ align-items: center;
184181
+ gap: 7px;
184182
+ padding: 5px 4px 5px 7px;
184183
+ text-align: left;
184184
+ cursor: pointer;
184185
+ }
184186
+
184187
+ .resourceIcon {
184188
+ flex: 0 0 auto;
184189
+ color: var(--dees-color-text-secondary);
184190
+ }
184191
+
184192
+ .resourceCopy {
184193
+ min-width: 0;
184194
+ flex: 1;
184195
+ }
184196
+
184197
+ .resourceTitle {
184198
+ display: block;
184199
+ overflow: hidden;
184200
+ color: var(--dees-color-text-primary);
184201
+ font-size: var(--dees-font-caption1-size, 11px);
184202
+ font-weight: 620;
184203
+ text-overflow: ellipsis;
184204
+ white-space: nowrap;
184205
+ }
184206
+
184207
+ .resourcePreview {
184208
+ display: block;
184209
+ overflow: hidden;
184210
+ margin-top: 1px;
184211
+ color: var(--dees-color-text-secondary);
184212
+ font-size: var(--dees-font-caption2-size, 10px);
184213
+ text-overflow: ellipsis;
184214
+ white-space: nowrap;
184215
+ }
184216
+
184217
+ .resourceMeta {
184218
+ display: block;
184219
+ overflow: hidden;
184220
+ margin-top: 1px;
184221
+ color: var(--dees-color-text-muted);
184222
+ font-size: var(--dees-font-caption2-size, 10px);
184223
+ text-overflow: ellipsis;
184224
+ white-space: nowrap;
184225
+ }
184226
+
184227
+ .resourceActions {
184228
+ display: grid;
184229
+ place-items: center;
184230
+ min-width: 34px;
184231
+ min-height: 34px;
184232
+ margin: 2px;
184233
+ padding: 0;
184234
+ border-radius: var(--dees-radius-md);
184235
+ color: var(--dees-color-text-muted);
184236
+ cursor: pointer;
184237
+ }
184238
+
184239
+ .resourceActions:hover {
184240
+ background: var(--dees-color-hover);
184241
+ color: var(--dees-color-text-primary);
184242
+ }
184243
+
184244
+ .resourceDragHandle:focus-visible,
184245
+ .resourcePrimary:focus-visible,
184246
+ .resourceActions:focus-visible {
184247
+ z-index: 1;
184248
+ outline: 2px solid var(--dees-color-accent-primary);
184249
+ outline-offset: -3px;
184250
+ border-radius: var(--dees-radius-md);
184251
+ }
184252
+
183465
184253
  .visuallyHidden {
183466
184254
  position: absolute;
183467
184255
  width: 1px;
@@ -183588,6 +184376,33 @@ __publicField(_DeesHarnessSessionList, "styles", [
183588
184376
  transition: none;
183589
184377
  }
183590
184378
  }
184379
+
184380
+ @media (pointer: coarse) {
184381
+ .resourceRow {
184382
+ grid-template-columns: 44px minmax(0, 1fr) 44px;
184383
+ }
184384
+
184385
+ .resourceDragHandle,
184386
+ .resourceActions {
184387
+ min-width: 44px;
184388
+ min-height: 44px;
184389
+ margin: 0;
184390
+ }
184391
+
184392
+ .resourcePrimary {
184393
+ min-height: 44px;
184394
+ }
184395
+ }
184396
+
184397
+ @media (max-width: 280px) {
184398
+ .resourceChildren {
184399
+ margin-left: 8px;
184400
+ }
184401
+
184402
+ .resourcePreview {
184403
+ display: none;
184404
+ }
184405
+ }
183591
184406
  `
183592
184407
  ]);
183593
184408
  __runInitializers(_init92, 1, _DeesHarnessSessionList);
@@ -186380,6 +187195,7 @@ var computeResizeDimensions = /* @__PURE__ */ __name(({
186380
187195
  }, "computeResizeDimensions");
186381
187196
 
186382
187197
  // ts_web/elements/00group-layout/dees-dashboardgrid/contextmenu.ts
187198
+ init_dees_contextmenu();
186383
187199
  init_plugins4();
186384
187200
  var openWidgetContextMenu = /* @__PURE__ */ __name(({
186385
187201
  widget,
@@ -186402,6 +187218,7 @@ var openWidgetContextMenu = /* @__PURE__ */ __name(({
186402
187218
  // ts_web/elements/00group-layout/dees-dashboardgrid/dees-dashboardgrid.ts
186403
187219
  init_dist_ts26();
186404
187220
  init_dees_icon();
187221
+ init_dees_contextmenu();
186405
187222
  var _previewWidgets_dec, _resolvedMargins_dec, _metrics_dec3, _placeholderPosition_dec, _activeBreakpoint_dec, _layouts_dec, _showGridLines_dec, _rtl_dec, _cellHeightUnit_dec, _enableAnimation_dec, _editable_dec, _columns_dec3, _margin_dec, _cellHeight_dec, _widgets_dec2, _a96, _DeesDashboardgrid_decorators, _init97, _widgets2, _cellHeight, _margin, _columns3, _editable, _enableAnimation, _cellHeightUnit, _rtl, _showGridLines, _layouts, _activeBreakpoint, _placeholderPosition, _metrics3, _resolvedMargins, _previewWidgets;
186406
187223
  _DeesDashboardgrid_decorators = [customElement("dees-dashboardgrid")];
186407
187224
  var _DeesDashboardgrid = class _DeesDashboardgrid extends (_a96 = DeesElement, _widgets_dec2 = [n5({ type: Array })], _cellHeight_dec = [n5({ type: Number })], _margin_dec = [n5({ type: Object })], _columns_dec3 = [n5({ type: Number })], _editable_dec = [n5({ type: Boolean })], _enableAnimation_dec = [n5({ type: Boolean, reflect: true })], _cellHeightUnit_dec = [n5({ type: String })], _rtl_dec = [n5({ type: Boolean })], _showGridLines_dec = [n5({ type: Boolean })], _layouts_dec = [n5({ attribute: false })], _activeBreakpoint_dec = [n5({ type: String })], _placeholderPosition_dec = [r5()], _metrics_dec3 = [r5()], _resolvedMargins_dec = [r5()], _previewWidgets_dec = [r5()], _a96) {
@@ -196287,6 +197104,9 @@ __publicField(_DeesThumbnailFolder, "styles", [
196287
197104
  __runInitializers(_init115, 1, _DeesThumbnailFolder);
196288
197105
  var DeesThumbnailFolder = _DeesThumbnailFolder;
196289
197106
 
197107
+ // ts_web/elements/00group-overlay/dees-contextmenu/index.ts
197108
+ init_dees_contextmenu();
197109
+
196290
197110
  // ts_web/elements/00group-overlay/dees-modal/index.ts
196291
197111
  init_dees_modal();
196292
197112
 
@@ -200875,6 +201695,8 @@ init_dist_ts26();
200875
201695
  init_dist_ts25();
200876
201696
  init_theme();
200877
201697
  init_dees_icon();
201698
+ init_dees_contextmenu();
201699
+ init_dees_contextmenu();
200878
201700
  init_dees_modal();
200879
201701
  var _errorMessage_dec, _isLoading_dec3, _treeData_dec, _selectedPath_dec, _rootPath_dec, _executionEnvironment_dec2, _a124, _DeesWorkspaceFiletree_decorators, _init127, _executionEnvironment2, _rootPath, _selectedPath, _treeData, _isLoading3, _errorMessage;
200880
201702
  _DeesWorkspaceFiletree_decorators = [customElement("dees-workspace-filetree")];
@@ -202181,6 +203003,7 @@ var demoFunc82 = /* @__PURE__ */ __name(() => b2`
202181
203003
  init_dist_ts26();
202182
203004
  init_theme();
202183
203005
  init_dees_icon();
203006
+ init_dees_contextmenu();
202184
203007
  var _isCheckingPackages_dec, _outdatedPackages_dec, _packageStatus_dec, _scripts_dec, _executionEnvironment_dec3, _a126, _DeesWorkspaceBottombar_decorators, _init129, _executionEnvironment3, _scripts, _packageStatus, _outdatedPackages, _isCheckingPackages;
202185
203008
  _DeesWorkspaceBottombar_decorators = [customElement("dees-workspace-bottombar")];
202186
203009
  var _DeesWorkspaceBottombar = class _DeesWorkspaceBottombar extends (_a126 = DeesElement, _executionEnvironment_dec3 = [n5({ type: Object })], _scripts_dec = [r5()], _packageStatus_dec = [r5()], _outdatedPackages_dec = [r5()], _isCheckingPackages_dec = [r5()], _a126) {
@@ -203264,6 +204087,7 @@ init_group_runtime();
203264
204087
  init_dees_workspace_terminal();
203265
204088
  init_dees_workspace_terminal();
203266
204089
  init_dees_icon();
204090
+ init_dees_contextmenu();
203267
204091
  init_dees_actionbar();
203268
204092
  var _diffViewConfig_dec, _showDiffView_dec, _isDraggingTerminal_dec, _isDraggingFileTree_dec, _currentTerminalHeight_dec, _currentFileTreeWidth_dec, _initOutput_dec, _initCommand_dec, _autoSave_dec, _diagnosticMarkers_dec, _activeBottomPanel_dec, _isInitializing_dec, _isFileTreeCollapsed_dec, _isTerminalCollapsed_dec, _activeFilePath_dec, _openFiles_dec, _terminalHeight_dec, _fileTreeWidth_dec, _showTerminal_dec, _showFileTree_dec, _initializationPromise_dec, _executionEnvironment_dec4, _a128, _DeesWorkspace_decorators, _init131, _executionEnvironment4, _initializationPromise, _showFileTree, _showTerminal, _fileTreeWidth, _terminalHeight, _openFiles, _activeFilePath, _isTerminalCollapsed, _isFileTreeCollapsed, _isInitializing, _activeBottomPanel, _diagnosticMarkers, _autoSave, _initCommand, _initOutput, _currentFileTreeWidth, _currentTerminalHeight, _isDraggingFileTree, _isDraggingTerminal, _showDiffView, _diffViewConfig;
203269
204093
  _DeesWorkspace_decorators = [customElement("dees-workspace")];
@@ -205669,7 +206493,7 @@ init_group_runtime();
205669
206493
  // ts_web/00_commitinfo_data.ts
205670
206494
  var commitinfo = {
205671
206495
  name: "@design.estate/dees-catalog",
205672
- version: "6.6.0",
206496
+ version: "6.7.0",
205673
206497
  description: "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript."
205674
206498
  };
205675
206499