@ixfx/components 0.3.0 → 0.3.1

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.
package/bundle/index.js CHANGED
@@ -32292,16 +32292,19 @@ let TabListItemElement = class TabListItemElement extends i$4 {
32292
32292
  <div>
32293
32293
  ${this.iconName ? b`<ixfx-icon name="${this.iconName}"></ixfx-icon>` : A}
32294
32294
  ${showLabel ? b`<span class="label"><slot></slot></span>` : A}
32295
- ${this.closeable ? b`
32296
- <button
32297
- class="close-btn"
32298
- type="button"
32299
- aria-label="Close tab"
32300
- @click=${this._onCloseClick}
32301
- >
32302
- <ixfx-icon name="close"></ixfx-icon>
32303
- </button>
32304
- ` : A}
32295
+ <div class="actions">
32296
+ <div class="toolbar"><slot name="toolbar"></slot></div>
32297
+ ${this.closeable ? b`
32298
+ <button
32299
+ class="close-btn"
32300
+ type="button"
32301
+ aria-label="Close tab"
32302
+ @click=${this._onCloseClick}
32303
+ >
32304
+ <ixfx-icon name="close"></ixfx-icon>
32305
+ </button>
32306
+ ` : A}
32307
+ </div>
32305
32308
  </div>
32306
32309
  `;
32307
32310
  }
@@ -32325,7 +32328,7 @@ let TabListItemElement = class TabListItemElement extends i$4 {
32325
32328
  box-sizing: border-box;
32326
32329
  }
32327
32330
 
32328
- div {
32331
+ :host > div {
32329
32332
  display: flex;
32330
32333
  align-items: center;
32331
32334
  gap: var(--space-s, 4px);
@@ -32356,6 +32359,28 @@ let TabListItemElement = class TabListItemElement extends i$4 {
32356
32359
  flex-shrink: 0;
32357
32360
  }
32358
32361
 
32362
+ .actions {
32363
+ display: flex;
32364
+ align-items: center;
32365
+ gap: var(--space-xs);
32366
+ margin-left: auto;
32367
+ flex-shrink: 0;
32368
+ }
32369
+
32370
+ .toolbar {
32371
+ display: none;
32372
+ align-items: center;
32373
+ gap: var(--space-xs);
32374
+ }
32375
+
32376
+ :host([selected]) .toolbar {
32377
+ display: flex;
32378
+ }
32379
+
32380
+ slot[name="toolbar"] {
32381
+ display: contents;
32382
+ }
32383
+
32359
32384
  .close-btn {
32360
32385
  display: inline-flex;
32361
32386
  align-items: center;
@@ -32363,7 +32388,6 @@ let TabListItemElement = class TabListItemElement extends i$4 {
32363
32388
  background: none;
32364
32389
  border: none;
32365
32390
  padding: var(--space-xs);
32366
- margin-left: auto;
32367
32391
  cursor: pointer;
32368
32392
  color: inherit;
32369
32393
  border-radius: var(--radius-s);
@@ -32642,14 +32666,17 @@ let TabPanelsElement = class TabPanelsElement extends i$4 {
32642
32666
  if (this.onSelectedPanel) this.onSelectedPanel(el.id, el);
32643
32667
  }
32644
32668
  syncWithList(el) {
32669
+ const apply = (t) => {
32670
+ if (!t) return;
32671
+ const forEl = t.getAttribute(`for`);
32672
+ if (forEl) this.selectPanel(forEl);
32673
+ };
32645
32674
  const t = el.getSelectedElement();
32646
32675
  if (!t) {
32647
- el.updateComplete.then(() => this.syncWithList(el));
32676
+ el.updateComplete.then(() => apply(el.getSelectedElement()));
32648
32677
  return;
32649
32678
  }
32650
- const forEl = t.getAttribute(`for`);
32651
- if (!forEl) return;
32652
- this.selectPanel(forEl);
32679
+ apply(t);
32653
32680
  }
32654
32681
  selectPanel(id) {
32655
32682
  const current = this.getSelectedElement();
@@ -35983,6 +36010,7 @@ let VerticalListElement = class VerticalListElement extends i$4 {
35983
36010
  this._selectedItems = /* @__PURE__ */ new Set();
35984
36011
  this._searchVisible = false;
35985
36012
  this._searchQuery = ``;
36013
+ this.#customWrappers = /* @__PURE__ */ new Map();
35986
36014
  this.tickled = new TickledController(this, {
35987
36015
  getItems: () => this._getVisibleItems().map((el) => ({
35988
36016
  id: el,
@@ -36092,6 +36120,7 @@ let VerticalListElement = class VerticalListElement extends i$4 {
36092
36120
  }
36093
36121
  #search;
36094
36122
  #selectionAnchor;
36123
+ #customWrappers;
36095
36124
  connectedCallback() {
36096
36125
  super.connectedCallback();
36097
36126
  if (!this.hasAttribute(`tabindex`)) this.tabIndex = 0;
@@ -36124,7 +36153,19 @@ let VerticalListElement = class VerticalListElement extends i$4 {
36124
36153
  super.updated(changed);
36125
36154
  if (changed.has(`interactionMode`)) {
36126
36155
  this.#selectionAnchor = void 0;
36127
- this._clearSelection();
36156
+ const previousSelected = this._selectedItems;
36157
+ const savedWrappers = changed.get(`interactionMode`) === `checked` ? new Map(this.#customWrappers) : null;
36158
+ this._syncCheckboxes();
36159
+ if (previousSelected.size > 0) {
36160
+ let remapped;
36161
+ if (savedWrappers && savedWrappers.size > 0) remapped = new Set([...previousSelected].map((el) => savedWrappers.get(el) ?? el));
36162
+ else if (this.#customWrappers.size > 0) {
36163
+ const innerToWrapper = new Map([...this.#customWrappers].map(([w, i]) => [i, w]));
36164
+ remapped = new Set([...previousSelected].map((el) => innerToWrapper.get(el) ?? el));
36165
+ } else remapped = new Set(previousSelected);
36166
+ this._selectedItems = remapped;
36167
+ }
36168
+ this._syncItemStates();
36128
36169
  }
36129
36170
  }
36130
36171
  /** The most recently selected item, or `undefined` if nothing is selected. */
@@ -36147,6 +36188,7 @@ let VerticalListElement = class VerticalListElement extends i$4 {
36147
36188
  item.remove();
36148
36189
  }
36149
36190
  clearItems() {
36191
+ this.#customWrappers.clear();
36150
36192
  this.replaceChildren();
36151
36193
  this.#selectionAnchor = void 0;
36152
36194
  this._selectedItems = /* @__PURE__ */ new Set();
@@ -36304,6 +36346,29 @@ let VerticalListElement = class VerticalListElement extends i$4 {
36304
36346
  }
36305
36347
  _syncCheckboxes() {
36306
36348
  const inCheckedMode = this.interactionMode === `checked`;
36349
+ if (inCheckedMode) for (const inner of Array.from(this.children)) {
36350
+ if (!inner.hasAttribute(`data-list-item`)) continue;
36351
+ if (inner.parentElement !== this) continue;
36352
+ const wrapper = document.createElement(`li`);
36353
+ wrapper.className = `ixfx-custom-row`;
36354
+ const key = inner.getAttribute(`data-key`);
36355
+ const label = inner.getAttribute(`data-search-label`);
36356
+ if (key !== null) wrapper.setAttribute(`data-key`, key);
36357
+ if (label !== null) wrapper.setAttribute(`data-search-label`, label);
36358
+ inner.removeAttribute(`data-list-item`);
36359
+ this.insertBefore(wrapper, inner);
36360
+ wrapper.appendChild(inner);
36361
+ this.#customWrappers.set(wrapper, inner);
36362
+ }
36363
+ else {
36364
+ for (const [wrapper, inner] of this.#customWrappers) {
36365
+ if (wrapper.parentElement !== this) continue;
36366
+ inner.setAttribute(`data-list-item`, ``);
36367
+ this.insertBefore(inner, wrapper);
36368
+ wrapper.remove();
36369
+ }
36370
+ this.#customWrappers.clear();
36371
+ }
36307
36372
  for (const el of this.querySelectorAll(`li`)) {
36308
36373
  let cb = el.querySelector(`input.ixfx-list-checkbox`);
36309
36374
  if (inCheckedMode) {
@@ -36445,17 +36510,6 @@ let VerticalListElement = class VerticalListElement extends i$4 {
36445
36510
  outline: 1px solid var(--accent, #60a5fa);
36446
36511
  }
36447
36512
 
36448
- /* checked mode: left-border indicator for custom shadow-DOM items (no checkbox injection possible) */
36449
- :host([interaction-mode="checked"]) ::slotted([data-list-item]) {
36450
- border-left: 3px solid transparent;
36451
- transition: background var(--transition, 0.1s ease-out),
36452
- border-color var(--transition, 0.1s ease-out);
36453
- }
36454
-
36455
- :host([interaction-mode="checked"]) ::slotted([data-list-item][data-checked]) {
36456
- border-left: 3px solid var(--accent, #60a5fa);
36457
- }
36458
-
36459
36513
  .search-overlay {
36460
36514
  position: absolute;
36461
36515
  top: 8px;