@ixfx/components 0.9.8 → 0.10.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.
Files changed (57) hide show
  1. package/bundle/index.d.ts +807 -5
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +8928 -5526
  4. package/bundle/index.js.map +1 -1
  5. package/bundle/style.css +38 -85
  6. package/dist/crumbs.d.ts +1 -1
  7. package/dist/{data-grid-BUeZjnvj.d.ts → data-grid-BT1d_nlu.d.ts} +4 -3
  8. package/dist/{data-grid-BUeZjnvj.d.ts.map → data-grid-BT1d_nlu.d.ts.map} +1 -1
  9. package/dist/data-grid.d.ts +2 -2
  10. package/dist/data-grid.js +3 -1
  11. package/dist/data-grid.js.map +1 -1
  12. package/dist/{detail-list-CQguZg9h.d.ts → detail-list-BCaIN7nx.d.ts} +5 -4
  13. package/dist/detail-list-BCaIN7nx.d.ts.map +1 -0
  14. package/dist/detail-list.d.ts +3 -3
  15. package/dist/detail-list.js +3 -1
  16. package/dist/detail-list.js.map +1 -1
  17. package/dist/{grid-list-lTwg4lp7.d.ts → grid-list-CiwlNE4c.d.ts} +28 -4
  18. package/dist/{grid-list-lTwg4lp7.d.ts.map → grid-list-CiwlNE4c.d.ts.map} +1 -1
  19. package/dist/{grid-list-40blkeza.js → grid-list-DLfw5HI4.js} +68 -5
  20. package/dist/grid-list-DLfw5HI4.js.map +1 -0
  21. package/dist/grid-list.d.ts +2 -2
  22. package/dist/grid-list.js +1 -1
  23. package/dist/incr-search.d.ts +1 -1
  24. package/dist/{index--qnhBWZJ.d.ts → index-DPFrRhKL.d.ts} +2 -2
  25. package/dist/{index--qnhBWZJ.d.ts.map → index-DPFrRhKL.d.ts.map} +1 -1
  26. package/dist/index.d.ts +682 -11
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +2988 -277
  29. package/dist/index.js.map +1 -1
  30. package/dist/{list-native-drag-controller-B0hWdbtM.js → list-native-drag-controller-B9xO0XWn.js} +41 -8
  31. package/dist/list-native-drag-controller-B9xO0XWn.js.map +1 -0
  32. package/dist/{list-native-drag-controller-Cmpx7jnx.d.ts → list-native-drag-controller-BAuWAtyQ.d.ts} +3 -2
  33. package/dist/list-native-drag-controller-BAuWAtyQ.d.ts.map +1 -0
  34. package/dist/miller.d.ts +2 -2
  35. package/dist/style.css +38 -85
  36. package/dist/{tree-CVj7TIk2.js → tree-BuzWn18_.js} +4 -2
  37. package/dist/tree-BuzWn18_.js.map +1 -0
  38. package/dist/{tree-component-BW2iCFq9.d.ts → tree-component-DGmKBbpy.d.ts} +17 -2
  39. package/dist/tree-component-DGmKBbpy.d.ts.map +1 -0
  40. package/dist/tree.d.ts +4 -3
  41. package/dist/tree.d.ts.map +1 -1
  42. package/dist/tree.js +1 -1
  43. package/dist/{vertical-list-CHrXmmQ3.d.ts → vertical-list-BLvJ4-Zf.d.ts} +92 -4
  44. package/dist/vertical-list-BLvJ4-Zf.d.ts.map +1 -0
  45. package/dist/vertical-list.d.ts +2 -2
  46. package/dist/vertical-list.js +617 -28
  47. package/dist/vertical-list.js.map +1 -1
  48. package/docs-user/grid-list.md +14 -0
  49. package/docs-user/index.json +2 -2
  50. package/package.json +1 -1
  51. package/dist/detail-list-CQguZg9h.d.ts.map +0 -1
  52. package/dist/grid-list-40blkeza.js.map +0 -1
  53. package/dist/list-native-drag-controller-B0hWdbtM.js.map +0 -1
  54. package/dist/list-native-drag-controller-Cmpx7jnx.d.ts.map +0 -1
  55. package/dist/tree-CVj7TIk2.js.map +0 -1
  56. package/dist/tree-component-BW2iCFq9.d.ts.map +0 -1
  57. package/dist/vertical-list-CHrXmmQ3.d.ts.map +0 -1
@@ -19,14 +19,12 @@ function fontOf(style) {
19
19
  } catch {}
20
20
  return `12px system-ui, sans-serif`;
21
21
  }
22
- /** Caption for a drag entry — element labels win, then string items, then common object fields, then the key. */
22
+ /** Caption for a drag entry — explicit element labels win, then data values, then generic element text, then the key. */
23
23
  function captionForEntry(entry) {
24
24
  const el = entry.element ?? (entry.item instanceof Element ? entry.item : void 0);
25
25
  if (el) {
26
26
  const labelled = el.getAttribute(`data-label`) ?? el.querySelector(`[data-grid-list-caption]`)?.textContent?.trim() ?? el.getAttribute(`data-search-label`) ?? el.querySelector(`.cell`)?.textContent?.trim();
27
27
  if (labelled) return labelled.slice(0, 80);
28
- const text = el.textContent?.trim();
29
- if (text) return text.slice(0, 80);
30
28
  }
31
29
  const item = entry.item;
32
30
  if (typeof item === `string` && item.length > 0) return item.slice(0, 80);
@@ -42,12 +40,32 @@ function captionForEntry(entry) {
42
40
  if (typeof value === `string` && value.length > 0) return value.slice(0, 80);
43
41
  }
44
42
  }
43
+ if (el) {
44
+ const text = el.textContent?.trim();
45
+ if (text) return text.slice(0, 80);
46
+ }
45
47
  return entry.key;
46
48
  }
47
49
  function glyphFor(caption) {
48
50
  const first = caption.trim().at(0);
49
51
  return first ? first.toLocaleUpperCase() : `?`;
50
52
  }
53
+ function hasUsableDimensions(source) {
54
+ if (source instanceof HTMLImageElement || source instanceof HTMLVideoElement || source instanceof HTMLCanvasElement) return source.clientWidth > 0 && source.clientHeight > 0;
55
+ if (source instanceof ImageBitmap) return source.width > 0 && source.height > 0;
56
+ if (`naturalWidth` in source && `naturalHeight` in source) {
57
+ const sized = source;
58
+ return sized.naturalWidth > 0 && sized.naturalHeight > 0;
59
+ }
60
+ return true;
61
+ }
62
+ function sourceImage(entry, resolveDragPreviewSource) {
63
+ if (resolveDragPreviewSource) try {
64
+ const source = resolveDragPreviewSource(entry);
65
+ if (source && hasUsableDimensions(source)) return source;
66
+ } catch {}
67
+ return decodedImage(entry);
68
+ }
51
69
  /** A decoded `<img>` ready for `drawImage`, if the entry's element has one. */
52
70
  function decodedImage(entry) {
53
71
  const scope = entry.element ?? (entry.item instanceof Element ? entry.item : void 0);
@@ -74,7 +92,7 @@ function thumbCell(doc, caption, img, size) {
74
92
  const well = doc.createElement(`div`);
75
93
  well.setAttribute(`data-thumb`, ``);
76
94
  well.style.cssText = `width:${size}px;height:${size}px;border-radius:4px;overflow:hidden;background:var(--surface-5, rgba(128,128,128,0.25));flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:${Math.round(size * .4)}px;font-weight:600;`;
77
- if (img) try {
95
+ if (img instanceof HTMLImageElement) try {
78
96
  const clone = img.cloneNode(true);
79
97
  clone.style.cssText = `width:100%;height:100%;object-fit:cover;`;
80
98
  clone.removeAttribute(`id`);
@@ -308,11 +326,19 @@ function paintList(context, scale, palette, captions, images, rh, cssW, cssH) {
308
326
  * Always returns an offscreen `element` for `DataTransfer.setDragImage()` and,
309
327
  * when a 2D context is available, a DPR-aware painted `canvas` for native
310
328
  * hosts. Colours track the active theme via `ctx.hostStyle` CSS variables.
329
+ *
330
+ * When `ctx.resolveDragPreviewSource` is provided, it is called for each
331
+ * selected entry before the default DOM-image lookup. The resolver must
332
+ * return an already-loaded `CanvasImageSource` (e.g. an `<img>`, `<canvas>`,
333
+ * `<video>`, or `ImageBitmap`) or `undefined`. Returning `undefined` or
334
+ * throwing causes the painter to fall back to the standard
335
+ * descendant-`<img>` inspection, and ultimately to the glyph fallback.
311
336
  */
312
- function createDefaultListDragPreview(ctx) {
337
+ function createDefaultListDragPreview(context) {
338
+ const ctx = context;
313
339
  const entries = ctx.selected;
314
340
  const captions = entries.map((entry) => captionForEntry(entry));
315
- const images = entries.map((entry) => decodedImage(entry));
341
+ const images = entries.map((entry) => sourceImage(entry, ctx.resolveDragPreviewSource));
316
342
  const isCards = entries.length <= 5;
317
343
  let element;
318
344
  let cssW;
@@ -496,12 +522,19 @@ var ListNativeDragController = class {
496
522
  } catch {
497
523
  metrics = {};
498
524
  }
525
+ let resolveDragPreviewSource;
526
+ try {
527
+ resolveDragPreviewSource = this.#config.getDragPreviewSourceResolver?.();
528
+ } catch {
529
+ resolveDragPreviewSource = void 0;
530
+ }
499
531
  const context = {
500
532
  source: this.#config.source,
501
533
  origin,
502
534
  selected,
503
535
  metrics,
504
- hostStyle
536
+ hostStyle,
537
+ ...resolveDragPreviewSource ? { resolveDragPreviewSource } : {}
505
538
  };
506
539
  let renderer;
507
540
  try {
@@ -578,4 +611,4 @@ var ListNativeDragController = class {
578
611
  //#endregion
579
612
  export { captionForEntry as n, createDefaultListDragPreview as r, ListNativeDragController as t };
580
613
 
581
- //# sourceMappingURL=list-native-drag-controller-B0hWdbtM.js.map
614
+ //# sourceMappingURL=list-native-drag-controller-B9xO0XWn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-native-drag-controller-B9xO0XWn.js","names":["#host","#config","#dragging","#bind","#observer","#unbind","#renderRoot","#boundRoot","#onDragStart","#onDragEnd","#boundHost","#seenDragStarts"],"sources":["../src/interaction/list-drag-preview-default.ts","../src/interaction/list-native-drag-controller.ts"],"sourcesContent":["import type { ListDragEntry, ListDragPreview, ListDragPreviewContext } from './list-drag-types.js';\n\nconst CARD_DEFAULT = 72;\nconst CARD_MIN = 48;\nconst CARD_MAX = 96;\nconst LIST_WIDTH = 220;\nconst LIST_MAX_ROWS = 5;\nconst MAX_CANVAS_DIM = 1024;\n\nfunction cssVar(style: CSSStyleDeclaration, name: string, fallback: string): string {\n try {\n const value = style.getPropertyValue(name)?.trim();\n return value || fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction fontOf(style: CSSStyleDeclaration): string {\n try {\n const font = style.font?.trim();\n if (font)\n return font;\n } catch {\n // Ignore.\n }\n return `12px system-ui, sans-serif`;\n}\n\n/** Caption for a drag entry — explicit element labels win, then data values, then generic element text, then the key. */\nexport function captionForEntry(entry: ListDragEntry<unknown>): string {\n const el = entry.element ?? (entry.item instanceof Element ? entry.item : undefined);\n if (el) {\n const labelled = el.getAttribute(`data-label`)\n ?? el.querySelector(`[data-grid-list-caption]`)?.textContent?.trim()\n ?? el.getAttribute(`data-search-label`)\n ?? el.querySelector(`.cell`)?.textContent?.trim();\n if (labelled)\n return labelled.slice(0, 80);\n }\n const item = entry.item;\n if (typeof item === `string` && item.length > 0)\n return item.slice(0, 80);\n if (item !== null && typeof item === `object` && !(item instanceof Element)) {\n const record = item as Record<string, unknown>;\n for (const field of [`label`, `name`, `title`, `text`]) {\n const value = record[field];\n if (typeof value === `string` && value.length > 0)\n return value.slice(0, 80);\n }\n }\n // Generic element text last: a data-backed virtual cell (`.cell`) contains\n // both the adapter output and the caption band, so its raw `textContent`\n // would duplicate the caption — prefer the data-derived caption above.\n if (el) {\n const text = el.textContent?.trim();\n if (text)\n return text.slice(0, 80);\n }\n return entry.key;\n}\n\nfunction glyphFor(caption: string): string {\n const first = caption.trim().at(0);\n return first ? first.toLocaleUpperCase() : `?`;\n}\n\nfunction hasUsableDimensions(source: CanvasImageSource): boolean {\n if (source instanceof HTMLImageElement || source instanceof HTMLVideoElement || source instanceof HTMLCanvasElement) {\n return source.clientWidth > 0 && source.clientHeight > 0;\n }\n if (source instanceof ImageBitmap) {\n return source.width > 0 && source.height > 0;\n }\n if (`naturalWidth` in source && `naturalHeight` in source) {\n const sized = source as unknown as { naturalWidth: number; naturalHeight: number };\n return sized.naturalWidth > 0 && sized.naturalHeight > 0;\n }\n return true;\n}\n\nfunction sourceImage(entry: ListDragEntry<unknown>, resolveDragPreviewSource?: (entry: ListDragEntry<unknown>) => CanvasImageSource | undefined): CanvasImageSource | undefined {\n if (resolveDragPreviewSource) {\n try {\n const source = resolveDragPreviewSource(entry);\n if (source && hasUsableDimensions(source))\n return source;\n } catch {\n // resolver threw — fall through to DOM lookup\n }\n }\n return decodedImage(entry);\n}\n\n/** A decoded `<img>` ready for `drawImage`, if the entry's element has one. */\nfunction decodedImage(entry: ListDragEntry<unknown>): HTMLImageElement | undefined {\n const scope = entry.element ?? (entry.item instanceof Element ? entry.item : undefined);\n if (!scope || typeof scope.querySelector !== `function`)\n return undefined;\n // The entry element itself may be an <img> (e.g. slotted image content).\n if (scope instanceof HTMLImageElement) {\n if (scope.complete && scope.naturalWidth > 0)\n return scope;\n return undefined;\n }\n try {\n const img = scope.querySelector(`img`);\n if (img instanceof HTMLImageElement && img.complete && img.naturalWidth > 0)\n return img;\n } catch {\n // Ignore.\n }\n return undefined;\n}\n\nfunction cardSize(metrics: ListDragPreviewContext<unknown>[`metrics`]): number {\n if (metrics.itemSize !== undefined && Number.isFinite(metrics.itemSize))\n return Math.max(CARD_MIN, Math.min(CARD_MAX, Math.round(metrics.itemSize)));\n return CARD_DEFAULT;\n}\n\nfunction rowHeight(metrics: ListDragPreviewContext<unknown>[`metrics`]): number {\n const raw = metrics.rowHeight;\n if (raw !== undefined && Number.isFinite(raw))\n return Math.max(24, Math.min(36, Math.round(raw)));\n return 28;\n}\n\nfunction thumbCell(doc: Document, caption: string, img: CanvasImageSource | undefined, size: number): HTMLElement {\n const well = doc.createElement(`div`);\n well.setAttribute(`data-thumb`, ``);\n well.style.cssText = `width:${size}px;height:${size}px;border-radius:4px;overflow:hidden;`\n + `background:var(--surface-5, rgba(128,128,128,0.25));flex-shrink:0;display:flex;`\n + `align-items:center;justify-content:center;font-size:${Math.round(size * 0.4)}px;font-weight:600;`;\n if (img instanceof HTMLImageElement) {\n try {\n const clone = img.cloneNode(true) as HTMLImageElement;\n clone.style.cssText = `width:100%;height:100%;object-fit:cover;`;\n clone.removeAttribute(`id`);\n well.appendChild(clone);\n } catch {\n well.textContent = glyphFor(caption);\n }\n } else {\n well.textContent = glyphFor(caption);\n }\n return well;\n}\n\nfunction buildCardsElement(ctx: ListDragPreviewContext<unknown>, captions: string[], images: Array<CanvasImageSource | undefined>): HTMLElement {\n const doc = document;\n const size = cardSize(ctx.metrics);\n const gap = 6;\n const pad = 8;\n const root = doc.createElement(`div`);\n root.setAttribute(`data-preview`, `cards`);\n root.setAttribute(`part`, `drag-preview`);\n root.style.cssText = `position:fixed;top:-9999px;left:-9999px;display:flex;flex-direction:row;gap:${gap}px;`\n + `padding:${pad}px;background:var(--surface-4, #333);color:var(--surface-4-text, #fff);`\n + `border:1px solid var(--border-subtle, #555);border-radius:var(--radius-m, 8px);`\n + `box-shadow:0 4px 16px rgba(0,0,0,0.3);font-family:system-ui,sans-serif;font-size:11px;`\n + `max-width:320px;z-index:999999;pointer-events:none;`;\n const n = ctx.selected.length;\n for (let i = 0; i < n; i++) {\n const card = doc.createElement(`div`);\n card.setAttribute(`data-card`, ``);\n card.style.cssText = `display:flex;flex-direction:column;gap:4px;align-items:center;width:${size}px;`;\n card.appendChild(thumbCell(doc, captions[i], images[i], Math.round(size * 0.72)));\n const label = doc.createElement(`span`);\n label.setAttribute(`data-caption`, ``);\n label.style.cssText = `max-width:${size}px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:0.9;`;\n label.textContent = captions[i];\n card.appendChild(label);\n root.appendChild(card);\n }\n return root;\n}\n\nfunction buildListElement(\n ctx: ListDragPreviewContext<unknown>,\n captions: string[],\n images: Array<CanvasImageSource | undefined>,\n): HTMLElement {\n const doc = document;\n const rh = rowHeight(ctx.metrics);\n const thumb = Math.round(rh * 0.78);\n const root = doc.createElement(`div`);\n root.setAttribute(`data-preview`, `list`);\n root.setAttribute(`part`, `drag-preview`);\n root.style.cssText = `position:fixed;top:-9999px;left:-9999px;display:flex;flex-direction:column;gap:4px;`\n + `padding:8px;background:var(--surface-4, #333);color:var(--surface-4-text, #fff);`\n + `border:1px solid var(--border-subtle, #555);border-radius:var(--radius-m, 8px);`\n + `box-shadow:0 4px 16px rgba(0,0,0,0.3);font-family:system-ui,sans-serif;font-size:12px;`\n + `width:${LIST_WIDTH}px;max-width:${LIST_WIDTH}px;z-index:999999;pointer-events:none;`;\n const header = doc.createElement(`div`);\n header.setAttribute(`data-header`, ``);\n header.style.cssText = `font-weight:600;padding-bottom:4px;border-bottom:1px solid var(--border-subtle, #555);margin-bottom:4px;`;\n header.textContent = `${ctx.selected.length} items`;\n root.appendChild(header);\n for (let i = 0; i < Math.min(LIST_MAX_ROWS, captions.length); i++) {\n const row = doc.createElement(`div`);\n row.setAttribute(`data-row`, ``);\n row.style.cssText = `display:flex;align-items:center;gap:6px;height:${rh}px;overflow:hidden;`;\n row.appendChild(thumbCell(doc, captions[i], images[i], thumb));\n const label = doc.createElement(`span`);\n label.setAttribute(`data-caption`, ``);\n label.style.cssText = `flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;`;\n label.textContent = captions[i];\n row.appendChild(label);\n root.appendChild(row);\n }\n if (captions.length > LIST_MAX_ROWS) {\n const more = doc.createElement(`div`);\n more.setAttribute(`data-more`, ``);\n more.style.cssText = `opacity:0.6;text-align:center;`;\n more.textContent = `+${captions.length - LIST_MAX_ROWS} more`;\n root.appendChild(more);\n }\n return root;\n}\n\ntype Palette = {\n bg: string;\n fg: string;\n subtle: string;\n accent: string;\n radius: number;\n font: string;\n};\n\nfunction paletteOf(style: CSSStyleDeclaration): Palette {\n const bg = cssVar(style, `--surface-4`, `#333333`);\n const fg = cssVar(style, `--surface-4-text`, `#ffffff`);\n const subtle = cssVar(style, `--border-subtle`, `#555555`);\n const accent = cssVar(style, `--accent`, `#4da3ff`);\n const radiusRaw = cssVar(style, `--radius-m`, `8`);\n const radius = Number.parseFloat(radiusRaw) || 8;\n return { bg, fg, subtle, accent, radius, font: fontOf(style) };\n}\n\nfunction fitCanvas(canvas: HTMLCanvasElement, cssW: number, cssH: number): { scale: number; dpr: number } {\n const dpr = Math.max(1, Math.min(3, (typeof devicePixelRatio === `number` && devicePixelRatio > 0) ? devicePixelRatio : 1));\n let scale = dpr;\n // Bound the backing store so huge selections cannot allocate unbounded canvases.\n const maxScaleW = MAX_CANVAS_DIM / Math.max(1, cssW);\n const maxScaleH = MAX_CANVAS_DIM / Math.max(1, cssH);\n scale = Math.min(scale, maxScaleW, maxScaleH);\n canvas.width = Math.max(1, Math.round(cssW * scale));\n canvas.height = Math.max(1, Math.round(cssH * scale));\n canvas.style.width = `${cssW}px`;\n canvas.style.height = `${cssH}px`;\n return { scale, dpr: scale };\n}\n\nfunction roundRectPath(context: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number): void {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n if (typeof context.roundRect === `function`) {\n context.beginPath();\n context.roundRect(x, y, w, h, radius);\n return;\n }\n context.beginPath();\n context.moveTo(x + radius, y);\n context.arcTo(x + w, y, x + w, y + h, radius);\n context.arcTo(x + w, y + h, x, y + h, radius);\n context.arcTo(x, y + h, x, y, radius);\n context.arcTo(x, y, x + w, y, radius);\n context.closePath();\n}\n\nfunction paintCards(\n context: CanvasRenderingContext2D,\n scale: number,\n palette: Palette,\n captions: string[],\n images: Array<CanvasImageSource | undefined>,\n size: number,\n cssW: number,\n cssH: number,\n): void {\n context.save();\n context.scale(scale, scale);\n roundRectPath(context, 0, 0, cssW, cssH, palette.radius);\n context.fillStyle = palette.bg;\n context.fill();\n context.strokeStyle = palette.subtle;\n context.lineWidth = 1;\n context.stroke();\n context.clip();\n\n const gap = 6;\n const pad = 8;\n const wellSize = Math.round(size * 0.72);\n context.font = palette.font;\n context.textBaseline = `middle`;\n for (let i = 0; i < captions.length; i++) {\n const x = pad + i * (size + gap);\n const wellX = x + (size - wellSize) / 2;\n const wellY = pad;\n roundRectPath(context, wellX, wellY, wellSize, wellSize, 4);\n context.fillStyle = palette.subtle;\n context.globalAlpha = 0.35;\n context.fill();\n context.globalAlpha = 1;\n const img = images[i];\n if (img) {\n try {\n context.save();\n context.clip();\n context.drawImage(img, wellX, wellY, wellSize, wellSize);\n context.restore();\n } catch {\n // Placeholder below already painted.\n }\n } else {\n context.fillStyle = palette.fg;\n context.globalAlpha = 0.9;\n context.font = `600 ${Math.round(wellSize * 0.4)}px system-ui, sans-serif`;\n context.textAlign = `center`;\n context.fillText(glyphFor(captions[i]), wellX + wellSize / 2, wellY + wellSize / 2 + 1);\n context.globalAlpha = 1;\n context.textAlign = `left`;\n context.font = palette.font;\n }\n context.fillStyle = palette.fg;\n context.globalAlpha = 0.9;\n context.font = palette.font;\n const label = captions[i].length > 12 ? `${captions[i].slice(0, 11)}…` : captions[i];\n const textWidth = context.measureText(label).width;\n context.fillText(label, x + (size - Math.min(size, textWidth)) / 2, wellY + wellSize + 10, size);\n context.globalAlpha = 1;\n }\n context.restore();\n}\n\nfunction paintList(\n context: CanvasRenderingContext2D,\n scale: number,\n palette: Palette,\n captions: string[],\n images: Array<CanvasImageSource | undefined>,\n rh: number,\n cssW: number,\n cssH: number,\n): void {\n context.save();\n context.scale(scale, scale);\n roundRectPath(context, 0, 0, cssW, cssH, palette.radius);\n context.fillStyle = palette.bg;\n context.fill();\n context.strokeStyle = palette.subtle;\n context.lineWidth = 1;\n context.stroke();\n context.clip();\n\n const pad = 8;\n context.fillStyle = palette.fg;\n context.font = `600 ${palette.font}`;\n context.textBaseline = `middle`;\n context.fillText(`${captions.length} items`, pad, pad + 8, cssW - pad * 2);\n context.strokeStyle = palette.subtle;\n context.beginPath();\n context.moveTo(pad, pad + 20);\n context.lineTo(cssW - pad, pad + 20);\n context.stroke();\n\n const thumb = Math.round(rh * 0.78);\n const rows = Math.min(LIST_MAX_ROWS, captions.length);\n context.font = palette.font;\n for (let i = 0; i < rows; i++) {\n const y = pad + 24 + i * rh;\n roundRectPath(context, pad, y + (rh - thumb) / 2, thumb, thumb, 4);\n context.fillStyle = palette.subtle;\n context.globalAlpha = 0.35;\n context.fill();\n context.globalAlpha = 1;\n const img = images[i];\n if (img) {\n try {\n context.save();\n context.clip();\n context.drawImage(img, pad, y + (rh - thumb) / 2, thumb, thumb);\n context.restore();\n } catch {\n // Placeholder already painted.\n }\n } else {\n context.fillStyle = palette.fg;\n context.font = `600 ${Math.round(thumb * 0.45)}px system-ui, sans-serif`;\n context.textAlign = `center`;\n context.fillText(glyphFor(captions[i]), pad + thumb / 2, y + rh / 2 + 1);\n context.textAlign = `left`;\n context.font = palette.font;\n }\n context.fillStyle = palette.fg;\n context.globalAlpha = 0.92;\n const maxText = cssW - pad * 2 - thumb - 6;\n context.fillText(captions[i], pad + thumb + 6, y + rh / 2 + 1, Math.max(8, maxText));\n context.globalAlpha = 1;\n }\n if (captions.length > LIST_MAX_ROWS) {\n context.fillStyle = palette.fg;\n context.globalAlpha = 0.6;\n context.textAlign = `center`;\n context.fillText(`+${captions.length - LIST_MAX_ROWS} more`, cssW / 2, cssH - pad - 6, cssW - pad * 2);\n context.textAlign = `left`;\n context.globalAlpha = 1;\n }\n context.restore();\n}\n\n/**\n * Uniform built-in HTML+canvas drag preview for all four list components.\n *\n * - ≤5 selected → a row of small cards (thumbnail well + caption).\n * - >5 selected → a compact list (`N items` header, up to 5 rows, `+N more`).\n *\n * Always returns an offscreen `element` for `DataTransfer.setDragImage()` and,\n * when a 2D context is available, a DPR-aware painted `canvas` for native\n * hosts. Colours track the active theme via `ctx.hostStyle` CSS variables.\n *\n * When `ctx.resolveDragPreviewSource` is provided, it is called for each\n * selected entry before the default DOM-image lookup. The resolver must\n * return an already-loaded `CanvasImageSource` (e.g. an `<img>`, `<canvas>`,\n * `<video>`, or `ImageBitmap`) or `undefined`. Returning `undefined` or\n * throwing causes the painter to fall back to the standard\n * descendant-`<img>` inspection, and ultimately to the glyph fallback.\n */\nexport function createDefaultListDragPreview<T>(context: ListDragPreviewContext<T>): ListDragPreview {\n // Safe: the resolver is only ever invoked below with entries drawn from\n // this same context's `selected`, so the erased `T` never actually mixes\n // with another list's entries. `resolveDragPreviewSource` is contravariant\n // in `T` (it's a function parameter position), so `ListDragPreviewContext<T>`\n // isn't structurally assignable to `<unknown>` — this cast is the one place\n // that boundary is crossed for the rest of this (internally `<unknown>`-typed) file.\n const ctx = context as unknown as ListDragPreviewContext<unknown>;\n const entries = ctx.selected;\n const captions = entries.map(entry => captionForEntry(entry));\n const images = entries.map(entry => sourceImage(entry, ctx.resolveDragPreviewSource));\n const isCards = entries.length <= 5;\n\n let element: HTMLElement;\n let cssW: number;\n let cssH: number;\n if (isCards) {\n const size = cardSize(ctx.metrics);\n const gap = 6;\n const pad = 8;\n cssW = entries.length * size + Math.max(0, entries.length - 1) * gap + pad * 2;\n cssH = Math.round(size * 0.72) + 22 + pad * 2;\n element = buildCardsElement(ctx, captions, images);\n } else {\n const rh = rowHeight(ctx.metrics);\n const pad = 8;\n const rows = Math.min(LIST_MAX_ROWS, entries.length);\n const more = entries.length > LIST_MAX_ROWS ? 18 : 0;\n cssW = LIST_WIDTH + 16;\n cssH = pad * 2 + 24 + rows * rh + more;\n element = buildListElement(ctx, captions, images);\n }\n\n let canvas: HTMLCanvasElement | undefined;\n try {\n const candidate = document.createElement(`canvas`);\n const paint = candidate.getContext(`2d`);\n if (paint) {\n const { scale } = fitCanvas(candidate, cssW, cssH);\n const palette = paletteOf(ctx.hostStyle);\n if (isCards) {\n paintCards(paint, scale, palette, captions, images, cardSize(ctx.metrics), cssW, cssH);\n } else {\n paintList(paint, scale, palette, captions, images, rowHeight(ctx.metrics), cssW, cssH);\n }\n canvas = candidate;\n }\n } catch {\n canvas = undefined;\n }\n\n return {\n element,\n hotspot: { x: 16, y: 16 },\n ...(canvas ? { canvas } : {}),\n dispose: () => {},\n };\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type {\n ListDragEntry,\n ListDragPreview,\n ListDragPreviewContext,\n ListDragPreviewRenderer,\n ListDragPreviewSourceResolver,\n ListDragSource,\n ListNativeDragStartDetail,\n} from './list-drag-types.js';\nimport { createDefaultListDragPreview } from './list-drag-preview-default.js';\n\nexport type ListNativeDragControllerConfig<T> = {\n readonly source: ListDragSource;\n /** `itemsDraggable && selection usable` */\n isEnabled: () => boolean;\n /** Event target → item key, or `undefined` when the drag did not start on an item. */\n resolveEventToKey: (target: EventTarget | null) => string | undefined;\n /**\n * Apply the origin rule (origin ∉ selection ⇒ replace with origin); return\n * display-ordered `{ origin, selected }` for both modes, or `undefined` when\n * the origin is not selectable.\n */\n prepareSelection: (originKey: string) => { origin: ListDragEntry<T>; selected: Array<ListDragEntry<T>> } | undefined;\n getMetrics: () => ListDragPreviewContext<T>[`metrics`];\n getRenderer: () => ListDragPreviewRenderer<T> | undefined;\n getDragPreviewSourceResolver?: () => ListDragPreviewSourceResolver<T> | undefined;\n /** Fire the cancelable `list-native-drag-start`; return `!defaultPrevented`. */\n dispatch: (detail: ListNativeDragStartDetail<T>) => boolean;\n /**\n * Optional: write custom payloads onto the drag's `DataTransfer` (e.g. a\n * MIME type for same-app drops). Called once, after a non-cancelled dispatch,\n * inside the synchronous `dragstart` turn.\n */\n writeDataTransfer?: (dataTransfer: DataTransfer, detail: ListNativeDragStartDetail<T>) => void;\n /** Host toggles `data-native-dragging` / `aria-label`, re-renders. */\n onActiveChange: (active: boolean, originKey?: string) => void;\n /** Host clears state + starts its post-drag click-suppress timer. */\n onEnd: () => void;\n /** Optional: sync `draggable` on light-DOM / slotted children while enabled. */\n syncLightDomDraggable?: () => void;\n /**\n * Optional. Called at the very top of the capture-phase `dragstart`, before\n * enablement / key resolution. Return `false` to abort the native drag — the\n * controller calls `event.preventDefault()` so the browser starts no drag.\n * Use when the gesture belongs to another interaction (e.g. marquee select).\n */\n shouldStart?: (event: DragEvent) => boolean;\n};\n\ntype DragHost = ReactiveControllerHost & HTMLElement;\n\n/**\n * Shared native item/row drag-out for list components.\n *\n * Owns capture-phase `dragstart` / `dragend` listeners on the host and its\n * render root, a `MutationObserver` that keeps light-DOM / slotted item `draggable`\n * attributes in sync, and a single post-dispatch disposal on\n * `requestAnimationFrame`. All DOM / selection knowledge lives in the host\n * config callbacks.\n */\nexport class ListNativeDragController<T> implements ReactiveController {\n readonly #host: DragHost;\n readonly #config: ListNativeDragControllerConfig<T>;\n\n #dragging = false;\n #boundRoot: EventTarget | undefined;\n #boundHost = false;\n #seenDragStarts = new WeakSet<Event>();\n #observer: MutationObserver | undefined;\n\n constructor(host: DragHost, config: ListNativeDragControllerConfig<T>) {\n this.#host = host;\n this.#config = config;\n host.addController(this);\n }\n\n get isDragging(): boolean {\n return this.#dragging;\n }\n\n /** `\"true\"` when enabled, else `\"false\"` — for shadow-row template bindings. */\n get draggableAttr(): string {\n try {\n return this.#config.isEnabled() ? `true` : `false`;\n } catch {\n return `false`;\n }\n }\n\n /** Re-run the light-DOM `draggable` sync (e.g. after `itemsDraggable` flips). */\n refreshDraggable(): void {\n try {\n this.#config.syncLightDomDraggable?.();\n } catch {\n // Host sync must never break the controller.\n }\n }\n\n hostConnected(): void {\n this.#bind();\n this.#observer ??= new MutationObserver(() => this.refreshDraggable());\n try {\n this.#observer.observe(this.#host, { childList: true, subtree: true });\n } catch {\n // happy-dom-safe: observing must never throw.\n }\n this.refreshDraggable();\n }\n\n /** `renderRoot` does not exist yet at `hostConnected` for a shadow-DOM host — rebind once it does. */\n hostUpdated(): void {\n this.#bind();\n }\n\n hostDisconnected(): void {\n this.#unbind();\n try {\n this.#observer?.disconnect();\n } catch {\n // Ignore.\n }\n this.#dragging = false;\n }\n\n #renderRoot(): EventTarget {\n const maybe = this.#host as unknown as { renderRoot?: EventTarget };\n return maybe.renderRoot ?? this.#host;\n }\n\n #bind(): void {\n // Capture on both the host (light-DOM / slotted items, and everything in\n // happy-dom where slot distribution is not reflected in the event path)\n // and the render root (shadow cells). A shadow-originated drag reaches\n // both — `#seenDragStarts` dedups the second call.\n const root = this.#renderRoot();\n if (root !== this.#boundRoot) {\n this.#unbind();\n this.#boundRoot = root;\n root.addEventListener(`dragstart`, this.#onDragStart as EventListener, { capture: true });\n root.addEventListener(`dragend`, this.#onDragEnd as EventListener, { capture: true });\n }\n if (!this.#boundHost) {\n this.#boundHost = true;\n this.#host.addEventListener(`dragstart`, this.#onDragStart as EventListener, { capture: true });\n this.#host.addEventListener(`dragend`, this.#onDragEnd as EventListener, { capture: true });\n }\n }\n\n #unbind(): void {\n this.#boundRoot?.removeEventListener(`dragstart`, this.#onDragStart as EventListener, { capture: true });\n this.#boundRoot?.removeEventListener(`dragend`, this.#onDragEnd as EventListener, { capture: true });\n this.#boundRoot = undefined;\n if (this.#boundHost) {\n this.#boundHost = false;\n this.#host.removeEventListener(`dragstart`, this.#onDragStart as EventListener, { capture: true });\n this.#host.removeEventListener(`dragend`, this.#onDragEnd as EventListener, { capture: true });\n }\n }\n\n #onDragStart = (event: Event): void => {\n if (!(event instanceof DragEvent))\n return;\n if (this.#seenDragStarts.has(event))\n return;\n if (this.#config.shouldStart) {\n let ok = true;\n try {\n ok = this.#config.shouldStart(event);\n } catch {\n ok = false;\n }\n if (!ok) {\n try {\n event.preventDefault();\n } catch {\n // Ignore — stubbed events in tests.\n }\n return;\n }\n }\n let enabled = false;\n try {\n enabled = this.#config.isEnabled();\n } catch {\n return;\n }\n if (!enabled)\n return;\n let originKey: string | undefined;\n try {\n originKey = this.#config.resolveEventToKey(event.target);\n } catch {\n return;\n }\n // Do NOT mark the event seen until we have a key. This handler is bound to\n // both the host and the render root; on a shadow-DOM host the host-level\n // invocation sees a retargeted `event.target` and resolves no key — it must\n // not poison the dedup for the render-root invocation that will succeed.\n if (originKey)\n this.#seenDragStarts.add(event);\n if (!originKey)\n return;\n let prepared: { origin: ListDragEntry<T>; selected: Array<ListDragEntry<T>> } | undefined;\n try {\n prepared = this.#config.prepareSelection(originKey);\n } catch {\n return;\n }\n if (!prepared || prepared.selected.length === 0)\n return;\n const { origin, selected } = prepared;\n\n let hostStyle: CSSStyleDeclaration;\n try {\n hostStyle = getComputedStyle(this.#host);\n } catch {\n hostStyle = document.createElement(`div`).style as unknown as CSSStyleDeclaration;\n }\n let metrics: ListDragPreviewContext<T>[`metrics`] = {};\n try {\n metrics = this.#config.getMetrics() ?? {};\n } catch {\n metrics = {};\n }\n let resolveDragPreviewSource;\n try {\n resolveDragPreviewSource = this.#config.getDragPreviewSourceResolver?.();\n } catch {\n resolveDragPreviewSource = undefined;\n }\n const context: ListDragPreviewContext<T> = {\n source: this.#config.source,\n origin,\n selected,\n metrics,\n hostStyle,\n ...(resolveDragPreviewSource ? { resolveDragPreviewSource } : {}),\n };\n let renderer: ListDragPreviewRenderer<T> | undefined;\n try {\n renderer = this.#config.getRenderer();\n } catch {\n renderer = undefined;\n }\n let preview: ListDragPreview;\n try {\n preview = renderer ? renderer(context) : createDefaultListDragPreview(context);\n } catch {\n preview = createDefaultListDragPreview(context);\n }\n try {\n document.body.appendChild(preview.element);\n } catch {\n // happy-dom-safe.\n }\n\n const detail: ListNativeDragStartDetail<T> = {\n key: origin.key,\n index: origin.index,\n item: origin.item,\n selectedKeys: selected.map(entry => entry.key),\n selected,\n preview,\n };\n let notCancelled = true;\n try {\n notCancelled = this.#config.dispatch(detail);\n } catch {\n notCancelled = true;\n }\n\n if (notCancelled) {\n if (event.dataTransfer) {\n try {\n // Let drop targets show a \"move\" / \"copy\" cursor.\n if (event.dataTransfer.effectAllowed === `none` || event.dataTransfer.effectAllowed === `uninitialized`)\n event.dataTransfer.effectAllowed = `copyMove`;\n } catch {\n // read-only in some contexts — non-fatal.\n }\n try {\n this.#config.writeDataTransfer?.(event.dataTransfer, detail);\n } catch {\n // A misbehaving payload writer must not abort the drag.\n }\n }\n const hotspot = preview.hotspot ?? { x: 16, y: 16 };\n try {\n event.dataTransfer?.setDragImage(preview.element, hotspot.x, hotspot.y);\n } catch {\n // Stubbed dataTransfer in tests may throw — non-fatal.\n }\n this.#dragging = true;\n try {\n this.#config.onActiveChange(true, origin.key);\n } catch {\n // Ignore.\n }\n } else {\n try {\n event.preventDefault();\n } catch {\n // Ignore.\n }\n }\n requestAnimationFrame(() => {\n try {\n preview.element.remove();\n } catch {\n // Ignore.\n }\n try {\n preview.dispose?.();\n } catch {\n // Ignore.\n }\n });\n };\n\n #onDragEnd = (): void => {\n if (!this.#dragging)\n return;\n this.#dragging = false;\n try {\n this.#config.onActiveChange(false);\n } catch {\n // Ignore.\n }\n try {\n this.#config.onEnd();\n } catch {\n // Ignore.\n }\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { F as ListDragSource, I as ListNativeDragStartDetail, N as ListDragPreviewContext, P as ListDragPreviewRenderer, j as ListDragEntry } from "./tree-component-BW2iCFq9.js";
1
+ import { F as ListDragPreviewSourceResolver, I as ListDragSource, L as ListNativeDragStartDetail, N as ListDragPreviewContext, P as ListDragPreviewRenderer, j as ListDragEntry } from "./tree-component-DGmKBbpy.js";
2
2
  import { ReactiveController, ReactiveControllerHost } from "lit";
3
3
  //#region src/interaction/list-native-drag-controller.d.ts
4
4
  type ListNativeDragControllerConfig<T> = {
@@ -18,6 +18,7 @@ type ListNativeDragControllerConfig<T> = {
18
18
  } | undefined;
19
19
  getMetrics: () => ListDragPreviewContext<T>[`metrics`];
20
20
  getRenderer: () => ListDragPreviewRenderer<T> | undefined;
21
+ getDragPreviewSourceResolver?: () => ListDragPreviewSourceResolver<T> | undefined;
21
22
  /** Fire the cancelable `list-native-drag-start`; return `!defaultPrevented`. */
22
23
  dispatch: (detail: ListNativeDragStartDetail<T>) => boolean;
23
24
  /**
@@ -65,4 +66,4 @@ declare class ListNativeDragController<T> implements ReactiveController {
65
66
  }
66
67
  //#endregion
67
68
  export { ListNativeDragControllerConfig as n, ListNativeDragController as t };
68
- //# sourceMappingURL=list-native-drag-controller-Cmpx7jnx.d.ts.map
69
+ //# sourceMappingURL=list-native-drag-controller-BAuWAtyQ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-native-drag-controller-BAuWAtyQ.d.ts","names":[],"sources":["../src/interaction/list-native-drag-controller.ts"],"mappings":";;;KAYY,+BAA+B;WAChC,QAAQ;;EAEjB;;EAEA,oBAAoB,QAAQ;;;;;;EAM5B,mBAAmB;IAAwB,QAAQ,cAAc;IAAI,UAAU,MAAM,cAAc;;EACnG,kBAAkB,uBAAuB;EACzC,mBAAmB,wBAAwB;EAC3C,qCAAqC,8BAA8B;;EAEnE,WAAW,QAAQ,0BAA0B;;;;;;EAM7C,qBAAqB,cAAc,cAAc,QAAQ,0BAA0B;;EAEnF,iBAAiB,iBAAiB;;EAElC;;EAEA;;;;;;;EAOA,eAAe,OAAO;;KAGnB,WAAW,yBAAyB;;;;;;;;;;cAW5B,yBAAyB,cAAc;;EAUtC,YAAA,MAAM,UAAU,QAAQ,+BAA+B;MAM/D;;MAKA;;EASJ;EAQA;;EAYA;EAIA"}
package/dist/miller.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { D as TreeTickleDetail, E as TreeSelectEvent, O as TreeTickleEvent, T as TreeSelectDetail, a as TreeComponent, b as TreeItemClickDetail, i as TreeCollapseEvent, k as TreeDataModel, n as TreeActivateEvent, o as TreeComponentEventMap, r as TreeCollapseDetail, t as TreeActivateDetail, v as TreeExpandDetail, w as TreeSearchHost, x as TreeItemClickEvent, y as TreeExpandEvent } from "./tree-component-BW2iCFq9.js";
1
+ import { D as TreeTickleDetail, E as TreeSelectEvent, O as TreeTickleEvent, T as TreeSelectDetail, a as TreeComponent, b as TreeItemClickDetail, i as TreeCollapseEvent, k as TreeDataModel, n as TreeActivateEvent, o as TreeComponentEventMap, r as TreeCollapseDetail, t as TreeActivateDetail, v as TreeExpandDetail, w as TreeSearchHost, x as TreeItemClickEvent, y as TreeExpandEvent } from "./tree-component-DGmKBbpy.js";
2
2
  import { a as TreeItem, n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-Bc23SI94.js";
3
- import { S as ListSearchController } from "./index--qnhBWZJ.js";
3
+ import { S as ListSearchController } from "./index-DPFrRhKL.js";
4
4
  import { n as TickledController } from "./tickled-controller-C1ZsHpyg.js";
5
5
  import { LitElement, PropertyValues, TemplateResult, nothing } from "lit";
6
6
  import { CommandRegistry } from "@clinth/ui-commands";
package/dist/style.css CHANGED
@@ -1,23 +1,24 @@
1
1
  :root {
2
- --surface-0: oklch(5% .02 240);
3
- --surface-1: oklch(8% .02 240);
4
- --surface-2: oklch(12% .02 240);
5
- --surface-3: oklch(15% .02 240);
6
- --surface-4: oklch(22% .02 240);
7
- --surface-5: oklch(28% .02 240);
8
- --surface-6: oklch(35% .02 240);
9
- --surface-2-text: #fff;
10
- --surface-3-text: oklch(75% .02 240);
11
- --surface-4-text: #fff;
12
- --surface-5-text: #fff;
13
- --surface-6-text: #fff;
14
- --surface-muted-text: oklch(55% .02 240);
15
- --content: oklch(10% .01 240);
16
- --content-text: #fff;
17
- --accent: oklch(from AccentColor .6 c h);
2
+ color-scheme: light dark;
3
+ --surface-0: light-dark(oklch(70% 0 0), oklch(5% .02 240));
4
+ --surface-1: light-dark(oklch(80% .01 240), oklch(8% .02 240));
5
+ --surface-2: light-dark(oklch(85% .01 240), oklch(12% .02 240));
6
+ --surface-3: light-dark(oklch(90% .01 240), oklch(15% .02 240));
7
+ --surface-4: light-dark(oklch(94% .01 240), oklch(22% .02 240));
8
+ --surface-5: light-dark(oklch(96% .01 240), oklch(28% .02 240));
9
+ --surface-6: light-dark(oklch(99% .01 240), oklch(35% .02 240));
10
+ --surface-2-text: light-dark(oklch(15% .02 240), #fff);
11
+ --surface-3-text: light-dark(oklch(25% .02 240), oklch(75% .02 240));
12
+ --surface-4-text: light-dark(oklch(15% .02 240), #fff);
13
+ --surface-5-text: light-dark(oklch(10% .02 240), #fff);
14
+ --surface-6-text: light-dark(oklch(10% .02 240), #fff);
15
+ --surface-muted-text: light-dark(oklch(45% .02 240), oklch(55% .02 240));
16
+ --content: light-dark(oklch(100% 0 0), oklch(10% .01 240));
17
+ --content-text: light-dark(oklch(10% .02 240), #fff);
18
+ --accent: light-dark(oklch(45% .15 140), oklch(from AccentColor .6 c h));
18
19
  --accent-text: #fff;
19
20
  --plot-color: var(--accent);
20
- --error: oklch(60% .15 20);
21
+ --error: light-dark(oklch(55% .15 20), oklch(60% .15 20));
21
22
  --error-text: #fff;
22
23
  --font-family: system-ui, sans-serif;
23
24
  --font-mono: ui-monospace, monospace;
@@ -35,36 +36,36 @@
35
36
  --space-l: 12px;
36
37
  --space-xl: 16px;
37
38
  --space-2xl: 20px;
38
- --border: 1px solid oklch(25% .02 240);
39
- --border-subtle-color: oklch(18% .02 240);
39
+ --border: 1px solid light-dark(oklch(80% .01 240), oklch(25% .02 240));
40
+ --border-subtle-color: light-dark(oklch(88% .01 240), oklch(18% .02 240));
40
41
  --border-subtle: 1px solid var(--border-subtle-color);
41
42
  --radius-s: 3px;
42
43
  --radius-m: 4px;
43
44
  --radius-l: 6px;
44
45
  --radius-xl: 8px;
45
- --shadow-m: 0 4px 12px #0000004d;
46
- --shadow-l: 0 4px 24px #00000080;
46
+ --shadow-m: light-dark(0 2px 8px #0000001a, 0 4px 12px #0000004d);
47
+ --shadow-l: light-dark(0 4px 16px #00000026, 0 4px 24px #00000080);
47
48
  --disabled-opacity: .5;
48
49
  --transition: .15s ease-out;
49
- --prominence-idle-opacity: .6;
50
- --prominence-idle-saturate: .4;
51
- --prominence-tickled-opacity: .85;
52
- --prominence-tickled-saturate: .8;
53
- --prominence-disabled-opacity: .3;
50
+ --prominence-idle-opacity: light-dark(.55, .6);
51
+ --prominence-idle-saturate: light-dark(.35, .4);
52
+ --prominence-tickled-opacity: light-dark(.8, .85);
53
+ --prominence-tickled-saturate: light-dark(.75, .8);
54
+ --prominence-disabled-opacity: light-dark(.25, .3);
54
55
  --prominence-disabled-saturate: .1;
55
- --transparent-bg: oklch(30% .02 240);
56
+ --transparent-bg: light-dark(oklch(85% .01 240), oklch(30% .02 240));
56
57
  --item-bg: transparent;
57
- --item-bg-tickled: var(--surface-5);
58
+ --item-bg-tickled: light-dark(var(--surface-4), var(--surface-5));
58
59
  --item-bg-selected: var(--accent);
59
60
  --item-bg-selected-tickled: color-mix(in oklch, var(--accent) 80%, oklch(0% 0 0));
60
- --item-text-tickled: var(--surface-5-text);
61
+ --item-text-tickled: light-dark(var(--surface-4-text), var(--surface-5-text));
61
62
  --item-text-selected: var(--accent-text);
62
- --item-border: 1px solid var(--surface-5);
63
+ --item-border: 1px solid light-dark(var(--surface-4), var(--surface-5));
63
64
  --item-border-tickled: var(--item-border);
64
65
  --item-border-selected: 1px dashed var(--accent);
65
66
  --item-border-active: 2px solid var(--accent);
66
67
  --item-border-dragged: 2px dotted color-mix(in oklch, var(--accent) 80%, transparent);
67
- --item-border-disabled: 1px solid var(--surface-4);
68
+ --item-border-disabled: 1px solid light-dark(var(--surface-3), var(--surface-4));
68
69
  --item-padding: var(--space-s) var(--space-m);
69
70
  --item-border-radius: var(--radius-m);
70
71
  --item-icon-spacing: var(--space-s);
@@ -84,60 +85,12 @@
84
85
  2px 2px 1px 0px color-mix(in oklch, var(--surface-2) 30%, transparent);
85
86
  }
86
87
 
87
- @media (prefers-color-scheme: light) {
88
- :root {
89
- --surface-0: oklch(70% 0 0);
90
- --surface-1: oklch(80% .01 240);
91
- --surface-2: oklch(85% .01 240);
92
- --surface-3: oklch(90% .01 240);
93
- --surface-4: oklch(94% .01 240);
94
- --surface-5: oklch(96% .01 240);
95
- --surface-6: oklch(99% .01 240);
96
- --surface-2-text: oklch(15% .02 240);
97
- --surface-3-text: oklch(25% .02 240);
98
- --surface-4-text: oklch(15% .02 240);
99
- --surface-5-text: oklch(10% .02 240);
100
- --surface-6-text: oklch(10% .02 240);
101
- --surface-muted-text: oklch(45% .02 240);
102
- --content: oklch(100% 0 0);
103
- --content-text: oklch(10% .02 240);
104
- --accent: oklch(45% .15 140);
105
- --accent-text: #fff;
106
- --plot-color: var(--accent);
107
- --error: oklch(55% .15 20);
108
- --error-text: #fff;
109
- --border: 1px solid oklch(80% .01 240);
110
- --border-subtle-color: oklch(88% .01 240);
111
- --border-subtle: 1px solid var(--border-subtle-color);
112
- --shadow-m: 0 2px 8px #0000001a;
113
- --shadow-l: 0 4px 16px #00000026;
114
- --prominence-idle-opacity: .55;
115
- --prominence-idle-saturate: .35;
116
- --prominence-tickled-opacity: .8;
117
- --prominence-tickled-saturate: .75;
118
- --prominence-disabled-opacity: .25;
119
- --prominence-disabled-saturate: .1;
120
- --transparent-bg: oklch(85% .01 240);
121
- --item-border: 1px solid var(--surface-4);
122
- --item-border-tickled: var(--item-border);
123
- --item-border-selected: 1px dashed var(--accent);
124
- --item-border-active: 2px solid var(--accent);
125
- --item-border-dragged: 2px dotted var(--accent);
126
- --item-border-disabled: 1px solid var(--surface-3);
127
- --item-bg-tickled: var(--surface-4);
128
- --item-bg-selected-tickled: color-mix(in oklch, var(--accent) 80%, oklch(0% 0 0));
129
- --item-text-tickled: var(--surface-4-text);
130
- --item-bg-selected: var(--accent);
131
- --item-text-selected: var(--accent-text);
132
- --item-label-font-style-default: normal;
133
- --item-label-font-style-selected: italic;
134
- --item-label-font-style-tickled: normal;
135
- --item-label-text-decoration-default: none;
136
- --item-label-text-decoration-selected: none;
137
- --item-label-text-decoration-tickled: underline;
138
- --item-label-text-underline-offset-default: auto;
139
- --item-label-text-underline-offset-tickled: 3px;
140
- }
88
+ :root.theme-light {
89
+ color-scheme: light;
90
+ }
91
+
92
+ :root.theme-dark {
93
+ color-scheme: dark;
141
94
  }
142
95
 
143
96
  ixfx-grouped-item-lister {
@@ -3,7 +3,7 @@ import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrA
3
3
  import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
4
4
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
5
5
  import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-C05WjbZh.js";
6
- import { t as ListNativeDragController } from "./list-native-drag-controller-B0hWdbtM.js";
6
+ import { t as ListNativeDragController } from "./list-native-drag-controller-B9xO0XWn.js";
7
7
  import { n as animateListItemIn, r as animateListItemOut } from "./list-item-animation-BUoEKi5s.js";
8
8
  import "./interaction-BskmlA9t.js";
9
9
  import { t as collectDataResult } from "./data-provider-35TyWclX.js";
@@ -1190,6 +1190,7 @@ let TreeBaseElement = class TreeBaseElement extends LitElement {
1190
1190
  },
1191
1191
  getMetrics: () => ({ rowHeight: this.#getItemHeight() }),
1192
1192
  getRenderer: () => this.dragPreviewRenderer,
1193
+ getDragPreviewSourceResolver: () => this.dragPreviewSource,
1193
1194
  dispatch: (detail) => {
1194
1195
  const keys = detail.selected.map((e) => e.key);
1195
1196
  const nodes = detail.selected.map((e) => e.item);
@@ -2340,6 +2341,7 @@ __decorate([property({
2340
2341
  }
2341
2342
  })], TreeBaseElement.prototype, "reorderable", void 0);
2342
2343
  __decorate([property({ attribute: false })], TreeBaseElement.prototype, "dragPreviewRenderer", void 0);
2344
+ __decorate([property({ attribute: false })], TreeBaseElement.prototype, "dragPreviewSource", void 0);
2343
2345
  __decorate([property({ attribute: false })], TreeBaseElement.prototype, "canDrag", void 0);
2344
2346
  __decorate([property({ attribute: false })], TreeBaseElement.prototype, "canDrop", void 0);
2345
2347
  __decorate([property({ attribute: false })], TreeBaseElement.prototype, "parseExternalDrop", void 0);
@@ -2630,4 +2632,4 @@ var TreeController = class {
2630
2632
  //#endregion
2631
2633
  export { TreeDataModel as a, pruneDraggedDescendants as c, TreeDropController as i, TreeListElement as n, applyTreeDrop as o, TreeBaseElement as r, dropTargetFor as s, TreeController as t };
2632
2634
 
2633
- //# sourceMappingURL=tree-CVj7TIk2.js.map
2635
+ //# sourceMappingURL=tree-BuzWn18_.js.map