@design.estate/dees-catalog 4.9.0 → 4.11.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.
@@ -33,10 +33,13 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
33
33
  return useValue ? value : void 0;
34
34
  };
35
35
  import { demoFunc } from './dees-harness-session-list.demo.js';
36
- import { DeesElement, html, css, customElement, property, state, cssManager, } from '@design.estate/dees-element';
36
+ import { DeesElement, html, css, customElement, property, state, cssManager, directives, } from '@design.estate/dees-element';
37
37
  import { themeDefaultStyles } from '../../00theme.js';
38
38
  import { harnessFormatRelativeTime } from '../harness.helpers.js';
39
39
  import '../../00group-utility/dees-icon/dees-icon.js';
40
+ const { repeat } = directives;
41
+ const dragAutoScrollMaxPixelsPerSecond = 900;
42
+ const dragThresholdPixels = 4;
40
43
  /**
41
44
  * Searchable conversation list, embeddable in a sidebar or a DeesModal.
42
45
  * Emits `harness-session-select` on click, `harness-session-open` on
@@ -49,7 +52,8 @@ import '../../00group-utility/dees-icon/dees-icon.js';
49
52
  * `harness-group-create-request`, and right-clicking a group header emits
50
53
  * `harness-group-context` — the host persists changes and passes fresh
51
54
  * `groups` back in. Sessions in no group render in the trailing ungrouped
52
- * section, recency-sorted. While a search query is active the list is flat.
55
+ * section with pinned entries first, then explicit order, then new sessions by
56
+ * recency. While a search query is active the list is flat.
53
57
  */
54
58
  let DeesHarnessSessionList = (() => {
55
59
  let _classDecorators = [customElement('dees-harness-session-list')];
@@ -75,6 +79,9 @@ let DeesHarnessSessionList = (() => {
75
79
  let _enableGrouping_decorators;
76
80
  let _enableGrouping_initializers = [];
77
81
  let _enableGrouping_extraInitializers = [];
82
+ let _ungroupedSessionIds_decorators;
83
+ let _ungroupedSessionIds_initializers = [];
84
+ let _ungroupedSessionIds_extraInitializers = [];
78
85
  let _search_decorators;
79
86
  let _search_initializers = [];
80
87
  let _search_extraInitializers = [];
@@ -84,9 +91,24 @@ let DeesHarnessSessionList = (() => {
84
91
  let _dropSlot_decorators;
85
92
  let _dropSlot_initializers = [];
86
93
  let _dropSlot_extraInitializers = [];
94
+ let _draggedItemHeight_decorators;
95
+ let _draggedItemHeight_initializers = [];
96
+ let _draggedItemHeight_extraInitializers = [];
97
+ let _expandedSessionIds_decorators;
98
+ let _expandedSessionIds_initializers = [];
99
+ let _expandedSessionIds_extraInitializers = [];
87
100
  let _collapsedGroupIds_decorators;
88
101
  let _collapsedGroupIds_initializers = [];
89
102
  let _collapsedGroupIds_extraInitializers = [];
103
+ let _topScrollShadowVisible_decorators;
104
+ let _topScrollShadowVisible_initializers = [];
105
+ let _topScrollShadowVisible_extraInitializers = [];
106
+ let _bottomScrollShadowVisible_decorators;
107
+ let _bottomScrollShadowVisible_initializers = [];
108
+ let _bottomScrollShadowVisible_extraInitializers = [];
109
+ let _moveAnnouncement_decorators;
110
+ let _moveAnnouncement_initializers = [];
111
+ let _moveAnnouncement_extraInitializers = [];
90
112
  var DeesHarnessSessionList = class extends _classSuper {
91
113
  static { _classThis = this; }
92
114
  static {
@@ -97,20 +119,32 @@ let DeesHarnessSessionList = (() => {
97
119
  _emptyText_decorators = [property()];
98
120
  _groups_decorators = [property({ attribute: false })];
99
121
  _enableGrouping_decorators = [property({ type: Boolean })];
122
+ _ungroupedSessionIds_decorators = [property({ attribute: false })];
100
123
  _search_decorators = [state()];
101
124
  _draggingSessionId_decorators = [state()];
102
125
  _dropSlot_decorators = [state()];
126
+ _draggedItemHeight_decorators = [state()];
127
+ _expandedSessionIds_decorators = [state()];
103
128
  _collapsedGroupIds_decorators = [state()];
129
+ _topScrollShadowVisible_decorators = [state()];
130
+ _bottomScrollShadowVisible_decorators = [state()];
131
+ _moveAnnouncement_decorators = [state()];
104
132
  __esDecorate(this, null, _sessions_decorators, { kind: "accessor", name: "sessions", static: false, private: false, access: { has: obj => "sessions" in obj, get: obj => obj.sessions, set: (obj, value) => { obj.sessions = value; } }, metadata: _metadata }, _sessions_initializers, _sessions_extraInitializers);
105
133
  __esDecorate(this, null, _selectedSessionId_decorators, { kind: "accessor", name: "selectedSessionId", static: false, private: false, access: { has: obj => "selectedSessionId" in obj, get: obj => obj.selectedSessionId, set: (obj, value) => { obj.selectedSessionId = value; } }, metadata: _metadata }, _selectedSessionId_initializers, _selectedSessionId_extraInitializers);
106
134
  __esDecorate(this, null, _loading_decorators, { kind: "accessor", name: "loading", static: false, private: false, access: { has: obj => "loading" in obj, get: obj => obj.loading, set: (obj, value) => { obj.loading = value; } }, metadata: _metadata }, _loading_initializers, _loading_extraInitializers);
107
135
  __esDecorate(this, null, _emptyText_decorators, { kind: "accessor", name: "emptyText", static: false, private: false, access: { has: obj => "emptyText" in obj, get: obj => obj.emptyText, set: (obj, value) => { obj.emptyText = value; } }, metadata: _metadata }, _emptyText_initializers, _emptyText_extraInitializers);
108
136
  __esDecorate(this, null, _groups_decorators, { kind: "accessor", name: "groups", static: false, private: false, access: { has: obj => "groups" in obj, get: obj => obj.groups, set: (obj, value) => { obj.groups = value; } }, metadata: _metadata }, _groups_initializers, _groups_extraInitializers);
109
137
  __esDecorate(this, null, _enableGrouping_decorators, { kind: "accessor", name: "enableGrouping", static: false, private: false, access: { has: obj => "enableGrouping" in obj, get: obj => obj.enableGrouping, set: (obj, value) => { obj.enableGrouping = value; } }, metadata: _metadata }, _enableGrouping_initializers, _enableGrouping_extraInitializers);
138
+ __esDecorate(this, null, _ungroupedSessionIds_decorators, { kind: "accessor", name: "ungroupedSessionIds", static: false, private: false, access: { has: obj => "ungroupedSessionIds" in obj, get: obj => obj.ungroupedSessionIds, set: (obj, value) => { obj.ungroupedSessionIds = value; } }, metadata: _metadata }, _ungroupedSessionIds_initializers, _ungroupedSessionIds_extraInitializers);
110
139
  __esDecorate(this, null, _search_decorators, { kind: "accessor", name: "search", static: false, private: false, access: { has: obj => "search" in obj, get: obj => obj.search, set: (obj, value) => { obj.search = value; } }, metadata: _metadata }, _search_initializers, _search_extraInitializers);
111
140
  __esDecorate(this, null, _draggingSessionId_decorators, { kind: "accessor", name: "draggingSessionId", static: false, private: false, access: { has: obj => "draggingSessionId" in obj, get: obj => obj.draggingSessionId, set: (obj, value) => { obj.draggingSessionId = value; } }, metadata: _metadata }, _draggingSessionId_initializers, _draggingSessionId_extraInitializers);
112
141
  __esDecorate(this, null, _dropSlot_decorators, { kind: "accessor", name: "dropSlot", static: false, private: false, access: { has: obj => "dropSlot" in obj, get: obj => obj.dropSlot, set: (obj, value) => { obj.dropSlot = value; } }, metadata: _metadata }, _dropSlot_initializers, _dropSlot_extraInitializers);
142
+ __esDecorate(this, null, _draggedItemHeight_decorators, { kind: "accessor", name: "draggedItemHeight", static: false, private: false, access: { has: obj => "draggedItemHeight" in obj, get: obj => obj.draggedItemHeight, set: (obj, value) => { obj.draggedItemHeight = value; } }, metadata: _metadata }, _draggedItemHeight_initializers, _draggedItemHeight_extraInitializers);
143
+ __esDecorate(this, null, _expandedSessionIds_decorators, { kind: "accessor", name: "expandedSessionIds", static: false, private: false, access: { has: obj => "expandedSessionIds" in obj, get: obj => obj.expandedSessionIds, set: (obj, value) => { obj.expandedSessionIds = value; } }, metadata: _metadata }, _expandedSessionIds_initializers, _expandedSessionIds_extraInitializers);
113
144
  __esDecorate(this, null, _collapsedGroupIds_decorators, { kind: "accessor", name: "collapsedGroupIds", static: false, private: false, access: { has: obj => "collapsedGroupIds" in obj, get: obj => obj.collapsedGroupIds, set: (obj, value) => { obj.collapsedGroupIds = value; } }, metadata: _metadata }, _collapsedGroupIds_initializers, _collapsedGroupIds_extraInitializers);
145
+ __esDecorate(this, null, _topScrollShadowVisible_decorators, { kind: "accessor", name: "topScrollShadowVisible", static: false, private: false, access: { has: obj => "topScrollShadowVisible" in obj, get: obj => obj.topScrollShadowVisible, set: (obj, value) => { obj.topScrollShadowVisible = value; } }, metadata: _metadata }, _topScrollShadowVisible_initializers, _topScrollShadowVisible_extraInitializers);
146
+ __esDecorate(this, null, _bottomScrollShadowVisible_decorators, { kind: "accessor", name: "bottomScrollShadowVisible", static: false, private: false, access: { has: obj => "bottomScrollShadowVisible" in obj, get: obj => obj.bottomScrollShadowVisible, set: (obj, value) => { obj.bottomScrollShadowVisible = value; } }, metadata: _metadata }, _bottomScrollShadowVisible_initializers, _bottomScrollShadowVisible_extraInitializers);
147
+ __esDecorate(this, null, _moveAnnouncement_decorators, { kind: "accessor", name: "moveAnnouncement", static: false, private: false, access: { has: obj => "moveAnnouncement" in obj, get: obj => obj.moveAnnouncement, set: (obj, value) => { obj.moveAnnouncement = value; } }, metadata: _metadata }, _moveAnnouncement_initializers, _moveAnnouncement_extraInitializers);
114
148
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
115
149
  DeesHarnessSessionList = _classThis = _classDescriptor.value;
116
150
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
@@ -135,7 +169,11 @@ let DeesHarnessSessionList = (() => {
135
169
  #enableGrouping_accessor_storage = (__runInitializers(this, _groups_extraInitializers), __runInitializers(this, _enableGrouping_initializers, false));
136
170
  get enableGrouping() { return this.#enableGrouping_accessor_storage; }
137
171
  set enableGrouping(value) { this.#enableGrouping_accessor_storage = value; }
138
- #search_accessor_storage = (__runInitializers(this, _enableGrouping_extraInitializers), __runInitializers(this, _search_initializers, ''));
172
+ #ungroupedSessionIds_accessor_storage = (__runInitializers(this, _enableGrouping_extraInitializers), __runInitializers(this, _ungroupedSessionIds_initializers, []));
173
+ /** Explicit order for sortable sessions outside user-defined groups. */
174
+ get ungroupedSessionIds() { return this.#ungroupedSessionIds_accessor_storage; }
175
+ set ungroupedSessionIds(value) { this.#ungroupedSessionIds_accessor_storage = value; }
176
+ #search_accessor_storage = (__runInitializers(this, _ungroupedSessionIds_extraInitializers), __runInitializers(this, _search_initializers, ''));
139
177
  get search() { return this.#search_accessor_storage; }
140
178
  set search(value) { this.#search_accessor_storage = value; }
141
179
  #draggingSessionId_accessor_storage = (__runInitializers(this, _search_extraInitializers), __runInitializers(this, _draggingSessionId_initializers, ''));
@@ -144,9 +182,36 @@ let DeesHarnessSessionList = (() => {
144
182
  #dropSlot_accessor_storage = (__runInitializers(this, _draggingSessionId_extraInitializers), __runInitializers(this, _dropSlot_initializers, undefined));
145
183
  get dropSlot() { return this.#dropSlot_accessor_storage; }
146
184
  set dropSlot(value) { this.#dropSlot_accessor_storage = value; }
147
- #collapsedGroupIds_accessor_storage = (__runInitializers(this, _dropSlot_extraInitializers), __runInitializers(this, _collapsedGroupIds_initializers, new Set()));
185
+ #draggedItemHeight_accessor_storage = (__runInitializers(this, _dropSlot_extraInitializers), __runInitializers(this, _draggedItemHeight_initializers, 0));
186
+ get draggedItemHeight() { return this.#draggedItemHeight_accessor_storage; }
187
+ set draggedItemHeight(value) { this.#draggedItemHeight_accessor_storage = value; }
188
+ #expandedSessionIds_accessor_storage = (__runInitializers(this, _draggedItemHeight_extraInitializers), __runInitializers(this, _expandedSessionIds_initializers, new Set()));
189
+ get expandedSessionIds() { return this.#expandedSessionIds_accessor_storage; }
190
+ set expandedSessionIds(value) { this.#expandedSessionIds_accessor_storage = value; }
191
+ #collapsedGroupIds_accessor_storage = (__runInitializers(this, _expandedSessionIds_extraInitializers), __runInitializers(this, _collapsedGroupIds_initializers, new Set()));
148
192
  get collapsedGroupIds() { return this.#collapsedGroupIds_accessor_storage; }
149
193
  set collapsedGroupIds(value) { this.#collapsedGroupIds_accessor_storage = value; }
194
+ #topScrollShadowVisible_accessor_storage = (__runInitializers(this, _collapsedGroupIds_extraInitializers), __runInitializers(this, _topScrollShadowVisible_initializers, false));
195
+ get topScrollShadowVisible() { return this.#topScrollShadowVisible_accessor_storage; }
196
+ set topScrollShadowVisible(value) { this.#topScrollShadowVisible_accessor_storage = value; }
197
+ #bottomScrollShadowVisible_accessor_storage = (__runInitializers(this, _topScrollShadowVisible_extraInitializers), __runInitializers(this, _bottomScrollShadowVisible_initializers, false));
198
+ get bottomScrollShadowVisible() { return this.#bottomScrollShadowVisible_accessor_storage; }
199
+ set bottomScrollShadowVisible(value) { this.#bottomScrollShadowVisible_accessor_storage = value; }
200
+ #moveAnnouncement_accessor_storage = (__runInitializers(this, _bottomScrollShadowVisible_extraInitializers), __runInitializers(this, _moveAnnouncement_initializers, ''));
201
+ get moveAnnouncement() { return this.#moveAnnouncement_accessor_storage; }
202
+ set moveAnnouncement(value) { this.#moveAnnouncement_accessor_storage = value; }
203
+ reflowGeneration = (__runInitializers(this, _moveAnnouncement_extraInitializers), 0);
204
+ reflowAnimations = new Set();
205
+ pointerDragGesture;
206
+ keyboardMoveFocus;
207
+ scrollResizeObserver;
208
+ observedScrollContainer;
209
+ observedScrollContent;
210
+ dragAutoScrollFrame;
211
+ dragAutoScrollClientX = 0;
212
+ dragAutoScrollClientY = 0;
213
+ dragAutoScrollVelocity = 0;
214
+ dragAutoScrollLastFrame = 0;
150
215
  static styles = [
151
216
  themeDefaultStyles,
152
217
  cssManager.defaultStyles,
@@ -156,26 +221,48 @@ let DeesHarnessSessionList = (() => {
156
221
  flex-direction: column;
157
222
  min-height: 0;
158
223
  font-family: var(--dees-font-family);
224
+ --session-normal: var(--dees-color-text-muted);
225
+ --session-working: var(--dees-color-accent-primary);
226
+ --session-finished: var(--dees-color-accent-success);
227
+ --session-attention: #bf5af2;
228
+ --session-error: var(--dees-color-accent-error);
229
+ }
230
+
231
+ :host([gobright]) {
232
+ --session-attention: #af52de;
159
233
  }
160
234
 
161
235
  .searchRow {
236
+ position: relative;
162
237
  flex: 0 0 auto;
163
- padding: var(--dees-spacing-sm);
238
+ padding: var(--dees-spacing-sm) var(--dees-spacing-md) var(--dees-spacing-md);
239
+ }
240
+
241
+ .searchIcon {
242
+ position: absolute;
243
+ top: 50%;
244
+ left: calc(var(--dees-spacing-md) + 10px);
245
+ color: var(--dees-color-text-muted);
246
+ transform: translateY(-62%);
247
+ pointer-events: none;
164
248
  }
165
249
 
166
250
  .searchRow input {
167
251
  width: 100%;
168
- height: var(--dees-control-height-sm);
169
- padding: 0 var(--dees-spacing-md);
252
+ height: var(--dees-control-height-lg);
253
+ padding: 0 var(--dees-spacing-md) 0 34px;
170
254
  border: 1px solid var(--dees-color-border-default);
171
- border-radius: var(--dees-radius-md);
255
+ border-radius: var(--dees-radius-lg);
172
256
  corner-shape: var(--dees-corner-shape);
173
- background: var(--dees-color-bg-primary);
257
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 78%, transparent);
174
258
  color: var(--dees-color-text-primary);
175
259
  font-family: inherit;
176
- font-size: var(--dees-font-control-size, 13px);
260
+ font-size: var(--dees-font-control-size-sm, 12px);
177
261
  outline: none;
178
262
  box-sizing: border-box;
263
+ box-shadow: var(--dees-shadow-xs);
264
+ transition: border-color var(--dees-transition-fast) var(--dees-ease-standard),
265
+ box-shadow var(--dees-transition-fast) var(--dees-ease-standard);
179
266
  }
180
267
 
181
268
  .searchRow input:focus {
@@ -184,51 +271,253 @@ let DeesHarnessSessionList = (() => {
184
271
  }
185
272
 
186
273
  .list {
187
- flex: 1;
188
- min-height: 0;
274
+ width: 100%;
275
+ height: 100%;
189
276
  overflow-y: auto;
190
277
  scrollbar-width: thin;
191
278
  scrollbar-color: var(--dees-color-scrollbar-thumb) transparent;
192
- padding: 0 var(--dees-spacing-xs) var(--dees-spacing-xs);
279
+ padding: 0 var(--dees-spacing-md) var(--dees-spacing-md);
280
+ box-sizing: border-box;
281
+ }
282
+
283
+ .listFrame {
284
+ position: relative;
285
+ flex: 1;
286
+ min-height: 0;
287
+ }
288
+
289
+ .scrollShadow {
290
+ position: absolute;
291
+ z-index: 1;
292
+ left: 0;
293
+ right: 0;
294
+ height: 16px;
295
+ opacity: 0;
296
+ pointer-events: none;
297
+ transition: opacity var(--dees-transition-fast) var(--dees-ease-standard);
298
+ }
299
+
300
+ .scrollShadow.visible {
301
+ opacity: 1;
302
+ }
303
+
304
+ .scrollShadow.top {
305
+ top: 0;
306
+ background: linear-gradient(
307
+ to bottom,
308
+ color-mix(in srgb, var(--dees-material-thin-bg-opaque) 74%, transparent),
309
+ transparent
310
+ );
311
+ box-shadow: var(--dees-shadow-sm);
312
+ }
313
+
314
+ .scrollShadow.bottom {
315
+ bottom: 0;
316
+ background: linear-gradient(
317
+ to top,
318
+ color-mix(in srgb, var(--dees-material-thin-bg-opaque) 74%, transparent),
319
+ transparent
320
+ );
321
+ box-shadow: var(--dees-shadow-up-sm);
322
+ }
323
+
324
+ .section {
325
+ position: relative;
193
326
  display: grid;
194
- gap: 2px;
327
+ gap: var(--dees-spacing-sm);
195
328
  align-content: start;
196
329
  }
197
330
 
198
331
  .item {
332
+ --card-accent: var(--session-normal);
333
+ position: relative;
199
334
  width: 100%;
200
- display: block;
201
- padding: var(--dees-spacing-xs) var(--dees-spacing-sm);
202
- border: 0;
203
- border-radius: var(--dees-radius-md);
335
+ min-width: 0;
336
+ overflow: hidden;
337
+ border: 1px solid color-mix(in srgb, var(--card-accent) 24%, var(--dees-color-border-subtle));
338
+ border-radius: var(--dees-radius-xl);
204
339
  corner-shape: var(--dees-corner-shape);
205
- background: transparent;
340
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 90%, transparent);
206
341
  color: var(--dees-color-text-primary);
207
- cursor: pointer;
208
- font-family: inherit;
209
- text-align: left;
210
- transition: background var(--dees-transition-fast) var(--dees-ease-standard);
342
+ box-shadow:
343
+ var(--dees-shadow-sm),
344
+ inset 3px 0 0 var(--card-accent);
345
+ box-sizing: border-box;
346
+ transition:
347
+ border-color var(--dees-transition-fast) var(--dees-ease-standard),
348
+ background var(--dees-transition-fast) var(--dees-ease-standard),
349
+ box-shadow var(--dees-transition-fast) var(--dees-ease-standard);
211
350
  }
212
351
 
213
352
  .item:hover {
214
- background: var(--dees-color-hover);
353
+ border-color: color-mix(in srgb, var(--card-accent) 42%, var(--dees-color-border-default));
354
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 90%, var(--card-accent) 10%);
355
+ box-shadow:
356
+ var(--dees-shadow-md),
357
+ inset 3px 0 0 var(--card-accent);
215
358
  }
216
359
 
217
360
  .item.selected {
218
- background: var(--dees-color-active);
219
- box-shadow: inset 2px 0 0 var(--dees-color-accent-primary);
361
+ border-color: var(--dees-color-border-default);
362
+ border-left-color: var(--dees-color-accent-primary);
363
+ border-left-width: 3px;
364
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 90%, transparent);
365
+ box-shadow: var(--dees-shadow-md);
366
+ }
367
+
368
+ .item.selected:hover {
369
+ border-color: var(--dees-color-border-default);
370
+ border-left-color: var(--dees-color-accent-primary);
371
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 90%, transparent);
372
+ box-shadow: var(--dees-shadow-md);
373
+ }
374
+
375
+ .item.selected .titleText {
376
+ font-weight: 700;
220
377
  }
221
378
 
222
379
  .item.dragging {
223
- opacity: 0.4;
380
+ position: fixed;
381
+ inset: 0 auto auto 0;
382
+ width: var(--drag-preview-width);
383
+ height: var(--drag-preview-height);
384
+ max-width: none;
385
+ margin: 0;
386
+ padding: 0;
387
+ opacity: 0.96;
388
+ pointer-events: none;
389
+ transform: translate3d(var(--drag-preview-x), var(--drag-preview-y), 0);
390
+ box-shadow: var(--dees-shadow-xl);
224
391
  }
225
392
 
226
- .itemTitle {
393
+ .item.state-working {
394
+ --card-accent: var(--session-working);
395
+ }
396
+
397
+ @keyframes workingDotPulse {
398
+ 0%, 100% {
399
+ transform: scale(0.92);
400
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--session-working) 14%, transparent);
401
+ }
402
+ 50% {
403
+ transform: scale(1.08);
404
+ box-shadow: 0 0 0 6px color-mix(in srgb, var(--session-working) 3%, transparent);
405
+ }
406
+ }
407
+
408
+ .item.state-working .itemHeader .stateDot {
409
+ animation: workingDotPulse 2.4s ease-in-out infinite;
410
+ }
411
+
412
+ .item.state-finished {
413
+ --card-accent: var(--session-finished);
414
+ }
415
+
416
+ .item.state-attention {
417
+ --card-accent: var(--session-attention);
418
+ }
419
+
420
+ .item.state-error {
421
+ --card-accent: var(--session-error);
422
+ }
423
+
424
+ @keyframes attentionPulse {
425
+ 0%, 100% {
426
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 94%, var(--session-attention) 6%);
427
+ }
428
+ 50% {
429
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 84%, var(--session-attention) 16%);
430
+ }
431
+ }
432
+
433
+ .item.state-attention:not(.selected) {
434
+ animation: attentionPulse 1.15s ease-in-out infinite;
435
+ }
436
+
437
+ .item.state-attention:not(.selected):hover {
438
+ animation: none;
439
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 82%, var(--session-attention) 18%);
440
+ }
441
+
442
+ .itemHeader {
443
+ display: grid;
444
+ grid-template-columns: minmax(0, 1fr) 30px;
445
+ min-height: 46px;
446
+ }
447
+
448
+ .itemHeader.draggable {
449
+ grid-template-columns: 24px minmax(0, 1fr) 30px;
450
+ }
451
+
452
+ .dragHandle {
453
+ appearance: none;
454
+ display: grid;
455
+ place-items: center;
456
+ padding: 0;
457
+ border: 0;
458
+ background: transparent;
459
+ color: var(--dees-color-text-muted);
460
+ cursor: grab;
461
+ touch-action: none;
462
+ }
463
+
464
+ .dragHandle:active {
465
+ cursor: grabbing;
466
+ }
467
+
468
+ .dragHandle:focus-visible {
469
+ outline: 2px solid var(--dees-color-accent-primary);
470
+ outline-offset: -3px;
471
+ border-radius: 8px;
472
+ }
473
+
474
+ .itemPrimary,
475
+ .expandToggle {
476
+ appearance: none;
477
+ border: 0;
478
+ background: transparent;
479
+ color: inherit;
480
+ font-family: inherit;
481
+ }
482
+
483
+ .itemPrimary {
227
484
  display: flex;
228
- align-items: baseline;
485
+ min-width: 0;
486
+ align-items: center;
229
487
  gap: var(--dees-spacing-sm);
488
+ padding: var(--dees-spacing-sm) var(--dees-spacing-xs) var(--dees-spacing-sm) var(--dees-spacing-md);
489
+ text-align: left;
490
+ cursor: pointer;
491
+ }
492
+
493
+ .itemPrimary:focus-visible,
494
+ .expandToggle:focus-visible {
495
+ outline: 2px solid var(--dees-color-accent-primary);
496
+ outline-offset: -3px;
497
+ border-radius: 9px;
498
+ }
499
+
500
+ .stateDot {
501
+ width: 8px;
502
+ height: 8px;
503
+ flex: 0 0 auto;
504
+ border-radius: 50%;
505
+ background: var(--card-accent);
506
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--card-accent) 15%, transparent);
507
+ }
508
+
509
+ .itemCopy {
510
+ min-width: 0;
511
+ flex: 1;
512
+ }
513
+
514
+ .itemTitle {
515
+ display: flex;
516
+ min-width: 0;
517
+ align-items: center;
518
+ gap: 6px;
230
519
  font-size: var(--dees-font-control-size-sm, 12px);
231
- font-weight: 500;
520
+ font-weight: 590;
232
521
  }
233
522
 
234
523
  .itemTitle .titleText {
@@ -240,24 +529,99 @@ let DeesHarnessSessionList = (() => {
240
529
 
241
530
  .itemTitle .itemIcon {
242
531
  flex: 0 0 auto;
243
- align-self: center;
244
532
  color: var(--dees-color-text-secondary);
245
533
  }
246
534
 
247
535
  .itemTime {
248
- margin-left: auto;
249
- flex: 0 0 auto;
536
+ margin-top: 2px;
250
537
  color: var(--dees-color-text-muted);
251
538
  font-size: var(--dees-font-caption2-size, 10px);
252
539
  }
253
540
 
541
+ .expandToggle {
542
+ display: grid;
543
+ place-items: center;
544
+ margin: 7px 7px 7px 0;
545
+ border-radius: 9px;
546
+ color: var(--dees-color-text-muted);
547
+ cursor: pointer;
548
+ }
549
+
550
+ .expandToggle:hover {
551
+ background: color-mix(in srgb, var(--card-accent) 11%, transparent);
552
+ color: var(--dees-color-text-primary);
553
+ }
554
+
555
+ .expandToggle dees-icon {
556
+ transition: transform var(--dees-transition-fast) var(--dees-ease-standard);
557
+ }
558
+
559
+ .item.expanded .expandToggle dees-icon {
560
+ transform: rotate(180deg);
561
+ }
562
+
563
+ .itemDetails {
564
+ display: grid;
565
+ gap: 6px;
566
+ margin: 0 10px 10px 28px;
567
+ padding: 9px 10px;
568
+ border-top: 1px solid color-mix(in srgb, var(--card-accent) 20%, var(--dees-color-border-subtle));
569
+ color: var(--dees-color-text-secondary);
570
+ }
571
+
572
+ .stateLine {
573
+ display: flex;
574
+ align-items: center;
575
+ gap: 6px;
576
+ color: var(--card-accent);
577
+ font-size: var(--dees-font-caption1-size, 11px);
578
+ font-weight: 650;
579
+ }
580
+
254
581
  .itemPreview {
255
- margin-top: 1px;
256
582
  color: var(--dees-color-text-secondary);
257
583
  font-size: var(--dees-font-caption1-size, 11px);
258
584
  overflow: hidden;
259
- text-overflow: ellipsis;
585
+ display: -webkit-box;
586
+ -webkit-line-clamp: 2;
587
+ -webkit-box-orient: vertical;
588
+ }
589
+
590
+ .itemMeta {
591
+ color: var(--dees-color-text-muted);
592
+ font-size: var(--dees-font-caption2-size, 10px);
593
+ }
594
+
595
+ .visuallyHidden {
596
+ position: absolute;
597
+ width: 1px;
598
+ height: 1px;
599
+ padding: 0;
600
+ margin: -1px;
601
+ overflow: hidden;
602
+ clip: rect(0, 0, 0, 0);
260
603
  white-space: nowrap;
604
+ border: 0;
605
+ }
606
+
607
+ .dropPlaceholder,
608
+ .emptyDropZone {
609
+ display: grid;
610
+ place-items: center;
611
+ min-height: 46px;
612
+ border: 1px dashed color-mix(in srgb, var(--dees-color-accent-primary) 68%, transparent);
613
+ border-radius: var(--dees-radius-xl);
614
+ background: color-mix(in srgb, var(--dees-color-accent-primary) 8%, transparent);
615
+ color: var(--dees-color-accent-primary);
616
+ box-sizing: border-box;
617
+ }
618
+
619
+ .dropPlaceholder::after,
620
+ .emptyDropZone::after {
621
+ content: 'Drop conversation here';
622
+ font-size: var(--dees-font-caption2-size, 10px);
623
+ font-weight: 650;
624
+ letter-spacing: 0.02em;
261
625
  }
262
626
 
263
627
  .emptyNote {
@@ -272,8 +636,8 @@ let DeesHarnessSessionList = (() => {
272
636
  align-items: center;
273
637
  gap: var(--dees-spacing-xs);
274
638
  width: 100%;
275
- margin-top: var(--dees-spacing-xs);
276
- padding: 2px var(--dees-spacing-sm);
639
+ margin: var(--dees-spacing-md) 0 7px;
640
+ padding: var(--dees-spacing-xs) 6px;
277
641
  border: 0;
278
642
  border-radius: var(--dees-radius-md);
279
643
  background: transparent;
@@ -313,15 +677,12 @@ let DeesHarnessSessionList = (() => {
313
677
  }
314
678
 
315
679
  .dropLine {
316
- height: 2px;
317
- margin: 0 var(--dees-spacing-sm);
318
- border-radius: 1px;
319
- background: var(--dees-color-accent-primary);
680
+ display: none;
320
681
  }
321
682
 
322
683
  .newGroupRow {
323
684
  flex: 0 0 auto;
324
- padding: var(--dees-spacing-xs) var(--dees-spacing-sm) var(--dees-spacing-sm);
685
+ padding: 0 var(--dees-spacing-md) var(--dees-spacing-md);
325
686
  }
326
687
 
327
688
  .newGroupButton {
@@ -329,10 +690,12 @@ let DeesHarnessSessionList = (() => {
329
690
  align-items: center;
330
691
  gap: var(--dees-spacing-xs);
331
692
  width: 100%;
693
+ min-height: 34px;
694
+ justify-content: center;
332
695
  padding: var(--dees-spacing-xs) var(--dees-spacing-sm);
333
696
  border: 1px dashed var(--dees-color-border-default);
334
- border-radius: var(--dees-radius-md);
335
- background: transparent;
697
+ border-radius: 11px;
698
+ background: color-mix(in srgb, var(--dees-color-bg-primary) 55%, transparent);
336
699
  color: var(--dees-color-text-secondary);
337
700
  cursor: pointer;
338
701
  font-family: inherit;
@@ -343,6 +706,17 @@ let DeesHarnessSessionList = (() => {
343
706
  border-color: var(--dees-color-accent-primary);
344
707
  color: var(--dees-color-text-primary);
345
708
  }
709
+
710
+ @media (prefers-reduced-motion: reduce) {
711
+ .item,
712
+ .item.state-attention,
713
+ .item.state-working .itemHeader .stateDot,
714
+ .scrollShadow,
715
+ .expandToggle dees-icon {
716
+ animation: none;
717
+ transition: none;
718
+ }
719
+ }
346
720
  `,
347
721
  ];
348
722
  get sessionsById() {
@@ -356,12 +730,22 @@ let DeesHarnessSessionList = (() => {
356
730
  }
357
731
  return ids;
358
732
  }
359
- /** Ungrouped sessions, most recent first. */
733
+ /** Pinned entries first, followed by explicitly ordered sortable sessions. */
360
734
  get ungroupedSessions() {
361
735
  const grouped = this.groupedSessionIds;
362
- return [...this.sessions]
363
- .filter((session) => !grouped.has(session.id))
364
- .sort((left, right) => (right.updatedAt ?? right.createdAt ?? 0) - (left.updatedAt ?? left.createdAt ?? 0));
736
+ const available = this.sessions.filter((session) => !grouped.has(session.id));
737
+ const pinned = available.filter((session) => session.draggable === false);
738
+ const sortableById = new Map(available.filter((session) => session.draggable !== false).map((session) => [session.id, session]));
739
+ const ordered = [];
740
+ for (const sessionId of this.ungroupedSessionIds) {
741
+ const session = sortableById.get(sessionId);
742
+ if (!session)
743
+ continue;
744
+ ordered.push(session);
745
+ sortableById.delete(sessionId);
746
+ }
747
+ const newSessions = [...sortableById.values()].sort((left, right) => (right.updatedAt ?? right.createdAt ?? 0) - (left.updatedAt ?? left.createdAt ?? 0));
748
+ return [...pinned, ...ordered, ...newSessions];
365
749
  }
366
750
  get filteredSessions() {
367
751
  const query = this.search.trim().toLowerCase();
@@ -373,10 +757,56 @@ let DeesHarnessSessionList = (() => {
373
757
  focusSearch() {
374
758
  this.shadowRoot?.querySelector('.searchRow input')?.focus();
375
759
  }
760
+ updated(changedProperties) {
761
+ super.updated(changedProperties);
762
+ this.observeScrollGeometry();
763
+ this.syncScrollShadowState();
764
+ this.restoreKeyboardMoveFocus();
765
+ if (this.pointerDragGesture
766
+ && (!this.pointerDragGesture.source.isConnected || !this.pointerDragGesture.handle.isConnected)) {
767
+ this.finishPointerDrag(false);
768
+ }
769
+ if (!changedProperties.has('sessions'))
770
+ return;
771
+ const previousSessions = changedProperties.get('sessions');
772
+ const previousById = new Map((previousSessions ?? []).map((session) => [session.id, session]));
773
+ const knownIds = new Set(this.sessions.map((session) => session.id));
774
+ if (this.pointerDragGesture && !knownIds.has(this.pointerDragGesture.sessionId)) {
775
+ this.finishPointerDrag(false);
776
+ }
777
+ const nextExpanded = new Set([...this.expandedSessionIds].filter((sessionId) => knownIds.has(sessionId)));
778
+ for (const session of this.sessions) {
779
+ const previous = previousById.get(session.id);
780
+ if (previous && previous.working !== true && session.working === true) {
781
+ nextExpanded.add(session.id);
782
+ }
783
+ }
784
+ if (nextExpanded.size !== this.expandedSessionIds.size
785
+ || [...nextExpanded].some((sessionId) => !this.expandedSessionIds.has(sessionId))) {
786
+ this.expandedSessionIds = nextExpanded;
787
+ }
788
+ }
789
+ async connectedCallback() {
790
+ await super.connectedCallback();
791
+ await this.updateComplete;
792
+ if (!this.isConnected)
793
+ return;
794
+ this.observeScrollGeometry();
795
+ this.syncScrollShadowState();
796
+ }
797
+ async disconnectedCallback() {
798
+ this.finishPointerDrag(false);
799
+ this.scrollResizeObserver?.disconnect();
800
+ this.scrollResizeObserver = undefined;
801
+ this.observedScrollContainer = undefined;
802
+ this.observedScrollContent = undefined;
803
+ await super.disconnectedCallback();
804
+ }
376
805
  render() {
377
806
  const groupingActive = this.enableGrouping && !this.search.trim();
378
807
  return html `
379
808
  <div class="searchRow">
809
+ <dees-icon class="searchIcon" icon="lucide:Search" iconSize="13"></dees-icon>
380
810
  <input
381
811
  placeholder="Search conversations"
382
812
  .value=${this.search}
@@ -385,13 +815,23 @@ let DeesHarnessSessionList = (() => {
385
815
  }}
386
816
  />
387
817
  </div>
388
- <div class="list">
389
- ${this.loading
818
+ <div class="listFrame">
819
+ <div class="scrollShadow top ${this.topScrollShadowVisible ? 'visible' : ''}"></div>
820
+ <div
821
+ class="list"
822
+ @scroll=${this.syncScrollShadowState}
823
+ >
824
+ <div class="listContent">
825
+ ${this.loading
390
826
  ? html `<div class="emptyNote">Loading conversations…</div>`
391
827
  : groupingActive
392
828
  ? this.renderGroupedList()
393
829
  : this.renderFlatList()}
830
+ </div>
831
+ </div>
832
+ <div class="scrollShadow bottom ${this.bottomScrollShadowVisible ? 'visible' : ''}"></div>
394
833
  </div>
834
+ <div class="visuallyHidden" aria-live="polite">${this.moveAnnouncement}</div>
395
835
  ${groupingActive
396
836
  ? html `
397
837
  <div class="newGroupRow">
@@ -420,7 +860,11 @@ let DeesHarnessSessionList = (() => {
420
860
  ${this.sessions.length ? 'No conversations match this search.' : this.emptyText}
421
861
  </div>`;
422
862
  }
423
- return html `${sessions.map((session) => this.renderItem(session, null, -1))}`;
863
+ return html `
864
+ <div class="section">
865
+ ${repeat(sessions, (session) => session.id, (session) => this.renderItem(session, null, -1))}
866
+ </div>
867
+ `;
424
868
  }
425
869
  renderGroupedList() {
426
870
  const byId = this.sessionsById;
@@ -434,10 +878,15 @@ let DeesHarnessSessionList = (() => {
434
878
  .map((id) => byId.get(id))
435
879
  .filter((session) => session !== undefined);
436
880
  const collapsed = this.collapsedGroupIds.has(group.id);
437
- const isHeaderDrop = this.dropSlot?.groupId === group.id && this.dropSlot.index === members.length && collapsed;
881
+ const isHeaderDrop = this.dropSlot?.groupId === group.id
882
+ && this.dropSlot.index === this.sortableSessions(members).length
883
+ && collapsed;
438
884
  return html `
439
885
  <button
440
886
  class="groupHeader ${collapsed ? 'collapsed' : ''} ${isHeaderDrop ? 'dropTarget' : ''}"
887
+ data-drop-group-id=${group.id}
888
+ data-drop-index=${this.sortableSessions(members).length}
889
+ data-drop-kind="slot"
441
890
  type="button"
442
891
  @click=${() => this.toggleGroupCollapsed(group.id)}
443
892
  @contextmenu=${(event) => {
@@ -450,8 +899,6 @@ let DeesHarnessSessionList = (() => {
450
899
  };
451
900
  this.dispatchEvent(new CustomEvent('harness-group-context', { detail, bubbles: true, composed: true }));
452
901
  }}
453
- @dragover=${(event) => this.handleDragOverSlot(event, group.id, members.length)}
454
- @drop=${(event) => this.handleDrop(event, group.id, members.length)}
455
902
  >
456
903
  <dees-icon class="chevron" icon="lucide:ChevronDown" iconSize="12"></dees-icon>
457
904
  <span>${group.name}</span>
@@ -462,14 +909,15 @@ let DeesHarnessSessionList = (() => {
462
909
  : this.renderSection(members, group.id)}
463
910
  `;
464
911
  })}
465
- ${this.groups.length && ungrouped.length
912
+ ${this.groups.length && (ungrouped.length || this.draggingSessionId)
466
913
  ? html `
467
914
  <button
468
915
  class="groupHeader"
916
+ data-drop-group-id=""
917
+ data-drop-index="0"
918
+ data-drop-kind="slot"
469
919
  type="button"
470
920
  tabindex="-1"
471
- @dragover=${(event) => this.handleDragOverSlot(event, null, 0)}
472
- @drop=${(event) => this.handleDrop(event, null, 0)}
473
921
  >
474
922
  <span>Ungrouped</span>
475
923
  <span class="groupCount">${ungrouped.length}</span>
@@ -481,32 +929,83 @@ let DeesHarnessSessionList = (() => {
481
929
  }
482
930
  renderSection(sessions, groupId) {
483
931
  const slot = this.dropSlot;
932
+ const entries = [];
933
+ let logicalIndex = 0;
934
+ for (const session of sessions) {
935
+ const isDragging = session.id === this.draggingSessionId;
936
+ const sortable = session.draggable !== false;
937
+ if (slot
938
+ && slot.groupId === groupId
939
+ && slot.index === logicalIndex
940
+ && !isDragging
941
+ && sortable) {
942
+ entries.push({ type: 'placeholder', key: `placeholder:${groupId ?? 'ungrouped'}` });
943
+ }
944
+ entries.push({
945
+ type: 'session',
946
+ key: `session:${session.id}`,
947
+ session,
948
+ logicalIndex: sortable ? logicalIndex : -1,
949
+ });
950
+ if (sortable && !isDragging)
951
+ logicalIndex += 1;
952
+ }
953
+ if (slot && slot.groupId === groupId && slot.index === logicalIndex) {
954
+ entries.push({ type: 'placeholder', key: `placeholder:${groupId ?? 'ungrouped'}` });
955
+ }
956
+ const hasPlaceholder = entries.some((entry) => entry.type === 'placeholder');
484
957
  return html `
485
- ${sessions.map((session, index) => html `
486
- ${slot && slot.groupId === groupId && slot.index === index
487
- ? html `<div class="dropLine"></div>`
488
- : ''}
489
- ${this.renderItem(session, groupId, index)}
490
- `)}
491
- ${slot && slot.groupId === groupId && slot.index === sessions.length
492
- ? html `<div class="dropLine"></div>`
958
+ <div class="section" data-group-id=${groupId ?? ''}>
959
+ ${repeat(entries, (entry) => entry.key, (entry) => entry.type === 'placeholder'
960
+ ? this.renderDropPlaceholder(groupId, slot?.index ?? 0)
961
+ : this.renderItem(entry.session, groupId, entry.logicalIndex))}
962
+ ${this.draggingSessionId && !hasPlaceholder && this.sortableSessions(sessions).length === 0
963
+ ? html `
964
+ <div
965
+ class="emptyDropZone"
966
+ data-drop-group-id=${groupId ?? ''}
967
+ data-drop-index="0"
968
+ data-drop-kind="slot"
969
+ ></div>
970
+ `
493
971
  : ''}
972
+ </div>
973
+ `;
974
+ }
975
+ renderDropPlaceholder(groupId, index) {
976
+ return html `
977
+ <div
978
+ class="dropPlaceholder"
979
+ data-drop-group-id=${groupId ?? ''}
980
+ data-drop-index=${index}
981
+ data-drop-kind="slot"
982
+ style=${`height: ${Math.max(46, this.draggedItemHeight)}px`}
983
+ ></div>
494
984
  `;
495
985
  }
496
986
  renderItem(session, groupId, index) {
497
- const draggable = this.enableGrouping && index >= 0;
987
+ const draggable = (this.enableGrouping
988
+ && session.draggable !== false
989
+ && index >= 0);
990
+ const expanded = this.expandedSessionIds.has(session.id);
991
+ const state = session.state ?? 'normal';
992
+ const detailsId = `session-details-${session.id}`;
993
+ const dropIndex = index < 0 ? 0 : index;
498
994
  return html `
499
- <button
500
- class="item ${session.id === this.selectedSessionId ? 'selected' : ''} ${this.draggingSessionId === session.id ? 'dragging' : ''}"
501
- type="button"
502
- draggable=${draggable ? 'true' : 'false'}
503
- @click=${() => this.emit('harness-session-select', session)}
504
- @dblclick=${() => this.emit('harness-session-open', session)}
505
- @keydown=${(event) => {
506
- if (event.key === 'Enter')
507
- this.emit('harness-session-open', session);
995
+ <article
996
+ class="item state-${state} ${expanded ? 'expanded' : ''} ${session.id === this.selectedSessionId ? 'selected' : ''} ${this.draggingSessionId === session.id ? 'dragging' : ''}"
997
+ data-session-id=${session.id}
998
+ data-drop-group-id=${groupId ?? ''}
999
+ data-drop-index=${dropIndex}
1000
+ data-drop-kind=${index < 0 ? 'slot' : 'card'}
1001
+ @dblclick=${(event) => {
1002
+ if (this.eventTargetsExpandToggle(event) || this.eventTargetsDragHandle(event))
1003
+ return;
1004
+ this.emit('harness-session-open', session);
508
1005
  }}
509
1006
  @contextmenu=${(event) => {
1007
+ if (this.eventTargetsExpandToggle(event))
1008
+ return;
510
1009
  event.preventDefault();
511
1010
  const detail = {
512
1011
  session,
@@ -516,47 +1015,109 @@ let DeesHarnessSessionList = (() => {
516
1015
  };
517
1016
  this.dispatchEvent(new CustomEvent('harness-session-context', { detail, bubbles: true, composed: true }));
518
1017
  }}
519
- @dragstart=${(event) => {
520
- if (!draggable)
521
- return;
522
- this.draggingSessionId = session.id;
523
- event.dataTransfer?.setData('text/plain', session.id);
524
- if (event.dataTransfer)
525
- event.dataTransfer.effectAllowed = 'move';
526
- }}
527
- @dragend=${() => {
528
- this.draggingSessionId = '';
529
- this.dropSlot = undefined;
530
- }}
531
- @dragover=${(event) => {
532
- if (!this.draggingSessionId || index < 0)
1018
+ >
1019
+ <div class="itemHeader ${draggable ? 'draggable' : ''}">
1020
+ ${draggable
1021
+ ? html `
1022
+ <button
1023
+ class="dragHandle"
1024
+ type="button"
1025
+ title="Drag to reorder; use arrow, Home, or End keys for keyboard reordering"
1026
+ aria-label=${`Reorder ${session.title || session.id}`}
1027
+ aria-keyshortcuts="ArrowUp ArrowDown Home End"
1028
+ @pointerdown=${(event) => {
1029
+ this.handlePointerDown(event, session, groupId, index);
1030
+ }}
1031
+ @pointermove=${this.handlePointerMove}
1032
+ @pointerup=${this.handlePointerUp}
1033
+ @pointercancel=${this.handlePointerCancel}
1034
+ @lostpointercapture=${this.handleLostPointerCapture}
1035
+ @keydown=${(event) => {
1036
+ this.handleKeyboardMove(event, session, groupId);
1037
+ }}
1038
+ >
1039
+ <dees-icon icon="lucide:GripVertical" iconSize="14"></dees-icon>
1040
+ </button>
1041
+ `
1042
+ : ''}
1043
+ <button
1044
+ class="itemPrimary"
1045
+ type="button"
1046
+ aria-current=${session.id === this.selectedSessionId ? 'true' : 'false'}
1047
+ @click=${() => this.emit('harness-session-select', session)}
1048
+ @keydown=${(event) => {
1049
+ if (event.key !== 'Enter')
533
1050
  return;
534
1051
  event.preventDefault();
535
- const rect = event.currentTarget.getBoundingClientRect();
536
- const before = event.clientY < rect.top + rect.height / 2;
537
- this.setDropSlot(groupId, before ? index : index + 1);
538
- }}
539
- @drop=${(event) => {
540
- if (index < 0)
541
- return;
542
- const rect = event.currentTarget.getBoundingClientRect();
543
- const before = event.clientY < rect.top + rect.height / 2;
544
- this.handleDrop(event, groupId, before ? index : index + 1);
1052
+ this.emit('harness-session-open', session);
545
1053
  }}
546
- >
547
- <span class="itemTitle">
548
- ${session.icon
549
- ? html `<dees-icon class="itemIcon" icon=${session.icon} iconSize="12"></dees-icon>`
1054
+ >
1055
+ <span class="stateDot"></span>
1056
+ <span class="itemCopy">
1057
+ <span class="itemTitle">
1058
+ ${session.icon
1059
+ ? html `<dees-icon class="itemIcon" icon=${session.icon} iconSize="13"></dees-icon>`
550
1060
  : ''}
551
- <span class="titleText">${session.title || session.id}</span>
552
- <span class="itemTime">${harnessFormatRelativeTime(session.updatedAt ?? session.createdAt)}</span>
553
- </span>
554
- ${session.preview
555
- ? html `<span class="itemPreview">${session.preview}${session.messageCount ? ` · ${session.messageCount} messages` : ''}</span>`
1061
+ <span class="titleText">${session.title || session.id}</span>
1062
+ </span>
1063
+ <span class="itemTime">${harnessFormatRelativeTime(session.updatedAt ?? session.createdAt)}</span>
1064
+ <span class="visuallyHidden">Status: ${this.sessionStateLabel(state)}</span>
1065
+ </span>
1066
+ </button>
1067
+ <button
1068
+ class="expandToggle"
1069
+ type="button"
1070
+ aria-expanded=${expanded ? 'true' : 'false'}
1071
+ aria-controls=${detailsId}
1072
+ title=${expanded ? 'Collapse conversation card' : 'Expand conversation card'}
1073
+ @click=${(event) => {
1074
+ event.stopPropagation();
1075
+ this.toggleSessionExpanded(session.id);
1076
+ }}
1077
+ >
1078
+ <dees-icon icon="lucide:ChevronDown" iconSize="15"></dees-icon>
1079
+ </button>
1080
+ </div>
1081
+ ${expanded
1082
+ ? html `
1083
+ <div class="itemDetails" id=${detailsId}>
1084
+ <div class="stateLine">
1085
+ <span class="stateDot"></span>
1086
+ <span>${this.sessionStateLabel(state)}</span>
1087
+ </div>
1088
+ ${session.preview ? html `<div class="itemPreview">${session.preview}</div>` : ''}
1089
+ <div class="itemMeta">
1090
+ ${session.messageCount ? `${session.messageCount} messages · ` : ''}${session.id}
1091
+ </div>
1092
+ </div>
1093
+ `
556
1094
  : ''}
557
- </button>
1095
+ </article>
558
1096
  `;
559
1097
  }
1098
+ eventTargetsExpandToggle(event) {
1099
+ return event.composedPath().some((target) => target instanceof HTMLElement && target.classList.contains('expandToggle'));
1100
+ }
1101
+ eventTargetsDragHandle(event) {
1102
+ return event.composedPath().some((target) => target instanceof HTMLElement && target.classList.contains('dragHandle'));
1103
+ }
1104
+ sessionStateLabel(state) {
1105
+ switch (state) {
1106
+ case 'working': return 'Working';
1107
+ case 'finished': return 'Finished';
1108
+ case 'attention': return 'Needs attention';
1109
+ case 'error': return 'Error';
1110
+ default: return 'Idle';
1111
+ }
1112
+ }
1113
+ toggleSessionExpanded(sessionIdArg) {
1114
+ const next = new Set(this.expandedSessionIds);
1115
+ if (next.has(sessionIdArg))
1116
+ next.delete(sessionIdArg);
1117
+ else
1118
+ next.add(sessionIdArg);
1119
+ this.expandedSessionIds = next;
1120
+ }
560
1121
  toggleGroupCollapsed(groupIdArg) {
561
1122
  const next = new Set(this.collapsedGroupIds);
562
1123
  if (next.has(groupIdArg)) {
@@ -567,40 +1128,459 @@ let DeesHarnessSessionList = (() => {
567
1128
  }
568
1129
  this.collapsedGroupIds = next;
569
1130
  }
1131
+ sortableSessions(sessionsArg, excludeDraggingArg = true) {
1132
+ return sessionsArg.filter((session) => (session.draggable !== false
1133
+ && (!excludeDraggingArg || session.id !== this.draggingSessionId)));
1134
+ }
1135
+ sessionsForGroup(groupIdArg) {
1136
+ if (groupIdArg === null)
1137
+ return this.ungroupedSessions;
1138
+ const group = this.groups.find((candidate) => candidate.id === groupIdArg);
1139
+ if (!group)
1140
+ return [];
1141
+ const byId = this.sessionsById;
1142
+ return group.sessionIds
1143
+ .map((sessionId) => byId.get(sessionId))
1144
+ .filter((session) => session !== undefined);
1145
+ }
1146
+ handlePointerDown(eventArg, sessionArg, groupIdArg, logicalIndexArg) {
1147
+ if (this.pointerDragGesture
1148
+ || eventArg.button !== 0
1149
+ || !eventArg.isPrimary
1150
+ || logicalIndexArg < 0)
1151
+ return;
1152
+ const handle = eventArg.currentTarget;
1153
+ const source = handle.closest('.item');
1154
+ if (!source)
1155
+ return;
1156
+ const sourceRect = source.getBoundingClientRect();
1157
+ this.pointerDragGesture = {
1158
+ pointerId: eventArg.pointerId,
1159
+ handle,
1160
+ source,
1161
+ sessionId: sessionArg.id,
1162
+ sourceGroupId: groupIdArg,
1163
+ sourceLogicalIndex: logicalIndexArg,
1164
+ startClientX: eventArg.clientX,
1165
+ startClientY: eventArg.clientY,
1166
+ grabOffsetX: eventArg.clientX - sourceRect.left,
1167
+ grabOffsetY: eventArg.clientY - sourceRect.top,
1168
+ phase: 'pending',
1169
+ };
1170
+ window.addEventListener('keydown', this.handleDragKeyDown, true);
1171
+ window.addEventListener('blur', this.handleDragWindowBlur);
1172
+ try {
1173
+ handle.setPointerCapture(eventArg.pointerId);
1174
+ }
1175
+ catch {
1176
+ this.finishPointerDrag(false);
1177
+ }
1178
+ }
1179
+ handlePointerMove = (eventArg) => {
1180
+ const gesture = this.pointerDragGesture;
1181
+ if (!gesture || eventArg.pointerId !== gesture.pointerId)
1182
+ return;
1183
+ if (!gesture.source.isConnected || !gesture.handle.isConnected) {
1184
+ this.finishPointerDrag(false);
1185
+ return;
1186
+ }
1187
+ if (gesture.phase === 'pending'
1188
+ && Math.hypot(eventArg.clientX - gesture.startClientX, eventArg.clientY - gesture.startClientY) < dragThresholdPixels)
1189
+ return;
1190
+ if (gesture.phase === 'pending' && !this.startPointerDrag(eventArg, gesture))
1191
+ return;
1192
+ eventArg.preventDefault();
1193
+ this.moveDragPreview(eventArg.clientX, eventArg.clientY, gesture);
1194
+ this.dragAutoScrollClientX = eventArg.clientX;
1195
+ this.dragAutoScrollClientY = eventArg.clientY;
1196
+ this.updateDragAutoScrollVelocity();
1197
+ this.updateDropSlotFromPointer();
1198
+ };
1199
+ handlePointerUp = (eventArg) => {
1200
+ const gesture = this.pointerDragGesture;
1201
+ if (!gesture || eventArg.pointerId !== gesture.pointerId)
1202
+ return;
1203
+ if (gesture.phase === 'active') {
1204
+ this.dragAutoScrollClientX = eventArg.clientX;
1205
+ this.dragAutoScrollClientY = eventArg.clientY;
1206
+ this.moveDragPreview(eventArg.clientX, eventArg.clientY, gesture);
1207
+ this.updateDropSlotFromPointer();
1208
+ this.finishPointerDrag(true);
1209
+ return;
1210
+ }
1211
+ this.finishPointerDrag(false);
1212
+ };
1213
+ handlePointerCancel = (eventArg) => {
1214
+ if (eventArg.pointerId === this.pointerDragGesture?.pointerId)
1215
+ this.finishPointerDrag(false);
1216
+ };
1217
+ handleLostPointerCapture = (eventArg) => {
1218
+ if (eventArg.pointerId === this.pointerDragGesture?.pointerId)
1219
+ this.finishPointerDrag(false);
1220
+ };
1221
+ handleDragKeyDown = (eventArg) => {
1222
+ if (eventArg.key !== 'Escape' || !this.pointerDragGesture)
1223
+ return;
1224
+ eventArg.preventDefault();
1225
+ eventArg.stopPropagation();
1226
+ this.finishPointerDrag(false);
1227
+ };
1228
+ handleDragWindowBlur = () => {
1229
+ this.finishPointerDrag(false);
1230
+ };
1231
+ startPointerDrag(eventArg, gestureArg) {
1232
+ const sourceRect = gestureArg.source.getBoundingClientRect();
1233
+ gestureArg.source.classList.add('dragging');
1234
+ gestureArg.source.style.setProperty('--drag-preview-width', `${sourceRect.width}px`);
1235
+ gestureArg.source.style.setProperty('--drag-preview-height', `${sourceRect.height}px`);
1236
+ this.moveDragPreview(eventArg.clientX, eventArg.clientY, gestureArg);
1237
+ gestureArg.source.setAttribute('popover', 'manual');
1238
+ try {
1239
+ gestureArg.source.showPopover();
1240
+ }
1241
+ catch {
1242
+ this.finishPointerDrag(false);
1243
+ return false;
1244
+ }
1245
+ gestureArg.phase = 'active';
1246
+ this.reflowGeneration += 1;
1247
+ this.cancelReflowAnimations();
1248
+ this.draggedItemHeight = Math.ceil(sourceRect.height);
1249
+ this.draggingSessionId = gestureArg.sessionId;
1250
+ const remainingCount = this.sortableSessions(this.sessionsForGroup(gestureArg.sourceGroupId)).length;
1251
+ this.dropSlot = {
1252
+ groupId: gestureArg.sourceGroupId,
1253
+ index: Math.min(gestureArg.sourceLogicalIndex, remainingCount),
1254
+ };
1255
+ return true;
1256
+ }
1257
+ moveDragPreview(clientXArg, clientYArg, gestureArg) {
1258
+ gestureArg.source.style.setProperty('--drag-preview-x', `${clientXArg - gestureArg.grabOffsetX}px`);
1259
+ gestureArg.source.style.setProperty('--drag-preview-y', `${clientYArg - gestureArg.grabOffsetY}px`);
1260
+ }
570
1261
  setDropSlot(groupIdArg, indexArg) {
571
1262
  const current = this.dropSlot;
572
1263
  if (current && current.groupId === groupIdArg && current.index === indexArg)
573
1264
  return;
1265
+ const previousRects = this.captureCardRects();
1266
+ const generation = ++this.reflowGeneration;
574
1267
  this.dropSlot = { groupId: groupIdArg, index: indexArg };
1268
+ void this.animateCardReflow(previousRects, generation);
575
1269
  }
576
- handleDragOverSlot(event, groupIdArg, indexArg) {
577
- if (!this.draggingSessionId)
1270
+ clearDropSlot() {
1271
+ if (!this.dropSlot)
578
1272
  return;
579
- event.preventDefault();
580
- this.setDropSlot(groupIdArg, indexArg);
581
- }
582
- handleDrop(event, groupIdArg, indexArg) {
583
- event.preventDefault();
584
- event.stopPropagation();
585
- const sessionId = this.draggingSessionId || event.dataTransfer?.getData('text/plain') || '';
586
- this.draggingSessionId = '';
1273
+ const previousRects = this.captureCardRects();
1274
+ const generation = ++this.reflowGeneration;
587
1275
  this.dropSlot = undefined;
588
- if (!sessionId)
1276
+ void this.animateCardReflow(previousRects, generation);
1277
+ }
1278
+ updateDragAutoScrollVelocity() {
1279
+ const container = this.scrollContainer;
1280
+ if (!container || !this.draggingSessionId)
1281
+ return;
1282
+ const rect = container.getBoundingClientRect();
1283
+ if (this.dragAutoScrollClientX < rect.left || this.dragAutoScrollClientX > rect.right) {
1284
+ this.stopDragAutoScroll();
1285
+ return;
1286
+ }
1287
+ const edgeSize = Math.min(64, Math.max(32, rect.height * 0.25));
1288
+ const topDepth = Math.max(0, Math.min(1, (rect.top + edgeSize - this.dragAutoScrollClientY) / edgeSize));
1289
+ const bottomDepth = Math.max(0, Math.min(1, (this.dragAutoScrollClientY - (rect.bottom - edgeSize)) / edgeSize));
1290
+ this.dragAutoScrollVelocity = bottomDepth > 0
1291
+ ? dragAutoScrollMaxPixelsPerSecond * bottomDepth * bottomDepth
1292
+ : topDepth > 0
1293
+ ? -dragAutoScrollMaxPixelsPerSecond * topDepth * topDepth
1294
+ : 0;
1295
+ if (this.dragAutoScrollVelocity === 0) {
1296
+ this.stopDragAutoScroll();
1297
+ return;
1298
+ }
1299
+ if (this.dragAutoScrollFrame === undefined) {
1300
+ this.dragAutoScrollLastFrame = performance.now();
1301
+ this.dragAutoScrollFrame = requestAnimationFrame(this.runDragAutoScroll);
1302
+ }
1303
+ }
1304
+ runDragAutoScroll = (timestampArg) => {
1305
+ this.dragAutoScrollFrame = undefined;
1306
+ const container = this.scrollContainer;
1307
+ if (!container || !this.draggingSessionId || this.dragAutoScrollVelocity === 0)
1308
+ return;
1309
+ const elapsedMs = Math.min(34, Math.max(0, timestampArg - this.dragAutoScrollLastFrame));
1310
+ this.dragAutoScrollLastFrame = timestampArg;
1311
+ const previousScrollTop = container.scrollTop;
1312
+ container.scrollTop += this.dragAutoScrollVelocity * elapsedMs / 1000;
1313
+ this.syncScrollShadowState();
1314
+ const atScrollBoundary = this.dragAutoScrollVelocity < 0
1315
+ ? container.scrollTop <= 0
1316
+ : container.scrollTop + container.clientHeight >= container.scrollHeight - 1;
1317
+ if (container.scrollTop === previousScrollTop && atScrollBoundary) {
1318
+ this.stopDragAutoScroll();
1319
+ return;
1320
+ }
1321
+ this.updateDropSlotFromPointer();
1322
+ this.dragAutoScrollFrame = requestAnimationFrame(this.runDragAutoScroll);
1323
+ };
1324
+ updateDropSlotFromPointer() {
1325
+ const pointerX = this.dragAutoScrollClientX;
1326
+ const pointerY = this.dragAutoScrollClientY;
1327
+ const placeholder = this.shadowRoot?.querySelector('.dropPlaceholder');
1328
+ if (placeholder) {
1329
+ const rect = placeholder.getBoundingClientRect();
1330
+ if (pointerX >= rect.left
1331
+ && pointerX <= rect.right
1332
+ && pointerY >= rect.top
1333
+ && pointerY <= rect.bottom) {
1334
+ this.setDropSlot(placeholder.dataset.dropGroupId || null, Number(placeholder.dataset.dropIndex));
1335
+ return;
1336
+ }
1337
+ }
1338
+ const selector = '[data-drop-group-id][data-drop-index][data-drop-kind]';
1339
+ let target;
1340
+ const offsets = this.dragAutoScrollVelocity === 0
1341
+ ? [0, -8, 8, -16, 16, -32, 32]
1342
+ : [0, 8, 16, 32, 48, 64, 96].map((value) => value * (this.dragAutoScrollVelocity < 0 ? 1 : -1));
1343
+ for (const offset of offsets) {
1344
+ const hit = this.shadowRoot?.elementFromPoint(pointerX, pointerY + offset);
1345
+ const candidate = hit?.closest(selector);
1346
+ if (candidate
1347
+ && candidate.dataset.sessionId !== this.draggingSessionId
1348
+ && Number(candidate.dataset.dropIndex) >= 0) {
1349
+ target = candidate;
1350
+ break;
1351
+ }
1352
+ }
1353
+ if (!target) {
1354
+ this.clearDropSlot();
1355
+ return;
1356
+ }
1357
+ const baseIndex = Number(target.dataset.dropIndex);
1358
+ const groupId = target.dataset.dropGroupId || null;
1359
+ const rect = target.getBoundingClientRect();
1360
+ const index = target.dataset.dropKind === 'card' && pointerY >= rect.top + rect.height / 2
1361
+ ? baseIndex + 1
1362
+ : baseIndex;
1363
+ this.setDropSlot(groupId, index);
1364
+ }
1365
+ get scrollContainer() {
1366
+ return this.shadowRoot?.querySelector('.list') ?? undefined;
1367
+ }
1368
+ observeScrollGeometry() {
1369
+ if (!this.isConnected)
1370
+ return;
1371
+ const container = this.scrollContainer;
1372
+ const content = this.shadowRoot?.querySelector('.listContent') ?? undefined;
1373
+ if (!container || !content)
589
1374
  return;
1375
+ if (this.scrollResizeObserver
1376
+ && this.observedScrollContainer === container
1377
+ && this.observedScrollContent === content)
1378
+ return;
1379
+ this.scrollResizeObserver?.disconnect();
1380
+ this.scrollResizeObserver = new ResizeObserver(this.syncScrollShadowState);
1381
+ this.scrollResizeObserver.observe(container);
1382
+ this.scrollResizeObserver.observe(content);
1383
+ this.observedScrollContainer = container;
1384
+ this.observedScrollContent = content;
1385
+ }
1386
+ syncScrollShadowState = () => {
1387
+ const container = this.scrollContainer;
1388
+ if (!container)
1389
+ return;
1390
+ const topVisible = container.scrollTop > 1;
1391
+ const bottomVisible = container.scrollTop + container.clientHeight < container.scrollHeight - 1;
1392
+ if (this.topScrollShadowVisible !== topVisible)
1393
+ this.topScrollShadowVisible = topVisible;
1394
+ if (this.bottomScrollShadowVisible !== bottomVisible)
1395
+ this.bottomScrollShadowVisible = bottomVisible;
1396
+ };
1397
+ stopDragAutoScroll() {
1398
+ if (this.dragAutoScrollFrame !== undefined)
1399
+ cancelAnimationFrame(this.dragAutoScrollFrame);
1400
+ this.dragAutoScrollFrame = undefined;
1401
+ this.dragAutoScrollVelocity = 0;
1402
+ this.dragAutoScrollLastFrame = 0;
1403
+ }
1404
+ createMoveDetail(sessionIdArg, groupIdArg, indexArg) {
1405
+ const targetSessions = this.sortableSessions(this.sessionsForGroup(groupIdArg));
1406
+ const beforeSessionId = targetSessions[Math.max(0, indexArg)]?.id;
1407
+ const sourceGroupId = this.groups.find((group) => group.sessionIds.includes(sessionIdArg))?.id ?? null;
1408
+ const sourceSessions = this.sortableSessions(this.sessionsForGroup(sourceGroupId), false);
1409
+ const sourceIndex = sourceSessions.findIndex((session) => session.id === sessionIdArg);
1410
+ const compatibilityIndex = (sourceGroupId === groupIdArg
1411
+ && sourceIndex >= 0
1412
+ && indexArg > sourceIndex) ? indexArg + 1 : indexArg;
1413
+ return {
1414
+ sessionId: sessionIdArg,
1415
+ groupId: groupIdArg,
1416
+ index: Math.max(0, compatibilityIndex),
1417
+ ...(beforeSessionId ? { beforeSessionId } : {}),
1418
+ };
1419
+ }
1420
+ handleKeyboardMove(eventArg, sessionArg, groupIdArg) {
1421
+ if (!['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(eventArg.key))
1422
+ return;
1423
+ eventArg.preventDefault();
1424
+ eventArg.stopPropagation();
1425
+ const sessions = this.sortableSessions(this.sessionsForGroup(groupIdArg), false);
1426
+ const sourceIndex = sessions.findIndex((session) => session.id === sessionArg.id);
1427
+ if (sourceIndex < 0)
1428
+ return;
1429
+ const sectionIds = [...this.groups.map((group) => group.id), null];
1430
+ const sectionIndex = sectionIds.indexOf(groupIdArg);
1431
+ const adjacentGroupId = eventArg.key === 'ArrowUp' && sourceIndex === 0 && sectionIndex > 0
1432
+ ? sectionIds[sectionIndex - 1]
1433
+ : eventArg.key === 'ArrowDown'
1434
+ && sourceIndex === sessions.length - 1
1435
+ && sectionIndex >= 0
1436
+ && sectionIndex < sectionIds.length - 1
1437
+ ? sectionIds[sectionIndex + 1]
1438
+ : undefined;
1439
+ if (adjacentGroupId !== undefined) {
1440
+ const targetSessions = this.sortableSessions(this.sessionsForGroup(adjacentGroupId), false);
1441
+ const targetIndex = eventArg.key === 'ArrowUp' ? targetSessions.length : 0;
1442
+ const beforeSession = targetSessions[targetIndex];
1443
+ const detail = {
1444
+ sessionId: sessionArg.id,
1445
+ groupId: adjacentGroupId,
1446
+ index: targetIndex,
1447
+ ...(beforeSession ? { beforeSessionId: beforeSession.id } : {}),
1448
+ };
1449
+ const groupName = adjacentGroupId === null
1450
+ ? 'Ungrouped'
1451
+ : this.groups.find((group) => group.id === adjacentGroupId)?.name ?? adjacentGroupId;
1452
+ this.moveAnnouncement = `Moved ${sessionArg.title || sessionArg.id} to ${groupName}.`;
1453
+ this.keyboardMoveFocus = { sessionId: sessionArg.id, groupId: adjacentGroupId };
1454
+ this.dispatchEvent(new CustomEvent('harness-session-move', { detail, bubbles: true, composed: true }));
1455
+ return;
1456
+ }
1457
+ const remaining = sessions.filter((session) => session.id !== sessionArg.id);
1458
+ const targetIndex = eventArg.key === 'Home'
1459
+ ? 0
1460
+ : eventArg.key === 'End'
1461
+ ? remaining.length
1462
+ : eventArg.key === 'ArrowUp'
1463
+ ? Math.max(0, sourceIndex - 1)
1464
+ : Math.min(remaining.length, sourceIndex + 1);
1465
+ if (targetIndex === sourceIndex)
1466
+ return;
1467
+ const beforeSession = remaining[targetIndex];
1468
+ const compatibilityIndex = targetIndex > sourceIndex ? targetIndex + 1 : targetIndex;
590
1469
  const detail = {
591
- sessionId,
1470
+ sessionId: sessionArg.id,
592
1471
  groupId: groupIdArg,
593
- index: Math.max(0, indexArg),
1472
+ index: compatibilityIndex,
1473
+ ...(beforeSession ? { beforeSessionId: beforeSession.id } : {}),
594
1474
  };
1475
+ this.moveAnnouncement = beforeSession
1476
+ ? `Moved ${sessionArg.title || sessionArg.id} before ${beforeSession.title || beforeSession.id}.`
1477
+ : `Moved ${sessionArg.title || sessionArg.id} to the end.`;
595
1478
  this.dispatchEvent(new CustomEvent('harness-session-move', { detail, bubbles: true, composed: true }));
596
1479
  }
1480
+ captureCardRects() {
1481
+ const result = new Map();
1482
+ for (const item of this.shadowRoot?.querySelectorAll('.item[data-session-id]') ?? []) {
1483
+ if (item.dataset.sessionId === this.draggingSessionId)
1484
+ continue;
1485
+ result.set(item.dataset.sessionId ?? '', item.getBoundingClientRect());
1486
+ }
1487
+ return result;
1488
+ }
1489
+ restoreKeyboardMoveFocus() {
1490
+ const pending = this.keyboardMoveFocus;
1491
+ if (!pending)
1492
+ return;
1493
+ const currentGroupId = this.groups.find((group) => group.sessionIds.includes(pending.sessionId))?.id ?? null;
1494
+ if (currentGroupId !== pending.groupId)
1495
+ return;
1496
+ const item = Array.from(this.shadowRoot?.querySelectorAll('.item[data-session-id]') ?? []).find((candidate) => candidate.dataset.sessionId === pending.sessionId);
1497
+ const handle = item?.querySelector('.dragHandle');
1498
+ if (handle) {
1499
+ handle.focus();
1500
+ this.keyboardMoveFocus = undefined;
1501
+ return;
1502
+ }
1503
+ const groupHeader = Array.from(this.shadowRoot?.querySelectorAll('.groupHeader[data-drop-group-id]') ?? []).find((candidate) => candidate.dataset.dropGroupId === (pending.groupId ?? ''));
1504
+ if (groupHeader) {
1505
+ groupHeader.focus();
1506
+ this.keyboardMoveFocus = undefined;
1507
+ }
1508
+ }
1509
+ async animateCardReflow(previousRectsArg, generationArg) {
1510
+ await this.updateComplete;
1511
+ if (generationArg !== this.reflowGeneration
1512
+ || !this.isConnected
1513
+ || globalThis.matchMedia?.('(prefers-reduced-motion: reduce)').matches)
1514
+ return;
1515
+ this.cancelReflowAnimations();
1516
+ for (const item of this.shadowRoot?.querySelectorAll('.item[data-session-id]') ?? []) {
1517
+ const sessionId = item.dataset.sessionId ?? '';
1518
+ if (!sessionId || sessionId === this.draggingSessionId)
1519
+ continue;
1520
+ const previous = previousRectsArg.get(sessionId);
1521
+ if (!previous)
1522
+ continue;
1523
+ const current = item.getBoundingClientRect();
1524
+ const deltaY = previous.top - current.top;
1525
+ if (Math.abs(deltaY) < 0.5)
1526
+ continue;
1527
+ const animation = item.animate([
1528
+ { transform: `translateY(${deltaY}px)` },
1529
+ { transform: 'translateY(0)' },
1530
+ ], { duration: 180, easing: 'cubic-bezier(0.22, 1, 0.36, 1)' });
1531
+ this.reflowAnimations.add(animation);
1532
+ void animation.finished.catch(() => undefined).finally(() => {
1533
+ this.reflowAnimations.delete(animation);
1534
+ });
1535
+ }
1536
+ }
1537
+ cancelReflowAnimations() {
1538
+ for (const animation of this.reflowAnimations)
1539
+ animation.cancel();
1540
+ this.reflowAnimations.clear();
1541
+ }
1542
+ finishPointerDrag(commitArg) {
1543
+ const gesture = this.pointerDragGesture;
1544
+ if (!gesture)
1545
+ return;
1546
+ const detail = commitArg && gesture.phase === 'active' && this.dropSlot
1547
+ ? this.createMoveDetail(gesture.sessionId, this.dropSlot.groupId, this.dropSlot.index)
1548
+ : undefined;
1549
+ this.pointerDragGesture = undefined;
1550
+ window.removeEventListener('keydown', this.handleDragKeyDown, true);
1551
+ window.removeEventListener('blur', this.handleDragWindowBlur);
1552
+ this.stopDragAutoScroll();
1553
+ this.reflowGeneration += 1;
1554
+ this.cancelReflowAnimations();
1555
+ if (gesture.source.matches(':popover-open'))
1556
+ gesture.source.hidePopover();
1557
+ gesture.source.removeAttribute('popover');
1558
+ gesture.source.classList.remove('dragging');
1559
+ for (const property of [
1560
+ '--drag-preview-width',
1561
+ '--drag-preview-height',
1562
+ '--drag-preview-x',
1563
+ '--drag-preview-y',
1564
+ ])
1565
+ gesture.source.style.removeProperty(property);
1566
+ this.draggingSessionId = '';
1567
+ this.draggedItemHeight = 0;
1568
+ this.dropSlot = undefined;
1569
+ try {
1570
+ if (gesture.handle.hasPointerCapture(gesture.pointerId)) {
1571
+ gesture.handle.releasePointerCapture(gesture.pointerId);
1572
+ }
1573
+ }
1574
+ catch {
1575
+ // Capture may already be released or the handle may have disconnected.
1576
+ }
1577
+ if (detail) {
1578
+ this.dispatchEvent(new CustomEvent('harness-session-move', { detail, bubbles: true, composed: true }));
1579
+ }
1580
+ }
597
1581
  emit(name, session) {
598
1582
  this.dispatchEvent(new CustomEvent(name, { detail: { session }, bubbles: true, composed: true }));
599
1583
  }
600
- constructor() {
601
- super(...arguments);
602
- __runInitializers(this, _collapsedGroupIds_extraInitializers);
603
- }
604
1584
  static {
605
1585
  __runInitializers(_classThis, _classExtraInitializers);
606
1586
  }
@@ -608,4 +1588,4 @@ let DeesHarnessSessionList = (() => {
608
1588
  return DeesHarnessSessionList = _classThis;
609
1589
  })();
610
1590
  export { DeesHarnessSessionList };
611
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oYXJuZXNzLXNlc3Npb24tbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWhhcm5lc3MvZGVlcy1oYXJuZXNzLXNlc3Npb24tbGlzdC9kZWVzLWhhcm5lc3Mtc2Vzc2lvbi1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDL0QsT0FBTyxFQUNMLFdBQVcsRUFDWCxJQUFJLEVBQ0osR0FBRyxFQUNILGFBQWEsRUFFYixRQUFRLEVBQ1IsS0FBSyxFQUNMLFVBQVUsR0FDWCxNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBUXRELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sOENBQThDLENBQUM7QUFhdEQ7Ozs7Ozs7Ozs7Ozs7R0FhRztJQUVVLHNCQUFzQjs0QkFEbEMsYUFBYSxDQUFDLDJCQUEyQixDQUFDOzs7O3NCQUNDLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0NBQW5CLFNBQVEsV0FBVzs7OztvQ0FJcEQsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDOzZDQUc5QixRQUFRLEVBQUU7bUNBR1YsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO3FDQUczQixRQUFRLEVBQUU7a0NBR1YsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDOzBDQUc5QixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7a0NBRzNCLEtBQUssRUFBRTs2Q0FHUCxLQUFLLEVBQUU7b0NBR1AsS0FBSyxFQUFFOzZDQUdQLEtBQUssRUFBRTtZQTFCUiw2S0FBUyxRQUFRLDZCQUFSLFFBQVEsMkZBQTZCO1lBRzlDLHdNQUFTLGlCQUFpQiw2QkFBakIsaUJBQWlCLDZHQUFjO1lBR3hDLDBLQUFTLE9BQU8sNkJBQVAsT0FBTyx5RkFBa0I7WUFHbEMsZ0xBQVMsU0FBUyw2QkFBVCxTQUFTLDZGQUFtQztZQUdyRCx1S0FBUyxNQUFNLDZCQUFOLE1BQU0sdUZBQThCO1lBRzdDLCtMQUFTLGNBQWMsNkJBQWQsY0FBYyx1R0FBa0I7WUFHekMsdUtBQVMsTUFBTSw2QkFBTixNQUFNLHVGQUFjO1lBRzdCLHdNQUFTLGlCQUFpQiw2QkFBakIsaUJBQWlCLDZHQUFjO1lBR3hDLDZLQUFTLFFBQVEsNkJBQVIsUUFBUSwyRkFBb0M7WUFHckQsd01BQVMsaUJBQWlCLDZCQUFqQixpQkFBaUIsNkdBQTBDO1lBaEN0RSw2S0FtZ0JDOzs7O1FBbGdCUSxNQUFNLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUN2QixNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFHMUMsNkVBQTJDLEVBQUUsRUFBQztRQUE5QyxJQUFTLFFBQVEsOENBQTZCO1FBQTlDLElBQVMsUUFBUSxvREFBNkI7UUFHOUMsc0pBQXFDLEVBQUUsR0FBQztRQUF4QyxJQUFTLGlCQUFpQix1REFBYztRQUF4QyxJQUFTLGlCQUFpQiw2REFBYztRQUd4QywySUFBNEIsS0FBSyxHQUFDO1FBQWxDLElBQVMsT0FBTyw2Q0FBa0I7UUFBbEMsSUFBUyxPQUFPLG1EQUFrQjtRQUdsQyxxSUFBNkIsdUJBQXVCLEdBQUM7UUFBckQsSUFBUyxTQUFTLCtDQUFtQztRQUFyRCxJQUFTLFNBQVMscURBQW1DO1FBR3JELGlJQUEwQyxFQUFFLEdBQUM7UUFBN0MsSUFBUyxNQUFNLDRDQUE4QjtRQUE3QyxJQUFTLE1BQU0sa0RBQThCO1FBRzdDLDhJQUFtQyxLQUFLLEdBQUM7UUFBekMsSUFBUyxjQUFjLG9EQUFrQjtRQUF6QyxJQUFTLGNBQWMsMERBQWtCO1FBR3pDLHNJQUEwQixFQUFFLEdBQUM7UUFBN0IsSUFBUyxNQUFNLDRDQUFjO1FBQTdCLElBQVMsTUFBTSxrREFBYztRQUc3QixvSkFBcUMsRUFBRSxHQUFDO1FBQXhDLElBQVMsaUJBQWlCLHVEQUFjO1FBQXhDLElBQVMsaUJBQWlCLDZEQUFjO1FBR3hDLDZJQUEyQyxTQUFTLEdBQUM7UUFBckQsSUFBUyxRQUFRLDhDQUFvQztRQUFyRCxJQUFTLFFBQVEsb0RBQW9DO1FBR3JELHNKQUFrRCxJQUFJLEdBQUcsRUFBVSxHQUFDO1FBQXBFLElBQVMsaUJBQWlCLHVEQUEwQztRQUFwRSxJQUFTLGlCQUFpQiw2REFBMEM7UUFFN0QsTUFBTSxDQUFDLE1BQU0sR0FBRztZQUNyQixrQkFBa0I7WUFDbEIsVUFBVSxDQUFDLGFBQWE7WUFDeEIsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBaU1GO1NBQ0YsQ0FBQztRQUVGLElBQVksWUFBWTtZQUN0QixPQUFPLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFZLGlCQUFpQjtZQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBQzlCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxVQUFVO29CQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELDZDQUE2QztRQUM3QyxJQUFZLGlCQUFpQjtZQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDdkMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztpQkFDdEIsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUM3QyxJQUFJLENBQ0gsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDZCxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FDdEYsQ0FBQztRQUNOLENBQUM7UUFFRCxJQUFZLGdCQUFnQjtZQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9DLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUNwQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUNyRyxDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxNQUFNLENBQUM7WUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDL0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUNyRyxDQUFDO1FBQ0osQ0FBQztRQUVNLFdBQVc7WUFDaEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQW1CLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDaEYsQ0FBQztRQUVNLE1BQU07WUFDWCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRSxPQUFPLElBQUksQ0FBQTs7OzttQkFJSSxJQUFJLENBQUMsTUFBTTttQkFDWCxDQUFDLEtBQVksRUFBRSxFQUFFO2dCQUN4QixJQUFJLENBQUMsTUFBTSxHQUFJLEtBQUssQ0FBQyxhQUFrQyxDQUFDLEtBQUssQ0FBQztZQUNoRSxDQUFDOzs7O1VBSUQsSUFBSSxDQUFDLE9BQU87Z0JBQ1osQ0FBQyxDQUFDLElBQUksQ0FBQSxxREFBcUQ7Z0JBQzNELENBQUMsQ0FBQyxjQUFjO29CQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7b0JBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFOztRQUUzQixjQUFjO2dCQUNkLENBQUMsQ0FBQyxJQUFJLENBQUE7Ozs7O3lCQUtXLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMsYUFBYSxDQUNoQixJQUFJLFdBQVcsQ0FBQyw4QkFBOEIsRUFBRTt3QkFDOUMsT0FBTyxFQUFFLElBQUk7d0JBQ2IsUUFBUSxFQUFFLElBQUk7cUJBQ2YsQ0FBQyxDQUNILENBQUM7Z0JBQ0osQ0FBQzs7Ozs7O1dBTU47Z0JBQ0gsQ0FBQyxDQUFDLEVBQUU7S0FDUCxDQUFDO1FBQ0osQ0FBQztRQUVPLGNBQWM7WUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFBO1VBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUzthQUMxRSxDQUFDO1lBQ1YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFBLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hGLENBQUM7UUFFTyxpQkFBaUI7WUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakQsT0FBTyxJQUFJLENBQUEsMEJBQTBCLElBQUksQ0FBQyxTQUFTLFFBQVEsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUE7UUFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVTtxQkFDN0IsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUN6QixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQWtDLEVBQUUsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUM7Z0JBQzlFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLFlBQVksR0FDaEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEtBQUssS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQztnQkFDN0YsT0FBTyxJQUFJLENBQUE7O2lDQUVjLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7O3FCQUU1RSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzsyQkFDbkMsQ0FBQyxLQUFpQixFQUFFLEVBQUU7b0JBQ25DLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxNQUFNLEdBQStCO3dCQUN6QyxLQUFLO3dCQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTzt3QkFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO3dCQUN0QixhQUFhLEVBQUUsS0FBSztxQkFDckIsQ0FBQztvQkFDRixJQUFJLENBQUMsYUFBYSxDQUNoQixJQUFJLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUNwRixDQUFDO2dCQUNKLENBQUM7d0JBQ1csQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQztvQkFDbEYsQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7OztvQkFHdEUsS0FBSyxDQUFDLElBQUk7dUNBQ1MsT0FBTyxDQUFDLE1BQU07O1lBRXpDLFNBQVM7b0JBQ1QsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDMUMsQ0FBQztZQUNKLENBQUMsQ0FBQztRQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNO2dCQUN0QyxDQUFDLENBQUMsSUFBSSxDQUFBOzs7OzswQkFLWSxDQUFDLEtBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztzQkFDakUsQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzs7eUNBR2xDLFNBQVMsQ0FBQyxNQUFNOztXQUU5QztnQkFDSCxDQUFDLENBQUMsRUFBRTtRQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQztLQUN0QyxDQUFDO1FBQ0osQ0FBQztRQUVPLGFBQWEsQ0FDbkIsUUFBK0IsRUFDL0IsT0FBc0I7WUFFdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQTtRQUNQLFFBQVEsQ0FBQyxHQUFHLENBQ1osQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUE7WUFDcEIsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSztnQkFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQSw4QkFBOEI7Z0JBQ3BDLENBQUMsQ0FBQyxFQUFFO1lBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQztTQUMzQyxDQUNGO1FBQ0MsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLE1BQU07Z0JBQ2xFLENBQUMsQ0FBQyxJQUFJLENBQUEsOEJBQThCO2dCQUNwQyxDQUFDLENBQUMsRUFBRTtLQUNQLENBQUM7UUFDSixDQUFDO1FBRU8sVUFBVSxDQUNoQixPQUE0QixFQUM1QixPQUFzQixFQUN0QixLQUFhO1lBRWIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFBOztzQkFFTyxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQ25FLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQ3ZEOztvQkFFWSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTztpQkFDL0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUM7b0JBQy9DLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDO21CQUNqRCxDQUFDLEtBQW9CLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU87b0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4RSxDQUFDO3VCQUNjLENBQUMsS0FBaUIsRUFBRSxFQUFFO2dCQUNuQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sTUFBTSxHQUFpQztvQkFDM0MsT0FBTztvQkFDUCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87b0JBQ3RCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztvQkFDdEIsYUFBYSxFQUFFLEtBQUs7aUJBQ3JCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsSUFBSSxXQUFXLENBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDdEYsQ0FBQztZQUNKLENBQUM7cUJBQ1ksQ0FBQyxLQUFnQixFQUFFLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxTQUFTO29CQUFFLE9BQU87Z0JBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLEtBQUssQ0FBQyxZQUFZO29CQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztZQUNwRSxDQUFDO21CQUNVLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUM1QixDQUFDO29CQUNXLENBQUMsS0FBZ0IsRUFBRSxFQUFFO2dCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEtBQUssR0FBRyxDQUFDO29CQUFFLE9BQU87Z0JBQ2pELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLGFBQTZCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDMUUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7Z0JBQ08sQ0FBQyxLQUFnQixFQUFFLEVBQUU7Z0JBQzNCLElBQUksS0FBSyxHQUFHLENBQUM7b0JBQUUsT0FBTztnQkFDdEIsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLGFBQTZCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDMUUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5RCxDQUFDOzs7WUFHRyxPQUFPLENBQUMsSUFBSTtnQkFDWixDQUFDLENBQUMsSUFBSSxDQUFBLG9DQUFvQyxPQUFPLENBQUMsSUFBSSw2QkFBNkI7Z0JBQ25GLENBQUMsQ0FBQyxFQUFFO29DQUNvQixPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxFQUFFO21DQUM1Qix5QkFBeUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUM7O1VBRTFGLE9BQU8sQ0FBQyxPQUFPO2dCQUNmLENBQUMsQ0FBQyxJQUFJLENBQUEsNkJBQTZCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxPQUFPLENBQUMsWUFBWSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUztnQkFDL0gsQ0FBQyxDQUFDLEVBQUU7O0tBRVQsQ0FBQztRQUNKLENBQUM7UUFFTyxvQkFBb0IsQ0FBQyxVQUFrQjtZQUM3QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDO1FBRU8sV0FBVyxDQUFDLFVBQXlCLEVBQUUsUUFBZ0I7WUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM5QixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFVBQVUsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVE7Z0JBQUUsT0FBTztZQUNwRixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDM0QsQ0FBQztRQUVPLGtCQUFrQixDQUFDLEtBQWdCLEVBQUUsVUFBeUIsRUFBRSxRQUFnQjtZQUN0RixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtnQkFBRSxPQUFPO1lBQ3BDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRU8sVUFBVSxDQUFDLEtBQWdCLEVBQUUsVUFBeUIsRUFBRSxRQUFnQjtZQUM5RSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUztnQkFBRSxPQUFPO1lBQ3ZCLE1BQU0sTUFBTSxHQUE4QjtnQkFDeEMsU0FBUztnQkFDVCxPQUFPLEVBQUUsVUFBVTtnQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQzthQUM3QixDQUFDO1lBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsSUFBSSxXQUFXLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDbkYsQ0FBQztRQUNKLENBQUM7UUFFTyxJQUFJLENBQUMsSUFBWSxFQUFFLE9BQTRCO1lBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7Ozs7OztZQWxnQlUsdURBQXNCOzs7OztTQUF0QixzQkFBc0IifQ==
1591
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oYXJuZXNzLXNlc3Npb24tbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWhhcm5lc3MvZGVlcy1oYXJuZXNzLXNlc3Npb24tbGlzdC9kZWVzLWhhcm5lc3Mtc2Vzc2lvbi1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDL0QsT0FBTyxFQUNMLFdBQVcsRUFDWCxJQUFJLEVBQ0osR0FBRyxFQUNILGFBQWEsRUFFYixRQUFRLEVBQ1IsS0FBSyxFQUNMLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVF0RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLDhDQUE4QyxDQUFDO0FBRXRELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUM7QUFDOUIsTUFBTSxnQ0FBZ0MsR0FBRyxHQUFHLENBQUM7QUFDN0MsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFvQzlCOzs7Ozs7Ozs7Ozs7OztHQWNHO0lBRVUsc0JBQXNCOzRCQURsQyxhQUFhLENBQUMsMkJBQTJCLENBQUM7Ozs7c0JBQ0MsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQ0FBbkIsU0FBUSxXQUFXOzs7O29DQUlwRCxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7NkNBRzlCLFFBQVEsRUFBRTttQ0FHVixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7cUNBRzNCLFFBQVEsRUFBRTtrQ0FHVixRQUFRLENB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