@design.estate/dees-catalog 3.59.1 → 3.61.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,85 @@ 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. Freeform + Candidates"} .subtitle=${"Allow adding items not in the candidate list (shown with a question mark)"}>
151080
+ <dees-input-list
151081
+ .label=${"Tags"}
151082
+ .placeholder=${"Type a tag... (freeform allowed)"}
151083
+ .allowFreeform=${true}
151084
+ .candidates=${[
151085
+ { viewKey: "bug", payload: { color: "red" } },
151086
+ { viewKey: "feature", payload: { color: "blue" } },
151087
+ { viewKey: "docs", payload: { color: "green" } },
151088
+ { viewKey: "refactor", payload: { color: "purple" } },
151089
+ { viewKey: "performance", payload: { color: "orange" } },
151090
+ { viewKey: "security", payload: { color: "red" } }
151091
+ ]}
151092
+ .value=${["bug", "my-custom-tag", "feature"]}
151093
+ .description=${"Known tags get a checkmark, custom tags get a question mark. Tab to complete, Enter to add freeform."}
151094
+ ></dees-input-list>
151095
+ </dees-panel>
151096
+
151097
+ <dees-panel .title=${"12. Empty State"} .subtitle=${"How the component looks with no items"}>
151020
151098
  <dees-input-list
151021
151099
  .label=${"Your Ideas"}
151022
151100
  .placeholder=${"Share your ideas..."}
@@ -151032,9 +151110,9 @@ var demoFunc26 = /* @__PURE__ */ __name(() => b2`
151032
151110
  init_dist_ts30();
151033
151111
  init_dees_icon();
151034
151112
  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;
151113
+ 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, _allowFreeform_dec, _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, _allowFreeform, _validationText3, _inputValue3, _ghostText, _currentCandidateIndex, _editingIndex, _editingValue, _draggedIndex, _dragOverIndex, _dragStartY, _dragCurrentY, _targetIndex, _itemHeight;
151036
151114
  _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) {
151115
+ 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 })], _allowFreeform_dec = [n5({ type: Boolean })], _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
151116
  constructor() {
151039
151117
  super(...arguments);
151040
151118
  __privateAdd(this, _value12, __runInitializers(_init33, 8, this, [])), __runInitializers(_init33, 11, this);
@@ -151044,16 +151122,22 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151044
151122
  __privateAdd(this, _allowDuplicates, __runInitializers(_init33, 24, this, false)), __runInitializers(_init33, 27, this);
151045
151123
  __privateAdd(this, _sortable, __runInitializers(_init33, 28, this, false)), __runInitializers(_init33, 31, this);
151046
151124
  __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);
151125
+ __privateAdd(this, _candidates, __runInitializers(_init33, 36, this, [])), __runInitializers(_init33, 39, this);
151126
+ __privateAdd(this, _allowFreeform, __runInitializers(_init33, 40, this, false)), __runInitializers(_init33, 43, this);
151127
+ __privateAdd(this, _validationText3, __runInitializers(_init33, 44, this, "")), __runInitializers(_init33, 47, this);
151128
+ __publicField(this, "addedCandidatesMap", /* @__PURE__ */ new Map());
151129
+ __publicField(this, "matchingCandidates", []);
151130
+ __privateAdd(this, _inputValue3, __runInitializers(_init33, 48, this, "")), __runInitializers(_init33, 51, this);
151131
+ __privateAdd(this, _ghostText, __runInitializers(_init33, 52, this, "")), __runInitializers(_init33, 55, this);
151132
+ __privateAdd(this, _currentCandidateIndex, __runInitializers(_init33, 56, this, -1)), __runInitializers(_init33, 59, this);
151133
+ __privateAdd(this, _editingIndex, __runInitializers(_init33, 60, this, -1)), __runInitializers(_init33, 63, this);
151134
+ __privateAdd(this, _editingValue, __runInitializers(_init33, 64, this, "")), __runInitializers(_init33, 67, this);
151135
+ __privateAdd(this, _draggedIndex, __runInitializers(_init33, 68, this, -1)), __runInitializers(_init33, 71, this);
151136
+ __privateAdd(this, _dragOverIndex, __runInitializers(_init33, 72, this, -1)), __runInitializers(_init33, 75, this);
151137
+ __privateAdd(this, _dragStartY, __runInitializers(_init33, 76, this, 0)), __runInitializers(_init33, 79, this);
151138
+ __privateAdd(this, _dragCurrentY, __runInitializers(_init33, 80, this, 0)), __runInitializers(_init33, 83, this);
151139
+ __privateAdd(this, _targetIndex, __runInitializers(_init33, 84, this, -1)), __runInitializers(_init33, 87, this);
151140
+ __privateAdd(this, _itemHeight, __runInitializers(_init33, 88, this, 0)), __runInitializers(_init33, 91, this);
151057
151141
  // Bound event handlers for cleanup
151058
151142
  __publicField(this, "boundHandleGlobalDragOver", null);
151059
151143
  __publicField(this, "boundHandleGlobalDragEnd", null);
@@ -151082,6 +151166,14 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151082
151166
  </div>
151083
151167
  ` : ""}
151084
151168
 
151169
+ ${this.candidates.length > 0 ? b2`
151170
+ ${this.candidates.some((c11) => c11.viewKey === item) ? b2`
151171
+ <dees-icon class="candidate-check" .icon=${"lucide:check"}></dees-icon>
151172
+ ` : b2`
151173
+ <dees-icon class="candidate-unknown" .icon=${"lucide:helpCircle"}></dees-icon>
151174
+ `}
151175
+ ` : ""}
151176
+
151085
151177
  <div class="item-content">
151086
151178
  ${this.editingIndex === index3 ? b2`
151087
151179
  <input
@@ -151128,15 +151220,22 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151128
151220
 
151129
151221
  ${!this.disabled && (!this.maxItems || this.value.length < this.maxItems) ? b2`
151130
151222
  <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
- />
151223
+ <div class="autocomplete-wrapper">
151224
+ ${this.ghostText ? b2`
151225
+ <span class="ghost-text">
151226
+ <span class="ghost-typed">${this.inputValue}</span><span class="ghost-completion">${this.ghostText}</span>
151227
+ </span>
151228
+ ` : ""}
151229
+ <input
151230
+ type="text"
151231
+ class="add-input"
151232
+ .placeholder=${this.placeholder}
151233
+ .value=${this.inputValue}
151234
+ @input=${this.handleInput}
151235
+ @keydown=${this.handleAddKeyDown}
151236
+ ?disabled=${this.disabled}
151237
+ />
151238
+ </div>
151140
151239
  <button
151141
151240
  class="add-button"
151142
151241
  @click=${this.addItem}
@@ -151160,10 +151259,67 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151160
151259
  }
151161
151260
  handleInput(e11) {
151162
151261
  this.inputValue = e11.target.value;
151262
+ this.updateGhostText();
151263
+ }
151264
+ updateGhostText() {
151265
+ if (this.candidates.length === 0 || !this.inputValue) {
151266
+ this.ghostText = "";
151267
+ this.currentCandidateIndex = -1;
151268
+ this.matchingCandidates = [];
151269
+ return;
151270
+ }
151271
+ const search2 = this.inputValue.toLowerCase();
151272
+ this.matchingCandidates = this.candidates.filter((c11) => {
151273
+ if (this.value.includes(c11.viewKey)) return false;
151274
+ return c11.viewKey.toLowerCase().startsWith(search2);
151275
+ }).sort((a5, b5) => a5.viewKey.length - b5.viewKey.length);
151276
+ if (this.matchingCandidates.length > 0) {
151277
+ this.currentCandidateIndex = 0;
151278
+ this.ghostText = this.matchingCandidates[0].viewKey.slice(this.inputValue.length);
151279
+ } else {
151280
+ this.currentCandidateIndex = -1;
151281
+ this.ghostText = "";
151282
+ }
151163
151283
  }
151164
151284
  handleAddKeyDown(e11) {
151285
+ if (e11.key === "Tab" && this.candidates.length > 0 && this.inputValue) {
151286
+ e11.preventDefault();
151287
+ if (e11.shiftKey && this.matchingCandidates.length > 0) {
151288
+ this.currentCandidateIndex = (this.currentCandidateIndex + 1) % this.matchingCandidates.length;
151289
+ const candidate = this.matchingCandidates[this.currentCandidateIndex];
151290
+ this.ghostText = candidate.viewKey.slice(this.inputValue.length);
151291
+ } else if (!e11.shiftKey && this.ghostText && this.matchingCandidates.length > 0) {
151292
+ const candidate = this.matchingCandidates[this.currentCandidateIndex];
151293
+ this.inputValue = candidate.viewKey;
151294
+ this.ghostText = "";
151295
+ const input = this.shadowRoot?.querySelector(".add-input");
151296
+ if (input) input.value = candidate.viewKey;
151297
+ }
151298
+ return;
151299
+ }
151300
+ if (e11.key === "Escape" && this.ghostText) {
151301
+ e11.preventDefault();
151302
+ this.ghostText = "";
151303
+ this.currentCandidateIndex = -1;
151304
+ this.matchingCandidates = [];
151305
+ return;
151306
+ }
151165
151307
  if (e11.key === "Enter" && this.inputValue.trim()) {
151166
151308
  e11.preventDefault();
151309
+ if (this.candidates.length > 0) {
151310
+ const match2 = this.candidates.find(
151311
+ (c11) => c11.viewKey.toLowerCase() === this.inputValue.trim().toLowerCase()
151312
+ );
151313
+ if (match2) {
151314
+ this.selectCandidate(match2);
151315
+ } else if (this.allowFreeform) {
151316
+ this.ghostText = "";
151317
+ this.currentCandidateIndex = -1;
151318
+ this.matchingCandidates = [];
151319
+ this.addItem();
151320
+ }
151321
+ return;
151322
+ }
151167
151323
  this.addItem();
151168
151324
  }
151169
151325
  }
@@ -151176,6 +151332,44 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151176
151332
  this.cancelEdit();
151177
151333
  }
151178
151334
  }
151335
+ selectCandidate(candidate) {
151336
+ if (this.maxItems && this.value.length >= this.maxItems) {
151337
+ this.validationText = `Maximum ${this.maxItems} items allowed`;
151338
+ setTimeout(() => this.validationText = "", 3e3);
151339
+ return;
151340
+ }
151341
+ if (!this.allowDuplicates && this.value.includes(candidate.viewKey)) {
151342
+ this.validationText = "This item already exists in the list";
151343
+ setTimeout(() => this.validationText = "", 3e3);
151344
+ return;
151345
+ }
151346
+ this.addedCandidatesMap.set(candidate.viewKey, candidate);
151347
+ this.value = [...this.value, candidate.viewKey];
151348
+ this.inputValue = "";
151349
+ this.ghostText = "";
151350
+ this.currentCandidateIndex = -1;
151351
+ this.matchingCandidates = [];
151352
+ this.validationText = "";
151353
+ const input = this.shadowRoot?.querySelector(".add-input");
151354
+ if (input) {
151355
+ input.value = "";
151356
+ input.focus();
151357
+ }
151358
+ this.emitChange();
151359
+ }
151360
+ /**
151361
+ * Get the full candidate object for an item by its viewKey.
151362
+ * Returns undefined if the item was added as a plain string.
151363
+ */
151364
+ getCandidateForItem(viewKey) {
151365
+ return this.addedCandidatesMap.get(viewKey);
151366
+ }
151367
+ /**
151368
+ * Get all added candidates with their payloads.
151369
+ */
151370
+ getAddedCandidates() {
151371
+ return this.value.map((v5) => this.addedCandidatesMap.get(v5)).filter((c11) => c11 !== void 0);
151372
+ }
151179
151373
  addItem() {
151180
151374
  const trimmedValue = this.inputValue.trim();
151181
151375
  if (!trimmedValue) return;
@@ -151238,6 +151432,8 @@ var _DeesInputList = class _DeesInputList extends (_a36 = DeesInputBase, _value_
151238
151432
  const confirmed = await this.showConfirmDialog(`Delete "${this.value[index3]}"?`);
151239
151433
  if (!confirmed) return;
151240
151434
  }
151435
+ const removedKey = this.value[index3];
151436
+ this.addedCandidatesMap.delete(removedKey);
151241
151437
  this.value = this.value.filter((_4, i11) => i11 !== index3);
151242
151438
  this.emitChange();
151243
151439
  }
@@ -151488,8 +151684,12 @@ _minItems = new WeakMap();
151488
151684
  _allowDuplicates = new WeakMap();
151489
151685
  _sortable = new WeakMap();
151490
151686
  _confirmDelete = new WeakMap();
151687
+ _candidates = new WeakMap();
151688
+ _allowFreeform = new WeakMap();
151491
151689
  _validationText3 = new WeakMap();
151492
151690
  _inputValue3 = new WeakMap();
151691
+ _ghostText = new WeakMap();
151692
+ _currentCandidateIndex = new WeakMap();
151493
151693
  _editingIndex = new WeakMap();
151494
151694
  _editingValue = new WeakMap();
151495
151695
  _draggedIndex = new WeakMap();
@@ -151505,8 +151705,12 @@ __decorateElement(_init33, 4, "minItems", _minItems_dec, _DeesInputList, _minIte
151505
151705
  __decorateElement(_init33, 4, "allowDuplicates", _allowDuplicates_dec, _DeesInputList, _allowDuplicates);
151506
151706
  __decorateElement(_init33, 4, "sortable", _sortable_dec, _DeesInputList, _sortable);
151507
151707
  __decorateElement(_init33, 4, "confirmDelete", _confirmDelete_dec, _DeesInputList, _confirmDelete);
151708
+ __decorateElement(_init33, 4, "candidates", _candidates_dec, _DeesInputList, _candidates);
151709
+ __decorateElement(_init33, 4, "allowFreeform", _allowFreeform_dec, _DeesInputList, _allowFreeform);
151508
151710
  __decorateElement(_init33, 4, "validationText", _validationText_dec3, _DeesInputList, _validationText3);
151509
151711
  __decorateElement(_init33, 4, "inputValue", _inputValue_dec3, _DeesInputList, _inputValue3);
151712
+ __decorateElement(_init33, 4, "ghostText", _ghostText_dec, _DeesInputList, _ghostText);
151713
+ __decorateElement(_init33, 4, "currentCandidateIndex", _currentCandidateIndex_dec, _DeesInputList, _currentCandidateIndex);
151510
151714
  __decorateElement(_init33, 4, "editingIndex", _editingIndex_dec, _DeesInputList, _editingIndex);
151511
151715
  __decorateElement(_init33, 4, "editingValue", _editingValue_dec, _DeesInputList, _editingValue);
151512
151716
  __decorateElement(_init33, 4, "draggedIndex", _draggedIndex_dec, _DeesInputList, _draggedIndex);
@@ -151603,6 +151807,20 @@ __publicField(_DeesInputList, "styles", [
151603
151807
  }
151604
151808
 
151605
151809
 
151810
+ .candidate-check {
151811
+ width: 14px;
151812
+ height: 14px;
151813
+ color: ${cssManager.bdTheme("hsl(142.1 76.2% 36.3%)", "hsl(142.1 70.6% 45.3%)")};
151814
+ flex-shrink: 0;
151815
+ }
151816
+
151817
+ .candidate-unknown {
151818
+ width: 14px;
151819
+ height: 14px;
151820
+ color: ${cssManager.bdTheme("hsl(45 93% 47%)", "hsl(45 93% 58%)")};
151821
+ flex-shrink: 0;
151822
+ }
151823
+
151606
151824
  .drag-handle {
151607
151825
  display: flex;
151608
151826
  align-items: center;
@@ -151710,7 +151928,7 @@ __publicField(_DeesInputList, "styles", [
151710
151928
  }
151711
151929
 
151712
151930
  .add-input {
151713
- flex: 1;
151931
+ width: 100%;
151714
151932
  padding: 4px 8px;
151715
151933
  font-size: 13px;
151716
151934
  line-height: 18px;
@@ -151804,6 +152022,38 @@ __publicField(_DeesInputList, "styles", [
151804
152022
  .list-items.dropping .list-item {
151805
152023
  transition: none !important;
151806
152024
  }
152025
+
152026
+ /* ── Terminal-style inline autocomplete ── */
152027
+ .autocomplete-wrapper {
152028
+ position: relative;
152029
+ flex: 1;
152030
+ min-width: 0;
152031
+ overflow: hidden;
152032
+ }
152033
+
152034
+ .ghost-text {
152035
+ position: absolute;
152036
+ top: 0;
152037
+ left: 0;
152038
+ right: 0;
152039
+ bottom: 0;
152040
+ padding: 4px 8px;
152041
+ font-size: 13px;
152042
+ line-height: 18px;
152043
+ font-family: inherit;
152044
+ white-space: nowrap;
152045
+ pointer-events: none;
152046
+ overflow: hidden;
152047
+ }
152048
+
152049
+ .ghost-typed {
152050
+ visibility: hidden;
152051
+ }
152052
+
152053
+ .ghost-completion {
152054
+ color: ${cssManager.bdTheme("hsl(0 0% 63.9%)", "hsl(0 0% 45.1%)")};
152055
+ opacity: 0.5;
152056
+ }
151807
152057
  `
151808
152058
  ]);
151809
152059
  __runInitializers(_init33, 1, _DeesInputList);
@@ -198760,7 +199010,7 @@ init_group_runtime();
198760
199010
  // ts_web/00_commitinfo_data.ts
198761
199011
  var commitinfo = {
198762
199012
  name: "@design.estate/dees-catalog",
198763
- version: "3.59.1",
199013
+ version: "3.61.0",
198764
199014
  description: "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript."
198765
199015
  };
198766
199016
  export {
@@ -200733,4 +200983,4 @@ ibantools/jsnext/ibantools.js:
200733
200983
  * @preferred
200734
200984
  *)
200735
200985
  */
200736
- //# sourceMappingURL=bundle-1775348932899.js.map
200986
+ //# sourceMappingURL=bundle-1775382650041.js.map
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/dees-catalog',
6
- version: '3.59.1',
6
+ version: '3.61.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,14 @@ 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[];
24
+ accessor allowFreeform: boolean;
19
25
  accessor validationText: string;
26
+ private addedCandidatesMap;
27
+ private matchingCandidates;
20
28
  accessor inputValue: string;
29
+ accessor ghostText: string;
30
+ accessor currentCandidateIndex: number;
21
31
  accessor editingIndex: number;
22
32
  accessor editingValue: string;
23
33
  accessor draggedIndex: number;
@@ -32,8 +42,19 @@ export declare class DeesInputList extends DeesInputBase<DeesInputList> {
32
42
  static styles: import("@design.estate/dees-element").CSSResult[];
33
43
  render(): TemplateResult;
34
44
  private handleInput;
45
+ private updateGhostText;
35
46
  private handleAddKeyDown;
36
47
  private handleEditKeyDown;
48
+ private selectCandidate;
49
+ /**
50
+ * Get the full candidate object for an item by its viewKey.
51
+ * Returns undefined if the item was added as a plain string.
52
+ */
53
+ getCandidateForItem(viewKey: string): IListCandidate | undefined;
54
+ /**
55
+ * Get all added candidates with their payloads.
56
+ */
57
+ getAddedCandidates(): IListCandidate[];
37
58
  private addItem;
38
59
  private startEdit;
39
60
  private saveEdit;
@@ -261,7 +261,85 @@ 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. Freeform + Candidates'} .subtitle=${'Allow adding items not in the candidate list (shown with a question mark)'}>
325
+ <dees-input-list
326
+ .label=${'Tags'}
327
+ .placeholder=${'Type a tag... (freeform allowed)'}
328
+ .allowFreeform=${true}
329
+ .candidates=${[
330
+ { viewKey: 'bug', payload: { color: 'red' } },
331
+ { viewKey: 'feature', payload: { color: 'blue' } },
332
+ { viewKey: 'docs', payload: { color: 'green' } },
333
+ { viewKey: 'refactor', payload: { color: 'purple' } },
334
+ { viewKey: 'performance', payload: { color: 'orange' } },
335
+ { viewKey: 'security', payload: { color: 'red' } },
336
+ ]}
337
+ .value=${['bug', 'my-custom-tag', 'feature']}
338
+ .description=${'Known tags get a checkmark, custom tags get a question mark. Tab to complete, Enter to add freeform.'}
339
+ ></dees-input-list>
340
+ </dees-panel>
341
+
342
+ <dees-panel .title=${'12. Empty State'} .subtitle=${'How the component looks with no items'}>
265
343
  <dees-input-list
266
344
  .label=${'Your Ideas'}
267
345
  .placeholder=${'Share your ideas...'}
@@ -272,4 +350,4 @@ export const demoFunc = () => html `
272
350
  </div>
273
351
  </dees-demowrapper>
274
352
  `;
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1pbnB1dC1saXN0LmRlbW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWxpc3QvZGVlcy1pbnB1dC1saXN0LmRlbW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sK0NBQStDLENBQUM7QUFDdkQsT0FBTywyQ0FBMkMsQ0FBQztBQUNuRCxPQUFPLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8seURBQXlELENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTs7O1FBRzFCLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpRUo7Ozs7MkJBSW9CLHFCQUFxQixjQUFjLG1EQUFtRDs7bUJBRTlGLGVBQWU7eUJBQ1QsMEJBQTBCO21CQUNoQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQzt5QkFDN0Isb0RBQW9EOzs7Ozs7OzJCQU9sRCxrQkFBa0IsY0FBYyxnQ0FBZ0M7O21CQUV4RSxlQUFlO3lCQUNULGVBQWU7c0JBQ2xCLElBQUk7bUJBQ1A7SUFDUCxzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsc0JBQXNCO0NBQ3ZCO3lCQUNjLDZDQUE2Qzs7Ozs7OzsyQkFPM0MsNkJBQTZCLGNBQWMsMkRBQTJEOzs7cUJBRzVHLDZCQUE2QjsyQkFDdkIsb0JBQW9CO3dCQUN2QixDQUFDO3dCQUNELENBQUM7cUJBQ0osQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO3dCQUNiLElBQUk7MkJBQ0Qsc0JBQXNCOzs7O3FCQUk1Qiw2QkFBNkI7MkJBQ3ZCLG1CQUFtQjsrQkFDZixLQUFLO3FCQUNmLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUM7MkJBQzdCLGlDQUFpQzs7Ozs7MkJBS2pDLHdCQUF3QixjQUFjLDRDQUE0Qzs7bUJBRTFGLHFCQUFxQjt5QkFDZixzQkFBc0I7MkJBQ3BCLElBQUk7bUJBQ1o7SUFDUCxtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLHVCQUF1QjtJQUN2QixtQkFBbUI7Q0FDcEI7eUJBQ2MsMkNBQTJDOzs7OzJCQUl6QyxtQkFBbUIsY0FBYyx3QkFBd0I7O21CQUVqRSxpQkFBaUI7bUJBQ2pCLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUM7c0JBQzVELElBQUk7eUJBQ0QsZ0NBQWdDOzs7OzJCQUk5QixxQkFBcUIsY0FBYywwQ0FBMEM7OztxQkFHbkYsYUFBYTsyQkFDUCxtQkFBbUI7d0JBQ3RCLElBQUk7bUJBQ1QsTUFBTTs7Ozs7dUJBS0YsYUFBYTs2QkFDUCxtQkFBbUI7MEJBQ3RCLElBQUk7MEJBQ0osQ0FBQztxQkFDTixhQUFhOzBCQUNSLElBQUk7dUJBQ1A7SUFDUCxjQUFjO0lBQ2QsYUFBYTtJQUNiLFFBQVE7Q0FDVDs2QkFDYyw0QkFBNEI7Ozs7dUJBSWxDLGNBQWM7NkJBQ1IseUJBQXlCOzBCQUM1QixJQUFJOzBCQUNKLENBQUM7cUJBQ04sY0FBYzswQkFDVCxJQUFJO3VCQUNQO0lBQ1AsdUJBQXVCO0lBQ3ZCLHFCQUFxQjtDQUN0Qjs2QkFDYyxtQ0FBbUM7Ozs7O3FCQUszQyxPQUFPO3lCQUNILFVBQVU7MkJBQ1IsOEJBQThCO21CQUN0QyxPQUFPOzs7b0NBR1UsYUFBYTs7OzsyQkFJdEIscUJBQXFCLGNBQWMsOENBQThDOzs7bUJBR3pGLGtCQUFrQjt5QkFDWixrQkFBa0I7c0JBQ3JCLElBQUk7MkJBQ0MsS0FBSzs2QkFDSCxLQUFLO3NCQUNaLEVBQUU7b0JBQ0osQ0FBQyxDQUFjLEVBQUUsRUFBRTtJQUMzQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksR0FBRztZQUNYLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDckIsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU07WUFDNUIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFDRixPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0FBQ0gsQ0FBQzs7Ozs7Ozs0QkFPaUIsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7Ozs7Ozs7OzsyQkFTekIsMkJBQTJCLGNBQWMsNENBQTRDOzttQkFFN0Ysb0JBQW9CO3lCQUNkLGtCQUFrQjttQkFDeEI7SUFDUCwwQkFBMEI7SUFDMUIsbUNBQW1DO0lBQ25DLHlCQUF5QjtJQUN6QixpQ0FBaUM7SUFDakMsMkJBQTJCO0lBQzNCLHNCQUFzQjtDQUN2QjtzQkFDVyxJQUFJOzJCQUNDLElBQUk7NkJBQ0YsS0FBSztzQkFDWixDQUFDO3NCQUNELEVBQUU7c0JBQ0YsSUFBSTt5QkFDRCxpRUFBaUU7Ozs7MkJBSS9ELGdCQUFnQixjQUFjLHVDQUF1Qzs7bUJBRTdFLFlBQVk7eUJBQ04scUJBQXFCO21CQUMzQixFQUFFO3lCQUNJLHVDQUF1Qzs7Ozs7Q0FLL0QsQ0FBQyJ9
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1pbnB1dC1saXN0LmRlbW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWxpc3QvZGVlcy1pbnB1dC1saXN0LmRlbW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sK0NBQStDLENBQUM7QUFDdkQsT0FBTywyQ0FBMkMsQ0FBQztBQUNuRCxPQUFPLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8seURBQXlELENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTs7O1FBRzFCLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpRUo7Ozs7MkJBSW9CLHFCQUFxQixjQUFjLG1EQUFtRDs7bUJBRTlGLGVBQWU7eUJBQ1QsMEJBQTBCO21CQUNoQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQzt5QkFDN0Isb0RBQW9EOzs7Ozs7OzJCQU9sRCxrQkFBa0IsY0FBYyxnQ0FBZ0M7O21CQUV4RSxlQUFlO3lCQUNULGVBQWU7c0JBQ2xCLElBQUk7bUJBQ1A7SUFDUCxzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsc0JBQXNCO0NBQ3ZCO3lCQUNjLDZDQUE2Qzs7Ozs7OzsyQkFPM0MsNkJBQTZCLGNBQWMsMkRBQTJEOzs7cUJBRzVHLDZCQUE2QjsyQkFDdkIsb0JBQW9CO3dCQUN2QixDQUFDO3dCQUNELENBQUM7cUJBQ0osQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO3dCQUNiLElBQUk7MkJBQ0Qsc0JBQXNCOzs7O3FCQUk1Qiw2QkFBNkI7MkJBQ3ZCLG1CQUFtQjsrQkFDZixLQUFLO3FCQUNmLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUM7MkJBQzdCLGlDQUFpQzs7Ozs7MkJBS2pDLHdCQUF3QixjQUFjLDRDQUE0Qzs7bUJBRTFGLHFCQUFxQjt5QkFDZixzQkFBc0I7MkJBQ3BCLElBQUk7bUJBQ1o7SUFDUCxtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLHVCQUF1QjtJQUN2QixtQkFBbUI7Q0FDcEI7eUJBQ2MsMkNBQTJDOzs7OzJCQUl6QyxtQkFBbUIsY0FBYyx3QkFBd0I7O21CQUVqRSxpQkFBaUI7bUJBQ2pCLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUM7c0JBQzVELElBQUk7eUJBQ0QsZ0NBQWdDOzs7OzJCQUk5QixxQkFBcUIsY0FBYywwQ0FBMEM7OztxQkFHbkYsYUFBYTsyQkFDUCxtQkFBbUI7d0JBQ3RCLElBQUk7bUJBQ1QsTUFBTTs7Ozs7dUJBS0YsYUFBYTs2QkFDUCxtQkFBbUI7MEJBQ3RCLElBQUk7MEJBQ0osQ0FBQztxQkFDTixhQUFhOzBCQUNSLElBQUk7dUJBQ1A7SUFDUCxjQUFjO0lBQ2QsYUFBYTtJQUNiLFFBQVE7Q0FDVDs2QkFDYyw0QkFBNEI7Ozs7dUJBSWxDLGNBQWM7NkJBQ1IseUJBQXlCOzBCQUM1QixJQUFJOzBCQUNKLENBQUM7cUJBQ04sY0FBYzswQkFDVCxJQUFJO3VCQUNQO0lBQ1AsdUJBQXVCO0lBQ3ZCLHFCQUFxQjtDQUN0Qjs2QkFDYyxtQ0FBbUM7Ozs7O3FCQUszQyxPQUFPO3lCQUNILFVBQVU7MkJBQ1IsOEJBQThCO21CQUN0QyxPQUFPOzs7b0NBR1UsYUFBYTs7OzsyQkFJdEIscUJBQXFCLGNBQWMsOENBQThDOzs7bUJBR3pGLGtCQUFrQjt5QkFDWixrQkFBa0I7c0JBQ3JCLElBQUk7MkJBQ0MsS0FBSzs2QkFDSCxLQUFLO3NCQUNaLEVBQUU7b0JBQ0osQ0FBQyxDQUFjLEVBQUUsRUFBRTtJQUMzQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksR0FBRztZQUNYLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDckIsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU07WUFDNUIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFDRixPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0FBQ0gsQ0FBQzs7Ozs7Ozs0QkFPaUIsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7Ozs7Ozs7OzsyQkFTekIsMkJBQTJCLGNBQWMsNENBQTRDOzttQkFFN0Ysb0JBQW9CO3lCQUNkLGtCQUFrQjttQkFDeEI7SUFDUCwwQkFBMEI7SUFDMUIsbUNBQW1DO0lBQ25DLHlCQUF5QjtJQUN6QixpQ0FBaUM7SUFDakMsMkJBQTJCO0lBQzNCLHNCQUFzQjtDQUN2QjtzQkFDVyxJQUFJOzJCQUNDLElBQUk7NkJBQ0YsS0FBSztzQkFDWixDQUFDO3NCQUNELEVBQUU7c0JBQ0YsSUFBSTt5QkFDRCxpRUFBaUU7Ozs7MkJBSS9ELG1DQUFtQyxjQUFjLDZEQUE2RDs7OztxQkFJcEgscUJBQXFCOzJCQUNmLGtDQUFrQzswQkFDbkM7SUFDWixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsRUFBRTtJQUN4RixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRTtJQUNsRixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUU7SUFDakcsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUU7SUFDdkYsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUU7SUFDeEYsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRTtJQUM3RixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRTtJQUNuRixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsRUFBRTtDQUN6RjtxQkFDUSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQzt3QkFDOUIsQ0FBQzsyQkFDRSxnRkFBZ0Y7c0JBQ3JGLENBQUMsQ0FBYyxFQUFFLEVBQUU7SUFDM0IsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzFELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksR0FBSSxDQUFDLENBQUMsTUFBYyxDQUFDO1FBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7OzJCQWFjLHNCQUFzQixjQUFjLDhDQUE4Qzs7bUJBRTFGLHFCQUFxQjt5QkFDZix5QkFBeUI7d0JBQzFCO0lBQ1osRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRTtJQUM1RCxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFO0lBQ3hELEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUU7SUFDekQsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUMxRCxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFO0lBQ3hELEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUU7SUFDckQsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTtJQUN0RCxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFO0lBQzVELEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUU7SUFDekQsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRTtJQUN2RCxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFO0NBQzNEO3lCQUNjLHlFQUF5RTs7OzsyQkFJdkUsMkJBQTJCLGNBQWMsMkVBQTJFOzttQkFFNUgsTUFBTTt5QkFDQSxrQ0FBa0M7MkJBQ2hDLElBQUk7d0JBQ1A7SUFDWixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQzdDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDbEQsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNoRCxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO0lBQ3JELEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7SUFDeEQsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtDQUNuRDttQkFDUSxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDO3lCQUM3QixzR0FBc0c7Ozs7MkJBSXBHLGlCQUFpQixjQUFjLHVDQUF1Qzs7bUJBRTlFLFlBQVk7eUJBQ04scUJBQXFCO21CQUMzQixFQUFFO3lCQUNJLHVDQUF1Qzs7Ozs7Q0FLL0QsQ0FBQyJ9