@ixfx/components 0.10.7 → 0.10.8
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.d.ts +403 -1
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +1459 -158
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +1 -1
- package/dist/{ac-token-TCLAZeVg.d.ts → ac-token--_vCHXWw.d.ts} +2 -2
- package/dist/{ac-token-TCLAZeVg.d.ts.map → ac-token--_vCHXWw.d.ts.map} +1 -1
- package/dist/ac-token.d.ts +1 -1
- package/dist/{button-CTL45aBl.d.ts → button-BYuf72aR.d.ts} +2 -2
- package/dist/{button-CTL45aBl.d.ts.map → button-BYuf72aR.d.ts.map} +1 -1
- package/dist/button.d.ts +1 -1
- package/dist/colour-picker.d.ts +1 -1
- package/dist/crumbs.d.ts +3 -3
- package/dist/{data-grid-BDNjQv3Q.d.ts → data-grid-3yIylIH-.d.ts} +5 -5
- package/dist/{data-grid-BDNjQv3Q.d.ts.map → data-grid-3yIylIH-.d.ts.map} +1 -1
- package/dist/data-grid.d.ts +2 -2
- package/dist/{detail-list-BdLuOwQj.d.ts → detail-list-ccWFyhEc.d.ts} +5 -5
- package/dist/{detail-list-BdLuOwQj.d.ts.map → detail-list-ccWFyhEc.d.ts.map} +1 -1
- package/dist/detail-list.d.ts +3 -3
- package/dist/{grid-list-DyphX9Fv.d.ts → grid-list-BnOVgtLI.d.ts} +4 -4
- package/dist/{grid-list-DyphX9Fv.d.ts.map → grid-list-BnOVgtLI.d.ts.map} +1 -1
- package/dist/grid-list.d.ts +2 -2
- package/dist/{grouped-item-lister-Bhyo-dkH.d.ts → grouped-item-lister-DETte0Dh.d.ts} +2 -2
- package/dist/{grouped-item-lister-Bhyo-dkH.d.ts.map → grouped-item-lister-DETte0Dh.d.ts.map} +1 -1
- package/dist/grouped-item-lister.d.ts +1 -1
- package/dist/{icon-DR_3rSyZ.d.ts → icon-CDGprSdE.d.ts} +2 -2
- package/dist/icon-CDGprSdE.d.ts.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/incr-search.d.ts +1 -1
- package/dist/{index-BXafRK-_.d.ts → index-5-cwYpmx.d.ts} +4 -4
- package/dist/{index-BXafRK-_.d.ts.map → index-5-cwYpmx.d.ts.map} +1 -1
- package/dist/{index-garxxqgV.d.ts → index-CYndvTWH.d.ts} +2 -2
- package/dist/{index-garxxqgV.d.ts.map → index-CYndvTWH.d.ts.map} +1 -1
- package/dist/{index-BUB5SICW.d.ts → index-CoqtMSd9.d.ts} +2 -2
- package/dist/{index-BUB5SICW.d.ts.map → index-CoqtMSd9.d.ts.map} +1 -1
- package/dist/{index-C59-JEPl.d.ts → index-RImMNo0r.d.ts} +4 -4
- package/dist/{index-C59-JEPl.d.ts.map → index-RImMNo0r.d.ts.map} +1 -1
- package/dist/{index-CJ5fshD3.d.ts → index-UvnoZUAo.d.ts} +2 -2
- package/dist/{index-CJ5fshD3.d.ts.map → index-UvnoZUAo.d.ts.map} +1 -1
- package/dist/{index-BOUaDIW-.d.ts → index-tq6f8007.d.ts} +2 -2
- package/dist/{index-BOUaDIW-.d.ts.map → index-tq6f8007.d.ts.map} +1 -1
- package/dist/index.d.ts +417 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1299 -40
- package/dist/index.js.map +1 -1
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -2
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts.map → labelled-input-base-DiTme1JO.d.ts.map} +1 -1
- package/dist/labelled-radial-input.d.ts +2 -2
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-slider-input.d.ts +1 -1
- package/dist/{list-native-drag-controller-BAuWAtyQ.d.ts → list-native-drag-controller-B9reY4uM.d.ts} +2 -2
- package/dist/{list-native-drag-controller-BAuWAtyQ.d.ts.map → list-native-drag-controller-B9reY4uM.d.ts.map} +1 -1
- package/dist/{menu-item-ZmkXNjek.d.ts → menu-item-CZi9vy5O.d.ts} +2 -2
- package/dist/{menu-item-ZmkXNjek.d.ts.map → menu-item-CZi9vy5O.d.ts.map} +1 -1
- package/dist/menu.d.ts +2 -2
- package/dist/miller.d.ts +3 -3
- package/dist/panel.d.ts +1 -1
- package/dist/{split-layout-BJEU1W0d.js → split-layout-CXotkdbx.js} +46 -4
- package/dist/split-layout-CXotkdbx.js.map +1 -0
- package/dist/{split-layout-C5SYbDrq.d.ts → split-layout-JK3xWVX2.d.ts} +2 -2
- package/dist/{split-layout-C5SYbDrq.d.ts.map → split-layout-JK3xWVX2.d.ts.map} +1 -1
- package/dist/split-layout.d.ts +1 -1
- package/dist/split-layout.js +1 -1
- package/dist/{tab-list-v8mKX7Fu.d.ts → tab-list-pqfKaVAE.d.ts} +2 -2
- package/dist/{tab-list-v8mKX7Fu.d.ts.map → tab-list-pqfKaVAE.d.ts.map} +1 -1
- package/dist/tabs.d.ts +1 -1
- package/dist/{titlebar-B5zSTZnF.d.ts → titlebar-Tqu-VvMU.d.ts} +2 -2
- package/dist/{titlebar-B5zSTZnF.d.ts.map → titlebar-Tqu-VvMU.d.ts.map} +1 -1
- package/dist/titlebar.d.ts +1 -1
- package/dist/{tree-component-DGmKBbpy.d.ts → tree-component-CMGeqyjZ.d.ts} +2 -2
- package/dist/{tree-component-DGmKBbpy.d.ts.map → tree-component-CMGeqyjZ.d.ts.map} +1 -1
- package/dist/tree.d.ts +4 -4
- package/dist/{types-Bc23SI94.d.ts → types-3Jfcaxvo.d.ts} +8 -1
- package/dist/types-3Jfcaxvo.d.ts.map +1 -0
- package/dist/{vertical-list-C03PN6lx.d.ts → vertical-list-9dJ1R1hU.d.ts} +3 -3
- package/dist/{vertical-list-C03PN6lx.d.ts.map → vertical-list-9dJ1R1hU.d.ts.map} +1 -1
- package/dist/vertical-list.d.ts +2 -2
- package/docs-user/README.md +1 -0
- package/docs-user/data-grid.md +11 -2
- package/docs-user/hyperbolic-tree.md +282 -0
- package/docs-user/index.json +7 -2
- package/docs-user/llms.txt +1 -0
- package/docs-user/tree.md +1 -0
- package/llms.txt +1 -0
- package/package.json +1 -1
- package/dist/icon-DR_3rSyZ.d.ts.map +0 -1
- package/dist/split-layout-BJEU1W0d.js.map +0 -1
- package/dist/types-Bc23SI94.d.ts.map +0 -1
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# Hyperbolic Tree
|
|
2
|
+
|
|
3
|
+
`<ixfx-hyperbolictree-list>` — a hyperbolic (Poincaré disk) browser over tree data. The focused node sits at the disk's center; its neighbourhood fans outward, shrinking toward the edge with tree-graph distance. Clicking a node re-centers the disk on it with an animated Möbius transform — the underlying layout never changes, only the projection.
|
|
4
|
+
|
|
5
|
+
It implements the shared `TreeComponent` interface (see [`src/tree/README.md`](../tree/README.md)), so `TreeDataModel`, `IncrSearchTreeController`, and any `TreeComponent`-typed code work unmodified.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Contents
|
|
10
|
+
|
|
11
|
+
1. [Differences from `ixfx-tree-list`](#differences-from-ixfx-tree-list)
|
|
12
|
+
2. [Data model](#data-model)
|
|
13
|
+
3. [Properties](#properties)
|
|
14
|
+
4. [Zoom vs. curvature](#zoom-vs-curvature)
|
|
15
|
+
5. [Weighting](#weighting)
|
|
16
|
+
6. [Targeting a specific node or edge](#targeting-a-specific-node-or-edge)
|
|
17
|
+
7. [Custom edge rendering](#custom-edge-rendering)
|
|
18
|
+
8. [Focus, selection, navigation](#focus-selection-navigation)
|
|
19
|
+
9. [Events](#events)
|
|
20
|
+
10. [Keyboard / pointer interaction](#keyboard--pointer-interaction)
|
|
21
|
+
11. [CSS variables and parts](#css-variables-and-parts)
|
|
22
|
+
12. [Types reference](#types-reference)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Differences from `ixfx-tree-list`
|
|
27
|
+
|
|
28
|
+
- **Expand/collapse is reinterpreted as focus change.** Every loaded node is always laid out; there's no expanded/collapsed state. `expand`/`collapse` still fire — when the new focus is a descendant/ancestor of the previous one — for interop with existing `TreeComponent` listeners.
|
|
29
|
+
- **`interactionMode` drops `'checked'`** — no checkbox affordance at disk-edge node scale.
|
|
30
|
+
- **`exclusivity` is accepted but ignored** — nothing is independently open.
|
|
31
|
+
- **`filterPredicate` dims** non-matching nodes instead of hiding them.
|
|
32
|
+
- Dragging empty disk space **pans** the view without changing focus or selection.
|
|
33
|
+
- Drag-and-drop and `checkboxRenderer` are out of scope.
|
|
34
|
+
|
|
35
|
+
## Data model
|
|
36
|
+
|
|
37
|
+
Same `TreeNode` / `TreeItem` shapes as the rest of the tree family (see [`src/tree/README.md`](../tree/README.md#data-model)), including `root`, `model` (`TreeDataModel`), and `loadChildren` for lazy loading.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
el.root = {
|
|
41
|
+
item: { key: 'root', label: 'My Files' },
|
|
42
|
+
children: [
|
|
43
|
+
{ item: { key: 'docs', label: 'Documents' }, children: [] },
|
|
44
|
+
{ item: { key: 'img', label: 'Images', isLeaf: true } },
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Properties
|
|
50
|
+
|
|
51
|
+
| Property (attribute) | Type | Default | Description |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| `root` | `TreeNode \| undefined` | `undefined` | Root node of the tree |
|
|
54
|
+
| `model` | `TreeDataModel \| undefined` | `undefined` | Shared data model; takes precedence over `loadChildren` |
|
|
55
|
+
| `loadChildren` | `LoadChildrenCallback \| undefined` | `undefined` | Callback for lazy child loading |
|
|
56
|
+
| `interactionMode` (`interaction-mode`) | `'implicit' \| 'standard' \| 'manual'` | `'standard'` | Gesture mapping — see [`src/tree/README.md`](../tree/README.md#interactionmode-ixfx-tree-list--ixfx-miller-list) (`'checked'` is unsupported here) |
|
|
57
|
+
| `selectionFilter` (`selection-filter`) | `'none' \| 'leaf' \| 'branch' \| 'all'` | `'all'` | Which node kinds can be selected |
|
|
58
|
+
| `exclusivity` | `TreeExclusivity` | `'none'` | Accepted for interface compatibility, ignored |
|
|
59
|
+
| `filterPredicate` | `TreeFilterPredicate \| undefined` | `undefined` | Non-matching nodes (and branches with no matching descendant) are dimmed, not hidden |
|
|
60
|
+
| `maxRadius` (`max-radius`) | `number` | `4` | Tree-graph steps from the focus to lay out and render |
|
|
61
|
+
| `nodeRadius` (`node-radius`) | `number` | `0.05` | Base node dot radius, as a fraction of the disk radius |
|
|
62
|
+
| `minNodeRadius` (`min-node-radius`) | `number` | `0.015` | Nodes whose scaled radius falls below this render without a label |
|
|
63
|
+
| `minWeightScale` (`min-weight-scale`) | `number` | `0.6` | Radius multiplier for a node with `weight` at the low end of the currently-visible range |
|
|
64
|
+
| `maxWeightScale` (`max-weight-scale`) | `number` | `1.6` | Radius multiplier for a node with `weight` at the high end of the currently-visible range |
|
|
65
|
+
| `zoom` | `number` | `1` | Post-layout SVG magnification, centered on the focus. See [Zoom vs. curvature](#zoom-vs-curvature) |
|
|
66
|
+
| `curvature` | `number` | `1` | Hyperbolic distance placed between generations — how curved the space itself is. See [Zoom vs. curvature](#zoom-vs-curvature) |
|
|
67
|
+
| `focusAnimationDuration` (`focus-animation-duration`) | `number` | `400` | Duration (ms) of the animated re-center on focus change; `0` snaps instantly. Respects `prefers-reduced-motion` |
|
|
68
|
+
| `edgeRenderer` | `HyperbolicEdgeRenderer \| undefined` | `undefined` | Custom renderer for edges, in place of the default geodesic-arc path |
|
|
69
|
+
| `disableKeyboardNavigation` (`disable-keyboard-navigation`) | `boolean` | `false` | Disables the keyboard handlers below |
|
|
70
|
+
| `searchModes` (`search-modes`) | `string \| undefined` | `undefined` | Space-separated subset of `navigate select filter` — see [`src/tree/README.md`](../tree/README.md#incremental-search) |
|
|
71
|
+
| `selectedNode` | `TreeNode \| undefined` | `undefined` | Primary (most recent) selected node |
|
|
72
|
+
| `selectedNodes` | `ReadonlySet<TreeNode>` | `{}` | Full selection set (read-only) |
|
|
73
|
+
| `focusedNode` | `TreeNode \| undefined` (read-only) | true root | The node currently centered on the disk. Pure view-state — `root` is never mutated by focus changes |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Zoom vs. curvature
|
|
78
|
+
|
|
79
|
+
Two independent knobs affect how much of the tree is visible and how it's magnified — neither mutates `root`:
|
|
80
|
+
|
|
81
|
+
| | What it changes | Effect |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `zoom` | A post-layout SVG `scale()`, applied after everything else | Uniformly magnifies/shrinks the rendered disk around the focus. Node positions relative to each other are unchanged — it's a camera zoom, not a re-layout. |
|
|
84
|
+
| `curvature` | The hyperbolic distance placed between each generation (default `1`, matching the standard Poincaré-disk layout) | Raising it pushes each generation further out in hyperbolic terms, so the disk's own `tanh` compression crowds distant generations toward the boundary faster — a stronger fisheye. This *reshapes* the layout (relative sizes/spacing of near vs. far nodes change), which is why increasing it reads as "zooming in" on the focus even at `zoom: 1`. Lowering it spreads generations out more evenly, flattening the view toward a Euclidean-feeling layout. |
|
|
85
|
+
| `maxRadius` | How many tree-graph rings are laid out at all | Independent of both — a window over the tree, not a projection change. |
|
|
86
|
+
|
|
87
|
+
```html
|
|
88
|
+
<ixfx-hyperbolictree-list zoom="1.5" curvature="1.8"></ixfx-hyperbolictree-list>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Weighting
|
|
92
|
+
|
|
93
|
+
Set `TreeItem.weight` (a plain `number`, any range) on nodes to influence their visuals:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
el.root = {
|
|
97
|
+
item: { key: 'root', label: 'Root', weight: 10 },
|
|
98
|
+
children: [
|
|
99
|
+
{ item: { key: 'big', label: 'Big folder', weight: 8 } },
|
|
100
|
+
{ item: { key: 'small', label: 'Small file', weight: 1 } },
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Weight is normalized to `0..1` **against whichever nodes are currently visible** (the ring window `maxRadius` selects) — not the whole tree — and exposed as CSS custom properties:
|
|
106
|
+
|
|
107
|
+
| Custom property | Where | Value |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| `--node-weight` | Each node's `<g part="node">` | Normalized `0..1` (defaults to `0.5` if the node, or the whole visible set, has no weight) |
|
|
110
|
+
| `--node-weight-raw` | Each node's `<g part="node">` | The raw `item.weight` value, when set (otherwise unset) |
|
|
111
|
+
| `--edge-weight` | Each edge's `<path part="edge">` | Average of the two endpoint nodes' `--node-weight` |
|
|
112
|
+
|
|
113
|
+
By default this:
|
|
114
|
+
|
|
115
|
+
- Scales node radius between `minWeightScale`× and `maxWeightScale`× (default `0.6`–`1.6`).
|
|
116
|
+
- Tints node fill toward `--accent` as weight increases (`color-mix` on `--node-weight`).
|
|
117
|
+
- Thickens edge strokes as `--edge-weight` increases.
|
|
118
|
+
|
|
119
|
+
Override any of it with plain CSS — `::part(dot)`, `::part(edge)`, or the custom properties themselves:
|
|
120
|
+
|
|
121
|
+
```css
|
|
122
|
+
ixfx-hyperbolictree-list::part(dot) {
|
|
123
|
+
fill: color-mix(in oklch, gray, red calc(var(--node-weight, 0.5) * 100%));
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> **Gotcha:** because normalization is per-*visible-window*, a node whose weight is small relative to something merely nearby in the tree (e.g. a giant sibling subtree, or the root itself, both often in view) can still normalize close to `0` even if it's "big" in absolute terms. If your weight metric has a wide dynamic range (e.g. raw descendant counts across a deep tree), compress it — `Math.log2(x + 1)` rather than `x` — before assigning it to `item.weight`, or the visible spread of sizes/colours will collapse toward one end.
|
|
128
|
+
|
|
129
|
+
## Targeting a specific node or edge
|
|
130
|
+
|
|
131
|
+
Each node and edge exports extra `part` tokens keyed by node identity, so a single one can be styled from outside the shadow root:
|
|
132
|
+
|
|
133
|
+
| Element | Exported parts |
|
|
134
|
+
|---|---|
|
|
135
|
+
| Node `<g>` | `node`, `node-<key>` |
|
|
136
|
+
| Edge `<path>` | `edge`, `edge-to-<key>`, `edge-from-<key>` |
|
|
137
|
+
|
|
138
|
+
(Non-identifier characters in a key are replaced with `-` to keep the token CSS-selectable.)
|
|
139
|
+
|
|
140
|
+
```css
|
|
141
|
+
/* Give the edge leading to "library" a distinct dashed line. */
|
|
142
|
+
ixfx-hyperbolictree-list::part(edge-to-library) {
|
|
143
|
+
stroke: var(--accent);
|
|
144
|
+
stroke-dasharray: 8 4;
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
A plain attribute selector — `[data-to="library"]` — **cannot** reach across the shadow boundary from page-level CSS; only `::part()` can. Each edge does carry `data-from`/`data-to` attributes (and each node a `data-key` attribute), but those are for JS introspection (`el.shadowRoot.querySelectorAll(...)`), not CSS.
|
|
149
|
+
|
|
150
|
+
## Custom edge rendering
|
|
151
|
+
|
|
152
|
+
For styling `::part()`/CSS can't express (arbitrary shapes, gradients per edge, etc.), replace the default geodesic-arc path entirely:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { svg } from 'lit';
|
|
156
|
+
import type { HyperbolicEdgeRenderContext } from '@ixfx/components';
|
|
157
|
+
|
|
158
|
+
el.edgeRenderer = ({ edge, fromNode, toNode }: HyperbolicEdgeRenderContext) => {
|
|
159
|
+
// Authored against the layout's native -1..1 disk coordinates —
|
|
160
|
+
// the component scales this up to match its internal render scale.
|
|
161
|
+
return svg`<line x1=${edge.from.x} y1=${edge.from.y} x2=${edge.to.x} y2=${edge.to.y} stroke="red" />`;
|
|
162
|
+
};
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
`edge.weightNormalized` is available on `edge` for weight-driven custom rendering.
|
|
166
|
+
|
|
167
|
+
## Focus, selection, navigation
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
// Re-center the disk on a node (animated Möbius transform; fires `focus`, plus
|
|
171
|
+
// `expand`/`collapse` when relevant)
|
|
172
|
+
el.focusOn(node);
|
|
173
|
+
|
|
174
|
+
// Selection — same contract as ixfx-tree-list
|
|
175
|
+
el.select(node);
|
|
176
|
+
el.deselect(node);
|
|
177
|
+
el.clearSelection();
|
|
178
|
+
el.selectAll();
|
|
179
|
+
el.deselectAll();
|
|
180
|
+
|
|
181
|
+
// Navigate by key path or predicate — focuses + selects the match
|
|
182
|
+
el.navigateTo(['root', 'documents', 'readme.md']);
|
|
183
|
+
el.navigateToNode(n => n.item.key === 'readme.md');
|
|
184
|
+
|
|
185
|
+
// Snapshot of every currently laid-out node (within maxRadius of the focus),
|
|
186
|
+
// including the focused node itself, in ring-major order
|
|
187
|
+
const nodes = el.getNodes(); // ReadonlyArray<{ node: TreeNode; depth: number }>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Events
|
|
191
|
+
|
|
192
|
+
All events **bubble** and are **composed**.
|
|
193
|
+
|
|
194
|
+
| Event | Detail type | When fired |
|
|
195
|
+
|---|---|---|
|
|
196
|
+
| `focus` | `HyperbolicFocusDetail` — `{ node: TreeNode; previous: TreeNode \| undefined }` | The focused (centered) node changes |
|
|
197
|
+
| `select` | `TreeSelectDetail` | Selection set changes |
|
|
198
|
+
| `tickle` | `TreeTickleDetail` | An item enters cursor focus (pointer hover or keyboard cursor) |
|
|
199
|
+
| `activate` | `TreeActivateDetail` | Enter key or double-click |
|
|
200
|
+
| `item-click` | `{ node: TreeNode; depth: number }` | Raw pointer click on any item |
|
|
201
|
+
| `item-dblclick` | `TreeItemDblClickDetail` | Double-click (also fires `activate`) |
|
|
202
|
+
| `expand` | `{ node: TreeNode; depth: number }` | New focus is a descendant of the previous one |
|
|
203
|
+
| `collapse` | `{ node: TreeNode; depth: number }` | New focus is an ancestor of the previous one |
|
|
204
|
+
|
|
205
|
+
## Keyboard / pointer interaction
|
|
206
|
+
|
|
207
|
+
The element must be focused before keyboard navigation works (`disableKeyboardNavigation` turns it off entirely).
|
|
208
|
+
|
|
209
|
+
| Key | Action |
|
|
210
|
+
|---|---|
|
|
211
|
+
| `Arrow Up` | Focus the child closest to screen-"up" |
|
|
212
|
+
| `Arrow Down` | Focus the parent |
|
|
213
|
+
| `Arrow Left` / `Arrow Right` | Cycle siblings of the focused node |
|
|
214
|
+
| `Enter` | Select (unless `interactionMode="manual"`) and activate the focused node |
|
|
215
|
+
| `Escape` | Return focus to the root |
|
|
216
|
+
|
|
217
|
+
Pointer: click a node to focus (and select, per `interactionMode`) it; drag empty disk space to pan.
|
|
218
|
+
|
|
219
|
+
## CSS variables and parts
|
|
220
|
+
|
|
221
|
+
| Variable | Default | Description |
|
|
222
|
+
|---|---|---|
|
|
223
|
+
| `--hyperbolictree-node-color` | `var(--surface-4)` | Base node fill |
|
|
224
|
+
| `--hyperbolictree-node-text` | `var(--surface-3-text)` | Label text colour |
|
|
225
|
+
| `--hyperbolictree-edge-color` | `var(--surface-6)` | Edge stroke colour |
|
|
226
|
+
| `--hyperbolictree-boundary-color` | `var(--border-subtle)` | Disk boundary stroke colour |
|
|
227
|
+
| `--hyperbolictree-font-size` | `25px` | Label font size |
|
|
228
|
+
| `--node-weight` / `--node-weight-raw` | — | See [Weighting](#weighting) |
|
|
229
|
+
| `--edge-weight` | — | See [Weighting](#weighting) |
|
|
230
|
+
|
|
231
|
+
| Part | Element | Notes |
|
|
232
|
+
|---|---|---|
|
|
233
|
+
| `boundary` | Disk-edge circle | |
|
|
234
|
+
| `edges` / `nodes` | Group wrappers | |
|
|
235
|
+
| `edge`, `edge-to-<key>`, `edge-from-<key>` | Each edge `<path>` | See [Targeting a specific node or edge](#targeting-a-specific-node-or-edge) |
|
|
236
|
+
| `node`, `node-<key>` | Each node `<g>` | |
|
|
237
|
+
| `hit` | Invisible larger hit-target circle per node | |
|
|
238
|
+
| `dot` | The visible node circle | |
|
|
239
|
+
| `label` | Node label `<text>` | |
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Types reference
|
|
244
|
+
|
|
245
|
+
```typescript
|
|
246
|
+
type HyperbolicInteractionMode = 'implicit' | 'standard' | 'manual';
|
|
247
|
+
|
|
248
|
+
type HyperbolicFocusDetail = {
|
|
249
|
+
readonly node: TreeNode;
|
|
250
|
+
readonly previous: TreeNode | undefined;
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
type HyperbolicEdgeRenderContext = {
|
|
254
|
+
readonly edge: HyperbolicLayoutEdge;
|
|
255
|
+
readonly fromNode: TreeNode;
|
|
256
|
+
readonly toNode: TreeNode;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
type HyperbolicEdgeRenderer = (context: HyperbolicEdgeRenderContext) => unknown;
|
|
260
|
+
|
|
261
|
+
type HyperbolicLayoutNode = {
|
|
262
|
+
readonly node: TreeNode;
|
|
263
|
+
readonly key: string;
|
|
264
|
+
readonly depth: number; // absolute depth from the true root
|
|
265
|
+
readonly ring: number; // tree-graph steps from the focus (0 = focus itself)
|
|
266
|
+
readonly parentKey: string | undefined;
|
|
267
|
+
readonly position: Point; // Poincaré-disk position, focus projected to the origin
|
|
268
|
+
readonly angularShare: number; // angular width (radians) allocated by the parent's partition
|
|
269
|
+
readonly weight: number | undefined;
|
|
270
|
+
readonly weightNormalized: number; // 0..1, normalized across the visible node set
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
type HyperbolicLayoutEdge = {
|
|
274
|
+
readonly fromKey: string;
|
|
275
|
+
readonly toKey: string;
|
|
276
|
+
readonly from: Point;
|
|
277
|
+
readonly to: Point;
|
|
278
|
+
readonly weightNormalized: number; // average of the two endpoints'
|
|
279
|
+
};
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
See [`src/tree/README.md`](../tree/README.md) for `TreeNode`, `TreeItem` (including `weight`), `TreeDataModel`, `TreeComponent`, and incremental search — all shared with the rest of the tree family.
|
package/docs-user/index.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ixfx/components",
|
|
3
|
-
"version": "0.10.
|
|
4
|
-
"generated": "2026-09-
|
|
3
|
+
"version": "0.10.8",
|
|
4
|
+
"generated": "2026-09-19T11:43:01.268Z",
|
|
5
5
|
"components": [
|
|
6
6
|
{
|
|
7
7
|
"name": "ac-text",
|
|
@@ -83,6 +83,11 @@
|
|
|
83
83
|
"summary": "A meta-component that renders a typed item list using any sub-component you supply. Items can be displayed in a single sub-component (_ungrouped_ mode) or split into labelled groups, each with its own",
|
|
84
84
|
"path": "docs-user/grouped-item-lister.md"
|
|
85
85
|
},
|
|
86
|
+
{
|
|
87
|
+
"name": "hyperbolic-tree",
|
|
88
|
+
"summary": "`<ixfx-hyperbolictree-list>` — a hyperbolic (Poincaré disk) browser over tree data. The focused node sits at the disk's center; its neighbourhood fans outward, shrinking toward the edge with tree-grap",
|
|
89
|
+
"path": "docs-user/hyperbolic-tree.md"
|
|
90
|
+
},
|
|
86
91
|
{
|
|
87
92
|
"name": "icons",
|
|
88
93
|
"summary": "A centralized SVG icon system for `@ixfx/components`. Icons are stored by name, can be overridden globally, and all components that use a given icon re-render automatically when it changes.",
|
package/docs-user/llms.txt
CHANGED
|
@@ -27,6 +27,7 @@ import '@ixfx/components/data-grid';
|
|
|
27
27
|
- [form](docs-user/form.md): Primitives for typical form layout with responsive label positioning and data binding.
|
|
28
28
|
- [grid-list](docs-user/grid-list.md): A virtualised grid of items — thumbnails, cards, or arbitrary slotted markup —
|
|
29
29
|
- [grouped-item-lister](docs-user/grouped-item-lister.md): A meta-component that renders a typed item list using any sub-component you supply. Items can be displayed in a single sub-component (_ungrouped_ mode) or split into labelled groups, each with its own
|
|
30
|
+
- [hyperbolic-tree](docs-user/hyperbolic-tree.md): `<ixfx-hyperbolictree-list>` — a hyperbolic (Poincaré disk) browser over tree data. The focused node sits at the disk's center; its neighbourhood fans outward, shrinking toward the edge with tree-grap
|
|
30
31
|
- [icons](docs-user/icons.md): A centralized SVG icon system for `@ixfx/components`. Icons are stored by name, can be overridden globally, and all components that use a given icon re-render automatically when it changes.
|
|
31
32
|
- [incr-search](docs-user/incr-search.md): Utilities for incremental (type-ahead) search over data collections or DOM-backed lists.
|
|
32
33
|
- [labelled-radial-input](docs-user/labelled-radial-input.md): A composite radial input that pairs an editable label (`ixfx-editable-number`) with a rotary dial (`ixfx-radial-input`). The two controls are always in sync — turning the dial updates the number, and
|
package/docs-user/tree.md
CHANGED
|
@@ -34,6 +34,7 @@ type TreeItem = {
|
|
|
34
34
|
icon?: string; // Icon name (passed to <ixfx-icon>)
|
|
35
35
|
tooltip?: string; // Tooltip content
|
|
36
36
|
value?: string; // Optional machine-readable value
|
|
37
|
+
weight?: number; // Relative importance/magnitude; only ixfx-hyperbolictree-list uses it today
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
type TreeNode = {
|
package/llms.txt
CHANGED
|
@@ -27,6 +27,7 @@ import '@ixfx/components/data-grid';
|
|
|
27
27
|
- [form](docs-user/form.md): Primitives for typical form layout with responsive label positioning and data binding.
|
|
28
28
|
- [grid-list](docs-user/grid-list.md): A virtualised grid of items — thumbnails, cards, or arbitrary slotted markup —
|
|
29
29
|
- [grouped-item-lister](docs-user/grouped-item-lister.md): A meta-component that renders a typed item list using any sub-component you supply. Items can be displayed in a single sub-component (_ungrouped_ mode) or split into labelled groups, each with its own
|
|
30
|
+
- [hyperbolic-tree](docs-user/hyperbolic-tree.md): `<ixfx-hyperbolictree-list>` — a hyperbolic (Poincaré disk) browser over tree data. The focused node sits at the disk's center; its neighbourhood fans outward, shrinking toward the edge with tree-grap
|
|
30
31
|
- [icons](docs-user/icons.md): A centralized SVG icon system for `@ixfx/components`. Icons are stored by name, can be overridden globally, and all components that use a given icon re-render automatically when it changes.
|
|
31
32
|
- [incr-search](docs-user/incr-search.md): Utilities for incremental (type-ahead) search over data collections or DOM-backed lists.
|
|
32
33
|
- [labelled-radial-input](docs-user/labelled-radial-input.md): A composite radial input that pairs an editable label (`ixfx-editable-number`) with a rotary dial (`ixfx-radial-input`). The two controls are always in sync — turning the dial updates the number, and
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icon-DR_3rSyZ.d.ts","names":[],"sources":["../src/icons/icon.ts"],"mappings":";;cAUa,wBAAwB;;EACvB;EACgB;EAChB;EAC0C;EACU;EAevD;EAMA;YAMU,wBAAM,2BAAA;YA4BN,QAAQ,SAAS;SAoBpB,sBAAM;;QAiDhB;YACI;IACR,aAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"split-layout-BJEU1W0d.js","names":["customElement","customElement"],"sources":["../src/split-layout/split-drag.ts","../src/split-layout/split-model.ts","../src/split-layout/split-panel.ts","../src/split-layout/split-layout.ts"],"sourcesContent":["import type { DistributeResult } from './split-model.js';\n\nexport interface DragState {\n isDragging: boolean;\n groupId: string;\n gutterIndex: number;\n startPointerX: number;\n startPointerY: number;\n containerRect: DOMRect;\n trackSizes: number[];\n minConstraints: number[];\n maxConstraints: Array<number | null>;\n fixedConstraints: Array<number | null>;\n whenSmallConstraints: string[];\n}\n\nexport interface DragHandlers {\n onDragStart: (state: DragState) => void;\n onDragMove: (state: DragState, deltaX: number, deltaY: number) => void;\n onDragEnd: (state: DragState) => void;\n distribute: (\n sizesPx: number[],\n gutterIndex: number,\n deltaPx: number,\n constraints: Array<{ minPx: number; maxPx: number | null; fixedPx: number | null; whenSmall: string }>,\n ) => DistributeResult;\n}\n\nexport function createDragMachine(handlers: DragHandlers) {\n let state: DragState | null = null;\n let rafId: number | null = null;\n let pendingMove: { deltaX: number; deltaY: number } | null = null;\n\n function startGutterDrag(\n groupId: string,\n gutterIndex: number,\n _pointerId: number,\n clientX: number,\n clientY: number,\n containerRect: DOMRect,\n trackSizes: number[],\n constraints: Array<{ minPx: number; maxPx: number | null; fixedPx: number | null; whenSmall: string }>,\n ) {\n state = {\n isDragging: true,\n groupId,\n gutterIndex,\n startPointerX: clientX,\n startPointerY: clientY,\n containerRect,\n trackSizes,\n minConstraints: constraints.map(c => c.minPx),\n maxConstraints: constraints.map(c => c.maxPx),\n fixedConstraints: constraints.map(c => c.fixedPx),\n whenSmallConstraints: constraints.map(c => c.whenSmall),\n };\n\n handlers.onDragStart(state);\n }\n\n function move(pointerEvent: PointerEvent) {\n if (!state || !state.isDragging)\n return;\n\n const deltaX = pointerEvent.clientX - state.startPointerX;\n const deltaY = pointerEvent.clientY - state.startPointerY;\n\n pendingMove = { deltaX, deltaY };\n\n if (rafId === null) {\n rafId = requestAnimationFrame(flushMove);\n }\n }\n\n function flushMove() {\n if (!state || !pendingMove) {\n rafId = null;\n return;\n }\n\n const { deltaX, deltaY } = pendingMove;\n pendingMove = null;\n rafId = null;\n\n handlers.onDragMove(state, deltaX, deltaY);\n }\n\n function end(_pointerEvent: PointerEvent) {\n if (!state || !state.isDragging)\n return;\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n pendingMove = null;\n handlers.onDragEnd(state);\n state = null;\n }\n\n return {\n startGutterDrag,\n move,\n end,\n getState: () => state,\n };\n}\n","import type {\n Axis,\n GroupNode,\n LayoutNode,\n LayoutSnapshot,\n PanelNode,\n SnapshotNode,\n WhenSmall,\n} from './types.js';\n\nlet panelIdCounter = 0;\nlet groupIdCounter = 0;\n\nfunction generatePanelId(): string {\n return `p-${++panelIdCounter}`;\n}\n\nfunction generateGroupId(): string {\n return `g-${++groupIdCounter}`;\n}\n\nfunction resetIdCounters(): void {\n panelIdCounter = 0;\n groupIdCounter = 0;\n}\n\n// A child's own `size`/`weight` attribute takes precedence over the parent's\n// positional `sizes` list. Both are read so hand-authored markup can use\n// either form.\nfunction readOwnWeight(el: HTMLElement): number | undefined {\n const attr = el.getAttribute(`size`) ?? el.getAttribute(`weight`);\n if (attr === null)\n return undefined;\n const value = Number.parseFloat(attr);\n return Number.isNaN(value) ? undefined : value;\n}\n\nexport function buildModel(rootEl: HTMLElement): GroupNode {\n resetIdCounters();\n return buildGroupFromElement(rootEl, null);\n}\n\nfunction buildGroupFromElement(el: HTMLElement, _parentAxis: Axis | null): GroupNode {\n const isNestedLayout = el.tagName === `IXFX-SPLIT-LAYOUT`;\n const directionAttr = el.getAttribute(`direction`);\n const axis: Axis = directionAttr === `column` ? `column` : `row`;\n\n const group: GroupNode = {\n kind: `group`,\n id: el.id || generateGroupId(),\n el: isNestedLayout ? el : null,\n axis,\n children: [],\n weight: readOwnWeight(el) ?? 1,\n fixedPx: null,\n };\n\n const sizesAttr = el.getAttribute(`sizes`);\n const sizes = sizesAttr ? sizesAttr.split(/\\s+/).map(s => Number.parseFloat(s)).filter(n => !Number.isNaN(n)) : [];\n\n const childNodes = Array.from(el.children);\n let sizeIndex = 0;\n\n for (const child of childNodes) {\n // Every child consumes a positional size; a child's own `size`/`weight`\n // attribute (read inside each builder) takes precedence over it.\n const positional = sizeIndex < sizes.length ? sizes[sizeIndex] : undefined;\n sizeIndex++;\n if (child.tagName === `IXFX-SPLIT-LAYOUT`) {\n group.children.push(buildGroupFromElement(child as HTMLElement, axis));\n } else if (child.tagName === `IXFX-SPLIT-PANEL`) {\n group.children.push(buildPanelNode(child as HTMLElement, positional));\n } else {\n const wrapper = createImplicitPanel(child as HTMLElement, positional);\n group.children.push(wrapper);\n }\n }\n\n if (group.children.length === 0) {\n const implicitPanel = createImplicitPanelWithoutId();\n group.children.push(implicitPanel);\n }\n\n return group;\n}\n\nfunction createImplicitPanel(el: HTMLElement, size?: number): PanelNode {\n const minAttr = el.getAttribute(`min`);\n const maxAttr = el.getAttribute(`max`);\n const whenSmallAttr = el.getAttribute(`when-small`) as WhenSmall | null;\n const fixedAttr = el.getAttribute(`fixed`);\n const collapsedAttr = el.hasAttribute(`collapsed`);\n\n let minPx = 0;\n if (minAttr) {\n minPx = parseLength(minAttr, 0);\n }\n\n let maxPx: number | null = null;\n if (maxAttr) {\n maxPx = parseLength(maxAttr, 0);\n }\n\n let fixedPx: number | null = null;\n if (fixedAttr) {\n fixedPx = fixedAttr === `` ? 100 : parseLength(fixedAttr, 100);\n }\n\n const weight = readOwnWeight(el) ?? size ?? 1;\n\n return {\n kind: `panel`,\n id: el.id || generatePanelId(),\n el,\n weight,\n fixedPx,\n minPx,\n maxPx,\n whenSmall: whenSmallAttr || `prevent`,\n collapsed: collapsedAttr,\n restoreWeight: weight,\n };\n}\n\nfunction createImplicitPanelWithoutId(size?: number): PanelNode {\n return {\n kind: `panel`,\n id: generatePanelId(),\n el: document.createElement(`div`),\n weight: size ?? 1,\n fixedPx: null,\n minPx: 0,\n maxPx: null,\n whenSmall: `prevent`,\n collapsed: false,\n restoreWeight: size ?? 1,\n };\n}\n\nfunction buildPanelNode(el: HTMLElement, size?: number): PanelNode {\n const sizeAttr = el.getAttribute(`size`) || el.getAttribute(`weight`);\n const minAttr = el.getAttribute(`min`);\n const maxAttr = el.getAttribute(`max`);\n const whenSmallAttr = el.getAttribute(`when-small`) as WhenSmall | null;\n const fixedAttr = el.getAttribute(`fixed`);\n const collapsedAttr = el.hasAttribute(`collapsed`);\n\n let weight = size ?? 1;\n if (sizeAttr) {\n weight = Number.parseFloat(sizeAttr);\n }\n\n let minPx = 0;\n if (minAttr) {\n minPx = parseLength(minAttr, 0);\n }\n\n let maxPx: number | null = null;\n if (maxAttr) {\n maxPx = parseLength(maxAttr, 0);\n }\n\n let fixedPx: number | null = null;\n if (fixedAttr) {\n fixedPx = fixedAttr === `` ? 100 : parseLength(fixedAttr, 100);\n }\n\n return {\n kind: `panel`,\n id: el.id || generatePanelId(),\n el,\n weight,\n fixedPx,\n minPx,\n maxPx,\n whenSmall: whenSmallAttr || `prevent`,\n collapsed: collapsedAttr,\n restoreWeight: weight,\n };\n}\n\nfunction parseLength(value: string, fallback: number): number {\n if (value.endsWith(`px`)) {\n return Number.parseFloat(value.replace(`px`, ``));\n }\n if (value.endsWith(`%`)) {\n return fallback;\n }\n const num = Number.parseFloat(value);\n return Number.isNaN(num) ? fallback : num;\n}\n\nexport function normalise(group: GroupNode): GroupNode {\n const flexibleWeights: number[] = [];\n let totalFlexibleWeight = 0;\n\n for (const child of group.children) {\n if (child.kind === `panel`) {\n if (child.fixedPx !== null) {\n // fixed-size panels sit outside the weighted flow\n } else if (!child.collapsed) {\n flexibleWeights.push(child.weight);\n totalFlexibleWeight += child.weight;\n }\n } else {\n flexibleWeights.push(child.weight);\n totalFlexibleWeight += child.weight;\n }\n }\n\n if (totalFlexibleWeight === 0) {\n totalFlexibleWeight = 1;\n }\n\n const normalizedChildren: LayoutNode[] = [];\n for (let i = 0; i < group.children.length; i++) {\n const child = group.children[i];\n if (child.kind === `panel`) {\n if (child.fixedPx === null && !child.collapsed) {\n normalizedChildren.push({\n ...child,\n weight: child.weight / totalFlexibleWeight,\n });\n } else {\n normalizedChildren.push(child);\n }\n } else {\n normalizedChildren.push({\n ...child,\n weight: child.weight / totalFlexibleWeight,\n });\n }\n }\n\n return {\n ...group,\n children: normalizedChildren,\n };\n}\n\nexport interface DistributeResult {\n sizesPx: number[];\n belowMin: number[];\n}\n\nexport function distribute(\n sizesPx: number[],\n gutterIndex: number,\n deltaPx: number,\n constraints: Array<{ minPx: number; maxPx: number | null; fixedPx: number | null; whenSmall: WhenSmall }>,\n): DistributeResult {\n const result = [...sizesPx];\n const belowMin: number[] = [];\n\n if (deltaPx === 0) {\n return { sizesPx: result, belowMin };\n }\n\n const growSide = deltaPx > 0 ? gutterIndex : gutterIndex + 1;\n const shrinkSide = deltaPx > 0 ? gutterIndex + 1 : gutterIndex;\n\n let remaining = Math.abs(deltaPx);\n\n for (let i = shrinkSide; i >= 0 && remaining > 0; i--) {\n const c = constraints[i];\n if (c.fixedPx !== null)\n continue;\n\n const currentSize = result[i];\n const room = currentSize - c.minPx;\n\n if (room > 0) {\n const take = Math.min(room, remaining);\n result[i] -= take;\n remaining -= take;\n if (c.whenSmall !== `prevent` && result[i] <= c.minPx && result[i] > 0) {\n belowMin.push(i);\n break;\n }\n } else if (c.whenSmall !== `prevent` && currentSize > 0) {\n const take = Math.min(currentSize, remaining);\n result[i] -= take;\n remaining -= take;\n if (result[i] <= c.minPx) {\n belowMin.push(i);\n break;\n }\n }\n }\n\n const actualMoved = Math.abs(deltaPx) - remaining;\n if (actualMoved > 0) {\n result[growSide] += actualMoved;\n remaining = 0;\n }\n\n if (remaining > 0) {\n for (let i = growSide; i < result.length && remaining > 0; i++) {\n const c = constraints[i];\n if (c.fixedPx !== null)\n continue;\n\n const maxRoom = c.maxPx !== null ? c.maxPx - result[i] : Infinity;\n if (maxRoom <= 0)\n continue;\n\n const give = Math.min(maxRoom, remaining);\n result[i] += give;\n remaining -= give;\n }\n }\n\n return { sizesPx: result, belowMin };\n}\n\nexport function resolveTracks(group: GroupNode, _containerPx: number): string {\n const parts: string[] = [];\n\n const gutterSize = `var(--split-gutter-size, 6px)`;\n\n for (let i = 0; i < group.children.length; i++) {\n const child = group.children[i];\n let track: string;\n\n if (child.kind === `panel`) {\n if (child.collapsed) {\n track = `var(--split-collapsed-size, 0px)`;\n } else if (child.fixedPx !== null) {\n track = `${child.fixedPx}px`;\n } else {\n const min = child.minPx > 0 ? `${child.minPx}px` : `0px`;\n track = `minmax(${min}, var(--s${i}))`;\n }\n } else {\n track = `minmax(0, var(--s${i}))`;\n }\n\n parts.push(track);\n\n if (i < group.children.length - 1) {\n parts.push(gutterSize);\n }\n }\n\n return parts.join(` `);\n}\n\nexport function toSnapshot(group: GroupNode): LayoutSnapshot {\n const root = snapshotNode(group);\n return {\n version: 1,\n root,\n };\n}\n\nfunction snapshotNode(node: LayoutNode): SnapshotNode {\n if (node.kind === `panel`) {\n return {\n kind: `panel`,\n id: node.id,\n weight: node.weight,\n collapsed: node.collapsed,\n };\n }\n\n const children = node.children.map(c => snapshotNode(c));\n return {\n kind: `group`,\n id: node.id,\n weight: node.weight,\n children,\n };\n}\n\nexport function applySnapshot(group: GroupNode, snapshot: LayoutSnapshot): GroupNode {\n return applySnapshotToGroup(group, snapshot.root);\n}\n\nfunction applySnapshotToGroup(group: GroupNode, snapshot: SnapshotNode): GroupNode {\n if (snapshot.kind !== `group`) {\n return group;\n }\n\n const weightMap = new Map<string, number>();\n const collapsedMap = new Map<string, boolean>();\n\n collectWeights(snapshot, weightMap, collapsedMap);\n\n const newChildren: LayoutNode[] = [];\n\n for (const child of group.children) {\n if (child.kind === `panel`) {\n const newWeight = weightMap.get(child.id);\n const collapsed = collapsedMap.get(child.id);\n\n newChildren.push({\n ...child,\n weight: newWeight !== undefined ? newWeight : child.weight,\n collapsed: collapsed !== undefined ? collapsed : child.collapsed,\n });\n } else {\n const childSnapshot = snapshot.children?.find(c => c.id === child.id);\n if (childSnapshot) {\n newChildren.push(applySnapshotToGroup(child, childSnapshot));\n } else {\n newChildren.push(child);\n }\n }\n }\n\n return {\n ...group,\n children: newChildren,\n };\n}\n\nfunction collectWeights(snapshot: SnapshotNode, weights: Map<string, number>, collapsed: Map<string, boolean>): void {\n if (snapshot.kind === `panel`) {\n weights.set(snapshot.id, snapshot.weight ?? 1);\n if (snapshot.collapsed !== undefined) {\n collapsed.set(snapshot.id, snapshot.collapsed);\n }\n } else if (snapshot.children) {\n for (const child of snapshot.children) {\n collectWeights(child, weights, collapsed);\n }\n }\n}\n\nexport function walk(group: GroupNode, visitor: (node: LayoutNode, path: number[]) => void): void {\n walkInner(group, [], visitor);\n}\n\nfunction walkInner(node: LayoutNode, path: number[], visitor: (node: LayoutNode, path: number[]) => void): void {\n visitor(node, path);\n\n if (node.kind === `group`) {\n for (let i = 0; i < node.children.length; i++) {\n walkInner(node.children[i], [...path, i], visitor);\n }\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-split-panel`)\nexport class SplitPanelElement extends LitElement {\n @property({ type: String, reflect: true })\n id = ``;\n\n @property({ type: String })\n size = ``;\n\n @property({ type: String })\n weight = ``;\n\n @property({ type: String })\n fixed = ``;\n\n @property({ type: String })\n min = ``;\n\n @property({ type: String })\n max = ``;\n\n @property({ type: String, attribute: `when-small` })\n whenSmall = `prevent`;\n\n @property({ type: Boolean, reflect: true })\n collapsed = false;\n\n @property({ type: String })\n snap = ``;\n\n override render() {\n return html`<slot></slot>`;\n }\n\n static override styles = [\n themeFallbacks,\n css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n :host([collapsed]) {\n visibility: hidden;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-split-panel': SplitPanelElement;\n }\n}\n","import type { DragState } from './split-drag.js';\nimport type { Axis, GroupNode, LayoutSnapshot, PanelInfo, SplitChangeDetail, SplitCloseDetail, SplitCollapseDetail, SplitExpandDetail, SplitResizeDetail } from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { handleStyles } from '../styles/handle.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createDragMachine } from './split-drag.js';\nimport { applySnapshot, buildModel, distribute, normalise, toSnapshot, walk } from './split-model.js';\nimport './split-panel.js';\n\n@customElement(`ixfx-split-layout`)\nexport class SplitLayoutElement extends LitElement {\n @property({ type: String, reflect: true })\n direction: Axis = `row`;\n\n @property({ type: String })\n sizes = ``;\n\n @property({ type: String, attribute: `gutter-size` })\n gutterSize = ``;\n\n @property({ type: String })\n snap = ``;\n\n @state()\n private _model: GroupNode | null = null;\n\n @state()\n private _resizing = false;\n\n @query(`.grid`)\n private _groupEl?: HTMLElement;\n\n private _observer: MutationObserver | null = null;\n private _applyingOwnMutation = false;\n private _dragStructurallyChanged = false;\n private _dragMachine = createDragMachine({\n onDragStart: state => this._handleDragStart(state),\n onDragMove: (state, deltaX, deltaY) => this._handleDragMove(state, deltaX, deltaY),\n onDragEnd: state => this._handleDragEnd(state),\n distribute: (sizes, idx, delta, constraints) => {\n return distribute(sizes, idx, delta, constraints as any);\n },\n });\n\n override connectedCallback() {\n super.connectedCallback();\n this._setupObserver();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._observer?.disconnect();\n }\n\n override firstUpdated() {\n this._rebuildModel();\n }\n\n private _setupObserver() {\n this._observer = new MutationObserver(() => {\n if (!this._applyingOwnMutation) {\n Promise.resolve().then(() => this._rebuildModel());\n }\n });\n\n this._observer.observe(this, {\n childList: true,\n subtree: true,\n attributeFilter: [`size`, `weight`, `min`, `max`, `when-small`, `fixed`, `direction`, `collapsed`, `sizes`],\n });\n }\n\n private _rebuildModel() {\n // Named slots are always rendered as `panel-0`..`panel-(n-1)`, so every\n // light-DOM child must carry the matching `slot`. Re-assert this on every\n // rebuild: children may have been added (with a stale/ad-hoc slot name) or\n // removed since the model was last built, which would otherwise leave an\n // orphaned child projected nowhere and an empty grid track.\n this._reindexSlots();\n const model = buildModel(this);\n const normalized = normalise(model);\n this._model = normalized;\n this.requestUpdate();\n }\n\n get panels(): PanelInfo[] {\n if (!this._model)\n return [];\n\n const panels: PanelInfo[] = [];\n walk(this._model, (node, path) => {\n if (node.kind === `panel`) {\n panels.push({\n id: node.id,\n el: node.el,\n index: path[path.length - 1],\n path: path.join(`-`),\n weight: node.weight,\n collapsed: node.collapsed,\n min: node.minPx,\n max: node.maxPx,\n whenSmall: node.whenSmall,\n });\n }\n });\n return panels;\n }\n\n getLayout(): LayoutSnapshot | null {\n if (!this._model)\n return null;\n return toSnapshot(this._model);\n }\n\n setLayout(s: LayoutSnapshot): void {\n if (!this._model)\n return;\n this._applyingOwnMutation = true;\n this._model = applySnapshot(this._model, s);\n this.requestUpdate();\n this._applyingOwnMutation = false;\n this._emitChange();\n }\n\n getSizes(_groupId?: string): Record<string, number> {\n if (!this._model)\n return {};\n const result: Record<string, number> = {};\n if (this._model.children) {\n this._model.children.forEach((child) => {\n result[child.id] = child.weight;\n });\n }\n return result;\n }\n\n setSizes(weights: number[] | Record<string, number>, _groupId?: string): void {\n if (!this._model)\n return;\n\n this._applyingOwnMutation = true;\n\n if (Array.isArray(weights)) {\n this._model.children.forEach((child, i) => {\n if (i < weights.length) {\n child.weight = weights[i];\n }\n });\n } else {\n for (const [id, weight] of Object.entries(weights)) {\n const child = this._model.children.find(c => c.id === id);\n if (child) {\n child.weight = weight;\n }\n }\n }\n\n this._model = normalise(this._model);\n this.requestUpdate();\n this._applyingOwnMutation = false;\n this._emitResize();\n this._emitChange();\n }\n\n collapse(idOrEl: string | HTMLElement): void {\n this._setCollapsedState(idOrEl, true);\n }\n\n expand(idOrEl: string | HTMLElement): void {\n this._setCollapsedState(idOrEl, false);\n }\n\n toggle(idOrEl: string | HTMLElement): void {\n const panel = this._findPanel(idOrEl);\n if (panel) {\n this._setCollapsedState(panel.id, !panel.collapsed);\n }\n }\n\n closePanel(idOrEl: string | HTMLElement): boolean {\n const panel = this._findPanel(idOrEl);\n if (!panel)\n return false;\n\n const event = new CustomEvent<SplitCloseDetail>(`ixfx-split-close`, {\n detail: { id: panel.id, index: panel.index },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(event);\n if (event.defaultPrevented)\n return false;\n\n this._applyingOwnMutation = true;\n panel.el.remove();\n this._rebuildModel();\n // Discard the records for our own mutations: the observer callback runs in a\n // microtask, by which point the flag below is already cleared, so without\n // this it would schedule a redundant rebuild from the DOM.\n this._observer?.takeRecords();\n this._applyingOwnMutation = false;\n\n this._emitResize();\n this._emitChange();\n return true;\n }\n\n /**\n * Bounding rects of the gutter elements, in gutter index order. lets\n * callers (e.g. dock junction handles) hit-test gutters without reaching\n * into the shadow DOM.\n */\n getGutterRects(): DOMRect[] {\n const gutters = this.shadowRoot?.querySelectorAll<HTMLElement>(`.gutter`);\n if (gutters === undefined || gutters === null)\n return [];\n return Array.from(gutters, g => g.getBoundingClientRect());\n }\n\n /**\n * Programmatically begin dragging the gutter at `gutterIndex`, as if the\n * user had pressed on it at (`clientX`, `clientY`). The drag then follows\n * the pointer `pointerId` until pointerup, exactly like a native gutter\n * drag. Returns false when the index is out of range or the layout isn't\n * ready. Intended for composite resize affordances — e.g. a junction handle\n * that starts this drag alongside perpendicular drags on other layouts.\n */\n beginGutterDrag(gutterIndex: number, pointerId: number, clientX: number, clientY: number): boolean {\n if (!this._groupEl || !this._model)\n return false;\n if (gutterIndex < 0 || gutterIndex >= this._model.children.length - 1)\n return false;\n\n const { rect, trackSizes, constraints } = this._snapshotTracks();\n\n this._dragMachine.startGutterDrag(\n this._model.id,\n gutterIndex,\n pointerId,\n clientX,\n clientY,\n rect,\n trackSizes,\n constraints,\n );\n\n window.addEventListener(`pointermove`, this._onPointerMove);\n window.addEventListener(`pointerup`, this._onPointerUp);\n return true;\n }\n\n private _setCollapsedState(idOrEl: string | HTMLElement, collapsed: boolean, revealWeight?: number): void {\n const panel = this._findPanel(idOrEl);\n if (!panel || panel.collapsed === collapsed)\n return;\n\n this._applyingOwnMutation = true;\n\n if (collapsed) {\n panel.el.setAttribute(`collapsed`, ``);\n panel.el.setAttribute(`data-collapsed`, ``);\n } else {\n panel.el.removeAttribute(`collapsed`);\n panel.el.removeAttribute(`data-collapsed`);\n }\n\n this._rebuildModel();\n if (!collapsed && revealWeight !== undefined) {\n this._setFlexibleWeight(panel.id, revealWeight);\n }\n this.requestUpdate();\n // The observer callback runs in a microtask, after the flag below is\n // cleared; draining our own records stops it rebuilding from the DOM and\n // wiping the weights just set (e.g. the drag-to-reveal size).\n this._observer?.takeRecords();\n this._applyingOwnMutation = false;\n\n if (collapsed) {\n this.dispatchEvent(new CustomEvent<SplitCollapseDetail>(`ixfx-split-collapse`, {\n detail: { id: panel.id, index: panel.index },\n bubbles: true,\n composed: true,\n }));\n } else {\n this.dispatchEvent(new CustomEvent<SplitExpandDetail>(`ixfx-split-expand`, {\n detail: { id: panel.id, index: panel.index },\n bubbles: true,\n composed: true,\n }));\n }\n\n this._emitResize();\n this._emitChange();\n }\n\n // Force every direct child onto the slot the renderer expects for its\n // position (`panel-<domIndex>`). Callers may append children with any slot\n // name (or none), and removals leave gaps; this keeps projection in sync\n // with the `panel-0`..`panel-(n-1)` slots `render()` emits. `slot` is not in\n // the observer's attributeFilter, so this does not re-trigger a rebuild.\n private _reindexSlots(): void {\n Array.from(this.children).forEach((child, i) => {\n const name = `panel-${i}`;\n if (child.getAttribute(`slot`) !== name)\n child.setAttribute(`slot`, name);\n });\n }\n\n private _findPanel(idOrEl: string | HTMLElement): PanelInfo | undefined {\n const id = typeof idOrEl === `string` ? idOrEl : idOrEl.id;\n return this.panels.find(p => p.id === id);\n }\n\n // Give one flexible child a target share of the weighted flow, shrinking the\n // other flexible children proportionally to make room.\n private _setFlexibleWeight(id: string, weight: number): void {\n if (!this._model)\n return;\n\n const isFlexible = (c: GroupNode[`children`][number]) =>\n c.kind === `group` || (c.fixedPx === null && !c.collapsed);\n const flexible = this._model.children.filter(isFlexible);\n const target = flexible.find(c => c.id === id);\n if (!target)\n return;\n\n const t = Math.min(Math.max(weight, 0), 0.9);\n const others = flexible.filter(c => c !== target);\n const othersTotal = others.reduce((sum, c) => sum + c.weight, 0) || 1;\n const scale = (1 - t) / othersTotal;\n for (const c of others) {\n c.weight *= scale;\n }\n target.weight = t;\n\n this._model = normalise(this._model);\n }\n\n // Pixel drag distance past a collapsed panel's gutter before it re-expands.\n private _snapPx(): number {\n const fromProp = Number.parseFloat(this.snap);\n if (!Number.isNaN(fromProp))\n return fromProp;\n const fromVar = Number.parseFloat(getComputedStyle(this).getPropertyValue(`--split-snap`));\n return Number.isNaN(fromVar) ? 24 : fromVar;\n }\n\n private _collapsedPx(): number {\n const v = Number.parseFloat(getComputedStyle(this).getPropertyValue(`--split-collapsed-size`));\n return Number.isNaN(v) ? 0 : v;\n }\n\n private _handleDragStart(_state: DragState) {\n this._resizing = true;\n this._dragStructurallyChanged = false;\n this.setAttribute(`data-dragging`, ``);\n }\n\n private _handleDragMove(state: DragState, deltaX: number, deltaY: number) {\n if (!this._model)\n return;\n\n // A panel was closed/collapsed on an earlier frame of this drag. The\n // captured drag state (track sizes, constraints, gutter index) no longer\n // lines up with the model, so continuing would operate on the wrong\n // panels and cascade. Ignore further movement until the pointer is released.\n if (this._dragStructurallyChanged)\n return;\n\n const axis = this.direction;\n const delta = axis === `row` ? deltaX : deltaY;\n const gutterIndex = state.gutterIndex;\n\n // Dragging a gutter away from a collapsed neighbour re-expands it.\n // Collapsed panels are outside the normal size-distribution flow, so this\n // has to be handled before `distribute`. The panel stays hidden until the\n // drag has travelled far enough to reveal it at its `min` size (it may not\n // render well any smaller); without a `min`, the snap threshold is used.\n const growSide = delta > 0 ? gutterIndex : gutterIndex + 1;\n const growNeighbour = this._model.children[growSide];\n if (growNeighbour?.kind === `panel` && growNeighbour.collapsed) {\n const revealPx = growNeighbour.minPx > 0 ? growNeighbour.minPx : this._snapPx();\n if (Math.abs(delta) >= revealPx) {\n const axisPx = axis === `row` ? state.containerRect.width : state.containerRect.height;\n this._setCollapsedState(growNeighbour.id, false, axisPx > 0 ? revealPx / axisPx : undefined);\n // Re-anchor the drag to the current pointer position and the new layout\n // so the same gesture keeps growing the panel past its min size.\n this._reseedDragState(state, state.startPointerX + deltaX, state.startPointerY + deltaY);\n }\n return;\n }\n\n const constraints = state.minConstraints.map((min, i) => ({\n minPx: min,\n maxPx: state.maxConstraints[i],\n fixedPx: state.fixedConstraints[i],\n whenSmall: state.whenSmallConstraints[i] as any,\n }));\n\n const result = distribute(\n state.trackSizes,\n gutterIndex,\n delta,\n constraints,\n );\n\n const totalSize = state.trackSizes.reduce((a, b) => a + b, 0);\n result.sizesPx.forEach((size, i) => {\n const child = this._model!.children[i];\n if (child && child.kind === `panel`) {\n child.weight = size / totalSize;\n }\n });\n\n if (result.belowMin.length > 0) {\n let processed = false;\n for (const idx of result.belowMin) {\n if (processed)\n break;\n const child = this._model!.children[idx];\n if (child && child.kind === `panel`) {\n const whenSmall = child.whenSmall;\n if (whenSmall === `collapse` && !child.collapsed) {\n this._setCollapsedState(child.id, true);\n processed = true;\n this._dragStructurallyChanged = true;\n } else if (whenSmall === `close`) {\n this.closePanel(child.id);\n processed = true;\n this._dragStructurallyChanged = true;\n }\n }\n }\n }\n\n this._model = normalise(this._model);\n this.requestUpdate();\n }\n\n private _handleDragEnd(_state: DragState) {\n this._resizing = false;\n this.removeAttribute(`data-dragging`);\n this._emitResize();\n this._emitChange();\n }\n\n // Snapshot of the current gutter geometry, used to seed (and mid-drag\n // re-seed) the drag machine. Collapsed / fixed panels sit outside the\n // weighted flow, so their raw `weight` is meaningless — use their real\n // rendered track size instead.\n private _snapshotTracks() {\n const rect = this._groupEl!.getBoundingClientRect();\n const axisSize = this.direction === `row` ? rect.width : rect.height;\n const collapsedPx = this._collapsedPx();\n const children = this._model!.children;\n\n const trackSizes = children.map((c) => {\n if (c.kind === `panel` && c.collapsed)\n return collapsedPx;\n if (c.kind === `panel` && c.fixedPx !== null)\n return c.fixedPx;\n return c.weight * axisSize;\n });\n const constraints = children.map((c) => {\n if (c.kind === `panel`) {\n return { minPx: c.minPx, maxPx: c.maxPx, fixedPx: c.fixedPx, whenSmall: c.whenSmall };\n }\n return { minPx: 0, maxPx: null as number | null, fixedPx: null as number | null, whenSmall: `prevent` as const };\n });\n\n return { rect, trackSizes, constraints };\n }\n\n private _reseedDragState(state: DragState, pointerX: number, pointerY: number): void {\n if (!this._groupEl || !this._model)\n return;\n\n const { rect, trackSizes, constraints } = this._snapshotTracks();\n state.startPointerX = pointerX;\n state.startPointerY = pointerY;\n state.containerRect = rect;\n state.trackSizes = trackSizes;\n state.minConstraints = constraints.map(c => c.minPx);\n state.maxConstraints = constraints.map(c => c.maxPx);\n state.fixedConstraints = constraints.map(c => c.fixedPx);\n state.whenSmallConstraints = constraints.map(c => c.whenSmall);\n }\n\n private _onGutterPointerDown = (e: PointerEvent, groupId: string, gutterIndex: number) => {\n e.preventDefault();\n if (!this._groupEl || !this._model)\n return;\n\n const { rect, trackSizes, constraints } = this._snapshotTracks();\n\n this._dragMachine.startGutterDrag(\n groupId,\n gutterIndex,\n e.pointerId,\n e.clientX,\n e.clientY,\n rect,\n trackSizes,\n constraints,\n );\n\n window.addEventListener(`pointermove`, this._onPointerMove);\n window.addEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _onPointerMove = (e: PointerEvent) => {\n this._dragMachine.move(e);\n };\n\n private _onPointerUp = (e: PointerEvent) => {\n this._dragMachine.end(e);\n window.removeEventListener(`pointermove`, this._onPointerMove);\n window.removeEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _emitResize() {\n if (!this._model)\n return;\n const detail: SplitResizeDetail = {\n sizes: this.getSizes(),\n groupId: this._model.id,\n };\n this.dispatchEvent(new CustomEvent<SplitResizeDetail>(`ixfx-split-resize`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _emitChange() {\n const layout = this.getLayout();\n if (!layout)\n return;\n const detail: SplitChangeDetail = { layout };\n this.dispatchEvent(new CustomEvent<SplitChangeDetail>(`ixfx-split-change`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n protected override render() {\n if (!this._model)\n return nothing;\n\n const isRow = this._model.axis === `row`;\n const trackSizes = this._resolveTracks(this._model);\n\n const cssVars = this._model.children.map((child, i) => {\n return `--s${i}: ${child.weight * 100}%`;\n }).join(`; `);\n\n const gridStyle = isRow\n ? `grid-template-columns: ${trackSizes}; grid-template-rows: 1fr; ${cssVars}`\n : `grid-template-rows: ${trackSizes}; grid-template-columns: 1fr; ${cssVars}`;\n\n return html`\n <div class=\"grid\" style=\"${gridStyle}\">\n ${this._model.children.map((_, i) => html`\n <div part=\"panel\" style=\"grid-column: ${isRow ? i * 2 + 1 : 1}; grid-row: ${isRow ? 1 : i * 2 + 1}; display: flex; flex-direction: ${isRow ? `row` : `column`}; overflow: hidden;\">\n <slot name=\"panel-${i}\"></slot>\n </div>\n `)}\n ${this._model.children.slice(0, -1).map((_, i) => this._renderGutter(this._model!.id, i, isRow))}\n </div>\n `;\n }\n\n private _getTrackSizes(count: number): string[] {\n const sizes: string[] = [];\n for (let i = 0; i < count; i++) {\n sizes.push(`var(--s${i}, 1fr)`);\n }\n return sizes;\n }\n\n private _resolveTracks(model: GroupNode): string {\n const _isRow = model.axis === `row`;\n const parts: string[] = [];\n const gutterSize = `var(--split-gutter-size, 6px)`;\n\n for (let i = 0; i < model.children.length; i++) {\n const child = model.children[i];\n let track: string;\n\n if (child.kind === `panel`) {\n if (child.collapsed) {\n track = `var(--split-collapsed-size, 0px)`;\n } else if (child.fixedPx !== null) {\n track = `${child.fixedPx}px`;\n } else {\n const min = child.minPx > 0 ? `${child.minPx}px` : `0px`;\n track = `minmax(${min}, var(--s${i}, 1fr))`;\n }\n } else {\n track = `minmax(0, var(--s${i}, 1fr))`;\n }\n\n parts.push(track);\n\n if (i < model.children.length - 1) {\n parts.push(gutterSize);\n }\n }\n\n return parts.join(` `);\n }\n\n private _renderGutter(groupId: string, index: number, isRow: boolean) {\n const cursor = isRow ? `ew-resize` : `ns-resize`;\n const gridColumn = isRow ? `${(index + 1) * 2}` : `1`;\n const gridRow = isRow ? `1` : `${(index + 1) * 2}`;\n\n return html`\n <div\n class=\"gutter\"\n data-group=\"${groupId}\"\n data-index=\"${index}\"\n style=\"cursor: ${cursor}; grid-column: ${gridColumn}; grid-row: ${gridRow};\"\n @pointerdown=${(e: PointerEvent) => this._onGutterPointerDown(e, groupId, index)}\n >\n <span\n class=\"ixfx-handle\"\n part=\"grip\"\n data-handle=\"dimpled\"\n data-shape=${isRow ? `vertical` : `horizontal`}\n ></span>\n </div>\n `;\n }\n\n static override styles = [\n themeFallbacks,\n handleStyles,\n css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n --split-gutter-size: 6px;\n --split-gutter-hit-size: 12px;\n --split-gutter-color: transparent;\n --split-gutter-hover-color: var(--surface-6);\n --split-gutter-active-color: var(--accent);\n --split-collapsed-size: 0px;\n --split-snap: 24px;\n\n /* Gutter grip — shared handle primitive (docs/infra-handle.md). */\n --ixfx-handle-length: 16px;\n --ixfx-handle-thickness: 8px;\n }\n\n * {\n box-sizing: border-box;\n }\n\n .grid {\n display: grid;\n width: 100%;\n height: 100%;\n }\n\n .grid slot {\n display: block;\n min-width: 0;\n min-height: 0;\n width: 100%;\n height: 100%;\n }\n\n ::part(panel) {\n width: 100%;\n height: 100%;\n }\n\n .gutter {\n z-index: 2;\n background: var(--split-gutter-color);\n transition: background-color var(--transition, 0.2s);\n pointer-events: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n }\n\n .gutter::before {\n content: '';\n position: absolute;\n pointer-events: auto;\n background: transparent;\n }\n\n :host([direction=\"row\"]) .gutter {\n width: var(--split-gutter-size);\n cursor: ew-resize;\n min-height: 100%;\n }\n\n :host([direction=\"row\"]) .gutter::before {\n width: var(--split-gutter-hit-size, 12px);\n height: 100%;\n left: 50%;\n transform: translateX(-50%);\n }\n\n :host([direction=\"column\"]) .gutter {\n height: var(--split-gutter-size);\n cursor: ns-resize;\n min-width: 100%;\n }\n\n :host([direction=\"column\"]) .gutter::before {\n height: var(--split-gutter-hit-size, 12px);\n width: 100%;\n top: 50%;\n transform: translateY(-50%);\n }\n\n .gutter:hover,\n .gutter[data-active] {\n background: var(--split-gutter-hover-color);\n }\n\n :host([data-dragging]) .gutter {\n background: var(--split-gutter-active-color);\n }\n\n :host([data-dragging]) * {\n transition: none !important;\n user-select: none;\n }\n\n :host([data-dragging]) .gutter .ixfx-handle {\n display: none;\n }\n\n :host(:not([data-dragging])) .gutter:hover .ixfx-handle {\n display: none;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-split-layout': SplitLayoutElement;\n }\n\n interface HTMLElementEventMap {\n 'ixfx-split-resize': CustomEvent<SplitResizeDetail>;\n 'ixfx-split-collapse': CustomEvent<SplitCollapseDetail>;\n 'ixfx-split-expand': CustomEvent<SplitExpandDetail>;\n 'ixfx-split-close': CustomEvent<SplitCloseDetail>;\n 'ixfx-split-change': CustomEvent<SplitChangeDetail>;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-Bc23SI94.d.ts","names":[],"sources":["../src/common/types.ts"],"mappings":";;KAQY;;EAEV;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;KAIU;EACV,MAAM;;;;;;;EAON,WAAW;;;;;;;KAQD,uBAAuB;EAAgB,MAAM;EAAU;GAAiB;;;;;;KAOxE,uBAAuB,MAAM,UAAU;;;;;;;KAQvC;;;;;;;;;KAUA;;;;;;;;;KAUA"}
|