@design.estate/dees-catalog 9.8.0 → 11.0.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 (67) hide show
  1. package/dist_bundle/bundle.js +5626 -5343
  2. package/dist_bundle/bundle.js.map +1 -1
  3. package/dist_bundle/third-party-notices.md +783 -10
  4. package/dist_ts_web/00_commitinfo_data.js +2 -2
  5. package/dist_ts_web/elements/00actionerror.d.ts +32 -0
  6. package/dist_ts_web/elements/00actionerror.js +45 -0
  7. package/dist_ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.d.ts +16 -0
  8. package/dist_ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.js +40 -3
  9. package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.d.ts +7 -0
  10. package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.js +17 -17
  11. package/dist_ts_web/elements/00group-feedback/dees-hint/dees-hint.d.ts +14 -3
  12. package/dist_ts_web/elements/00group-feedback/dees-hint/dees-hint.demo.js +23 -4
  13. package/dist_ts_web/elements/00group-feedback/dees-hint/dees-hint.js +77 -5
  14. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +62 -48
  15. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +89 -51
  16. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +528 -662
  17. package/dist_ts_web/elements/00group-harness/dees-terminal-view/dees-terminal-view.d.ts +45 -6
  18. package/dist_ts_web/elements/00group-harness/dees-terminal-view/dees-terminal-view.js +184 -27
  19. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +55 -20
  20. package/dist_ts_web/elements/00group-input/dees-input-text/dees-input-text.d.ts +23 -3
  21. package/dist_ts_web/elements/00group-input/dees-input-text/dees-input-text.js +71 -11
  22. package/dist_ts_web/elements/00group-input/index.d.ts +0 -1
  23. package/dist_ts_web/elements/00group-input/index.js +1 -2
  24. package/dist_ts_web/elements/00group-overlay/dees-modal/dees-modal.d.ts +7 -0
  25. package/dist_ts_web/elements/00group-overlay/dees-modal/dees-modal.js +13 -3
  26. package/dist_ts_web/elements/index.d.ts +1 -2
  27. package/dist_ts_web/elements/index.js +2 -4
  28. package/dist_ts_web/services/DeesServiceLibLoader.d.ts +7 -0
  29. package/dist_ts_web/services/DeesServiceLibLoader.js +45 -22
  30. package/package.json +3 -4
  31. package/readme.md +105 -18
  32. package/scripts/check-third-party-notices.mjs +261 -0
  33. package/third-party-notices.md +783 -10
  34. package/ts_web/00_commitinfo_data.ts +1 -1
  35. package/ts_web/elements/00actionerror.ts +66 -0
  36. package/ts_web/elements/00group-appui/dees-appui-tabs/dees-appui-tabs.ts +38 -2
  37. package/ts_web/elements/00group-dataview/dees-table/dees-table.ts +18 -16
  38. package/ts_web/elements/00group-feedback/dees-hint/dees-hint.demo.ts +22 -3
  39. package/ts_web/elements/00group-feedback/dees-hint/dees-hint.ts +71 -3
  40. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +99 -49
  41. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +607 -752
  42. package/ts_web/elements/00group-harness/dees-terminal-view/dees-terminal-view.ts +196 -24
  43. package/ts_web/elements/00group-harness/interfaces.ts +59 -19
  44. package/ts_web/elements/00group-input/dees-input-text/dees-input-text.ts +73 -13
  45. package/ts_web/elements/00group-input/index.ts +0 -1
  46. package/ts_web/elements/00group-overlay/dees-modal/dees-modal.ts +13 -2
  47. package/ts_web/elements/index.ts +1 -4
  48. package/ts_web/services/DeesServiceLibLoader.ts +150 -102
  49. package/.smartconfig.json +0 -86
  50. package/dist_ts_web/elements/00group-input/dees-input-searchselect/dees-input-searchselect.d.ts +0 -1
  51. package/dist_ts_web/elements/00group-input/dees-input-searchselect/dees-input-searchselect.js +0 -2
  52. package/dist_ts_web/elements/00group-input/dees-input-searchselect/index.d.ts +0 -1
  53. package/dist_ts_web/elements/00group-input/dees-input-searchselect/index.js +0 -2
  54. package/dist_ts_web/elements/dees-search/dees-search.d.ts +0 -1
  55. package/dist_ts_web/elements/dees-search/dees-search.js +0 -2
  56. package/dist_ts_web/elements/dees-search/index.d.ts +0 -1
  57. package/dist_ts_web/elements/dees-search/index.js +0 -2
  58. package/dist_ts_web/elements/dees-tooltip/dees-tooltip.d.ts +0 -1
  59. package/dist_ts_web/elements/dees-tooltip/dees-tooltip.js +0 -2
  60. package/dist_ts_web/elements/dees-tooltip/index.d.ts +0 -1
  61. package/dist_ts_web/elements/dees-tooltip/index.js +0 -2
  62. package/ts_web/elements/00group-input/dees-input-searchselect/dees-input-searchselect.ts +0 -0
  63. package/ts_web/elements/00group-input/dees-input-searchselect/index.ts +0 -1
  64. package/ts_web/elements/dees-search/dees-search.ts +0 -0
  65. package/ts_web/elements/dees-search/index.ts +0 -1
  66. package/ts_web/elements/dees-tooltip/dees-tooltip.ts +0 -1
  67. package/ts_web/elements/dees-tooltip/index.ts +0 -1
@@ -1,14 +1,25 @@
1
- import { DeesElement, type CSSResult, type TemplateResult } from '@design.estate/dees-element';
1
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
+ import '../../00group-utility/dees-icon/dees-icon.js';
2
3
  declare global {
3
4
  interface HTMLElementTagNameMap {
4
5
  'dees-hint': DeesHint;
5
6
  }
6
7
  }
8
+ export type THintType = 'info' | 'success' | 'warning' | 'error';
9
+ /**
10
+ * An inline advisory note next to the thing it explains. Use `text` for a plain
11
+ * sentence and the default slot for markup; both render when both are set.
12
+ * For a hover-revealed label on a control, use the control's own tooltip.
13
+ */
7
14
  export declare class DeesHint extends DeesElement {
8
15
  static demo: () => TemplateResult<1>;
9
16
  static demoGroups: string[];
10
- accessor type: 'info' | 'warn' | 'error' | 'critical';
17
+ accessor type: THintType;
18
+ /** The hint sentence. Rendered before any slotted content. */
19
+ accessor text: string;
20
+ private accessor hasSlottedContent;
11
21
  constructor();
12
- static styles: CSSResult[];
22
+ static styles: import("@design.estate/dees-element").CSSResult[];
13
23
  render(): TemplateResult;
24
+ private handleSlotChange;
14
25
  }
@@ -1,5 +1,24 @@
1
1
  import { html } from '@design.estate/dees-element';
2
- export const demoFunc = () => html `
3
- <dees-hint></dees-hint>
4
- `;
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oaW50LmRlbW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvMDBncm91cC1mZWVkYmFjay9kZWVzLWhpbnQvZGVlcy1oaW50LmRlbW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRW5ELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUE7O0NBRWpDLENBQUMifQ==
2
+ import { demoPage, demoSection, demoCode } from '../../../demos/templates.js';
3
+ export const demoFunc = () => demoPage('Hint', 'An inline note next to the thing it explains. Four types carry the catalog status colors; a plain sentence or slotted markup both work.', html `
4
+ ${demoSection('Types', 'The type chooses the icon and the accent color. Info is the default.', html `
5
+ <dees-hint text="Workspace names are visible to everyone you invite."></dees-hint>
6
+ <dees-hint type="success" text="Your changes are saved and shared with your team."></dees-hint>
7
+ <dees-hint type="warning" text="This workspace has no owner. Assign one before the trial ends."></dees-hint>
8
+ <dees-hint type="error" text="The deployment could not reach the registry."></dees-hint>
9
+ ${demoCode('<dees-hint type="warning" text="Assign an owner before the trial ends."></dees-hint>')}
10
+ `)}
11
+ ${demoSection('Slotted content', 'Use the default slot when the note needs markup. Text and slotted content render together.', html `
12
+ <dees-hint type="info">Read the <a href="https://code.foss.global/design.estate/dees-catalog">component index</a> before adding a control.</dees-hint>
13
+ <dees-hint type="warning" text="Rotation is due.">
14
+ <strong> Keys older than 90 days stop working.</strong>
15
+ </dees-hint>
16
+ ${demoCode('<dees-hint type="info">Read the <a href="…">component index</a> first.</dees-hint>')}
17
+ `)}
18
+ ${demoSection('Empty hints', 'A hint with neither text nor slotted content reserves no space, so a conditional note needs no wrapper.', html `
19
+ <p class="dees-demo-caption">There is an empty hint between these two lines.</p>
20
+ <dees-hint></dees-hint>
21
+ <p class="dees-demo-caption">It renders nothing until it is given text.</p>
22
+ `)}
23
+ `);
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oaW50LmRlbW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvMDBncm91cC1mZWVkYmFjay9kZWVzLWhpbnQvZGVlcy1oaW50LmRlbW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLHlJQUF5SSxFQUFFLElBQUksQ0FBQTtJQUMxTCxXQUFXLENBQUMsT0FBTyxFQUFFLHNFQUFzRSxFQUFFLElBQUksQ0FBQTs7Ozs7TUFLL0YsUUFBUSxDQUFDLHNGQUFzRixDQUFDO0dBQ25HLENBQUM7SUFDQSxXQUFXLENBQUMsaUJBQWlCLEVBQUUsNEZBQTRGLEVBQUUsSUFBSSxDQUFBOzs7OztNQUsvSCxRQUFRLENBQUMsb0ZBQW9GLENBQUM7R0FDakcsQ0FBQztJQUNBLFdBQVcsQ0FBQyxhQUFhLEVBQUUseUdBQXlHLEVBQUUsSUFBSSxDQUFBOzs7O0dBSTNJLENBQUM7Q0FDSCxDQUFDLENBQUMifQ==
@@ -32,10 +32,22 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
32
32
  }
33
33
  return useValue ? value : void 0;
34
34
  };
35
- import { DeesElement, css, cssManager, customElement, html, property, } from '@design.estate/dees-element';
35
+ import { DeesElement, css, cssManager, customElement, html, property, state, } from '@design.estate/dees-element';
36
36
  import * as domtools from '@design.estate/dees-domtools';
37
37
  import { demoFunc } from './dees-hint.demo.js';
38
38
  import { themeDefaultStyles } from '../../00theme.js';
39
+ import '../../00group-utility/dees-icon/dees-icon.js';
40
+ const hintIcons = {
41
+ info: 'lucide:Info',
42
+ success: 'lucide:CircleCheck',
43
+ warning: 'lucide:TriangleAlert',
44
+ error: 'lucide:CircleAlert',
45
+ };
46
+ /**
47
+ * An inline advisory note next to the thing it explains. Use `text` for a plain
48
+ * sentence and the default slot for markup; both render when both are set.
49
+ * For a hover-revealed label on a control, use the control's own tooltip.
50
+ */
39
51
  let DeesHint = (() => {
40
52
  let _classDecorators = [customElement('dees-hint')];
41
53
  let _classDescriptor;
@@ -45,12 +57,22 @@ let DeesHint = (() => {
45
57
  let _type_decorators;
46
58
  let _type_initializers = [];
47
59
  let _type_extraInitializers = [];
60
+ let _text_decorators;
61
+ let _text_initializers = [];
62
+ let _text_extraInitializers = [];
63
+ let _hasSlottedContent_decorators;
64
+ let _hasSlottedContent_initializers = [];
65
+ let _hasSlottedContent_extraInitializers = [];
48
66
  var DeesHint = class extends _classSuper {
49
67
  static { _classThis = this; }
50
68
  static {
51
69
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
52
- _type_decorators = [property({ type: String })];
70
+ _type_decorators = [property({ type: String, reflect: true })];
71
+ _text_decorators = [property({ type: String })];
72
+ _hasSlottedContent_decorators = [state()];
53
73
  __esDecorate(this, null, _type_decorators, { kind: "accessor", name: "type", static: false, private: false, access: { has: obj => "type" in obj, get: obj => obj.type, set: (obj, value) => { obj.type = value; } }, metadata: _metadata }, _type_initializers, _type_extraInitializers);
74
+ __esDecorate(this, null, _text_decorators, { kind: "accessor", name: "text", static: false, private: false, access: { has: obj => "text" in obj, get: obj => obj.text, set: (obj, value) => { obj.text = value; } }, metadata: _metadata }, _text_initializers, _text_extraInitializers);
75
+ __esDecorate(this, null, _hasSlottedContent_decorators, { kind: "accessor", name: "hasSlottedContent", static: false, private: false, access: { has: obj => "hasSlottedContent" in obj, get: obj => obj.hasSlottedContent, set: (obj, value) => { obj.hasSlottedContent = value; } }, metadata: _metadata }, _hasSlottedContent_initializers, _hasSlottedContent_extraInitializers);
54
76
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
55
77
  DeesHint = _classThis = _classDescriptor.value;
56
78
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
@@ -60,9 +82,15 @@ let DeesHint = (() => {
60
82
  #type_accessor_storage = __runInitializers(this, _type_initializers, 'info');
61
83
  get type() { return this.#type_accessor_storage; }
62
84
  set type(value) { this.#type_accessor_storage = value; }
85
+ #text_accessor_storage = (__runInitializers(this, _type_extraInitializers), __runInitializers(this, _text_initializers, ''));
86
+ /** The hint sentence. Rendered before any slotted content. */
87
+ get text() { return this.#text_accessor_storage; }
88
+ set text(value) { this.#text_accessor_storage = value; }
89
+ #hasSlottedContent_accessor_storage = (__runInitializers(this, _text_extraInitializers), __runInitializers(this, _hasSlottedContent_initializers, false));
90
+ get hasSlottedContent() { return this.#hasSlottedContent_accessor_storage; }
91
+ set hasSlottedContent(value) { this.#hasSlottedContent_accessor_storage = value; }
63
92
  constructor() {
64
93
  super();
65
- __runInitializers(this, _type_extraInitializers);
66
94
  domtools.elementBasic.setup();
67
95
  }
68
96
  static styles = [themeDefaultStyles, cssManager.defaultStyles, css `
@@ -70,15 +98,59 @@ let DeesHint = (() => {
70
98
  display: block;
71
99
  font-family: var(--dees-font-family);
72
100
  color: var(--dees-color-text-primary);
101
+ --dees-hint-accent: var(--dees-color-accent-primary);
73
102
  }
74
103
 
104
+ :host([type='success']) { --dees-hint-accent: var(--dees-color-text-success); }
105
+ :host([type='warning']) { --dees-hint-accent: var(--dees-color-text-warning); }
106
+ :host([type='error']) { --dees-hint-accent: var(--dees-color-text-error); }
107
+
75
108
  .mainbox {
76
109
  box-sizing: border-box;
110
+ display: flex;
111
+ align-items: flex-start;
112
+ gap: var(--dees-spacing-sm);
113
+ padding: var(--dees-spacing-sm) var(--dees-spacing-md);
114
+ border: 1px solid color-mix(in srgb, var(--dees-hint-accent) 28%, transparent);
115
+ border-radius: var(--dees-radius-lg);
116
+ corner-shape: var(--dees-corner-shape);
117
+ background: color-mix(in srgb, var(--dees-hint-accent) 8%, transparent);
118
+ font-size: var(--dees-font-footnote-size);
119
+ line-height: var(--dees-font-footnote-line);
120
+ overflow-wrap: anywhere;
121
+ }
122
+
123
+ /* An element with neither text nor slotted content reserves no space. */
124
+ .mainbox.empty {
125
+ display: none;
126
+ }
127
+
128
+ .icon {
129
+ flex-shrink: 0;
130
+ color: var(--dees-hint-accent);
131
+ font-size: 16px;
132
+ /* Optically aligns the glyph with the first line of text. */
133
+ margin-top: 1px;
134
+ }
135
+
136
+ .content {
137
+ min-width: 0;
138
+ color: var(--dees-color-text-secondary);
77
139
  }
78
140
  `];
79
141
  render() {
80
- return html ` <div class="mainbox"></div> `;
142
+ const isEmpty = !this.text && !this.hasSlottedContent;
143
+ return html `
144
+ <div class="mainbox ${isEmpty ? 'empty' : ''}" role="note">
145
+ <dees-icon class="icon" aria-hidden="true" .icon=${hintIcons[this.type] ?? hintIcons.info}></dees-icon>
146
+ <div class="content">${this.text}<slot @slotchange=${this.handleSlotChange}></slot></div>
147
+ </div>
148
+ `;
81
149
  }
150
+ handleSlotChange = (__runInitializers(this, _hasSlottedContent_extraInitializers), (eventArg) => {
151
+ const assigned = eventArg.target.assignedNodes({ flatten: true });
152
+ this.hasSlottedContent = assigned.some((node) => node.nodeType === Node.ELEMENT_NODE || (node.textContent ?? '').trim().length > 0);
153
+ });
82
154
  static {
83
155
  __runInitializers(_classThis, _classExtraInitializers);
84
156
  }
@@ -86,4 +158,4 @@ let DeesHint = (() => {
86
158
  return DeesHint = _classThis;
87
159
  })();
88
160
  export { DeesHint };
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1oaW50L2RlZXMtaGludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxHQUFHLEVBQ0gsVUFBVSxFQUNWLGFBQWEsRUFDYixJQUFJLEVBQ0osUUFBUSxHQUdULE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxLQUFLLFFBQVEsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7SUFTekMsUUFBUTs0QkFEcEIsYUFBYSxDQUFDLFdBQVcsQ0FBQzs7OztzQkFDRyxXQUFXOzs7O3dCQUFuQixTQUFRLFdBQVc7Ozs7Z0NBSXRDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUMzQixpS0FBUyxJQUFJLDZCQUFKLElBQUksbUZBQWtEO1lBTGpFLDZLQTJCQzs7OztRQTFCUSxNQUFNLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUN2QixNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFHeEMscUVBQXdELE1BQU0sRUFBQztRQUEvRCxJQUFTLElBQUksMENBQWtEO1FBQS9ELElBQVMsSUFBSSxnREFBa0Q7UUFFL0Q7WUFDRSxLQUFLLEVBQUUsQ0FBQzs7WUFDUixRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQy9CO1FBRU0sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFBOzs7Ozs7Ozs7O0tBVXRFLENBQUMsQ0FBQztRQUVFLE1BQU07WUFDWCxPQUFPLElBQUksQ0FBQSwrQkFBK0IsQ0FBQztRQUM3QyxDQUFDOztZQTFCVSx1REFBUTs7Ozs7U0FBUixRQUFRIn0=
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1oaW50L2RlZXMtaGludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxHQUFHLEVBQ0gsVUFBVSxFQUNWLGFBQWEsRUFDYixJQUFJLEVBQ0osUUFBUSxFQUNSLEtBQUssR0FFTixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sS0FBSyxRQUFRLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sOENBQThDLENBQUM7QUFVdEQsTUFBTSxTQUFTLEdBQThCO0lBQzNDLElBQUksRUFBRSxhQUFhO0lBQ25CLE9BQU8sRUFBRSxvQkFBb0I7SUFDN0IsT0FBTyxFQUFFLHNCQUFzQjtJQUMvQixLQUFLLEVBQUUsb0JBQW9CO0NBQzVCLENBQUM7QUFFRjs7OztHQUlHO0lBRVUsUUFBUTs0QkFEcEIsYUFBYSxDQUFDLFdBQVcsQ0FBQzs7OztzQkFDRyxXQUFXOzs7Ozs7Ozs7O3dCQUFuQixTQUFRLFdBQVc7Ozs7Z0NBSXRDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO2dDQUl6QyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7NkNBRzFCLEtBQUssRUFBRTtZQU5SLGlLQUFTLElBQUksNkJBQUosSUFBSSxtRkFBcUI7WUFJbEMsaUtBQVMsSUFBSSw2QkFBSixJQUFJLG1GQUFjO1lBRzNCLHdNQUFpQixpQkFBaUIsNkJBQWpCLGlCQUFpQiw2R0FBUztZQVo3Qyw2S0FnRkM7Ozs7UUEvRVEsTUFBTSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDdkIsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBR3hDLHFFQUEyQixNQUFNLEVBQUM7UUFBbEMsSUFBUyxJQUFJLDBDQUFxQjtRQUFsQyxJQUFTLElBQUksZ0RBQXFCO1FBSWxDLHdIQUF3QixFQUFFLEdBQUM7UUFGM0IsOERBQThEO1FBRTlELElBQVMsSUFBSSwwQ0FBYztRQUEzQixJQUFTLElBQUksZ0RBQWM7UUFHM0Isa0pBQXFDLEtBQUssR0FBQztRQUEzQyxJQUFpQixpQkFBaUIsdURBQVM7UUFBM0MsSUFBaUIsaUJBQWlCLDZEQUFTO1FBRTNDO1lBQ0UsS0FBSyxFQUFFLENBQUM7WUFDUixRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLENBQUM7UUFFTSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBNEN0RSxDQUFDLENBQUM7UUFFRSxNQUFNO1lBQ1gsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3RELE9BQU8sSUFBSSxDQUFBOzRCQUNhLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFOzJEQUNTLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLElBQUk7K0JBQ2xFLElBQUksQ0FBQyxJQUFJLHFCQUFxQixJQUFJLENBQUMsZ0JBQWdCOztLQUU3RSxDQUFDO1FBQ0osQ0FBQztRQUVPLGdCQUFnQixtRUFBRyxDQUFDLFFBQWUsRUFBRSxFQUFFO1lBQzdDLE1BQU0sUUFBUSxHQUFJLFFBQVEsQ0FBQyxNQUEwQixDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDOUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQyxFQUFDOztZQS9FUyx1REFBUTs7Ozs7U0FBUixRQUFRIn0=
@@ -1,31 +1,33 @@
1
1
  import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
- import type { IHarnessResourceAssociation, IHarnessResourceMeta, IHarnessSessionGroup, IHarnessSessionMeta, THarnessResourceAssociationInteractionSource } from '../interfaces.js';
2
+ import type { IDropSlot, IHarnessResourceAssociation, IHarnessResourceMeta, IHarnessSessionGroup, IHarnessSessionListItemRef, IHarnessSessionMeta, THarnessResourceAssociationInteractionSource } from '../interfaces.js';
3
3
  import '../../00group-utility/dees-icon/dees-icon.js';
4
4
  declare global {
5
5
  interface HTMLElementTagNameMap {
6
6
  'dees-harness-session-list': DeesHarnessSessionList;
7
7
  }
8
8
  }
9
- interface IDropSlot {
10
- groupId: string | null;
11
- index: number;
12
- }
13
9
  /**
14
10
  * Searchable conversation list, embeddable in a sidebar or a DeesModal.
15
11
  * Emits `harness-session-select` on click, `harness-session-open` on
16
12
  * double-click or Enter, and `harness-session-context` with viewport
17
13
  * coordinates on right-click, Actions, or ContextMenu/Shift+F10.
18
14
  *
19
- * With `enableGrouping`, sessions render under user-defined `groups` and can
20
- * be dragged between groups and reordered. The component never mutates its
21
- * inputs: drops emit `harness-session-move`, the "new group" button emits
22
- * `harness-group-create-request`, and right-clicking a group header emits
23
- * `harness-group-context` — the host persists changes and passes fresh
24
- * `groups` back in. Sessions in no group render in the trailing ungrouped
25
- * section with pinned entries first, then explicit order, then new sessions by
26
- * recency. While a search query is active the list is flat. Generic resources
27
- * project as controlled child rows or into a trailing unattached Resources
28
- * section; association interactions only emit host requests.
15
+ * Sessions and host resources are peers in ONE ordered list: a resource row
16
+ * can be dragged anywhere a session can, including between sessions and into
17
+ * or out of groups. Attaching a resource to a session is a separate explicit
18
+ * host action (`requestResourceAssociation()` /
19
+ * `harness-resource-association-request`) that never moves a row; the
20
+ * association only renders as a marker on the resource row.
21
+ *
22
+ * The component never mutates its inputs: reordering emits `harness-item-move`,
23
+ * the "new group" button emits `harness-group-create-request`, and
24
+ * right-clicking a group header emits `harness-group-context` — the host
25
+ * persists changes and passes fresh `groups` / `ungroupedItemIds` back in.
26
+ * Items in no group render in the trailing ungrouped section with pinned
27
+ * entries first, then explicit order, then new entries by recency. With
28
+ * `enableGrouping` the list additionally renders group chrome. While a search
29
+ * query is active the list is one flat, non-sortable, recency-ordered section
30
+ * in which sessions and resources match as peers.
29
31
  */
30
32
  export declare class DeesHarnessSessionList extends DeesElement {
31
33
  static demo: () => TemplateResult<1>;
@@ -36,17 +38,18 @@ export declare class DeesHarnessSessionList extends DeesElement {
36
38
  accessor emptyText: string;
37
39
  accessor groups: IHarnessSessionGroup[];
38
40
  accessor enableGrouping: boolean;
39
- /** Explicit order for sortable sessions outside user-defined groups. */
40
- accessor ungroupedSessionIds: string[];
41
+ /** Explicit order for sortable items of both kinds outside user-defined groups. */
42
+ accessor ungroupedItemIds: IHarnessSessionListItemRef[];
41
43
  accessor resources: IHarnessResourceMeta[];
42
44
  accessor resourceAssociations: IHarnessResourceAssociation[];
43
45
  accessor selectedResourceId: string;
44
- /** Serializable attach/reassign targets. A missing resource entry means no eligible targets. */
45
- accessor eligibleSessionIdsByResourceId: Record<string, string[]>;
46
+ /**
47
+ * Serializable attach/reassign targets for host menus. A missing entry leaves
48
+ * the resource unrestricted; an empty array means no eligible target.
49
+ */
50
+ accessor eligibleTargetsByResourceId: Record<string, IHarnessSessionListItemRef[]>;
46
51
  accessor search: string;
47
- accessor draggingSessionId: string;
48
- accessor draggingResourceId: string;
49
- accessor resourceDropTargetSessionId: string;
52
+ accessor draggingItem: IHarnessSessionListItemRef | undefined;
50
53
  accessor dropSlot: IDropSlot | undefined;
51
54
  accessor draggedItemHeight: number;
52
55
  accessor expandedSessionIds: ReadonlySet<string>;
@@ -72,32 +75,47 @@ export declare class DeesHarnessSessionList extends DeesElement {
72
75
  private dragAutoScrollVelocity;
73
76
  private dragAutoScrollLastFrame;
74
77
  static styles: import("@design.estate/dees-element").CSSResult[];
75
- private get sessionsById();
76
78
  private get resourcesById();
77
- /** First valid record wins; unknown and duplicate records remain untouched but are not projected. */
79
+ /**
80
+ * First valid record wins; unknown records, self-references and duplicates
81
+ * remain untouched but are not projected. Keyed by resource id.
82
+ */
78
83
  private get acceptedResourceAssociations();
79
84
  private get acceptedResources();
85
+ /** Sessions and resources as one pool of orderable items, before grouping and search. */
86
+ private get acceptedItems();
87
+ private get itemsByKey();
88
+ /** Groups only organize the list while grouping is enabled. */
89
+ private get effectiveGroups();
90
+ private get groupedItemKeys();
91
+ private itemsForGroup;
92
+ /** Pinned entries first, then explicitly ordered items, then unknown items by recency. */
93
+ private get ungroupedItems();
80
94
  private resourceMatchesSearch;
81
95
  private sessionMatchesSearch;
82
- private resourcesForSession;
83
- private get unattachedResources();
84
- private get groupedSessionIds();
85
- /** Pinned entries first, followed by explicitly ordered sortable sessions. */
86
- private get ungroupedSessions();
87
- private get filteredSessions();
96
+ private itemMatchesSearch;
97
+ /** Search flattens the list: sessions and resources match as peers, newest first. */
98
+ private get searchItems();
99
+ private get searchActive();
100
+ private sortableItems;
101
+ private groupIdForItem;
102
+ private rowElementFor;
88
103
  focusSearch(): void;
89
- requestResourceAssociation(resourceIdArg: string, toSessionIdArg: string | null, sourceArg?: THarnessResourceAssociationInteractionSource): boolean;
104
+ requestResourceAssociation(resourceIdArg: string, toTargetArg: IHarnessSessionListItemRef | null, sourceArg?: THarnessResourceAssociationInteractionSource): boolean;
90
105
  updated(changedProperties: Map<PropertyKey, unknown>): void;
91
106
  connectedCallback(): Promise<void>;
92
107
  disconnectedCallback(): Promise<void>;
93
108
  render(): TemplateResult;
94
- private renderFlatList;
95
- private renderGroupedList;
109
+ private renderEmptyNote;
110
+ private renderSearchList;
111
+ private renderOrderedList;
112
+ private renderGroup;
96
113
  private renderSection;
97
114
  private renderDropPlaceholder;
98
- private renderItem;
99
- private renderUnattachedResources;
100
- private renderResource;
115
+ /** One grip for both kinds; only its size and extra class differ. */
116
+ private renderDragHandle;
117
+ private renderSessionItem;
118
+ private renderResourceItem;
101
119
  private invokeSessionContext;
102
120
  private handleSessionContextKey;
103
121
  private eventTargetsSessionActions;
@@ -109,10 +127,7 @@ export declare class DeesHarnessSessionList extends DeesElement {
109
127
  private sessionStateIcon;
110
128
  private toggleSessionExpanded;
111
129
  private toggleGroupCollapsed;
112
- private sortableSessions;
113
- private sessionsForGroup;
114
130
  private handlePointerDown;
115
- private handleResourcePointerDown;
116
131
  private readonly handlePointerMove;
117
132
  private readonly handlePointerUp;
118
133
  private readonly handlePointerCancel;
@@ -120,10 +135,7 @@ export declare class DeesHarnessSessionList extends DeesElement {
120
135
  private readonly handleDragKeyDown;
121
136
  private readonly handleDragWindowBlur;
122
137
  private startPointerDrag;
123
- private startResourcePointerDrag;
124
138
  private moveDragPreview;
125
- private moveResourceDragPreview;
126
- private updateResourceDropTargetFromPointer;
127
139
  private setDropSlot;
128
140
  private clearDropSlot;
129
141
  private updateDragAutoScrollVelocity;
@@ -134,12 +146,16 @@ export declare class DeesHarnessSessionList extends DeesElement {
134
146
  private readonly syncScrollShadowState;
135
147
  private stopDragAutoScroll;
136
148
  private createMoveDetail;
149
+ private emitItemMove;
137
150
  private handleKeyboardMove;
138
- private captureCardRects;
151
+ private rowKey;
152
+ private captureRowRects;
139
153
  private restoreKeyboardMoveFocus;
140
- private eligibleSessionIds;
141
- private sameSessionIds;
154
+ /** Known, de-duplicated targets the host allows; an absent entry means unrestricted. */
155
+ private eligibleTargets;
142
156
  private isResourceTargetEligible;
157
+ private itemTitleFor;
158
+ private emitSession;
143
159
  private emitResource;
144
160
  private handleResourceContextKey;
145
161
  private emitResourceContext;
@@ -147,9 +163,7 @@ export declare class DeesHarnessSessionList extends DeesElement {
147
163
  private clearResourceContextState;
148
164
  private reconcilePendingResourceAssociation;
149
165
  private resourceAssociationAnnouncement;
150
- private animateCardReflow;
166
+ private animateRowReflow;
151
167
  private cancelReflowAnimations;
152
168
  private finishPointerDrag;
153
- private emit;
154
169
  }
155
- export {};