@design.estate/dees-catalog 9.0.0 → 9.1.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.
Files changed (38) hide show
  1. package/dist_bundle/bundle.js +2636 -2150
  2. package/dist_bundle/bundle.js.map +1 -1
  3. package/dist_ts_web/00_commitinfo_data.js +1 -1
  4. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.d.ts +7 -2
  5. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js +56 -5
  6. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +1 -0
  7. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +62 -18
  8. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.d.ts +4 -2
  9. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.js +7 -2
  10. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.js +69 -29
  11. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +6 -1
  12. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.d.ts +2 -0
  13. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +419 -83
  14. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +247 -118
  15. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +2 -2
  16. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +2 -4
  17. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +15 -4
  18. package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +2 -1
  19. package/dist_ts_web/elements/00group-harness/toolregistry.js +1 -1
  20. package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.d.ts +1 -1
  21. package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js +30 -12
  22. package/dist_ts_web/elements/00theme.js +3 -1
  23. package/package.json +1 -1
  24. package/readme.md +19 -3
  25. package/readme.plan.md +97 -0
  26. package/ts_web/00_commitinfo_data.ts +1 -1
  27. package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.ts +48 -4
  28. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +62 -17
  29. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.ts +6 -1
  30. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.ts +60 -27
  31. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +341 -88
  32. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +257 -125
  33. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +1 -1
  34. package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +1 -3
  35. package/ts_web/elements/00group-harness/interfaces.ts +16 -4
  36. package/ts_web/elements/00group-harness/toolregistry.ts +2 -1
  37. package/ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts +29 -15
  38. package/ts_web/elements/00theme.ts +2 -0
@@ -278,6 +278,8 @@ export class DeesHarnessChat extends DeesElement {
278
278
  min-height: 0;
279
279
  display: flex;
280
280
  flex-direction: column;
281
+ /* Keep composer/suggestion layers below the adjacent narrow drawer. */
282
+ isolation: isolate;
281
283
  }
282
284
 
283
285
  .sessionPanel {
@@ -341,6 +343,11 @@ export class DeesHarnessChat extends DeesElement {
341
343
  /* Narrow hosts keep every session section reachable in an overlay.
342
344
  Todo tool cards remain a second transcript-level representation. */
343
345
  @container (max-width: 680px) {
346
+ .chatBody {
347
+ /* The closed off-canvas drawer must not widen its owning chat. */
348
+ overflow-x: clip;
349
+ }
350
+
344
351
  .sessionPanel {
345
352
  position: absolute;
346
353
  inset: 0 0 0 auto;
@@ -455,9 +462,40 @@ export class DeesHarnessChat extends DeesElement {
455
462
  min-height: 0;
456
463
  }
457
464
 
458
- /* the composer docks edge-to-edge like the toolbar, so the tasks
459
- panel's border meets its top border cleanly; z-order keeps its
460
- upward shadow above the transcript */
465
+ /* Stationary contact shadows keep the transcript beneath the chrome.
466
+ They neither mask the scroll surface nor participate in hit testing. */
467
+ .transcriptColumn > dees-harness-message-list::before,
468
+ .transcriptColumn > dees-harness-message-list::after {
469
+ content: '';
470
+ position: absolute;
471
+ inset-inline: 0;
472
+ height: 20px;
473
+ z-index: 1;
474
+ pointer-events: none;
475
+ }
476
+
477
+ .transcriptColumn > dees-harness-message-list::before {
478
+ content: none;
479
+ top: 0;
480
+ }
481
+
482
+ .toolbar + .chatBody .transcriptColumn > dees-harness-message-list::before {
483
+ content: '';
484
+ background: linear-gradient(to bottom,
485
+ var(--dees-color-scroll-edge-shadow),
486
+ color-mix(in srgb, var(--dees-color-scroll-edge-shadow) 35%, transparent) 6px,
487
+ transparent 100%);
488
+ }
489
+
490
+ .transcriptColumn > dees-harness-message-list::after {
491
+ bottom: 0;
492
+ background: linear-gradient(to top,
493
+ var(--dees-color-scroll-edge-shadow),
494
+ color-mix(in srgb, var(--dees-color-scroll-edge-shadow) 35%, transparent) 6px,
495
+ transparent 100%);
496
+ }
497
+
498
+ /* Dock only within the conversation column, above transcript content. */
461
499
  .composerRow {
462
500
  flex: 0 0 auto;
463
501
  position: relative;
@@ -469,11 +507,10 @@ export class DeesHarnessChat extends DeesElement {
469
507
  display: flex;
470
508
  align-items: center;
471
509
  gap: var(--dees-spacing-xs);
472
- padding: 5px var(--dees-spacing-md);
473
- background: var(--dees-color-bg-secondary);
510
+ padding: 8px 12px 0;
474
511
  color: var(--dees-color-text-muted);
475
- font-size: var(--dees-font-caption2-size, 10px);
476
- line-height: 1.3;
512
+ font-size: var(--dees-font-caption1-size, 11px);
513
+ line-height: 16px;
477
514
  }
478
515
 
479
516
  .composerContextBar dees-icon {
@@ -640,15 +677,7 @@ export class DeesHarnessChat extends DeesElement {
640
677
  .markdownWhileStreaming=${this.markdownWhileStreaming}
641
678
  .toolRegistry=${this.toolRegistry}
642
679
  ></dees-harness-message-list>
643
- ${this.heading
644
- ? html`
645
- <div class="composerContextBar" title=${`Replying to ${this.heading}`}>
646
- <dees-icon icon="lucide:MessageSquare" iconSize="11"></dees-icon>
647
- <span class="composerContextLabel">Replying to</span>
648
- <span class="composerContextTitle">${this.heading}</span>
649
- </div>
650
- `
651
- : ''}
680
+ ${this.renderComposer()}
652
681
  ${this.hasSessionSidebar && !this.showToolbar ? html`
653
682
  <button
654
683
  class="sessionPanelToggle"
@@ -723,9 +752,15 @@ export class DeesHarnessChat extends DeesElement {
723
752
  `
724
753
  : ''}
725
754
  </div>
755
+ `;
756
+ }
757
+
758
+ private renderComposer(): TemplateResult {
759
+ return html`
726
760
  <div class="composerRow">
727
761
  <dees-harness-composer
728
762
  docked
763
+ .contextDescription=${this.heading ? `Replying to ${this.heading}` : ''}
729
764
  .value=${this.composerValue}
730
765
  .attachments=${this.attachments}
731
766
  .suggestions=${this.suggestions}
@@ -762,7 +797,17 @@ export class DeesHarnessChat extends DeesElement {
762
797
  @harness-mode-change=${(event: CustomEvent<{ mode?: string }>) => {
763
798
  if (event.detail?.mode) this.mode = event.detail.mode;
764
799
  }}
765
- ></dees-harness-composer>
800
+ >
801
+ ${this.heading
802
+ ? html`
803
+ <div slot="context" class="composerContextBar" title=${`Replying to ${this.heading}`}>
804
+ <dees-icon icon="lucide:MessageSquare" iconSize="11" aria-hidden="true"></dees-icon>
805
+ <span class="composerContextLabel">Replying to</span>
806
+ <span class="composerContextTitle">${this.heading}</span>
807
+ </div>
808
+ `
809
+ : ''}
810
+ </dees-harness-composer>
766
811
  </div>
767
812
  `;
768
813
  }
@@ -21,6 +21,7 @@ export const demoFunc = () => demoPage('Composer', 'Write, attach files, choose
21
21
  >
22
22
  <div class="dees-demo-label">Account, model and mode</div>
23
23
  <dees-harness-composer
24
+ contextDescription="Replying to Deploy assistant"
24
25
  account="account-1"
25
26
  model="gpt-5.5"
26
27
  reasoningEffort="high"
@@ -32,7 +33,11 @@ export const demoFunc = () => demoPage('Composer', 'Write, attach files, choose
32
33
  ]}
33
34
  .modelOptions=${['gpt-5.5', 'gpt-5', 'o4-mini']}
34
35
  .effortOptions=${['xhigh', 'high', 'medium', 'low']}
35
- ></dees-harness-composer>
36
+ >
37
+ <div slot="context" style="padding:8px 12px 0;font-size:11px;line-height:16px;color:var(--dees-color-text-secondary)">
38
+ Replying to <strong>Deploy assistant</strong>
39
+ </div>
40
+ </dees-harness-composer>
36
41
  <div class="dees-demo-label">Queue a follow-up while the agent works</div>
37
42
  <dees-harness-composer busy value="Refactor the sitemap job…"></dees-harness-composer>
38
43
  <div class="dees-demo-label">Steer the task with queued messages</div>
@@ -68,11 +68,14 @@ export class DeesHarnessComposer extends DeesElement {
68
68
  @property()
69
69
  accessor placeholder: string = 'Message the agent — drop or paste files to attach…';
70
70
 
71
+ /** Accessible description of the optional `context` slot inside the prompt field. */
72
+ @property()
73
+ accessor contextDescription: string = '';
74
+
71
75
  /**
72
76
  * Docked composers sit flush against their container edge-to-edge (a
73
77
  * top border instead of the floating card chrome) — used by
74
- * dees-harness-chat so the bar meets the transcript and the tasks panel
75
- * without a gap.
78
+ * dees-harness-chat at the bottom of its conversation column.
76
79
  */
77
80
  @property({ type: Boolean, reflect: true })
78
81
  accessor docked: boolean = false;
@@ -268,15 +271,37 @@ export class DeesHarnessComposer extends DeesElement {
268
271
  display: none;
269
272
  }
270
273
 
274
+ .promptField {
275
+ display: grid;
276
+ grid-template-columns: minmax(0, 1fr);
277
+ min-width: 0;
278
+ border: 1px solid var(--dees-color-control-border);
279
+ border-radius: var(--dees-radius-xl);
280
+ corner-shape: var(--dees-corner-shape);
281
+ background: var(--dees-color-control-bg);
282
+ }
283
+
284
+ .promptField:focus-within {
285
+ border-color: var(--dees-color-accent-primary);
286
+ outline: 2px solid var(--dees-color-focus-ring);
287
+ outline-offset: 1px;
288
+ }
289
+
290
+ .promptField:has(textarea:disabled) {
291
+ opacity: 0.55;
292
+ }
293
+
271
294
  textarea {
295
+ display: block;
272
296
  width: 100%;
273
- min-height: 64px;
297
+ min-width: 0;
298
+ min-height: 62px;
274
299
  max-height: 40vh;
275
300
  resize: none;
276
301
  padding: 10px 12px;
277
- border: 1px solid var(--dees-color-control-border);
278
- border-radius: var(--dees-radius-xl);
279
- background: var(--dees-color-control-bg);
302
+ border: 0;
303
+ border-radius: inherit;
304
+ background: transparent;
280
305
  color: var(--dees-color-text-primary);
281
306
  font-family: inherit;
282
307
  font-size: var(--dees-font-control-size, 13px);
@@ -290,13 +315,7 @@ export class DeesHarnessComposer extends DeesElement {
290
315
  }
291
316
 
292
317
  textarea:focus-visible {
293
- border-color: var(--dees-color-accent-primary);
294
- outline: 2px solid var(--dees-color-focus-ring);
295
- outline-offset: 1px;
296
- }
297
-
298
- textarea:disabled {
299
- opacity: 0.55;
318
+ outline: none;
300
319
  }
301
320
 
302
321
  .attachmentRow {
@@ -515,20 +534,24 @@ export class DeesHarnessComposer extends DeesElement {
515
534
  </div>
516
535
  `
517
536
  : ''}
518
- <textarea
519
- .value=${this.value}
520
- aria-label="Message"
521
- placeholder=${this.placeholder}
522
- ?disabled=${this.disabled}
523
- rows="1"
524
- @input=${this.handleTextInput}
525
- @keydown=${this.handleKeydown}
526
- @focus=${this.handlePromptFocus}
527
- @blur=${this.handlePromptBlur}
528
- @compositionstart=${this.handleCompositionStart}
529
- @compositionend=${this.handleCompositionEnd}
530
- @paste=${this.handlePaste}
531
- ></textarea>
537
+ <div class="promptField" @click=${this.handlePromptFieldClick}>
538
+ <slot name="context"></slot>
539
+ <textarea
540
+ .value=${this.value}
541
+ aria-label="Message"
542
+ aria-description=${this.contextDescription}
543
+ placeholder=${this.placeholder}
544
+ ?disabled=${this.disabled}
545
+ rows="1"
546
+ @input=${this.handleTextInput}
547
+ @keydown=${this.handleKeydown}
548
+ @focus=${this.handlePromptFocus}
549
+ @blur=${this.handlePromptBlur}
550
+ @compositionstart=${this.handleCompositionStart}
551
+ @compositionend=${this.handleCompositionEnd}
552
+ @paste=${this.handlePaste}
553
+ ></textarea>
554
+ </div>
532
555
  <div class="controlsRow">
533
556
  <dees-button
534
557
  size="sm"
@@ -653,6 +676,16 @@ export class DeesHarnessComposer extends DeesElement {
653
676
  `;
654
677
  }
655
678
 
679
+ private handlePromptFieldClick(event: MouseEvent): void {
680
+ // Context text is part of the field; preserve native interactions in slotted controls.
681
+ for (const target of event.composedPath()) {
682
+ if (target === event.currentTarget) break;
683
+ if (target instanceof Element
684
+ && target.matches('a[href], button, input, textarea, select, label, [tabindex], [contenteditable]')) return;
685
+ }
686
+ if (!this.disabled) this.shadowRoot?.querySelector<HTMLTextAreaElement>('textarea')?.focus();
687
+ }
688
+
656
689
  private renderSuggestions(): TemplateResult {
657
690
  return html`
658
691
  <ul