@design.estate/dees-catalog 3.59.0 → 3.60.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.
@@ -151016,7 +151016,67 @@ var demoFunc26 = /* @__PURE__ */ __name(() => b2`
151016
151016
  ></dees-input-list>
151017
151017
  </dees-panel>
151018
151018
 
151019
- <dees-panel .title=${"9. Empty State"} .subtitle=${"How the component looks with no items"}>
151019
+ <dees-panel .title=${"9. Candidates with Tab Completion"} .subtitle=${"Terminal-style autocomplete \u2014 Tab accepts, Shift+Tab cycles"}>
151020
+ <div class="grid-layout">
151021
+ <dees-input-list
151022
+ id="candidate-list"
151023
+ .label=${"Assign Team Members"}
151024
+ .placeholder=${"Type a name... (Tab to complete)"}
151025
+ .candidates=${[
151026
+ { viewKey: "Alice Smith", payload: { id: 1, role: "Engineer", department: "Frontend" } },
151027
+ { viewKey: "Bob Johnson", payload: { id: 2, role: "Designer", department: "UX" } },
151028
+ { viewKey: "Carol Williams", payload: { id: 3, role: "Product Manager", department: "Product" } },
151029
+ { viewKey: "David Brown", payload: { id: 4, role: "Engineer", department: "Backend" } },
151030
+ { viewKey: "Eve Davis", payload: { id: 5, role: "QA Engineer", department: "Quality" } },
151031
+ { viewKey: "Frank Miller", payload: { id: 6, role: "DevOps", department: "Infrastructure" } },
151032
+ { viewKey: "Grace Wilson", payload: { id: 7, role: "Designer", department: "UX" } },
151033
+ { viewKey: "Henry Moore", payload: { id: 8, role: "Engineer", department: "Frontend" } }
151034
+ ]}
151035
+ .value=${["Alice Smith", "Carol Williams"]}
151036
+ .maxItems=${5}
151037
+ .description=${"Type to see ghost completion. Tab to accept, Shift+Tab to cycle, Enter to add."}
151038
+ @change=${(e11) => {
151039
+ const preview = document.querySelector("#candidate-json");
151040
+ if (preview) {
151041
+ const list5 = e11.target;
151042
+ const candidates = list5.getAddedCandidates();
151043
+ preview.textContent = JSON.stringify(candidates, null, 2);
151044
+ }
151045
+ }}
151046
+ ></dees-input-list>
151047
+
151048
+ <div>
151049
+ <div style="font-size: 13px; font-weight: 500; margin-bottom: 8px; color: inherit;">Selected Candidates (with payloads)</div>
151050
+ <div class="output-preview" id="candidate-json">[]</div>
151051
+ <div class="feature-note">
151052
+ Try typing "D" — ghost text shows "avid Brown". Press Shift+Tab to cycle to other D-matches. Tab accepts, Enter adds.
151053
+ </div>
151054
+ </div>
151055
+ </div>
151056
+ </dees-panel>
151057
+
151058
+ <dees-panel .title=${"10. Technology Stack"} .subtitle=${"Larger candidate pool with Shift+Tab cycling"}>
151059
+ <dees-input-list
151060
+ .label=${"Select Technologies"}
151061
+ .placeholder=${"Type to autocomplete..."}
151062
+ .candidates=${[
151063
+ { viewKey: "TypeScript", payload: { category: "language" } },
151064
+ { viewKey: "React", payload: { category: "framework" } },
151065
+ { viewKey: "Vue.js", payload: { category: "framework" } },
151066
+ { viewKey: "Angular", payload: { category: "framework" } },
151067
+ { viewKey: "Node.js", payload: { category: "runtime" } },
151068
+ { viewKey: "Deno", payload: { category: "runtime" } },
151069
+ { viewKey: "Docker", payload: { category: "devops" } },
151070
+ { viewKey: "PostgreSQL", payload: { category: "database" } },
151071
+ { viewKey: "MongoDB", payload: { category: "database" } },
151072
+ { viewKey: "Redis", payload: { category: "database" } },
151073
+ { viewKey: "Kubernetes", payload: { category: "devops" } }
151074
+ ]}
151075
+ .description=${'Try "D" \u2014 cycles through Deno/Docker. "R" \u2014 cycles through React/Redis.'}
151076
+ ></dees-input-list>
151077
+ </dees-panel>
151078
+
151079
+ <dees-panel .title=${"11. Empty State"} .subtitle=${"How the component looks with no items"}>
151020
151080
  <dees-input-list
151021
151081
  .label=${"Your Ideas"}
151022
151082
  .placeholder=${"Share your ideas..."}
@@ -151032,9 +151092,9 @@ var demoFunc26 = /* @__PURE__ */ __name(() => b2`
151032
151092
  init_dist_ts30();
151033
151093
  init_dees_icon();
151034
151094
  init_theme();
151035
- var _itemHeight_dec, _targetIndex_dec, _dragCurrentY_dec, _dragStartY_dec, _dragOverIndex_dec, _draggedIndex_dec, _editingValue_dec, _editingIndex_dec, _inputValue_dec3, _validationText_dec3, _confirmDelete_dec, _sortable_dec, _allowDuplicates_dec, _minItems_dec, _maxItems_dec, _placeholder_dec4, _value_dec12, _a36, _DeesInputList_decorators, _init33, _value12, _placeholder4, _maxItems, _minItems, _allowDuplicates, _sortable, _confirmDelete, _validationText3, _inputValue3, _editingIndex, _editingValue, _draggedIndex, _dragOverIndex, _dragStartY, _dragCurrentY, _targetIndex, _itemHeight;
151095
+ var _itemHeight_dec, _targetIndex_dec, _dragCurrentY_dec, _dragStartY_dec, _dragOverIndex_dec, _draggedIndex_dec, _editingValue_dec, _editingIndex_dec, _currentCandidateIndex_dec, _ghostText_dec, _inputValue_dec3, _validationText_dec3, _candidates_dec, _confirmDelete_dec, _sortable_dec, _allowDuplicates_dec, _minItems_dec, _maxItems_dec, _placeholder_dec4, _value_dec12, _a36, _DeesInputList_decorators, _init33, _value12, _placeholder4, _maxItems, _minItems, _allowDuplicates, _sortable, _confirmDelete, _candidates, _validationText3, _inputValue3, _ghostText, _currentCandidateIndex, _editingIndex, _editingValue, _draggedIndex, _dragOverIndex, _dragStartY, _dragCurrentY, _targetIndex, _itemHeight;
151036
151096
  _DeesInputList_decorators = [customElement("dees-input-list")];
151037
- var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_dec12 = [n5({ type: Array })], _placeholder_dec4 = [n5({ type: String })], _maxItems_dec = [n5({ type: Number })], _minItems_dec = [n5({ type: Number })], _allowDuplicates_dec = [n5({ type: Boolean })], _sortable_dec = [n5({ type: Boolean })], _confirmDelete_dec = [n5({ type: Boolean })], _validationText_dec3 = [n5({ type: String })], _inputValue_dec3 = [r5()], _editingIndex_dec = [r5()], _editingValue_dec = [r5()], _draggedIndex_dec = [r5()], _dragOverIndex_dec = [r5()], _dragStartY_dec = [r5()], _dragCurrentY_dec = [r5()], _targetIndex_dec = [r5()], _itemHeight_dec = [r5()], _a36) {
151097
+ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_dec12 = [n5({ type: Array })], _placeholder_dec4 = [n5({ type: String })], _maxItems_dec = [n5({ type: Number })], _minItems_dec = [n5({ type: Number })], _allowDuplicates_dec = [n5({ type: Boolean })], _sortable_dec = [n5({ type: Boolean })], _confirmDelete_dec = [n5({ type: Boolean })], _candidates_dec = [n5({ type: Array })], _validationText_dec3 = [n5({ type: String })], _inputValue_dec3 = [r5()], _ghostText_dec = [r5()], _currentCandidateIndex_dec = [r5()], _editingIndex_dec = [r5()], _editingValue_dec = [r5()], _draggedIndex_dec = [r5()], _dragOverIndex_dec = [r5()], _dragStartY_dec = [r5()], _dragCurrentY_dec = [r5()], _targetIndex_dec = [r5()], _itemHeight_dec = [r5()], _a36) {
151038
151098
  constructor() {
151039
151099
  super(...arguments);
151040
151100
  __privateAdd(this, _value12, __runInitializers(_init33, 8, this, [])), __runInitializers(_init33, 11, this);
@@ -151044,16 +151104,21 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151044
151104
  __privateAdd(this, _allowDuplicates, __runInitializers(_init33, 24, this, false)), __runInitializers(_init33, 27, this);
151045
151105
  __privateAdd(this, _sortable, __runInitializers(_init33, 28, this, false)), __runInitializers(_init33, 31, this);
151046
151106
  __privateAdd(this, _confirmDelete, __runInitializers(_init33, 32, this, false)), __runInitializers(_init33, 35, this);
151047
- __privateAdd(this, _validationText3, __runInitializers(_init33, 36, this, "")), __runInitializers(_init33, 39, this);
151048
- __privateAdd(this, _inputValue3, __runInitializers(_init33, 40, this, "")), __runInitializers(_init33, 43, this);
151049
- __privateAdd(this, _editingIndex, __runInitializers(_init33, 44, this, -1)), __runInitializers(_init33, 47, this);
151050
- __privateAdd(this, _editingValue, __runInitializers(_init33, 48, this, "")), __runInitializers(_init33, 51, this);
151051
- __privateAdd(this, _draggedIndex, __runInitializers(_init33, 52, this, -1)), __runInitializers(_init33, 55, this);
151052
- __privateAdd(this, _dragOverIndex, __runInitializers(_init33, 56, this, -1)), __runInitializers(_init33, 59, this);
151053
- __privateAdd(this, _dragStartY, __runInitializers(_init33, 60, this, 0)), __runInitializers(_init33, 63, this);
151054
- __privateAdd(this, _dragCurrentY, __runInitializers(_init33, 64, this, 0)), __runInitializers(_init33, 67, this);
151055
- __privateAdd(this, _targetIndex, __runInitializers(_init33, 68, this, -1)), __runInitializers(_init33, 71, this);
151056
- __privateAdd(this, _itemHeight, __runInitializers(_init33, 72, this, 0)), __runInitializers(_init33, 75, this);
151107
+ __privateAdd(this, _candidates, __runInitializers(_init33, 36, this, [])), __runInitializers(_init33, 39, this);
151108
+ __privateAdd(this, _validationText3, __runInitializers(_init33, 40, this, "")), __runInitializers(_init33, 43, this);
151109
+ __publicField(this, "addedCandidatesMap", /* @__PURE__ */ new Map());
151110
+ __publicField(this, "matchingCandidates", []);
151111
+ __privateAdd(this, _inputValue3, __runInitializers(_init33, 44, this, "")), __runInitializers(_init33, 47, this);
151112
+ __privateAdd(this, _ghostText, __runInitializers(_init33, 48, this, "")), __runInitializers(_init33, 51, this);
151113
+ __privateAdd(this, _currentCandidateIndex, __runInitializers(_init33, 52, this, -1)), __runInitializers(_init33, 55, this);
151114
+ __privateAdd(this, _editingIndex, __runInitializers(_init33, 56, this, -1)), __runInitializers(_init33, 59, this);
151115
+ __privateAdd(this, _editingValue, __runInitializers(_init33, 60, this, "")), __runInitializers(_init33, 63, this);
151116
+ __privateAdd(this, _draggedIndex, __runInitializers(_init33, 64, this, -1)), __runInitializers(_init33, 67, this);
151117
+ __privateAdd(this, _dragOverIndex, __runInitializers(_init33, 68, this, -1)), __runInitializers(_init33, 71, this);
151118
+ __privateAdd(this, _dragStartY, __runInitializers(_init33, 72, this, 0)), __runInitializers(_init33, 75, this);
151119
+ __privateAdd(this, _dragCurrentY, __runInitializers(_init33, 76, this, 0)), __runInitializers(_init33, 79, this);
151120
+ __privateAdd(this, _targetIndex, __runInitializers(_init33, 80, this, -1)), __runInitializers(_init33, 83, this);
151121
+ __privateAdd(this, _itemHeight, __runInitializers(_init33, 84, this, 0)), __runInitializers(_init33, 87, this);
151057
151122
  // Bound event handlers for cleanup
151058
151123
  __publicField(this, "boundHandleGlobalDragOver", null);
151059
151124
  __publicField(this, "boundHandleGlobalDragEnd", null);
@@ -151128,15 +151193,22 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151128
151193
 
151129
151194
  ${!this.disabled && (!this.maxItems || this.value.length < this.maxItems) ? b2`
151130
151195
  <div class="add-item-container">
151131
- <input
151132
- type="text"
151133
- class="add-input"
151134
- .placeholder=${this.placeholder}
151135
- .value=${this.inputValue}
151136
- @input=${this.handleInput}
151137
- @keydown=${this.handleAddKeyDown}
151138
- ?disabled=${this.disabled}
151139
- />
151196
+ <div class="autocomplete-wrapper">
151197
+ ${this.ghostText ? b2`
151198
+ <span class="ghost-text">
151199
+ <span class="ghost-typed">${this.inputValue}</span><span class="ghost-completion">${this.ghostText}</span>
151200
+ </span>
151201
+ ` : ""}
151202
+ <input
151203
+ type="text"
151204
+ class="add-input"
151205
+ .placeholder=${this.placeholder}
151206
+ .value=${this.inputValue}
151207
+ @input=${this.handleInput}
151208
+ @keydown=${this.handleAddKeyDown}
151209
+ ?disabled=${this.disabled}
151210
+ />
151211
+ </div>
151140
151212
  <button
151141
151213
  class="add-button"
151142
151214
  @click=${this.addItem}
@@ -151160,10 +151232,62 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151160
151232
  }
151161
151233
  handleInput(e11) {
151162
151234
  this.inputValue = e11.target.value;
151235
+ this.updateGhostText();
151236
+ }
151237
+ updateGhostText() {
151238
+ if (this.candidates.length === 0 || !this.inputValue) {
151239
+ this.ghostText = "";
151240
+ this.currentCandidateIndex = -1;
151241
+ this.matchingCandidates = [];
151242
+ return;
151243
+ }
151244
+ const search2 = this.inputValue.toLowerCase();
151245
+ this.matchingCandidates = this.candidates.filter((c11) => {
151246
+ if (this.value.includes(c11.viewKey)) return false;
151247
+ return c11.viewKey.toLowerCase().startsWith(search2);
151248
+ }).sort((a5, b5) => a5.viewKey.length - b5.viewKey.length);
151249
+ if (this.matchingCandidates.length > 0) {
151250
+ this.currentCandidateIndex = 0;
151251
+ this.ghostText = this.matchingCandidates[0].viewKey.slice(this.inputValue.length);
151252
+ } else {
151253
+ this.currentCandidateIndex = -1;
151254
+ this.ghostText = "";
151255
+ }
151163
151256
  }
151164
151257
  handleAddKeyDown(e11) {
151258
+ if (e11.key === "Tab" && this.candidates.length > 0 && this.inputValue) {
151259
+ e11.preventDefault();
151260
+ if (e11.shiftKey && this.matchingCandidates.length > 0) {
151261
+ this.currentCandidateIndex = (this.currentCandidateIndex + 1) % this.matchingCandidates.length;
151262
+ const candidate = this.matchingCandidates[this.currentCandidateIndex];
151263
+ this.ghostText = candidate.viewKey.slice(this.inputValue.length);
151264
+ } else if (!e11.shiftKey && this.ghostText && this.matchingCandidates.length > 0) {
151265
+ const candidate = this.matchingCandidates[this.currentCandidateIndex];
151266
+ this.inputValue = candidate.viewKey;
151267
+ this.ghostText = "";
151268
+ const input = this.shadowRoot?.querySelector(".add-input");
151269
+ if (input) input.value = candidate.viewKey;
151270
+ }
151271
+ return;
151272
+ }
151273
+ if (e11.key === "Escape" && this.ghostText) {
151274
+ e11.preventDefault();
151275
+ this.ghostText = "";
151276
+ this.currentCandidateIndex = -1;
151277
+ this.matchingCandidates = [];
151278
+ return;
151279
+ }
151165
151280
  if (e11.key === "Enter" && this.inputValue.trim()) {
151166
151281
  e11.preventDefault();
151282
+ if (this.candidates.length > 0) {
151283
+ const match2 = this.candidates.find(
151284
+ (c11) => c11.viewKey.toLowerCase() === this.inputValue.trim().toLowerCase()
151285
+ );
151286
+ if (match2) {
151287
+ this.selectCandidate(match2);
151288
+ }
151289
+ return;
151290
+ }
151167
151291
  this.addItem();
151168
151292
  }
151169
151293
  }
@@ -151176,6 +151300,44 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151176
151300
  this.cancelEdit();
151177
151301
  }
151178
151302
  }
151303
+ selectCandidate(candidate) {
151304
+ if (this.maxItems && this.value.length >= this.maxItems) {
151305
+ this.validationText = `Maximum ${this.maxItems} items allowed`;
151306
+ setTimeout(() => this.validationText = "", 3e3);
151307
+ return;
151308
+ }
151309
+ if (!this.allowDuplicates && this.value.includes(candidate.viewKey)) {
151310
+ this.validationText = "This item already exists in the list";
151311
+ setTimeout(() => this.validationText = "", 3e3);
151312
+ return;
151313
+ }
151314
+ this.addedCandidatesMap.set(candidate.viewKey, candidate);
151315
+ this.value = [...this.value, candidate.viewKey];
151316
+ this.inputValue = "";
151317
+ this.ghostText = "";
151318
+ this.currentCandidateIndex = -1;
151319
+ this.matchingCandidates = [];
151320
+ this.validationText = "";
151321
+ const input = this.shadowRoot?.querySelector(".add-input");
151322
+ if (input) {
151323
+ input.value = "";
151324
+ input.focus();
151325
+ }
151326
+ this.emitChange();
151327
+ }
151328
+ /**
151329
+ * Get the full candidate object for an item by its viewKey.
151330
+ * Returns undefined if the item was added as a plain string.
151331
+ */
151332
+ getCandidateForItem(viewKey) {
151333
+ return this.addedCandidatesMap.get(viewKey);
151334
+ }
151335
+ /**
151336
+ * Get all added candidates with their payloads.
151337
+ */
151338
+ getAddedCandidates() {
151339
+ return this.value.map((v5) => this.addedCandidatesMap.get(v5)).filter((c11) => c11 !== void 0);
151340
+ }
151179
151341
  addItem() {
151180
151342
  const trimmedValue = this.inputValue.trim();
151181
151343
  if (!trimmedValue) return;
@@ -151238,6 +151400,8 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151238
151400
  const confirmed = await this.showConfirmDialog(`Delete "${this.value[index3]}"?`);
151239
151401
  if (!confirmed) return;
151240
151402
  }
151403
+ const removedKey = this.value[index3];
151404
+ this.addedCandidatesMap.delete(removedKey);
151241
151405
  this.value = this.value.filter((_4, i11) => i11 !== index3);
151242
151406
  this.emitChange();
151243
151407
  }
@@ -151488,8 +151652,11 @@ _minItems = new WeakMap();
151488
151652
  _allowDuplicates = new WeakMap();
151489
151653
  _sortable = new WeakMap();
151490
151654
  _confirmDelete = new WeakMap();
151655
+ _candidates = new WeakMap();
151491
151656
  _validationText3 = new WeakMap();
151492
151657
  _inputValue3 = new WeakMap();
151658
+ _ghostText = new WeakMap();
151659
+ _currentCandidateIndex = new WeakMap();
151493
151660
  _editingIndex = new WeakMap();
151494
151661
  _editingValue = new WeakMap();
151495
151662
  _draggedIndex = new WeakMap();
@@ -151505,8 +151672,11 @@ __decorateElement(_init33, 4, "minItems", _minItems_dec, _DeesInputList, _minIte
151505
151672
  __decorateElement(_init33, 4, "allowDuplicates", _allowDuplicates_dec, _DeesInputList, _allowDuplicates);
151506
151673
  __decorateElement(_init33, 4, "sortable", _sortable_dec, _DeesInputList, _sortable);
151507
151674
  __decorateElement(_init33, 4, "confirmDelete", _confirmDelete_dec, _DeesInputList, _confirmDelete);
151675
+ __decorateElement(_init33, 4, "candidates", _candidates_dec, _DeesInputList, _candidates);
151508
151676
  __decorateElement(_init33, 4, "validationText", _validationText_dec3, _DeesInputList, _validationText3);
151509
151677
  __decorateElement(_init33, 4, "inputValue", _inputValue_dec3, _DeesInputList, _inputValue3);
151678
+ __decorateElement(_init33, 4, "ghostText", _ghostText_dec, _DeesInputList, _ghostText);
151679
+ __decorateElement(_init33, 4, "currentCandidateIndex", _currentCandidateIndex_dec, _DeesInputList, _currentCandidateIndex);
151510
151680
  __decorateElement(_init33, 4, "editingIndex", _editingIndex_dec, _DeesInputList, _editingIndex);
151511
151681
  __decorateElement(_init33, 4, "editingValue", _editingValue_dec, _DeesInputList, _editingValue);
151512
151682
  __decorateElement(_init33, 4, "draggedIndex", _draggedIndex_dec, _DeesInputList, _draggedIndex);
@@ -151710,7 +151880,7 @@ __publicField(_DeesInputList, "styles", [
151710
151880
  }
151711
151881
 
151712
151882
  .add-input {
151713
- flex: 1;
151883
+ width: 100%;
151714
151884
  padding: 4px 8px;
151715
151885
  font-size: 13px;
151716
151886
  line-height: 18px;
@@ -151804,6 +151974,38 @@ __publicField(_DeesInputList, "styles", [
151804
151974
  .list-items.dropping .list-item {
151805
151975
  transition: none !important;
151806
151976
  }
151977
+
151978
+ /* ── Terminal-style inline autocomplete ── */
151979
+ .autocomplete-wrapper {
151980
+ position: relative;
151981
+ flex: 1;
151982
+ min-width: 0;
151983
+ overflow: hidden;
151984
+ }
151985
+
151986
+ .ghost-text {
151987
+ position: absolute;
151988
+ top: 0;
151989
+ left: 0;
151990
+ right: 0;
151991
+ bottom: 0;
151992
+ padding: 4px 8px;
151993
+ font-size: 13px;
151994
+ line-height: 18px;
151995
+ font-family: inherit;
151996
+ white-space: nowrap;
151997
+ pointer-events: none;
151998
+ overflow: hidden;
151999
+ }
152000
+
152001
+ .ghost-typed {
152002
+ visibility: hidden;
152003
+ }
152004
+
152005
+ .ghost-completion {
152006
+ color: ${cssManager.bdTheme("hsl(0 0% 63.9%)", "hsl(0 0% 45.1%)")};
152007
+ opacity: 0.5;
152008
+ }
151807
152009
  `
151808
152010
  ]);
151809
152011
  __runInitializers(_init33, 1, _DeesInputList);
@@ -198760,7 +198962,7 @@ init_group_runtime();
198760
198962
  // ts_web/00_commitinfo_data.ts
198761
198963
  var commitinfo = {
198762
198964
  name: "@design.estate/dees-catalog",
198763
- version: "3.59.0",
198965
+ version: "3.60.0",
198764
198966
  description: "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript."
198765
198967
  };
198766
198968
  export {
@@ -200733,4 +200935,4 @@ ibantools/jsnext/ibantools.js:
200733
200935
  * @preferred
200734
200936
  *)
200735
200937
  */
200736
- //# sourceMappingURL=bundle-1775348667598.js.map
200938
+ //# sourceMappingURL=bundle-1775381196096.js.map
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/dees-catalog',
6
- version: '3.59.0',
6
+ version: '3.60.0',
7
7
  description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFdBQVcsRUFBRSxzSkFBc0o7Q0FDcEssQ0FBQSJ9
@@ -1,6 +1,10 @@
1
1
  import { type TemplateResult } from '@design.estate/dees-element';
2
2
  import { DeesInputBase } from '../dees-input-base/dees-input-base.js';
3
3
  import '../../00group-utility/dees-icon/dees-icon.js';
4
+ export interface IListCandidate {
5
+ viewKey: string;
6
+ payload?: any;
7
+ }
4
8
  declare global {
5
9
  interface HTMLElementTagNameMap {
6
10
  'dees-input-list': DeesInputList;
@@ -16,8 +20,13 @@ export declare class DeesInputList extends DeesInputBase<DeesInputList> {
16
20
  accessor allowDuplicates: boolean;
17
21
  accessor sortable: boolean;
18
22
  accessor confirmDelete: boolean;
23
+ accessor candidates: IListCandidate[];
19
24
  accessor validationText: string;
25
+ private addedCandidatesMap;
26
+ private matchingCandidates;
20
27
  accessor inputValue: string;
28
+ accessor ghostText: string;
29
+ accessor currentCandidateIndex: number;
21
30
  accessor editingIndex: number;
22
31
  accessor editingValue: string;
23
32
  accessor draggedIndex: number;
@@ -32,8 +41,19 @@ export declare class DeesInputList extends DeesInputBase<DeesInputList> {
32
41
  static styles: import("@design.estate/dees-element").CSSResult[];
33
42
  render(): TemplateResult;
34
43
  private handleInput;
44
+ private updateGhostText;
35
45
  private handleAddKeyDown;
36
46
  private handleEditKeyDown;
47
+ private selectCandidate;
48
+ /**
49
+ * Get the full candidate object for an item by its viewKey.
50
+ * Returns undefined if the item was added as a plain string.
51
+ */
52
+ getCandidateForItem(viewKey: string): IListCandidate | undefined;
53
+ /**
54
+ * Get all added candidates with their payloads.
55
+ */
56
+ getAddedCandidates(): IListCandidate[];
37
57
  private addItem;
38
58
  private startEdit;
39
59
  private saveEdit;
@@ -261,7 +261,67 @@ export const demoFunc = () => html `
261
261
  ></dees-input-list>
262
262
  </dees-panel>
263
263
 
264
- <dees-panel .title=${'9. Empty State'} .subtitle=${'How the component looks with no items'}>
264
+ <dees-panel .title=${'9. Candidates with Tab Completion'} .subtitle=${'Terminal-style autocomplete Tab accepts, Shift+Tab cycles'}>
265
+ <div class="grid-layout">
266
+ <dees-input-list
267
+ id="candidate-list"
268
+ .label=${'Assign Team Members'}
269
+ .placeholder=${'Type a name... (Tab to complete)'}
270
+ .candidates=${[
271
+ { viewKey: 'Alice Smith', payload: { id: 1, role: 'Engineer', department: 'Frontend' } },
272
+ { viewKey: 'Bob Johnson', payload: { id: 2, role: 'Designer', department: 'UX' } },
273
+ { viewKey: 'Carol Williams', payload: { id: 3, role: 'Product Manager', department: 'Product' } },
274
+ { viewKey: 'David Brown', payload: { id: 4, role: 'Engineer', department: 'Backend' } },
275
+ { viewKey: 'Eve Davis', payload: { id: 5, role: 'QA Engineer', department: 'Quality' } },
276
+ { viewKey: 'Frank Miller', payload: { id: 6, role: 'DevOps', department: 'Infrastructure' } },
277
+ { viewKey: 'Grace Wilson', payload: { id: 7, role: 'Designer', department: 'UX' } },
278
+ { viewKey: 'Henry Moore', payload: { id: 8, role: 'Engineer', department: 'Frontend' } },
279
+ ]}
280
+ .value=${['Alice Smith', 'Carol Williams']}
281
+ .maxItems=${5}
282
+ .description=${'Type to see ghost completion. Tab to accept, Shift+Tab to cycle, Enter to add.'}
283
+ @change=${(e) => {
284
+ const preview = document.querySelector('#candidate-json');
285
+ if (preview) {
286
+ const list = e.target;
287
+ const candidates = list.getAddedCandidates();
288
+ preview.textContent = JSON.stringify(candidates, null, 2);
289
+ }
290
+ }}
291
+ ></dees-input-list>
292
+
293
+ <div>
294
+ <div style="font-size: 13px; font-weight: 500; margin-bottom: 8px; color: inherit;">Selected Candidates (with payloads)</div>
295
+ <div class="output-preview" id="candidate-json">[]</div>
296
+ <div class="feature-note">
297
+ Try typing "D" — ghost text shows "avid Brown". Press Shift+Tab to cycle to other D-matches. Tab accepts, Enter adds.
298
+ </div>
299
+ </div>
300
+ </div>
301
+ </dees-panel>
302
+
303
+ <dees-panel .title=${'10. Technology Stack'} .subtitle=${'Larger candidate pool with Shift+Tab cycling'}>
304
+ <dees-input-list
305
+ .label=${'Select Technologies'}
306
+ .placeholder=${'Type to autocomplete...'}
307
+ .candidates=${[
308
+ { viewKey: 'TypeScript', payload: { category: 'language' } },
309
+ { viewKey: 'React', payload: { category: 'framework' } },
310
+ { viewKey: 'Vue.js', payload: { category: 'framework' } },
311
+ { viewKey: 'Angular', payload: { category: 'framework' } },
312
+ { viewKey: 'Node.js', payload: { category: 'runtime' } },
313
+ { viewKey: 'Deno', payload: { category: 'runtime' } },
314
+ { viewKey: 'Docker', payload: { category: 'devops' } },
315
+ { viewKey: 'PostgreSQL', payload: { category: 'database' } },
316
+ { viewKey: 'MongoDB', payload: { category: 'database' } },
317
+ { viewKey: 'Redis', payload: { category: 'database' } },
318
+ { viewKey: 'Kubernetes', payload: { category: 'devops' } },
319
+ ]}
320
+ .description=${'Try "D" — cycles through Deno/Docker. "R" — cycles through React/Redis.'}
321
+ ></dees-input-list>
322
+ </dees-panel>
323
+
324
+ <dees-panel .title=${'11. Empty State'} .subtitle=${'How the component looks with no items'}>
265
325
  <dees-input-list
266
326
  .label=${'Your Ideas'}
267
327
  .placeholder=${'Share your ideas...'}
@@ -272,4 +332,4 @@ export const demoFunc = () => html `
272
332
  </div>
273
333
  </dees-demowrapper>
274
334
  `;
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1pbnB1dC1saXN0LmRlbW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWxpc3QvZGVlcy1pbnB1dC1saXN0LmRlbW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sK0NBQStDLENBQUM7QUFDdkQsT0FBTywyQ0FBMkMsQ0FBQztBQUNuRCxPQUFPLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8seURBQXlELENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTs7O1FBRzFCLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpRUo7Ozs7MkJBSW9CLHFCQUFxQixjQUFjLG1EQUFtRDs7bUJBRTlGLGVBQWU7eUJBQ1QsMEJBQTBCO21CQUNoQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQzt5QkFDN0Isb0RBQW9EOzs7Ozs7OzJCQU9sRCxrQkFBa0IsY0FBYyxnQ0FBZ0M7O21CQUV4RSxlQUFlO3lCQUNULGVBQWU7c0JBQ2xCLElBQUk7bUJBQ1A7SUFDUCxzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsc0JBQXNCO0NBQ3ZCO3lCQUNjLDZDQUE2Qzs7Ozs7OzsyQkFPM0MsNkJBQTZCLGNBQWMsMkRBQTJEOzs7cUJBRzVHLDZCQUE2QjsyQkFDdkIsb0JBQW9CO3dCQUN2QixDQUFDO3dCQUNELENBQUM7cUJBQ0osQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO3dCQUNiLElBQUk7MkJB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
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1pbnB1dC1saXN0LmRlbW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWxpc3QvZGVlcy1pbnB1dC1saXN0LmRlbW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sK0NBQStDLENBQUM7QUFDdkQsT0FBTywyQ0FBMkMsQ0FBQztBQUNuRCxPQUFPLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8seURBQXlELENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTs7O1FBRzFCLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpRUo7Ozs7MkJBSW9CLHFCQUFxQixjQUFjLG1EQUFtRDs7bUJBRTlGLGVBQWU7eUJBQ1QsMEJBQTBCO21CQUNoQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQzt5QkFDN0Isb0RBQW9EOzs7Ozs7OzJCQU9sRCxrQkFBa0IsY0FBYyxnQ0FBZ0M7O21CQUV4RSxlQUFlO3lCQUNULGVBQWU7c0JBQ2xCLElBQUk7bUJBQ1A7SUFDUCxzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsc0JBQXNCO0NBQ3ZCO3lCQUNjLDZDQUE2Qzs7Ozs7OzsyQkFPM0MsNkJBQTZCLGNBQWMsMkRBQTJEOzs7cUJBRzVHLDZCQUE2QjsyQkFDdkIsb0JBQW9CO3dCQUN2QixDQUFDO3dCQUNELENBQUM7cUJBQ0osQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO3dCQUNiLElBQUk7MkJB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