@social.io/catalog 1.3.0 → 2.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 (124) hide show
  1. package/.smartconfig.json +51 -0
  2. package/dist_bundle/bundle.js +5450 -3267
  3. package/dist_ts_web/00_commitinfo_data.js +3 -3
  4. package/dist_ts_web/elements/index.d.ts +20 -3
  5. package/dist_ts_web/elements/index.js +27 -7
  6. package/dist_ts_web/elements/sio-ai-card.d.ts +39 -0
  7. package/dist_ts_web/elements/sio-ai-card.js +229 -0
  8. package/dist_ts_web/elements/sio-avatar.d.ts +46 -0
  9. package/dist_ts_web/elements/sio-avatar.js +379 -0
  10. package/dist_ts_web/elements/sio-bucket-header.d.ts +36 -0
  11. package/dist_ts_web/elements/sio-bucket-header.js +197 -0
  12. package/dist_ts_web/elements/sio-button.d.ts +7 -3
  13. package/dist_ts_web/elements/sio-button.js +253 -152
  14. package/dist_ts_web/elements/sio-channel-rail.d.ts +37 -0
  15. package/dist_ts_web/elements/sio-channel-rail.js +275 -0
  16. package/dist_ts_web/elements/sio-chip.d.ts +25 -0
  17. package/dist_ts_web/elements/sio-chip.js +188 -0
  18. package/dist_ts_web/elements/sio-cmdk.d.ts +59 -0
  19. package/dist_ts_web/elements/sio-cmdk.js +471 -0
  20. package/dist_ts_web/elements/sio-combox.d.ts +55 -1
  21. package/dist_ts_web/elements/sio-combox.js +458 -261
  22. package/dist_ts_web/elements/sio-composer.d.ts +48 -0
  23. package/dist_ts_web/elements/sio-composer.js +357 -0
  24. package/dist_ts_web/elements/sio-conversation-selector.d.ts +41 -1
  25. package/dist_ts_web/elements/sio-conversation-selector.js +426 -238
  26. package/dist_ts_web/elements/sio-conversation-view.d.ts +34 -6
  27. package/dist_ts_web/elements/sio-conversation-view.js +738 -564
  28. package/dist_ts_web/elements/sio-dropdown-menu.d.ts +6 -6
  29. package/dist_ts_web/elements/sio-dropdown-menu.js +223 -169
  30. package/dist_ts_web/elements/sio-fab.d.ts +23 -5
  31. package/dist_ts_web/elements/sio-fab.js +259 -235
  32. package/dist_ts_web/elements/sio-glass-toolbar.d.ts +22 -0
  33. package/dist_ts_web/elements/sio-glass-toolbar.js +178 -0
  34. package/dist_ts_web/elements/sio-icon.d.ts +1 -0
  35. package/dist_ts_web/elements/sio-icon.js +254 -94
  36. package/dist_ts_web/elements/sio-image-lightbox.d.ts +3 -4
  37. package/dist_ts_web/elements/sio-image-lightbox.js +282 -191
  38. package/dist_ts_web/elements/sio-inset-list.d.ts +28 -0
  39. package/dist_ts_web/elements/sio-inset-list.js +191 -0
  40. package/dist_ts_web/elements/sio-kbd.d.ts +16 -0
  41. package/dist_ts_web/elements/sio-kbd.js +117 -0
  42. package/dist_ts_web/elements/sio-list-row.d.ts +55 -0
  43. package/dist_ts_web/elements/sio-list-row.js +462 -0
  44. package/dist_ts_web/elements/sio-message-input.d.ts +25 -4
  45. package/dist_ts_web/elements/sio-message-input.js +231 -226
  46. package/dist_ts_web/elements/sio-paper-thumb.d.ts +24 -0
  47. package/dist_ts_web/elements/sio-paper-thumb.js +293 -0
  48. package/dist_ts_web/elements/sio-pdf-viewer.d.ts +2 -0
  49. package/dist_ts_web/elements/sio-pdf-viewer.js +344 -244
  50. package/dist_ts_web/elements/sio-segmented.d.ts +32 -0
  51. package/dist_ts_web/elements/sio-segmented.js +217 -0
  52. package/dist_ts_web/elements/sio-step-timeline.d.ts +28 -0
  53. package/dist_ts_web/elements/sio-step-timeline.js +222 -0
  54. package/dist_ts_web/elements/sio-tab-bar.d.ts +36 -0
  55. package/dist_ts_web/elements/sio-tab-bar.js +232 -0
  56. package/dist_ts_web/elements/sio-unread-badge.d.ts +25 -0
  57. package/dist_ts_web/elements/sio-unread-badge.js +203 -0
  58. package/dist_ts_web/elements/sio-waveform.d.ts +34 -0
  59. package/dist_ts_web/elements/sio-waveform.js +304 -0
  60. package/dist_ts_web/elements/tokens.d.ts +70 -0
  61. package/dist_ts_web/elements/tokens.js +277 -0
  62. package/dist_ts_web/pages/firstpage.d.ts +5 -0
  63. package/dist_ts_web/pages/firstpage.js +21 -2
  64. package/dist_ts_web/pages/mainpage.d.ts +6 -0
  65. package/dist_ts_web/pages/mainpage.js +111 -39
  66. package/{license → license.md} +3 -1
  67. package/package.json +23 -29
  68. package/readme.hints.md +81 -0
  69. package/readme.md +85 -151
  70. package/ts_web/00_commitinfo_data.ts +2 -2
  71. package/ts_web/elements/index.ts +30 -7
  72. package/ts_web/elements/sio-ai-card.ts +175 -0
  73. package/ts_web/elements/sio-avatar.ts +295 -0
  74. package/ts_web/elements/sio-bucket-header.ts +157 -0
  75. package/ts_web/elements/sio-button.ts +149 -127
  76. package/ts_web/elements/sio-channel-rail.ts +243 -0
  77. package/ts_web/elements/sio-chip.ts +134 -0
  78. package/ts_web/elements/sio-cmdk.ts +461 -0
  79. package/ts_web/elements/sio-combox.ts +327 -204
  80. package/ts_web/elements/sio-composer.ts +306 -0
  81. package/ts_web/elements/sio-conversation-selector.ts +350 -228
  82. package/ts_web/elements/sio-conversation-view.ts +573 -457
  83. package/ts_web/elements/sio-dropdown-menu.ts +112 -130
  84. package/ts_web/elements/sio-fab.ts +192 -227
  85. package/ts_web/elements/sio-glass-toolbar.ts +140 -0
  86. package/ts_web/elements/sio-icon.ts +147 -25
  87. package/ts_web/elements/sio-image-lightbox.ts +62 -64
  88. package/ts_web/elements/sio-inset-list.ts +140 -0
  89. package/ts_web/elements/sio-kbd.ts +80 -0
  90. package/ts_web/elements/sio-list-row.ts +393 -0
  91. package/ts_web/elements/sio-message-input.ts +142 -221
  92. package/ts_web/elements/sio-paper-thumb.ts +244 -0
  93. package/ts_web/elements/sio-pdf-viewer.ts +58 -60
  94. package/ts_web/elements/sio-segmented.ts +183 -0
  95. package/ts_web/elements/sio-step-timeline.ts +179 -0
  96. package/ts_web/elements/sio-tab-bar.ts +195 -0
  97. package/ts_web/elements/sio-unread-badge.ts +147 -0
  98. package/ts_web/elements/sio-waveform.ts +239 -0
  99. package/ts_web/elements/tokens.ts +297 -0
  100. package/ts_web/pages/firstpage.ts +20 -1
  101. package/ts_web/pages/mainpage.ts +111 -39
  102. package/dist_bundle/bundle.js.map +0 -7
  103. package/dist_ts_web/elements/00colors.d.ts +0 -108
  104. package/dist_ts_web/elements/00colors.js +0 -137
  105. package/dist_ts_web/elements/00fonts.d.ts +0 -60
  106. package/dist_ts_web/elements/00fonts.js +0 -129
  107. package/dist_ts_web/elements/00tokens.d.ts +0 -123
  108. package/dist_ts_web/elements/00tokens.js +0 -176
  109. package/dist_ts_web/elements/sio-conversation-list.d.ts +0 -20
  110. package/dist_ts_web/elements/sio-conversation-list.js +0 -495
  111. package/dist_ts_web/elements/sio-recorder.d.ts +0 -60
  112. package/dist_ts_web/elements/sio-recorder.js +0 -173
  113. package/dist_ts_web/elements/sio-subwidget-conversations.d.ts +0 -16
  114. package/dist_ts_web/elements/sio-subwidget-conversations.js +0 -350
  115. package/dist_ts_web/elements/sio-subwidget-onboardme.d.ts +0 -7
  116. package/dist_ts_web/elements/sio-subwidget-onboardme.js +0 -243
  117. package/dist_watch/bundle.js +0 -81694
  118. package/dist_watch/bundle.js.map +0 -7
  119. package/dist_watch/index.html +0 -25
  120. package/npmextra.json +0 -19
  121. package/ts_web/elements/00colors.ts +0 -164
  122. package/ts_web/elements/00fonts.ts +0 -145
  123. package/ts_web/elements/00tokens.ts +0 -197
  124. package/ts_web/elements/sio-recorder.ts +0 -213
@@ -0,0 +1,471 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { DeesElement, html, css, customElement, property, state, } from '@design.estate/dees-element';
36
+ import { sioElementStyles } from './tokens.js';
37
+ import './sio-icon.js';
38
+ import './sio-kbd.js';
39
+ let SioCmdk = (() => {
40
+ let _classDecorators = [customElement('sio-cmdk')];
41
+ let _classDescriptor;
42
+ let _classExtraInitializers = [];
43
+ let _classThis;
44
+ let _classSuper = DeesElement;
45
+ let _sections_decorators;
46
+ let _sections_initializers = [];
47
+ let _sections_extraInitializers = [];
48
+ let _open_decorators;
49
+ let _open_initializers = [];
50
+ let _open_extraInitializers = [];
51
+ let _query_decorators;
52
+ let _query_initializers = [];
53
+ let _query_extraInitializers = [];
54
+ let _placeholder_decorators;
55
+ let _placeholder_initializers = [];
56
+ let _placeholder_extraInitializers = [];
57
+ let _activeIndex_decorators;
58
+ let _activeIndex_initializers = [];
59
+ let _activeIndex_extraInitializers = [];
60
+ var SioCmdk = class extends _classSuper {
61
+ static { _classThis = this; }
62
+ static {
63
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
64
+ _sections_decorators = [property({ type: Array })];
65
+ _open_decorators = [property({ type: Boolean, reflect: true })];
66
+ _query_decorators = [property({ type: String })];
67
+ _placeholder_decorators = [property({ type: String })];
68
+ _activeIndex_decorators = [state()];
69
+ __esDecorate(this, null, _sections_decorators, { kind: "accessor", name: "sections", static: false, private: false, access: { has: obj => "sections" in obj, get: obj => obj.sections, set: (obj, value) => { obj.sections = value; } }, metadata: _metadata }, _sections_initializers, _sections_extraInitializers);
70
+ __esDecorate(this, null, _open_decorators, { kind: "accessor", name: "open", static: false, private: false, access: { has: obj => "open" in obj, get: obj => obj.open, set: (obj, value) => { obj.open = value; } }, metadata: _metadata }, _open_initializers, _open_extraInitializers);
71
+ __esDecorate(this, null, _query_decorators, { kind: "accessor", name: "query", static: false, private: false, access: { has: obj => "query" in obj, get: obj => obj.query, set: (obj, value) => { obj.query = value; } }, metadata: _metadata }, _query_initializers, _query_extraInitializers);
72
+ __esDecorate(this, null, _placeholder_decorators, { kind: "accessor", name: "placeholder", static: false, private: false, access: { has: obj => "placeholder" in obj, get: obj => obj.placeholder, set: (obj, value) => { obj.placeholder = value; } }, metadata: _metadata }, _placeholder_initializers, _placeholder_extraInitializers);
73
+ __esDecorate(this, null, _activeIndex_decorators, { kind: "accessor", name: "activeIndex", static: false, private: false, access: { has: obj => "activeIndex" in obj, get: obj => obj.activeIndex, set: (obj, value) => { obj.activeIndex = value; } }, metadata: _metadata }, _activeIndex_initializers, _activeIndex_extraInitializers);
74
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
75
+ SioCmdk = _classThis = _classDescriptor.value;
76
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
77
+ }
78
+ static demo = () => {
79
+ const demoSections = [
80
+ {
81
+ name: 'Actions',
82
+ items: [
83
+ { id: 'action.reply', icon: 'reply', label: 'Reply', shortcut: 'R' },
84
+ { id: 'action.reply-all', icon: 'reply-all', label: 'Reply all', shortcut: '⇧R' },
85
+ { id: 'action.forward', icon: 'forward', label: 'Forward', shortcut: 'F' },
86
+ { id: 'action.archive', icon: 'archive', label: 'Archive', shortcut: 'E' },
87
+ ],
88
+ },
89
+ {
90
+ name: 'Jump to',
91
+ items: [
92
+ { id: 'goto.inbox-people', icon: 'inbox', label: 'Inbox · People', shortcut: 'G I' },
93
+ { id: 'goto.starred', icon: 'star', label: 'Starred', shortcut: 'G S' },
94
+ { id: 'goto.sent', icon: 'send', label: 'Sent', shortcut: 'G T' },
95
+ ],
96
+ },
97
+ {
98
+ name: 'Snooze',
99
+ items: [
100
+ { id: 'snooze.tomorrow', icon: 'sunset', label: 'Tomorrow morning', shortcut: 'H 1' },
101
+ { id: 'snooze.evening', icon: 'clock', label: 'This evening', shortcut: 'H 2' },
102
+ { id: 'snooze.next-week', icon: 'calendar', label: 'Next week', shortcut: 'H 3' },
103
+ ],
104
+ },
105
+ ];
106
+ // The wrapper's transform contains the fixed-position overlay so each
107
+ // frame keeps its own palette (same trick as the prototype's mac window).
108
+ const frameStyle = `
109
+ position: relative; transform: translateZ(0); overflow: hidden;
110
+ border-radius: 12px; background: var(--sio-bg);
111
+ box-shadow: 0 0 0 0.5px var(--sio-separator);
112
+ `;
113
+ const mockRow = (from, subject, time) => html `
114
+ <div style="display: flex; align-items: center; gap: 12px; padding: 12px 18px; border-bottom: 0.5px solid var(--sio-separator);">
115
+ <span style="width: 8px; height: 8px; border-radius: 50%; background: var(--sio-tint); flex-shrink: 0;"></span>
116
+ <span style="width: 140px; font-size: 14px; font-weight: 600; color: var(--sio-label); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">${from}</span>
117
+ <span style="flex: 1; font-size: 14px; color: var(--sio-label-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">${subject}</span>
118
+ <span style="font-size: 12px; color: var(--sio-label-3); font-variant-numeric: tabular-nums;">${time}</span>
119
+ </div>
120
+ `;
121
+ const mockWindow = html `
122
+ <div style="height: 44px; display: flex; align-items: center; gap: 8px; padding: 0 18px; border-bottom: 0.5px solid var(--sio-separator); background: var(--sio-surface);">
123
+ <span style="width: 12px; height: 12px; border-radius: 50%; background: #FF5F57;"></span>
124
+ <span style="width: 12px; height: 12px; border-radius: 50%; background: #FEBC2E;"></span>
125
+ <span style="width: 12px; height: 12px; border-radius: 50%; background: #28C840;"></span>
126
+ <span style="margin-left: 10px; font-size: 15px; font-weight: 700; letter-spacing: -0.3px; color: var(--sio-label);">People</span>
127
+ <span style="font-size: 12px; font-weight: 500; color: var(--sio-label-3);">3 unread</span>
128
+ </div>
129
+ ${mockRow('Maya Lindqvist', 'Launch copy — final pass before Thursday', '09:41')}
130
+ ${mockRow('Jonas Weber', 'Re: Offsite agenda + travel booking', 'Yesterday')}
131
+ ${mockRow('Priya Nair', 'Voicemail transcript: callback re: contract', 'Tue')}
132
+ `;
133
+ return html `
134
+ <div style="display: flex; flex-direction: column; gap: 28px; font-family: var(--sio-font-sf);">
135
+ <div>
136
+ <div style="font-size: 12px; font-weight: 600; letter-spacing: 0.4px; text-transform: uppercase; color: var(--sio-label-3); margin: 0 0 10px 2px;">
137
+ ⌘K over the desktop — grouped results, first row active
138
+ </div>
139
+ <div style="${frameStyle} height: 480px;">
140
+ <div>${mockWindow}</div>
141
+ <sio-cmdk
142
+ open
143
+ .sections=${demoSections}
144
+ @cmdk-run=${(eventArg) => console.log('cmdk-run', eventArg.detail.id)}
145
+ @cmdk-close=${() => console.log('cmdk-close')}
146
+ ></sio-cmdk>
147
+ </div>
148
+ </div>
149
+ <div>
150
+ <div style="font-size: 12px; font-weight: 600; letter-spacing: 0.4px; text-transform: uppercase; color: var(--sio-label-3); margin: 0 0 10px 2px;">
151
+ Typed query "re" — sections filter down, empty groups drop out
152
+ </div>
153
+ <div style="${frameStyle} height: 340px;">
154
+ <div>${mockWindow}</div>
155
+ <sio-cmdk open query="re" .sections=${demoSections}></sio-cmdk>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ `;
160
+ };
161
+ #sections_accessor_storage = __runInitializers(this, _sections_initializers, []);
162
+ // --------------------------------------------------------------------- api
163
+ /** Grouped commands; filtered live against `query`. */
164
+ get sections() { return this.#sections_accessor_storage; }
165
+ set sections(value) { this.#sections_accessor_storage = value; }
166
+ #open_accessor_storage = (__runInitializers(this, _sections_extraInitializers), __runInitializers(this, _open_initializers, false));
167
+ /** Host-owned visibility flag (wire ⌘K / cmdk-close in the app shell). */
168
+ get open() { return this.#open_accessor_storage; }
169
+ set open(value) { this.#open_accessor_storage = value; }
170
+ #query_accessor_storage = (__runInitializers(this, _open_extraInitializers), __runInitializers(this, _query_initializers, ''));
171
+ /** Current filter text — settable to preseed, updated as the user types. */
172
+ get query() { return this.#query_accessor_storage; }
173
+ set query(value) { this.#query_accessor_storage = value; }
174
+ #placeholder_accessor_storage = (__runInitializers(this, _query_extraInitializers), __runInitializers(this, _placeholder_initializers, 'Type a command…'));
175
+ get placeholder() { return this.#placeholder_accessor_storage; }
176
+ set placeholder(value) { this.#placeholder_accessor_storage = value; }
177
+ #activeIndex_accessor_storage = (__runInitializers(this, _placeholder_extraInitializers), __runInitializers(this, _activeIndex_initializers, 0));
178
+ get activeIndex() { return this.#activeIndex_accessor_storage; }
179
+ set activeIndex(value) { this.#activeIndex_accessor_storage = value; }
180
+ // ------------------------------------------------------------------ styles
181
+ static styles = [
182
+ ...sioElementStyles,
183
+ css `
184
+ :host {
185
+ display: none;
186
+ }
187
+ :host([open]) {
188
+ display: block;
189
+ position: fixed;
190
+ inset: 0;
191
+ z-index: 100;
192
+ }
193
+ /* scrim + shadow values are spec'd black in the v7 prototype
194
+ (socialio.css .sio-cmdk*) — they are not theme surfaces. */
195
+ .backdrop {
196
+ position: absolute;
197
+ inset: 0;
198
+ background: rgba(0, 0, 0, 0.32);
199
+ backdrop-filter: blur(6px);
200
+ -webkit-backdrop-filter: blur(6px);
201
+ display: flex;
202
+ justify-content: center;
203
+ align-items: flex-start;
204
+ padding-top: 14vh;
205
+ }
206
+ .panel {
207
+ width: 640px;
208
+ max-width: calc(100% - 80px);
209
+ background: var(--sio-surface);
210
+ border-radius: var(--sio-radius-lg);
211
+ box-shadow:
212
+ 0 30px 80px rgba(0, 0, 0, 0.35),
213
+ 0 0 0 var(--sio-hairline) var(--sio-separator);
214
+ overflow: hidden;
215
+ }
216
+
217
+ /* search row */
218
+ .search-row {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 10px;
222
+ padding: 14px 16px;
223
+ border-bottom: var(--sio-hairline) solid var(--sio-separator);
224
+ }
225
+ .search-icon {
226
+ color: var(--sio-label-3);
227
+ flex-shrink: 0;
228
+ }
229
+ .search-input {
230
+ flex: 1;
231
+ min-width: 0;
232
+ padding: 0;
233
+ border: none;
234
+ outline: none;
235
+ background: transparent;
236
+ font-family: var(--sio-font-sf);
237
+ font-size: 15px;
238
+ line-height: 20px;
239
+ letter-spacing: -0.24px;
240
+ color: var(--sio-label);
241
+ }
242
+ .search-input::placeholder {
243
+ color: var(--sio-label-4);
244
+ }
245
+ .esc-hint {
246
+ flex-shrink: 0;
247
+ cursor: pointer;
248
+ }
249
+
250
+ /* grouped results */
251
+ .results {
252
+ padding: 6px 0;
253
+ max-height: 360px;
254
+ overflow-y: auto;
255
+ overscroll-behavior: contain;
256
+ }
257
+ .section {
258
+ padding: 4px 0;
259
+ }
260
+ .section-header {
261
+ padding: 6px 18px;
262
+ font-size: 11px;
263
+ line-height: 13px;
264
+ font-weight: 600;
265
+ letter-spacing: 0.06px;
266
+ text-transform: uppercase;
267
+ color: var(--sio-label-3);
268
+ }
269
+ .row {
270
+ display: flex;
271
+ align-items: center;
272
+ gap: 12px;
273
+ padding: 8px 18px;
274
+ color: var(--sio-label);
275
+ cursor: default;
276
+ transition: background 0.08s ease;
277
+ }
278
+ .row.active {
279
+ background: var(--sio-tint-soft);
280
+ color: var(--sio-tint);
281
+ }
282
+ .glyph {
283
+ width: 18px;
284
+ display: inline-flex;
285
+ align-items: center;
286
+ justify-content: center;
287
+ flex-shrink: 0;
288
+ color: inherit;
289
+ }
290
+ .label {
291
+ flex: 1;
292
+ min-width: 0;
293
+ font-size: 14px;
294
+ line-height: 19px;
295
+ letter-spacing: -0.15px;
296
+ white-space: nowrap;
297
+ overflow: hidden;
298
+ text-overflow: ellipsis;
299
+ }
300
+ .row sio-kbd {
301
+ flex-shrink: 0;
302
+ }
303
+ .empty {
304
+ padding: 18px;
305
+ text-align: center;
306
+ font-size: 14px;
307
+ color: var(--sio-label-3);
308
+ }
309
+ `,
310
+ ];
311
+ // --------------------------------------------------------------- filtering
312
+ getFilteredSections() {
313
+ const normalizedQuery = this.query.trim().toLowerCase();
314
+ if (!normalizedQuery) {
315
+ return this.sections;
316
+ }
317
+ return this.sections
318
+ .map((sectionArg) => ({
319
+ ...sectionArg,
320
+ items: sectionArg.items.filter((itemArg) => itemArg.label.toLowerCase().includes(normalizedQuery)),
321
+ }))
322
+ .filter((sectionArg) => sectionArg.items.length > 0);
323
+ }
324
+ getFlatItems() {
325
+ return this.getFilteredSections().flatMap((sectionArg) => sectionArg.items);
326
+ }
327
+ // -------------------------------------------------------------- lifecycle
328
+ willUpdate() {
329
+ // keep the active row inside the (possibly shrunken) filtered list
330
+ const totalItems = this.getFlatItems().length;
331
+ if (this.activeIndex >= totalItems) {
332
+ this.activeIndex = totalItems > 0 ? totalItems - 1 : 0;
333
+ }
334
+ }
335
+ updated(changedPropertiesArg) {
336
+ if (changedPropertiesArg.has('open') && this.open) {
337
+ const inputElement = this.shadowRoot?.querySelector('.search-input');
338
+ inputElement?.focus({ preventScroll: true });
339
+ }
340
+ }
341
+ // ------------------------------------------------------------ interaction
342
+ handleInput(eventArg) {
343
+ this.query = eventArg.target.value;
344
+ this.activeIndex = 0;
345
+ }
346
+ handleKeydown(eventArg) {
347
+ const flatItems = this.getFlatItems();
348
+ switch (eventArg.key) {
349
+ case 'ArrowDown':
350
+ eventArg.preventDefault();
351
+ if (flatItems.length > 0) {
352
+ this.activeIndex = (this.activeIndex + 1) % flatItems.length;
353
+ this.scrollActiveRowIntoView();
354
+ }
355
+ break;
356
+ case 'ArrowUp':
357
+ eventArg.preventDefault();
358
+ if (flatItems.length > 0) {
359
+ this.activeIndex = (this.activeIndex - 1 + flatItems.length) % flatItems.length;
360
+ this.scrollActiveRowIntoView();
361
+ }
362
+ break;
363
+ case 'Enter':
364
+ eventArg.preventDefault();
365
+ if (flatItems[this.activeIndex]) {
366
+ this.runItem(flatItems[this.activeIndex]);
367
+ }
368
+ break;
369
+ case 'Escape':
370
+ eventArg.preventDefault();
371
+ this.close();
372
+ break;
373
+ }
374
+ }
375
+ async scrollActiveRowIntoView() {
376
+ await this.updateComplete;
377
+ this.shadowRoot?.querySelector('.row.active')?.scrollIntoView({ block: 'nearest' });
378
+ }
379
+ handleBackdropClick(eventArg) {
380
+ if (eventArg.target === eventArg.currentTarget) {
381
+ this.close();
382
+ }
383
+ }
384
+ runItem(itemArg) {
385
+ this.dispatchEvent(new CustomEvent('cmdk-run', {
386
+ detail: { id: itemArg.id },
387
+ bubbles: true,
388
+ composed: true,
389
+ }));
390
+ }
391
+ close() {
392
+ this.dispatchEvent(new CustomEvent('cmdk-close', {
393
+ bubbles: true,
394
+ composed: true,
395
+ }));
396
+ }
397
+ // ----------------------------------------------------------------- render
398
+ render() {
399
+ if (!this.open) {
400
+ return html ``;
401
+ }
402
+ const filteredSections = this.getFilteredSections();
403
+ let runningIndex = -1;
404
+ return html `
405
+ <div class="backdrop" @click=${this.handleBackdropClick} @keydown=${this.handleKeydown}>
406
+ <div class="panel" role="dialog" aria-modal="true" aria-label="Command palette">
407
+ <div class="search-row">
408
+ <sio-icon class="search-icon" icon="search" size="16"></sio-icon>
409
+ <input
410
+ class="search-input"
411
+ type="text"
412
+ .value=${this.query}
413
+ placeholder=${this.placeholder}
414
+ spellcheck="false"
415
+ autocomplete="off"
416
+ aria-label="Search commands"
417
+ @input=${this.handleInput}
418
+ />
419
+ <sio-kbd class="esc-hint" @click=${this.close}>esc</sio-kbd>
420
+ </div>
421
+ <div class="results" role="listbox" aria-label="Commands">
422
+ ${filteredSections.length === 0
423
+ ? html `<div class="empty">No matching commands</div>`
424
+ : filteredSections.map((sectionArg) => html `
425
+ <div class="section">
426
+ <div class="section-header">${sectionArg.name}</div>
427
+ ${sectionArg.items.map((itemArg) => {
428
+ runningIndex += 1;
429
+ const itemIndex = runningIndex;
430
+ const isActive = itemIndex === this.activeIndex;
431
+ return html `
432
+ <div
433
+ class="row ${isActive ? 'active' : ''}"
434
+ role="option"
435
+ aria-selected=${isActive ? 'true' : 'false'}
436
+ @pointerenter=${() => {
437
+ this.activeIndex = itemIndex;
438
+ }}
439
+ @click=${() => this.runItem(itemArg)}
440
+ >
441
+ <span class="glyph">
442
+ ${itemArg.icon
443
+ ? html `<sio-icon icon=${itemArg.icon} size="16"></sio-icon>`
444
+ : html ``}
445
+ </span>
446
+ <span class="label">${itemArg.label}</span>
447
+ ${itemArg.shortcut
448
+ ? html `<sio-kbd>${itemArg.shortcut}</sio-kbd>`
449
+ : html ``}
450
+ </div>
451
+ `;
452
+ })}
453
+ </div>
454
+ `)}
455
+ </div>
456
+ </div>
457
+ </div>
458
+ `;
459
+ }
460
+ constructor() {
461
+ super(...arguments);
462
+ __runInitializers(this, _activeIndex_extraInitializers);
463
+ }
464
+ static {
465
+ __runInitializers(_classThis, _classExtraInitializers);
466
+ }
467
+ };
468
+ return SioCmdk = _classThis;
469
+ })();
470
+ export { SioCmdk };
471
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lvLWNtZGsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvc2lvLWNtZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsSUFBSSxFQUNKLEdBQUcsRUFDSCxhQUFhLEVBQ2IsUUFBUSxFQUNSLEtBQUssR0FFTixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLGVBQWUsQ0FBQztBQUN2QixPQUFPLGNBQWMsQ0FBQztJQXdDVCxPQUFPOzRCQURuQixhQUFhLENBQUMsVUFBVSxDQUFDOzs7O3NCQUNHLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7dUJBQW5CLFNBQVEsV0FBVzs7OztvQ0F3RnJDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztnQ0FJekIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7aUNBSTFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzt1Q0FHMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO3VDQUcxQixLQUFLLEVBQUU7WUFiUiw2S0FBZ0IsUUFBUSw2QkFBUixRQUFRLDJGQUF5QjtZQUlqRCxpS0FBZ0IsSUFBSSw2QkFBSixJQUFJLG1GQUFTO1lBSTdCLG9LQUFnQixLQUFLLDZCQUFMLEtBQUsscUZBQU07WUFHM0Isc0xBQWdCLFdBQVcsNkJBQVgsV0FBVyxpR0FBcUI7WUFHaEQsc0xBQWlCLFdBQVcsNkJBQVgsV0FBVyxpR0FBSztZQXZHbkMsNktBeVpDOzs7O1FBeFpRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sWUFBWSxHQUFzQjtnQkFD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
@@ -1,20 +1,74 @@
1
1
  import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
+ import { type IMessage } from './sio-conversation-view.js';
2
3
  declare global {
3
4
  interface HTMLElementTagNameMap {
4
5
  'sio-combox': SioCombox;
5
6
  }
6
7
  }
8
+ /**
9
+ * sio-combox — the widget panel (v7 SocialIOWidget.jsx SIOWidgetShell).
10
+ *
11
+ * 380×620 panel, radius 20 on --sio-surface, floating shadow with a
12
+ * 0.5px ring, anchored above the sio-fab launcher. Slides between the
13
+ * home/welcome state (sio-conversation-selector) and the conversation
14
+ * state (sio-conversation-view); the away/email-fallback state is the
15
+ * conversation state with `away` set. Every state carries the centered
16
+ * "Powered by social.io" footer with the mini brand glyph.
17
+ *
18
+ * Singleton API: SioCombox.createOnBody() / getInstance(), plus
19
+ * open() / close() / toggle() / getIsOpen(). Full-screen on phablet.
20
+ */
7
21
  export declare class SioCombox extends DeesElement {
8
22
  static demo: () => TemplateResult<1>;
9
- accessor referenceObject: HTMLElement;
23
+ private static instance;
24
+ /**
25
+ * Creates and appends a singleton combox to document.body
26
+ */
27
+ static createOnBody(): SioCombox;
28
+ /**
29
+ * Gets the singleton instance if it exists
30
+ */
31
+ static getInstance(): SioCombox | null;
32
+ /** team is away — the conversation state falls back to email capture */
33
+ accessor away: boolean;
10
34
  private accessor selectedConversationId;
35
+ private accessor isKeyboardVisible;
36
+ private accessor isOpen;
37
+ private keyboardBlurTimeout?;
11
38
  private accessor conversations;
12
39
  private accessor messages;
13
40
  constructor();
41
+ connectedCallback(): Promise<void>;
42
+ disconnectedCallback(): Promise<void>;
43
+ private handleInputFocus;
44
+ private handleInputBlur;
45
+ updated(changedProperties: Map<string, any>): void;
46
+ /**
47
+ * Opens the combox
48
+ */
49
+ open(): void;
50
+ /**
51
+ * Closes the combox
52
+ */
53
+ close(): void;
54
+ /**
55
+ * Toggles the combox open/closed state
56
+ */
57
+ toggle(): void;
58
+ /**
59
+ * Returns whether the combox is currently open
60
+ */
61
+ getIsOpen(): boolean;
14
62
  static styles: import("@design.estate/dees-element").CSSResult[];
15
63
  render(): TemplateResult;
16
64
  private handleConversationSelected;
65
+ private handleNewConversation;
17
66
  private handleBack;
18
67
  private handleSendMessage;
68
+ /**
69
+ * Append an inbound (support-side) message to a conversation.
70
+ * The host application calls this when a reply arrives.
71
+ */
72
+ receiveMessage(conversationId: string, message: IMessage): void;
19
73
  private handleOpenImage;
20
74
  }