@ixfx/components 0.7.5 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/bundle/index.d.ts +256 -17
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +1461 -165
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-token.js +1 -1
  6. package/dist/{data-grid-CtJ35v8L.d.ts → data-grid-D-z7bx5-.d.ts} +2 -2
  7. package/dist/{data-grid-CtJ35v8L.d.ts.map → data-grid-D-z7bx5-.d.ts.map} +1 -1
  8. package/dist/data-grid.d.ts +1 -1
  9. package/dist/data-grid.js +1 -1
  10. package/dist/{detail-list-BS5dRDda.d.ts → detail-list-_ZJHYEBr.d.ts} +3 -3
  11. package/dist/{detail-list-BS5dRDda.d.ts.map → detail-list-_ZJHYEBr.d.ts.map} +1 -1
  12. package/dist/detail-list.d.ts +2 -2
  13. package/dist/detail-list.js +1 -1
  14. package/dist/grid-list-nRUQOcEL.js +1537 -0
  15. package/dist/grid-list-nRUQOcEL.js.map +1 -0
  16. package/dist/{grid-list-D-GbghSH.d.ts → grid-list-u33vmKzb.d.ts} +116 -15
  17. package/dist/grid-list-u33vmKzb.d.ts.map +1 -0
  18. package/dist/grid-list.d.ts +1 -1
  19. package/dist/grid-list.js +1 -993
  20. package/dist/{incr-search-DpbSJtgj.js → incr-search-C05WjbZh.js} +40 -3
  21. package/dist/incr-search-C05WjbZh.js.map +1 -0
  22. package/dist/incr-search.d.ts +2 -2
  23. package/dist/incr-search.js +2 -2
  24. package/dist/{index-CBS4z1v-.d.ts → index-h6gxtfHH.d.ts} +34 -2
  25. package/dist/index-h6gxtfHH.d.ts.map +1 -0
  26. package/dist/index.d.ts +60 -11
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +342 -15
  29. package/dist/index.js.map +1 -1
  30. package/dist/led.d.ts +33 -1
  31. package/dist/led.d.ts.map +1 -1
  32. package/dist/led.js +157 -13
  33. package/dist/led.js.map +1 -1
  34. package/dist/miller.d.ts +1 -1
  35. package/dist/miller.js +1 -1
  36. package/dist/narrowed-text.js +1 -1
  37. package/dist/panel.d.ts +3 -1
  38. package/dist/panel.d.ts.map +1 -1
  39. package/dist/panel.js +31 -1
  40. package/dist/panel.js.map +1 -1
  41. package/dist/plots.d.ts +2 -2
  42. package/dist/plots.js +1 -1
  43. package/dist/{titlebar-Bj5pfdw_.d.ts → titlebar-YQ-jVQoS.d.ts} +2 -2
  44. package/dist/{titlebar-Bj5pfdw_.d.ts.map → titlebar-YQ-jVQoS.d.ts.map} +1 -1
  45. package/dist/titlebar.d.ts +1 -1
  46. package/dist/titlebar.js +83 -1
  47. package/dist/titlebar.js.map +1 -1
  48. package/dist/{tree-DAii2A1g.js → tree-Chptss7I.js} +2 -2
  49. package/dist/{tree-DAii2A1g.js.map → tree-Chptss7I.js.map} +1 -1
  50. package/dist/tree.d.ts +1 -1
  51. package/dist/tree.js +1 -1
  52. package/dist/{vertical-list-DwtCPy1b.d.ts → vertical-list-CFuFDygi.d.ts} +2 -2
  53. package/dist/{vertical-list-DwtCPy1b.d.ts.map → vertical-list-CFuFDygi.d.ts.map} +1 -1
  54. package/dist/vertical-list.d.ts +1 -1
  55. package/dist/vertical-list.js +1 -1
  56. package/dist/{xy-axis-5KhVTNoX.d.ts → xy-axis-BfP9hKLj.d.ts} +25 -2
  57. package/dist/{xy-axis-5KhVTNoX.d.ts.map → xy-axis-BfP9hKLj.d.ts.map} +1 -1
  58. package/dist/{xy-axis-VrX8dmvS.js → xy-axis-DzM1brBZ.js} +141 -8
  59. package/dist/xy-axis-DzM1brBZ.js.map +1 -0
  60. package/docs-user/grid-list.md +99 -14
  61. package/docs-user/index.json +3 -3
  62. package/docs-user/led.md +37 -7
  63. package/docs-user/llms.txt +1 -1
  64. package/docs-user/panel.md +68 -13
  65. package/docs-user/titlebar.md +3 -4
  66. package/llms.txt +1 -1
  67. package/package.json +1 -1
  68. package/dist/grid-list-D-GbghSH.d.ts.map +0 -1
  69. package/dist/grid-list.js.map +0 -1
  70. package/dist/incr-search-DpbSJtgj.js.map +0 -1
  71. package/dist/index-CBS4z1v-.d.ts.map +0 -1
  72. package/dist/xy-axis-VrX8dmvS.js.map +0 -1
package/dist/led.d.ts CHANGED
@@ -1,14 +1,46 @@
1
1
  import { LitElement } from "lit";
2
2
  //#region src/led/led.d.ts
3
+ type LedMode = `brightness` | `blink` | `pulse`;
3
4
  declare class LedElement extends LitElement {
4
5
  #private;
5
6
  value: number;
6
7
  lit: boolean;
7
8
  color: string;
9
+ glow: boolean;
10
+ /**
11
+ * Operating mode:
12
+ * - `brightness` (default): {@link value} sets the LED brightness directly
13
+ * - `blink`: LED blinks on/off every {@link rate} milliseconds (this mode
14
+ * is what the legacy `blinking` attribute now selects)
15
+ * - `pulse`: LED sits unlit until {@link pulse} is called, which fires an
16
+ * attack/release envelope up to {@link value} and back down
17
+ */
18
+ mode: LedMode;
19
+ /**
20
+ * Legacy alias for `mode="blink"`. Setting `blinking` switches {@link mode}
21
+ * to `blink`; clearing it returns to `brightness`.
22
+ */
8
23
  blinking: boolean;
9
24
  rate: number;
25
+ /** Pulse-mode attack time in milliseconds (0 → instant). */
26
+ attackTime: number;
27
+ /** Pulse-mode release/decay time in milliseconds (0 → instant). */
28
+ releaseTime: number;
29
+ /**
30
+ * Pulse-mode retrigger behaviour. When set, each {@link pulse} call restarts
31
+ * the envelope from 0. When unset (default), the attack ramps from wherever
32
+ * the envelope currently sits, so a retrigger mid-decay is continuous.
33
+ */
34
+ pulseRetrigger: boolean;
10
35
  willUpdate(changedProperties: Map<string, unknown>): void;
11
36
  disconnectedCallback(): void;
37
+ /**
38
+ * Pulse-mode trigger: lights the LED to {@link value} using an attack/release
39
+ * envelope, then decays back to unlit. Calling again restarts the envelope
40
+ * (from 0 if {@link pulseRetrigger} is set, otherwise from the current level).
41
+ * No-op unless {@link mode} is `pulse`.
42
+ */
43
+ pulse(): void;
12
44
  protected render(): import("lit").TemplateResult<1>;
13
45
  static styles: import("lit").CSSResult;
14
46
  }
@@ -18,5 +50,5 @@ declare global {
18
50
  }
19
51
  }
20
52
  //#endregion
21
- export { LedElement };
53
+ export { LedElement, LedMode };
22
54
  //# sourceMappingURL=led.d.ts.map
package/dist/led.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"led.d.ts","names":[],"sources":["../src/led/led.ts"],"mappings":";;cAKa,mBAAmB;;EAE9B;EAGA;EAGA;EAGA;EAGA;EAIA,WAAW,mBAAmB;EAmB9B;YAwBU,wBAAM;SAIT,sBAAM;;QAqBP;YACI;IACR,YAAY"}
1
+ {"version":3,"file":"led.d.ts","names":[],"sources":["../src/led/led.ts"],"mappings":";;KAIY;cAGC,mBAAmB;;EAE9B;EAGA;EAGA;EAGA;;;;;;;;;EAWA,MAAM;;;;;EAON;EAGA;;EAIA;;EAIA;;;;;;EAQA;EAWA,WAAW,mBAAmB;EA+C9B;;;;;;;EAYA;YA6EU,wBAAM;SAIT,sBAAM;;QAwEP;YACI;IACR,YAAY"}
package/dist/led.js CHANGED
@@ -8,15 +8,62 @@ let LedElement = class LedElement extends LitElement {
8
8
  this.value = 0;
9
9
  this.lit = false;
10
10
  this.color = `oklch(50% 0.15 25)`;
11
+ this.glow = false;
12
+ this.mode = `brightness`;
11
13
  this.blinking = false;
12
14
  this.rate = 500;
15
+ this.attackTime = 40;
16
+ this.releaseTime = 400;
17
+ this.pulseRetrigger = false;
18
+ this.#appliedMode = `brightness`;
19
+ this.#pulseStart = 0;
20
+ this.#pulsePeak = 0;
21
+ this.#pulseFrom = 0;
22
+ this.#pulseLevel = 0;
23
+ this.#pulseTick = (now) => {
24
+ const attack = Math.max(0, this.attackTime);
25
+ const release = Math.max(0, this.releaseTime);
26
+ const from = this.#pulseFrom;
27
+ const peak = this.#pulsePeak;
28
+ const elapsed = now - this.#pulseStart;
29
+ let level;
30
+ if (attack > 0 && elapsed < attack) level = from + (peak - from) * (elapsed / attack);
31
+ else if (elapsed < attack + release) level = release > 0 ? peak * (1 - (elapsed - attack) / release) : 0;
32
+ else level = 0;
33
+ level = Math.max(0, Math.min(Math.max(from, peak), level));
34
+ this.#pulseLevel = level;
35
+ this.style.setProperty(`--value`, String(level));
36
+ if (elapsed < attack + release) this.#pulseRaf = requestAnimationFrame(this.#pulseTick);
37
+ else {
38
+ this.#pulseRaf = void 0;
39
+ this.#pulseLevel = 0;
40
+ }
41
+ };
13
42
  }
14
43
  #blinkInterval;
44
+ #appliedMode;
45
+ #pulseRaf;
46
+ #pulseStart;
47
+ #pulsePeak;
48
+ #pulseFrom;
49
+ #pulseLevel;
15
50
  willUpdate(changedProperties) {
16
- if (changedProperties.has(`lit`)) this.value = this.lit ? 1 : 0;
17
- if (changedProperties.has(`value`) || changedProperties.has(`lit`)) this.style.setProperty(`--value`, String(this.value));
18
- if (changedProperties.has(`blinking`) || changedProperties.has(`rate`)) this.#updateBlinking();
51
+ if (changedProperties.has(`blinking`)) {
52
+ if (this.blinking) this.mode = `blink`;
53
+ else if (this.mode === `blink`) this.mode = `brightness`;
54
+ }
55
+ if (this.mode !== this.#appliedMode) {
56
+ this.#appliedMode = this.mode;
57
+ this.#onModeChange();
58
+ }
59
+ if (changedProperties.has(`lit`)) {
60
+ if (this.lit) this.value = 1;
61
+ else if (changedProperties.get(`lit`) !== void 0) this.value = 0;
62
+ }
63
+ if (changedProperties.has(`color`)) this.style.setProperty(`--_color-attr`, this.color);
64
+ if (this.mode !== `pulse` && (changedProperties.has(`value`) || changedProperties.has(`lit`))) this.style.setProperty(`--value`, String(this.value));
19
65
  if (changedProperties.has(`rate`)) {
66
+ this.#updateBlinking();
20
67
  const transitionMs = this.rate < 300 ? this.rate * .5 : 150;
21
68
  this.style.setProperty(`--transition-duration`, `${transitionMs}ms`);
22
69
  }
@@ -24,18 +71,43 @@ let LedElement = class LedElement extends LitElement {
24
71
  disconnectedCallback() {
25
72
  super.disconnectedCallback();
26
73
  this.#stopBlinking();
74
+ this.#stopPulse();
27
75
  }
28
- #updateBlinking() {
29
- if (this.blinking && this.rate > 0) {
30
- this.#stopBlinking();
31
- this.#blinkInterval = window.setInterval(() => {
32
- this.value = this.value === 0 ? 1 : 0;
33
- }, this.rate);
34
- } else {
35
- this.#stopBlinking();
36
- this.value = 0;
76
+ /**
77
+ * Pulse-mode trigger: lights the LED to {@link value} using an attack/release
78
+ * envelope, then decays back to unlit. Calling again restarts the envelope
79
+ * (from 0 if {@link pulseRetrigger} is set, otherwise from the current level).
80
+ * No-op unless {@link mode} is `pulse`.
81
+ */
82
+ pulse() {
83
+ if (this.mode !== `pulse`) return;
84
+ this.#pulsePeak = this.value;
85
+ this.#pulseFrom = this.pulseRetrigger ? 0 : this.#pulseLevel;
86
+ this.#pulseStart = performance.now();
87
+ if (this.#pulseRaf === void 0) this.#pulseRaf = requestAnimationFrame(this.#pulseTick);
88
+ }
89
+ #onModeChange() {
90
+ this.#stopPulse();
91
+ this.#pulseLevel = 0;
92
+ this.blinking = this.mode === `blink`;
93
+ this.#updateBlinking();
94
+ this.style.setProperty(`--value`, this.mode === `pulse` ? `0` : String(this.value));
95
+ }
96
+ #pulseTick;
97
+ #stopPulse() {
98
+ if (this.#pulseRaf !== void 0) {
99
+ cancelAnimationFrame(this.#pulseRaf);
100
+ this.#pulseRaf = void 0;
37
101
  }
38
102
  }
103
+ #updateBlinking() {
104
+ const wasBlinking = this.#blinkInterval !== void 0;
105
+ this.#stopBlinking();
106
+ if (this.mode === `blink` && this.rate > 0) this.#blinkInterval = window.setInterval(() => {
107
+ this.value = this.value === 0 ? 1 : 0;
108
+ }, this.rate);
109
+ else if (wasBlinking || this.mode === `blink`) this.value = 0;
110
+ }
39
111
  #stopBlinking() {
40
112
  if (this.#blinkInterval !== void 0) {
41
113
  clearInterval(this.#blinkInterval);
@@ -49,6 +121,8 @@ let LedElement = class LedElement extends LitElement {
49
121
  this.styles = css`
50
122
  :host {
51
123
  --_size: var(--size, 1ex);
124
+ /* Resolved colour: explicit --colour wins, then the \`color\` attribute, then a default. */
125
+ --_colour: var(--colour, var(--_color-attr, oklch(50% 0.15 25)));
52
126
  display: inline-block;
53
127
  min-width: 1ex;
54
128
  min-height: 1ex;
@@ -58,12 +132,61 @@ let LedElement = class LedElement extends LitElement {
58
132
  }
59
133
 
60
134
  div {
135
+ position: relative;
61
136
  width: 100%;
62
137
  height: 100%;
63
138
  border-radius: 50%;
64
- background: color-mix(in oklch, var(--colour, oklch(50% 0.15 25)), white calc((1 - var(--value, 0)) * 50%));
139
+ background: color-mix(in oklch, var(--_colour), white calc((1 - var(--value, 0)) * 50%));
65
140
  transition: background var(--transition-duration, 150ms) ease-out;
66
141
  }
142
+
143
+ /* Glow: a more realistic domed LED with a specular highlight and coloured bloom. */
144
+ :host([glow]) {
145
+ /* Body darkens toward black as the LED dims, so an unlit LED reads as a dark dome. */
146
+ --_body: color-mix(in oklch, var(--_colour), black calc((1 - var(--value, 0)) * 60%));
147
+ overflow: visible;
148
+ }
149
+
150
+ :host([glow]) div {
151
+ background:
152
+ radial-gradient(circle at 32% 28%,
153
+ color-mix(in oklch, var(--_body), white 55%) 0%,
154
+ var(--_body) 45%,
155
+ color-mix(in oklch, var(--_body), black 32%) 100%);
156
+ box-shadow:
157
+ /* inner rim shading for depth */
158
+ inset 0 calc(var(--_size) * -0.1) calc(var(--_size) * 0.18)
159
+ color-mix(in oklch, var(--_body), black 45%),
160
+ inset 0 calc(var(--_size) * 0.08) calc(var(--_size) * 0.14)
161
+ color-mix(in oklch, var(--_body), white 25%),
162
+ /* coloured bloom, scaled by value so it only glows when lit */
163
+ 0 0 calc(var(--_size) * 0.6 * var(--value, 0)) calc(var(--_size) * 0.12 * var(--value, 0))
164
+ var(--_colour),
165
+ 0 0 calc(var(--_size) * 1.7 * var(--value, 0)) calc(var(--_size) * 0.5 * var(--value, 0))
166
+ color-mix(in oklch, var(--_colour), transparent 45%);
167
+ transition:
168
+ background var(--transition-duration, 150ms) ease-out,
169
+ box-shadow var(--transition-duration, 150ms) ease-out;
170
+ }
171
+
172
+ /* Specular highlight blob near the top-left. */
173
+ :host([glow]) div::after {
174
+ content: "";
175
+ position: absolute;
176
+ inset: 0;
177
+ border-radius: 50%;
178
+ background: radial-gradient(ellipse 55% 45% at 30% 22%,
179
+ color-mix(in oklch, white, transparent 10%) 0%,
180
+ transparent 60%);
181
+ pointer-events: none;
182
+ }
183
+
184
+ /* Pulse mode animates --value frame-by-frame, so drop the CSS transition
185
+ that would otherwise smear the envelope. Placed last to win over the
186
+ glow rule for elements matching both. */
187
+ :host([mode="pulse"]) div {
188
+ transition: none;
189
+ }
67
190
  `;
68
191
  }
69
192
  };
@@ -74,6 +197,15 @@ __decorate([property({
74
197
  reflect: true
75
198
  })], LedElement.prototype, "lit", void 0);
76
199
  __decorate([property({ type: String })], LedElement.prototype, "color", void 0);
200
+ __decorate([property({
201
+ type: Boolean,
202
+ attribute: `glow`,
203
+ reflect: true
204
+ })], LedElement.prototype, "glow", void 0);
205
+ __decorate([property({
206
+ type: String,
207
+ reflect: true
208
+ })], LedElement.prototype, "mode", void 0);
77
209
  __decorate([property({
78
210
  type: Boolean,
79
211
  attribute: `blinking`,
@@ -83,6 +215,18 @@ __decorate([property({
83
215
  type: Number,
84
216
  attribute: `rate`
85
217
  })], LedElement.prototype, "rate", void 0);
218
+ __decorate([property({
219
+ type: Number,
220
+ attribute: `attack-time`
221
+ })], LedElement.prototype, "attackTime", void 0);
222
+ __decorate([property({
223
+ type: Number,
224
+ attribute: `release-time`
225
+ })], LedElement.prototype, "releaseTime", void 0);
226
+ __decorate([property({
227
+ type: Boolean,
228
+ attribute: `pulse-retrigger`
229
+ })], LedElement.prototype, "pulseRetrigger", void 0);
86
230
  LedElement = __decorate([safeCustomElement(`ixfx-led`)], LedElement);
87
231
  //#endregion
88
232
  export { LedElement };
package/dist/led.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"led.js","names":["#updateBlinking","#stopBlinking","#blinkInterval","customElement"],"sources":["../src/led/led.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n@customElement(`ixfx-led`)\nexport class LedElement extends LitElement {\n @property({ type: Number })\n value = 0;\n\n @property({ type: Boolean, attribute: `lit`, reflect: true })\n lit = false;\n\n @property({ type: String })\n color = `oklch(50% 0.15 25)`;\n\n @property({ type: Boolean, attribute: `blinking`, reflect: true })\n blinking = false;\n\n @property({ type: Number, attribute: `rate` })\n rate = 500;\n\n #blinkInterval: number | undefined;\n\n willUpdate(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(`lit`)) {\n this.value = this.lit ? 1 : 0;\n }\n\n if (changedProperties.has(`value`) || changedProperties.has(`lit`)) {\n this.style.setProperty(`--value`, String(this.value));\n }\n\n if (changedProperties.has(`blinking`) || changedProperties.has(`rate`)) {\n this.#updateBlinking();\n }\n\n if (changedProperties.has(`rate`)) {\n const transitionMs = this.rate < 300 ? this.rate * 0.5 : 150;\n this.style.setProperty(`--transition-duration`, `${transitionMs}ms`);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#stopBlinking();\n }\n\n #updateBlinking() {\n if (this.blinking && this.rate > 0) {\n this.#stopBlinking();\n this.#blinkInterval = window.setInterval(() => {\n this.value = this.value === 0 ? 1 : 0;\n }, this.rate);\n } else {\n this.#stopBlinking();\n this.value = 0;\n }\n }\n\n #stopBlinking() {\n if (this.#blinkInterval !== undefined) {\n clearInterval(this.#blinkInterval);\n this.#blinkInterval = undefined;\n }\n }\n\n protected render() {\n return html`<div part=\"circle\"></div>`;\n }\n\n static styles = css`\n :host {\n --_size: var(--size, 1ex);\n display: inline-block;\n min-width: 1ex;\n min-height: 1ex;\n width: var(--_size);\n height: var(--_size);\n vertical-align: middle;\n }\n\n div {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background: color-mix(in oklch, var(--colour, oklch(50% 0.15 25)), white calc((1 - var(--value, 0)) * 50%));\n transition: background var(--transition-duration, 150ms) ease-out;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-led\": LedElement;\n }\n}\n"],"mappings":";;;;AAKO,IAAM,aAAN,MAAM,mBAAmB,WAAW;;;EAEjC,KAAA,QAAA;EAGF,KAAA,MAAA;EAGE,KAAA,QAAA;EAGG,KAAA,WAAA;EAGJ,KAAA,OAAA;;CAEP;CAEA,WAAW,mBAAyC;EAClD,IAAI,kBAAkB,IAAI,KAAK,GAC7B,KAAK,QAAQ,KAAK,MAAM,IAAI;EAG9B,IAAI,kBAAkB,IAAI,OAAO,KAAK,kBAAkB,IAAI,KAAK,GAC/D,KAAK,MAAM,YAAY,WAAW,OAAO,KAAK,KAAK,CAAC;EAGtD,IAAI,kBAAkB,IAAI,UAAU,KAAK,kBAAkB,IAAI,MAAM,GACnE,KAAKA,gBAAgB;EAGvB,IAAI,kBAAkB,IAAI,MAAM,GAAG;GACjC,MAAM,eAAe,KAAK,OAAO,MAAM,KAAK,OAAO,KAAM;GACzD,KAAK,MAAM,YAAY,yBAAyB,GAAG,aAAa,GAAG;EACrE;CACF;CAEA,uBAAuB;EACrB,MAAM,qBAAqB;EAC3B,KAAKC,cAAc;CACrB;CAEA,kBAAkB;EAChB,IAAI,KAAK,YAAY,KAAK,OAAO,GAAG;GAClC,KAAKA,cAAc;GACnB,KAAKC,iBAAiB,OAAO,kBAAkB;IAC7C,KAAK,QAAQ,KAAK,UAAU,IAAI,IAAI;GACtC,GAAG,KAAK,IAAI;EACd,OAAO;GACL,KAAKD,cAAc;GACnB,KAAK,QAAQ;EACf;CACF;CAEA,gBAAgB;EACd,IAAI,KAAKC,mBAAmB,KAAA,GAAW;GACrC,cAAc,KAAKA,cAAc;GACjC,KAAKA,iBAAiB,KAAA;EACxB;CACF;CAEA,SAAmB;EACjB,OAAO,IAAI;CACb;;EAEgB,KAAA,SAAA,GAAG;;;;;;;;;;;;;;;;;;;;AAmBrB;AAnFG,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,WAAA,WAAA,SAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAO,SAAS;AAAK,CAAC,CAAA,GAAA,WAAA,WAAA,OAAA,KAAA,CAAA;AAG3D,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,WAAA,WAAA,SAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAY,SAAS;AAAK,CAAC,CAAA,GAAA,WAAA,WAAA,YAAA,KAAA,CAAA;AAGhE,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAO,CAAC,CAAA,GAAA,WAAA,WAAA,QAAA,KAAA,CAAA;AAd9CC,aAAAA,WAAAA,CAAAA,kBAAc,UAAU,CAAA,GAAA,UAAA"}
1
+ {"version":3,"file":"led.js","names":["#pulseFrom","#pulsePeak","#pulseStart","#pulseLevel","#pulseRaf","#pulseTick","#appliedMode","#onModeChange","#updateBlinking","#stopBlinking","#stopPulse","#blinkInterval","customElement"],"sources":["../src/led/led.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\nexport type LedMode = `brightness` | `blink` | `pulse`;\n\n@customElement(`ixfx-led`)\nexport class LedElement extends LitElement {\n @property({ type: Number })\n value = 0;\n\n @property({ type: Boolean, attribute: `lit`, reflect: true })\n lit = false;\n\n @property({ type: String })\n color = `oklch(50% 0.15 25)`;\n\n @property({ type: Boolean, attribute: `glow`, reflect: true })\n glow = false;\n\n /**\n * Operating mode:\n * - `brightness` (default): {@link value} sets the LED brightness directly\n * - `blink`: LED blinks on/off every {@link rate} milliseconds (this mode\n * is what the legacy `blinking` attribute now selects)\n * - `pulse`: LED sits unlit until {@link pulse} is called, which fires an\n * attack/release envelope up to {@link value} and back down\n */\n @property({ type: String, reflect: true })\n mode: LedMode = `brightness`;\n\n /**\n * Legacy alias for `mode=\"blink\"`. Setting `blinking` switches {@link mode}\n * to `blink`; clearing it returns to `brightness`.\n */\n @property({ type: Boolean, attribute: `blinking`, reflect: true })\n blinking = false;\n\n @property({ type: Number, attribute: `rate` })\n rate = 500;\n\n /** Pulse-mode attack time in milliseconds (0 → instant). */\n @property({ type: Number, attribute: `attack-time` })\n attackTime = 40;\n\n /** Pulse-mode release/decay time in milliseconds (0 → instant). */\n @property({ type: Number, attribute: `release-time` })\n releaseTime = 400;\n\n /**\n * Pulse-mode retrigger behaviour. When set, each {@link pulse} call restarts\n * the envelope from 0. When unset (default), the attack ramps from wherever\n * the envelope currently sits, so a retrigger mid-decay is continuous.\n */\n @property({ type: Boolean, attribute: `pulse-retrigger` })\n pulseRetrigger = false;\n\n #blinkInterval: number | undefined;\n #appliedMode: LedMode = `brightness`;\n\n #pulseRaf: number | undefined;\n #pulseStart = 0;\n #pulsePeak = 0;\n #pulseFrom = 0;\n #pulseLevel = 0;\n\n willUpdate(changedProperties: Map<string, unknown>) {\n // `blinking` is a compatibility alias for mode=\"blink\".\n if (changedProperties.has(`blinking`)) {\n if (this.blinking) {\n this.mode = `blink`;\n } else if (this.mode === `blink`) {\n this.mode = `brightness`;\n }\n }\n\n // Handle a mode change (including one triggered by `blinking`, above, in\n // this same update). `#appliedMode` is compared directly rather than via\n // `changedProperties` so a same-pass change is still caught.\n if (this.mode !== this.#appliedMode) {\n this.#appliedMode = this.mode;\n this.#onModeChange();\n }\n\n if (changedProperties.has(`lit`)) {\n // Map `lit` onto `value`, but don't let the initial (undefined -> false)\n // change clobber an explicit `value` attribute.\n if (this.lit) {\n this.value = 1;\n } else if (changedProperties.get(`lit`) !== undefined) {\n this.value = 0;\n }\n }\n\n if (changedProperties.has(`color`)) {\n this.style.setProperty(`--_color-attr`, this.color);\n }\n\n // In pulse mode `--value` is driven by the envelope, not by `value`.\n if (\n this.mode !== `pulse`\n && (changedProperties.has(`value`) || changedProperties.has(`lit`))\n ) {\n this.style.setProperty(`--value`, String(this.value));\n }\n\n if (changedProperties.has(`rate`)) {\n this.#updateBlinking();\n const transitionMs = this.rate < 300 ? this.rate * 0.5 : 150;\n this.style.setProperty(`--transition-duration`, `${transitionMs}ms`);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#stopBlinking();\n this.#stopPulse();\n }\n\n /**\n * Pulse-mode trigger: lights the LED to {@link value} using an attack/release\n * envelope, then decays back to unlit. Calling again restarts the envelope\n * (from 0 if {@link pulseRetrigger} is set, otherwise from the current level).\n * No-op unless {@link mode} is `pulse`.\n */\n pulse() {\n if (this.mode !== `pulse`)\n return;\n this.#pulsePeak = this.value;\n this.#pulseFrom = this.pulseRetrigger ? 0 : this.#pulseLevel;\n this.#pulseStart = performance.now();\n if (this.#pulseRaf === undefined) {\n this.#pulseRaf = requestAnimationFrame(this.#pulseTick);\n }\n }\n\n #onModeChange() {\n this.#stopPulse();\n this.#pulseLevel = 0;\n this.blinking = this.mode === `blink`;\n this.#updateBlinking();\n this.style.setProperty(\n `--value`,\n this.mode === `pulse` ? `0` : String(this.value),\n );\n }\n\n #pulseTick = (now: number) => {\n const attack = Math.max(0, this.attackTime);\n const release = Math.max(0, this.releaseTime);\n const from = this.#pulseFrom;\n const peak = this.#pulsePeak;\n const elapsed = now - this.#pulseStart;\n\n let level: number;\n if (attack > 0 && elapsed < attack) {\n // Ramp from the envelope's starting level up to the peak.\n level = from + (peak - from) * (elapsed / attack);\n } else if (elapsed < attack + release) {\n level = release > 0 ? peak * (1 - (elapsed - attack) / release) : 0;\n } else {\n level = 0;\n }\n level = Math.max(0, Math.min(Math.max(from, peak), level));\n this.#pulseLevel = level;\n this.style.setProperty(`--value`, String(level));\n\n if (elapsed < attack + release) {\n this.#pulseRaf = requestAnimationFrame(this.#pulseTick);\n } else {\n this.#pulseRaf = undefined;\n this.#pulseLevel = 0;\n }\n };\n\n #stopPulse() {\n if (this.#pulseRaf !== undefined) {\n cancelAnimationFrame(this.#pulseRaf);\n this.#pulseRaf = undefined;\n }\n }\n\n #updateBlinking() {\n const wasBlinking = this.#blinkInterval !== undefined;\n this.#stopBlinking();\n if (this.mode === `blink` && this.rate > 0) {\n this.#blinkInterval = window.setInterval(() => {\n this.value = this.value === 0 ? 1 : 0;\n }, this.rate);\n } else if (wasBlinking || this.mode === `blink`) {\n // Leaving blink mode (or blink with rate 0): settle to off.\n this.value = 0;\n }\n }\n\n #stopBlinking() {\n if (this.#blinkInterval !== undefined) {\n clearInterval(this.#blinkInterval);\n this.#blinkInterval = undefined;\n }\n }\n\n protected render() {\n return html`<div part=\"circle\"></div>`;\n }\n\n static styles = css`\n :host {\n --_size: var(--size, 1ex);\n /* Resolved colour: explicit --colour wins, then the \\`color\\` attribute, then a default. */\n --_colour: var(--colour, var(--_color-attr, oklch(50% 0.15 25)));\n display: inline-block;\n min-width: 1ex;\n min-height: 1ex;\n width: var(--_size);\n height: var(--_size);\n vertical-align: middle;\n }\n\n div {\n position: relative;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background: color-mix(in oklch, var(--_colour), white calc((1 - var(--value, 0)) * 50%));\n transition: background var(--transition-duration, 150ms) ease-out;\n }\n\n /* Glow: a more realistic domed LED with a specular highlight and coloured bloom. */\n :host([glow]) {\n /* Body darkens toward black as the LED dims, so an unlit LED reads as a dark dome. */\n --_body: color-mix(in oklch, var(--_colour), black calc((1 - var(--value, 0)) * 60%));\n overflow: visible;\n }\n\n :host([glow]) div {\n background:\n radial-gradient(circle at 32% 28%,\n color-mix(in oklch, var(--_body), white 55%) 0%,\n var(--_body) 45%,\n color-mix(in oklch, var(--_body), black 32%) 100%);\n box-shadow:\n /* inner rim shading for depth */\n inset 0 calc(var(--_size) * -0.1) calc(var(--_size) * 0.18)\n color-mix(in oklch, var(--_body), black 45%),\n inset 0 calc(var(--_size) * 0.08) calc(var(--_size) * 0.14)\n color-mix(in oklch, var(--_body), white 25%),\n /* coloured bloom, scaled by value so it only glows when lit */\n 0 0 calc(var(--_size) * 0.6 * var(--value, 0)) calc(var(--_size) * 0.12 * var(--value, 0))\n var(--_colour),\n 0 0 calc(var(--_size) * 1.7 * var(--value, 0)) calc(var(--_size) * 0.5 * var(--value, 0))\n color-mix(in oklch, var(--_colour), transparent 45%);\n transition:\n background var(--transition-duration, 150ms) ease-out,\n box-shadow var(--transition-duration, 150ms) ease-out;\n }\n\n /* Specular highlight blob near the top-left. */\n :host([glow]) div::after {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: 50%;\n background: radial-gradient(ellipse 55% 45% at 30% 22%,\n color-mix(in oklch, white, transparent 10%) 0%,\n transparent 60%);\n pointer-events: none;\n }\n\n /* Pulse mode animates --value frame-by-frame, so drop the CSS transition\n that would otherwise smear the envelope. Placed last to win over the\n glow rule for elements matching both. */\n :host([mode=\"pulse\"]) div {\n transition: none;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-led\": LedElement;\n }\n}\n"],"mappings":"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"}
package/dist/miller.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { a as TreeItem, n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-Bc23SI94.js";
2
2
  import { a as TreeComponent, c as TreeExpandEvent, d as TreeSearchHost, f as TreeSelectDetail, g as TreeDataModel, h as TreeTickleEvent, i as TreeCollapseEvent, l as TreeItemClickDetail, m as TreeTickleDetail, n as TreeActivateEvent, o as TreeComponentEventMap, p as TreeSelectEvent, r as TreeCollapseDetail, s as TreeExpandDetail, t as TreeActivateDetail, u as TreeItemClickEvent } from "./tree-component-F6qZ0Gdv.js";
3
- import { y as ListSearchController } from "./index-CBS4z1v-.js";
3
+ import { S as ListSearchController } from "./index-h6gxtfHH.js";
4
4
  import { n as TickledController } from "./tickled-controller-Bn3YdQsM.js";
5
5
  import { LitElement, PropertyValues, TemplateResult, nothing } from "lit";
6
6
  import { CommandRegistry } from "@clinth/ui-commands";
package/dist/miller.js CHANGED
@@ -2,7 +2,7 @@ import { t as TickledController } from "./tickled-controller-C66DgJHl.js";
2
2
  import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
3
3
  import { t as themeFallbacks } from "./fallbacks-DNI9xt0F.js";
4
4
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
5
- import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-DpbSJtgj.js";
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
6
  import "./interaction-Cr13azbM.js";
7
7
  import { t as collectDataResult } from "./data-provider-35TyWclX.js";
8
8
  import { LitElement, css, html, nothing } from "lit";
@@ -3,7 +3,7 @@ import { t as TickledController } from "./tickled-controller-C66DgJHl.js";
3
3
  import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
4
4
  import { t as themeFallbacks } from "./fallbacks-DNI9xt0F.js";
5
5
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
6
- import { f as createIncrSearch } from "./incr-search-DpbSJtgj.js";
6
+ import { p as createIncrSearch } from "./incr-search-C05WjbZh.js";
7
7
  import "./interaction-Cr13azbM.js";
8
8
  import { LitElement, css, html, nothing } from "lit";
9
9
  import { property, query, state } from "lit/decorators.js";
package/dist/panel.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as TitlebarToggleDetail, c as TitlebarVariant, i as TitlebarOrientation, o as TitlebarToggleEvent, s as TitlebarToggleInteraction, t as TitlebarCloseEvent } from "./titlebar-Bj5pfdw_.js";
1
+ import { a as TitlebarToggleDetail, c as TitlebarVariant, i as TitlebarOrientation, o as TitlebarToggleEvent, s as TitlebarToggleInteraction, t as TitlebarCloseEvent } from "./titlebar-YQ-jVQoS.js";
2
2
  import { LitElement } from "lit";
3
3
  //#region src/panel/panel.d.ts
4
4
  /** Backwards-compatible aliases: canonical types now live in `../titlebar/titlebar.js`. */
@@ -24,6 +24,8 @@ declare class PanelElement extends LitElement {
24
24
  variant: PanelVariant;
25
25
  /** Suppress the titlebar entirely (content-only chrome, e.g. dock tabbed mode). */
26
26
  hideTitlebar: boolean;
27
+ /** Keep the toolbar visible even when the panel is collapsed. */
28
+ keepToolbar: boolean;
27
29
  private _onTitlebarToggle;
28
30
  private _onCloseClick;
29
31
  protected render(): import("lit").TemplateResult<1>;
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","names":[],"sources":["../src/panel/panel.ts"],"mappings":";;;;KAgBY,mBAAmB;KACnB,eAAe;KACf,yBAAyB;KACzB,oBAAoB;KACpB,mBAAmB;KACnB,kBAAkB;UAEb;EACf,QAAQ;EACR,OAAO;;cAII,qBAAqB;EACY;EACyB,aAAa;EACrD;;EAEe;EAChB;EACwB;EACS,mBAAmB;EACf,SAAS;;EAEjB;UAEjD;UAYA;YAWW,wBAAM;SA6BT,sBAAM;;QA2FhB;YACI;IACR,cAAc;;;UAID;EACf,oBAAoB,gBAAgB,sBAClC,MAAM,GACN,WAAW,MAAM,cAAc,OAAO,qBAAqB,aAC3D,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
1
+ {"version":3,"file":"panel.d.ts","names":[],"sources":["../src/panel/panel.ts"],"mappings":";;;;KAgBY,mBAAmB;KACnB,eAAe;KACf,yBAAyB;KACzB,oBAAoB;KACpB,mBAAmB;KACnB,kBAAkB;UAEb;EACf,QAAQ;EACR,OAAO;;cAII,qBAAqB;EACY;EACyB,aAAa;EACrD;;EAEe;EAChB;EACwB;EACS,mBAAmB;EACf,SAAS;;EAEjB;;EAED;UAEhD;UAYA;YAWW,wBAAM;SA8BT,sBAAM;;QAmHhB;YACI;IACR,cAAc;;;UAID;EACf,oBAAoB,gBAAgB,sBAClC,MAAM,GACN,WAAW,MAAM,cAAc,OAAO,qBAAqB,aAC3D,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
package/dist/panel.js CHANGED
@@ -16,6 +16,7 @@ let PanelElement = class PanelElement extends LitElement {
16
16
  this.toggleInteraction = `implicit`;
17
17
  this.variant = `titlebar`;
18
18
  this.hideTitlebar = false;
19
+ this.keepToolbar = false;
19
20
  }
20
21
  _onTitlebarToggle(event) {
21
22
  event.stopPropagation();
@@ -35,6 +36,7 @@ let PanelElement = class PanelElement extends LitElement {
35
36
  this.remove();
36
37
  }
37
38
  render() {
39
+ const showToolbar = this.keepToolbar || !this.collapsed;
38
40
  return html`
39
41
  ${this.hideTitlebar ? nothing : html`
40
42
  <ixfx-titlebar
@@ -49,7 +51,7 @@ let PanelElement = class PanelElement extends LitElement {
49
51
  @toggle=${this._onTitlebarToggle}
50
52
  @close=${this._onCloseClick}
51
53
  >
52
- <slot name="toolbar" slot="toolbar"></slot>
54
+ ${showToolbar ? html`<slot name="toolbar" slot="toolbar"></slot>` : nothing}
53
55
  </ixfx-titlebar>
54
56
  `}
55
57
 
@@ -149,6 +151,30 @@ let PanelElement = class PanelElement extends LitElement {
149
151
  :host([variant="midline"][orientation="vertical"]) .content-wrapper {
150
152
  background: transparent;
151
153
  }
154
+
155
+ /* === Tree variant: VS Code explorer / Outline style === */
156
+
157
+ :host([variant="tree"]) {
158
+ border: none !important;
159
+ border-radius: 0 !important;
160
+ background: transparent;
161
+ }
162
+
163
+ :host([variant="tree"]) .content-inner {
164
+ box-shadow: none;
165
+ background: transparent;
166
+ padding: 0;
167
+ }
168
+
169
+ :host([variant="tree"]) .content-wrapper {
170
+ background: transparent;
171
+ }
172
+
173
+ :host([variant="tree"][orientation="vertical"]) .content-inner {
174
+ width: max-content;
175
+ height: 100%;
176
+ transform: none;
177
+ }
152
178
  `];
153
179
  }
154
180
  };
@@ -184,6 +210,10 @@ __decorate([property({
184
210
  type: Boolean,
185
211
  attribute: `hide-titlebar`
186
212
  })], PanelElement.prototype, "hideTitlebar", void 0);
213
+ __decorate([property({
214
+ type: Boolean,
215
+ attribute: `keep-toolbar`
216
+ })], PanelElement.prototype, "keepToolbar", void 0);
187
217
  PanelElement = __decorate([safeCustomElement(`ixfx-panel`)], PanelElement);
188
218
  //#endregion
189
219
  export { PanelElement };
package/dist/panel.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","names":["customElement"],"sources":["../src/panel/panel.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type {\n TitlebarCloseEvent,\n TitlebarOrientation,\n TitlebarToggleDetail,\n TitlebarToggleEvent,\n TitlebarToggleInteraction,\n TitlebarVariant,\n} from '../titlebar/titlebar.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../titlebar/titlebar.js';\n\n/** Backwards-compatible aliases: canonical types now live in `../titlebar/titlebar.js`. */\nexport type PanelOrientation = TitlebarOrientation;\nexport type PanelVariant = TitlebarVariant;\nexport type PanelToggleInteraction = TitlebarToggleInteraction;\nexport type PanelToggleDetail = TitlebarToggleDetail;\nexport type PanelToggleEvent = TitlebarToggleEvent;\nexport type PanelCloseEvent = TitlebarCloseEvent;\n\nexport interface PanelElementEventMap {\n toggle: PanelToggleEvent;\n close: PanelCloseEvent;\n}\n\n@customElement(`ixfx-panel`)\nexport class PanelElement extends LitElement {\n @property({ type: Boolean, reflect: true }) collapsed = false;\n @property({ type: String, attribute: `orientation`, reflect: true }) orientation: PanelOrientation = `horizontal`;\n @property({ type: Boolean }) closable = false;\n /** Show the collapse/expand caret and enable toggle behaviour. Defaults to true so existing panels stay collapsible. */\n @property({ type: Boolean, reflect: true }) collapsible = true;\n @property({ type: String }) title = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ type: String, attribute: `toggle-interaction` }) toggleInteraction: PanelToggleInteraction = `implicit`;\n @property({ type: String, attribute: `variant`, reflect: true }) variant: PanelVariant = `titlebar`;\n /** Suppress the titlebar entirely (content-only chrome, e.g. dock tabbed mode). */\n @property({ type: Boolean, attribute: `hide-titlebar` }) hideTitlebar = false;\n\n private _onTitlebarToggle(event: TitlebarToggleEvent) {\n event.stopPropagation();\n this.collapsed = event.detail.collapsed;\n this.dispatchEvent(\n new CustomEvent<PanelToggleDetail>(`toggle`, {\n detail: { collapsed: this.collapsed },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _onCloseClick(event: Event) {\n event.stopPropagation();\n this.dispatchEvent(\n new CustomEvent<void>(`close`, {\n bubbles: true,\n composed: true,\n }),\n );\n this.remove();\n }\n\n protected override render() {\n return html`\n ${this.hideTitlebar\n ? nothing\n : html`\n <ixfx-titlebar\n .title=${this.title}\n .iconName=${this.iconName}\n .orientation=${this.orientation}\n .variant=${this.variant}\n .closable=${this.closable}\n .collapsible=${this.collapsible}\n .collapsed=${this.collapsed}\n .toggleInteraction=${this.toggleInteraction}\n @toggle=${this._onTitlebarToggle}\n @close=${this._onCloseClick}\n >\n <slot name=\"toolbar\" slot=\"toolbar\"></slot>\n </ixfx-titlebar>\n `}\n\n <div class=\"content-wrapper\" ?expanded=${!this.collapsed}>\n <div class=\"content-inner\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n\n static override styles = [themeFallbacks, css`\n :host {\n display: flex;\n flex-direction: column;\n background: var(--surface-3);\n border: var(--border-subtle);\n border-radius: var(--radius-m);\n overflow: hidden;\n box-sizing: border-box;\n }\n\n :host([orientation=\"vertical\"]) {\n flex-direction: row;\n align-self: flex-start;\n min-width: 0 !important;\n flex-shrink: 1;\n }\n\n ixfx-titlebar {\n flex-shrink: 0;\n }\n\n .content-wrapper {\n interpolate-size: allow-keywords;\n overflow: hidden;\n height: 0;\n transition: height var(--transition, 0.2s ease-out);\n background: var(--surface-3);\n }\n\n .content-wrapper[expanded] {\n height: auto;\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper {\n height: unset;\n width: 0;\n transition: width var(--transition, 0.2s ease-out);\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper[expanded] {\n width: auto;\n }\n\n .content-inner {\n box-shadow: var(--deboss-3);\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n padding: var(--space-s);\n transform: translateY(-100%);\n transition: transform var(--transition, 0.2s ease-out);\n }\n\n .content-wrapper[expanded] .content-inner {\n transform: translateY(0);\n }\n\n :host([orientation=\"vertical\"]) .content-inner {\n width: max-content;\n height: 100%;\n transform: translateX(-100%);\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper[expanded] .content-inner {\n transform: translateX(0);\n }\n\n /* === Midline variant (host + content only; bar chrome lives in ixfx-titlebar) === */\n\n :host([variant=\"midline\"]) {\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n\n :host([variant=\"midline\"]) .content-inner {\n box-shadow: none;\n background: var(--surface-3);\n }\n\n :host([variant=\"midline\"]) .content-wrapper {\n background: transparent;\n }\n\n :host([variant=\"midline\"][orientation=\"vertical\"]) .content-wrapper {\n background: transparent;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-panel': PanelElement;\n }\n}\n\nexport interface PanelElement {\n addEventListener: (<K extends keyof PanelElementEventMap>(\n type: K,\n listener: (this: PanelElement, event: PanelElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":";;;;;;AA6BO,IAAM,eAAN,MAAM,qBAAqB,WAAW;;;EACa,KAAA,YAAA;EAC6C,KAAA,cAAA;EAC7D,KAAA,WAAA;EAEkB,KAAA,cAAA;EACtB,KAAA,QAAA;EAC2B,KAAA,WAAA;EAC0C,KAAA,oBAAA;EAChB,KAAA,UAAA;EAEjB,KAAA,eAAA;;CAExE,kBAA0B,OAA4B;EACpD,MAAM,gBAAgB;EACtB,KAAK,YAAY,MAAM,OAAO;EAC9B,KAAK,cACH,IAAI,YAA+B,UAAU;GAC3C,QAAQ,EAAE,WAAW,KAAK,UAAU;GACpC,SAAS;GACT,UAAU;EACZ,CAAC,CACH;CACF;CAEA,cAAsB,OAAc;EAClC,MAAM,gBAAgB;EACtB,KAAK,cACH,IAAI,YAAkB,SAAS;GAC7B,SAAS;GACT,UAAU;EACZ,CAAC,CACH;EACA,KAAK,OAAO;CACd;CAEA,SAA4B;EAC1B,OAAO,IAAI;QACP,KAAK,eACH,UACA,IAAI;;mBAEK,KAAK,MAAM;sBACR,KAAK,SAAS;yBACX,KAAK,YAAY;qBACrB,KAAK,QAAQ;sBACZ,KAAK,SAAS;yBACX,KAAK,YAAY;uBACnB,KAAK,UAAU;+BACP,KAAK,kBAAkB;oBAClC,KAAK,kBAAkB;mBACxB,KAAK,cAAc;;;;UAI5B;;+CAEqC,CAAC,KAAK,UAAU;;;;;;CAM7D;;EAEyB,KAAA,SAAA,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwF5C;;AACH;AAzJG,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,aAAA,KAAA,CAAA;AACzC,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;AAClE,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;AAE1B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;AACzC,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAY,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;AACjD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAqB,CAAC,CAAA,GAAA,aAAA,WAAA,qBAAA,KAAA,CAAA;AAC1D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAW,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,WAAA,KAAA,CAAA;AAE9D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAgB,CAAC,CAAA,GAAA,aAAA,WAAA,gBAAA,KAAA,CAAA;AAZxDA,eAAAA,WAAAA,CAAAA,kBAAc,YAAY,CAAA,GAAA,YAAA"}
1
+ {"version":3,"file":"panel.js","names":["customElement"],"sources":["../src/panel/panel.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type {\n TitlebarCloseEvent,\n TitlebarOrientation,\n TitlebarToggleDetail,\n TitlebarToggleEvent,\n TitlebarToggleInteraction,\n TitlebarVariant,\n} from '../titlebar/titlebar.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../titlebar/titlebar.js';\n\n/** Backwards-compatible aliases: canonical types now live in `../titlebar/titlebar.js`. */\nexport type PanelOrientation = TitlebarOrientation;\nexport type PanelVariant = TitlebarVariant;\nexport type PanelToggleInteraction = TitlebarToggleInteraction;\nexport type PanelToggleDetail = TitlebarToggleDetail;\nexport type PanelToggleEvent = TitlebarToggleEvent;\nexport type PanelCloseEvent = TitlebarCloseEvent;\n\nexport interface PanelElementEventMap {\n toggle: PanelToggleEvent;\n close: PanelCloseEvent;\n}\n\n@customElement(`ixfx-panel`)\nexport class PanelElement extends LitElement {\n @property({ type: Boolean, reflect: true }) collapsed = false;\n @property({ type: String, attribute: `orientation`, reflect: true }) orientation: PanelOrientation = `horizontal`;\n @property({ type: Boolean }) closable = false;\n /** Show the collapse/expand caret and enable toggle behaviour. Defaults to true so existing panels stay collapsible. */\n @property({ type: Boolean, reflect: true }) collapsible = true;\n @property({ type: String }) title = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ type: String, attribute: `toggle-interaction` }) toggleInteraction: PanelToggleInteraction = `implicit`;\n @property({ type: String, attribute: `variant`, reflect: true }) variant: PanelVariant = `titlebar`;\n /** Suppress the titlebar entirely (content-only chrome, e.g. dock tabbed mode). */\n @property({ type: Boolean, attribute: `hide-titlebar` }) hideTitlebar = false;\n /** Keep the toolbar visible even when the panel is collapsed. */\n @property({ type: Boolean, attribute: `keep-toolbar` }) keepToolbar = false;\n\n private _onTitlebarToggle(event: TitlebarToggleEvent) {\n event.stopPropagation();\n this.collapsed = event.detail.collapsed;\n this.dispatchEvent(\n new CustomEvent<PanelToggleDetail>(`toggle`, {\n detail: { collapsed: this.collapsed },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _onCloseClick(event: Event) {\n event.stopPropagation();\n this.dispatchEvent(\n new CustomEvent<void>(`close`, {\n bubbles: true,\n composed: true,\n }),\n );\n this.remove();\n }\n\n protected override render() {\n const showToolbar = this.keepToolbar || !this.collapsed;\n return html`\n ${this.hideTitlebar\n ? nothing\n : html`\n <ixfx-titlebar\n .title=${this.title}\n .iconName=${this.iconName}\n .orientation=${this.orientation}\n .variant=${this.variant}\n .closable=${this.closable}\n .collapsible=${this.collapsible}\n .collapsed=${this.collapsed}\n .toggleInteraction=${this.toggleInteraction}\n @toggle=${this._onTitlebarToggle}\n @close=${this._onCloseClick}\n >\n ${showToolbar ? html`<slot name=\"toolbar\" slot=\"toolbar\"></slot>` : nothing}\n </ixfx-titlebar>\n `}\n\n <div class=\"content-wrapper\" ?expanded=${!this.collapsed}>\n <div class=\"content-inner\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n\n static override styles = [themeFallbacks, css`\n :host {\n display: flex;\n flex-direction: column;\n background: var(--surface-3);\n border: var(--border-subtle);\n border-radius: var(--radius-m);\n overflow: hidden;\n box-sizing: border-box;\n }\n\n :host([orientation=\"vertical\"]) {\n flex-direction: row;\n align-self: flex-start;\n min-width: 0 !important;\n flex-shrink: 1;\n }\n\n ixfx-titlebar {\n flex-shrink: 0;\n }\n\n .content-wrapper {\n interpolate-size: allow-keywords;\n overflow: hidden;\n height: 0;\n transition: height var(--transition, 0.2s ease-out);\n background: var(--surface-3);\n }\n\n .content-wrapper[expanded] {\n height: auto;\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper {\n height: unset;\n width: 0;\n transition: width var(--transition, 0.2s ease-out);\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper[expanded] {\n width: auto;\n }\n\n .content-inner {\n box-shadow: var(--deboss-3);\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n padding: var(--space-s);\n transform: translateY(-100%);\n transition: transform var(--transition, 0.2s ease-out);\n }\n\n .content-wrapper[expanded] .content-inner {\n transform: translateY(0);\n }\n\n :host([orientation=\"vertical\"]) .content-inner {\n width: max-content;\n height: 100%;\n transform: translateX(-100%);\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper[expanded] .content-inner {\n transform: translateX(0);\n }\n\n /* === Midline variant (host + content only; bar chrome lives in ixfx-titlebar) === */\n\n :host([variant=\"midline\"]) {\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n\n :host([variant=\"midline\"]) .content-inner {\n box-shadow: none;\n background: var(--surface-3);\n }\n\n :host([variant=\"midline\"]) .content-wrapper {\n background: transparent;\n }\n\n :host([variant=\"midline\"][orientation=\"vertical\"]) .content-wrapper {\n background: transparent;\n }\n\n /* === Tree variant: VS Code explorer / Outline style === */\n\n :host([variant=\"tree\"]) {\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n\n :host([variant=\"tree\"]) .content-inner {\n box-shadow: none;\n background: transparent;\n padding: 0;\n }\n\n :host([variant=\"tree\"]) .content-wrapper {\n background: transparent;\n }\n\n :host([variant=\"tree\"][orientation=\"vertical\"]) .content-inner {\n width: max-content;\n height: 100%;\n transform: none;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-panel': PanelElement;\n }\n}\n\nexport interface PanelElement {\n addEventListener: (<K extends keyof PanelElementEventMap>(\n type: K,\n listener: (this: PanelElement, event: PanelElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":";;;;;;AA6BO,IAAM,eAAN,MAAM,qBAAqB,WAAW;;;EACa,KAAA,YAAA;EAC6C,KAAA,cAAA;EAC7D,KAAA,WAAA;EAEkB,KAAA,cAAA;EACtB,KAAA,QAAA;EAC2B,KAAA,WAAA;EAC0C,KAAA,oBAAA;EAChB,KAAA,UAAA;EAEjB,KAAA,eAAA;EAEF,KAAA,cAAA;;CAEtE,kBAA0B,OAA4B;EACpD,MAAM,gBAAgB;EACtB,KAAK,YAAY,MAAM,OAAO;EAC9B,KAAK,cACH,IAAI,YAA+B,UAAU;GAC3C,QAAQ,EAAE,WAAW,KAAK,UAAU;GACpC,SAAS;GACT,UAAU;EACZ,CAAC,CACH;CACF;CAEA,cAAsB,OAAc;EAClC,MAAM,gBAAgB;EACtB,KAAK,cACH,IAAI,YAAkB,SAAS;GAC7B,SAAS;GACT,UAAU;EACZ,CAAC,CACH;EACA,KAAK,OAAO;CACd;CAEA,SAA4B;EAC1B,MAAM,cAAc,KAAK,eAAe,CAAC,KAAK;EAC9C,OAAO,IAAI;QACP,KAAK,eACH,UACA,IAAI;;mBAEK,KAAK,MAAM;sBACR,KAAK,SAAS;yBACX,KAAK,YAAY;qBACrB,KAAK,QAAQ;sBACZ,KAAK,SAAS;yBACX,KAAK,YAAY;uBACnB,KAAK,UAAU;+BACP,KAAK,kBAAkB;oBAClC,KAAK,kBAAkB;mBACxB,KAAK,cAAc;;YAE1B,cAAc,IAAI,gDAAgD,QAAQ;;UAE5E;;+CAEqC,CAAC,KAAK,UAAU;;;;;;CAM7D;;EAEyB,KAAA,SAAA,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgH5C;;AACH;AApLG,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,aAAA,KAAA,CAAA;AACzC,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;AAClE,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;AAE1B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;AACzC,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAY,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;AACjD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAqB,CAAC,CAAA,GAAA,aAAA,WAAA,qBAAA,KAAA,CAAA;AAC1D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAW,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,WAAA,KAAA,CAAA;AAE9D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAgB,CAAC,CAAA,GAAA,aAAA,WAAA,gBAAA,KAAA,CAAA;AAEtD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAe,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;AAdvDA,eAAAA,WAAAA,CAAAA,kBAAc,YAAY,CAAA,GAAA,YAAA"}
package/dist/plots.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { C as ColourMapConfig, D as computeColour, E as applyAgeModification, O as parseColourScaleAttr, S as PlotDataSeriesOptions, T as ColourResult, _ as PlotSingleAxisPointerMoveDetail, a as PlotHistogramBucketClickDetail, b as SingleAxisDrawStyle, c as PlotHistogramOrientation, d as PlotMultiAxisDataPointClickDetail, f as PlotMultiAxisDataPointClickEvent, g as PlotSingleAxisElementEventMap, h as PlotSingleAxis, i as PlotHistogram, k as readBaseColour, l as PlotHistogramValueTooltips, m as PlotMultiAxisLayout, n as XyAgeStyle, o as PlotHistogramBucketClickEvent, p as PlotMultiAxisElementEventMap, r as XyDrawStyle, s as PlotHistogramElementEventMap, t as PlotXyAxis, u as PlotMultiAxis, v as PlotSingleAxisPointerMoveEvent, w as ColourMode, x as PlotDataSeries, y as SingleAxisAgeStyle } from "./xy-axis-5KhVTNoX.js";
2
- export { ColourMapConfig, ColourMode, ColourResult, PlotDataSeries, PlotDataSeriesOptions, PlotHistogram, PlotHistogramBucketClickDetail, PlotHistogramBucketClickEvent, PlotHistogramElementEventMap, PlotHistogramOrientation, PlotHistogramValueTooltips, PlotMultiAxis, PlotMultiAxisDataPointClickDetail, PlotMultiAxisDataPointClickEvent, PlotMultiAxisElementEventMap, PlotMultiAxisLayout, PlotSingleAxis, PlotSingleAxisElementEventMap, PlotSingleAxisPointerMoveDetail, PlotSingleAxisPointerMoveEvent, PlotXyAxis, SingleAxisAgeStyle, SingleAxisDrawStyle, XyAgeStyle, XyDrawStyle, applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour };
1
+ import { A as readBaseColour, C as PlotDataSeriesOptions, D as applyAgeModification, E as ColourResult, O as computeColour, S as PlotDataSeries, T as ColourMode, _ as PlotSingleAxisElementEventMap, a as PlotHistogramBucketClickDetail, b as SingleAxisAgeStyle, c as PlotHistogramInteractionMode, d as PlotMultiAxis, f as PlotMultiAxisDataPointClickDetail, g as PlotSingleAxis, h as PlotMultiAxisLayout, i as PlotHistogram, k as parseColourScaleAttr, l as PlotHistogramOrientation, m as PlotMultiAxisElementEventMap, n as XyAgeStyle, o as PlotHistogramBucketClickEvent, p as PlotMultiAxisDataPointClickEvent, r as XyDrawStyle, s as PlotHistogramElementEventMap, t as PlotXyAxis, u as PlotHistogramValueTooltips, v as PlotSingleAxisPointerMoveDetail, w as ColourMapConfig, x as SingleAxisDrawStyle, y as PlotSingleAxisPointerMoveEvent } from "./xy-axis-BfP9hKLj.js";
2
+ export { ColourMapConfig, ColourMode, ColourResult, PlotDataSeries, PlotDataSeriesOptions, PlotHistogram, PlotHistogramBucketClickDetail, PlotHistogramBucketClickEvent, PlotHistogramElementEventMap, PlotHistogramInteractionMode, PlotHistogramOrientation, PlotHistogramValueTooltips, PlotMultiAxis, PlotMultiAxisDataPointClickDetail, PlotMultiAxisDataPointClickEvent, PlotMultiAxisElementEventMap, PlotMultiAxisLayout, PlotSingleAxis, PlotSingleAxisElementEventMap, PlotSingleAxisPointerMoveDetail, PlotSingleAxisPointerMoveEvent, PlotXyAxis, SingleAxisAgeStyle, SingleAxisDrawStyle, XyAgeStyle, XyDrawStyle, applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour };
package/dist/plots.js CHANGED
@@ -1,2 +1,2 @@
1
- import { c as computeColour, i as PlotMultiAxis, l as parseColourScaleAttr, n as PlotSingleAxis, o as PlotDataSeries, r as PlotHistogram, s as applyAgeModification, t as PlotXyAxis, u as readBaseColour } from "./xy-axis-VrX8dmvS.js";
1
+ import { c as computeColour, i as PlotMultiAxis, l as parseColourScaleAttr, n as PlotSingleAxis, o as PlotDataSeries, r as PlotHistogram, s as applyAgeModification, t as PlotXyAxis, u as readBaseColour } from "./xy-axis-DzM1brBZ.js";
2
2
  export { PlotDataSeries, PlotHistogram, PlotMultiAxis, PlotSingleAxis, PlotXyAxis, applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour };
@@ -2,7 +2,7 @@ import "./icon-CDGprSdE.js";
2
2
  import { LitElement } from "lit";
3
3
  //#region src/titlebar/titlebar.d.ts
4
4
  type TitlebarOrientation = `horizontal` | `vertical`;
5
- type TitlebarVariant = `titlebar` | `midline`;
5
+ type TitlebarVariant = `titlebar` | `midline` | `tree`;
6
6
  type TitlebarToggleInteraction = `implicit` | `explicit` | `disabled`;
7
7
  interface TitlebarToggleDetail {
8
8
  readonly collapsed: boolean;
@@ -47,4 +47,4 @@ interface TitlebarElement {
47
47
  }
48
48
  //#endregion
49
49
  export { TitlebarToggleDetail as a, TitlebarVariant as c, TitlebarOrientation as i, TitlebarElement as n, TitlebarToggleEvent as o, TitlebarElementEventMap as r, TitlebarToggleInteraction as s, TitlebarCloseEvent as t };
50
- //# sourceMappingURL=titlebar-Bj5pfdw_.d.ts.map
50
+ //# sourceMappingURL=titlebar-YQ-jVQoS.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"titlebar-Bj5pfdw_.d.ts","names":[],"sources":["../src/titlebar/titlebar.ts"],"mappings":";;;KAOY;KACA;KACA;UAEK;WACN;;KAGC,sBAAsB,YAAY;KAClC,qBAAqB;UAEhB;EACf,QAAQ;EACR,OAAO;;;;;;;;;;cAYI,wBAAwB;EACP;EACwB;EACiB,aAAa;EACjB,SAAS;EAC7C;;EAEe;EACA;EACiB,mBAAmB;UAExE;UAaA;UASA;YAIW,wBAAM;SAoDT,sBAAM;;QAmNhB;YACI;IACR,iBAAiB;;;UAIJ;EACf,oBAAoB,gBAAgB,yBAClC,MAAM,GACN,WAAW,MAAM,iBAAiB,OAAO,wBAAwB,aACjE,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
1
+ {"version":3,"file":"titlebar-YQ-jVQoS.d.ts","names":[],"sources":["../src/titlebar/titlebar.ts"],"mappings":";;;KAOY;KACA;KACA;UAEK;WACN;;KAGC,sBAAsB,YAAY;KAClC,qBAAqB;UAEhB;EACf,QAAQ;EACR,OAAO;;;;;;;;;;cAYI,wBAAwB;EACP;EACwB;EACiB,aAAa;EACjB,SAAS;EAC7C;;EAEe;EACA;EACiB,mBAAmB;UAExE;UAaA;UASA;YAIW,wBAAM;SAkET,sBAAM;;QA0RhB;YACI;IACR,iBAAiB;;;UAIJ;EACf,oBAAoB,gBAAgB,yBAClC,MAAM,GACN,WAAW,MAAM,iBAAiB,OAAO,wBAAwB,aACjE,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
@@ -1,2 +1,2 @@
1
- import { a as TitlebarToggleDetail, c as TitlebarVariant, i as TitlebarOrientation, n as TitlebarElement, o as TitlebarToggleEvent, r as TitlebarElementEventMap, s as TitlebarToggleInteraction, t as TitlebarCloseEvent } from "./titlebar-Bj5pfdw_.js";
1
+ import { a as TitlebarToggleDetail, c as TitlebarVariant, i as TitlebarOrientation, n as TitlebarElement, o as TitlebarToggleEvent, r as TitlebarElementEventMap, s as TitlebarToggleInteraction, t as TitlebarCloseEvent } from "./titlebar-YQ-jVQoS.js";
2
2
  export { TitlebarCloseEvent, TitlebarElement, TitlebarElementEventMap, TitlebarOrientation, TitlebarToggleDetail, TitlebarToggleEvent, TitlebarToggleInteraction, TitlebarVariant };
package/dist/titlebar.js CHANGED
@@ -40,12 +40,23 @@ let TitlebarElement = class TitlebarElement extends LitElement {
40
40
  const showCaret = this.collapsible && this.toggleInteraction !== `disabled`;
41
41
  const implicitToggle = this.collapsible && this.toggleInteraction === `implicit`;
42
42
  const caretRotation = isVertical ? this.collapsed ? `` : `-90deg` : this.collapsed ? `-90deg` : ``;
43
+ const treeVariant = this.variant === `tree`;
43
44
  return html`
44
45
  <div
45
46
  class="bar"
46
47
  role="toolbar"
47
48
  @click=${implicitToggle ? this._onToggleClick : nothing}
48
49
  >
50
+ ${treeVariant && showCaret ? html`
51
+ <button
52
+ class="caret-btn"
53
+ type="button"
54
+ aria-label=${this.collapsed ? `Expand panel` : `Collapse panel`}
55
+ @click=${this._onToggleClick}
56
+ >
57
+ <ixfx-icon name=${caretIcon} prominence .rotate=${caretRotation.length > 0 ? caretRotation : nothing}></ixfx-icon>
58
+ </button>
59
+ ` : nothing}
49
60
  <div class="title-text-wrapper">
50
61
  ${this.iconName ? html`<ixfx-icon class="title-icon" name=${this.iconName}></ixfx-icon>` : nothing}
51
62
  <span class="title-text">${this.title}</span>
@@ -63,7 +74,7 @@ let TitlebarElement = class TitlebarElement extends LitElement {
63
74
  <ixfx-icon name="close"></ixfx-icon>
64
75
  </button>
65
76
  ` : nothing}
66
- ${showCaret ? html`
77
+ ${!treeVariant && showCaret ? html`
67
78
  <button
68
79
  class="caret-btn"
69
80
  type="button"
@@ -286,6 +297,77 @@ let TitlebarElement = class TitlebarElement extends LitElement {
286
297
  -1px 0 0 var(--surface-5),
287
298
  1px 0 0 var(--surface-1);
288
299
  }
300
+
301
+ /* === Tree variant: VS Code explorer / Outline style === */
302
+ :host([variant="tree"]) .bar {
303
+ background: transparent;
304
+ padding: 0 var(--space-xs);
305
+ min-height: unset;
306
+ gap: var(--space-xs);
307
+ }
308
+
309
+ :host([variant="tree"][orientation="vertical"]) .bar {
310
+ padding: var(--space-xs) 0;
311
+ flex-direction: column;
312
+ min-width: unset;
313
+ writing-mode: horizontal-tb;
314
+ }
315
+
316
+ :host([variant="tree"]) .title-text-wrapper {
317
+ display: inline-flex;
318
+ align-items: center;
319
+ gap: var(--space-xs);
320
+ padding: 0;
321
+ background: transparent;
322
+ }
323
+
324
+ :host([variant="tree"]) .title-icon {
325
+ background: transparent;
326
+ flex-shrink: 0;
327
+ }
328
+
329
+ :host([variant="tree"]) .title-text {
330
+ font-weight: normal;
331
+ color: var(--surface-3-text);
332
+ padding: 0;
333
+ background: transparent;
334
+ box-shadow: none;
335
+ flex: unset;
336
+ width: auto;
337
+ white-space: nowrap;
338
+ }
339
+
340
+ :host([variant="tree"][orientation="vertical"]) .title-text {
341
+ writing-mode: vertical-rl;
342
+ transform: rotate(180deg);
343
+ padding: 0;
344
+ }
345
+
346
+ :host([variant="tree"]) .caret-btn {
347
+ background: transparent;
348
+ opacity: var(--prominence-idle-opacity);
349
+ padding: 0;
350
+ }
351
+
352
+ :host([variant="tree"]) .caret-btn:hover {
353
+ background: transparent;
354
+ opacity: var(--prominence-tickled-opacity);
355
+ }
356
+
357
+ :host([variant="tree"]) .toolbar {
358
+ margin-left: auto;
359
+ }
360
+
361
+ :host([variant="tree"][orientation="vertical"]) .toolbar {
362
+ flex-direction: row;
363
+ margin-left: 0;
364
+ margin-top: auto;
365
+ }
366
+
367
+ :host([variant="tree"]) ixfx-icon {
368
+ width: 1em;
369
+ height: 1em;
370
+ }
289
371
  `];
290
372
  }
291
373
  };