@fusion.dev/helix 0.204.1 → 0.205.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31653,6 +31653,14 @@
31653
31653
  "name": "HelixHeadlessChatMessage",
31654
31654
  "module": "src/chat/message/chat-message.ts"
31655
31655
  }
31656
+ },
31657
+ {
31658
+ "description": "The box around the `work` slot, above the content.",
31659
+ "name": "work",
31660
+ "inheritedFrom": {
31661
+ "name": "HelixHeadlessChatMessage",
31662
+ "module": "src/chat/message/chat-message.ts"
31663
+ }
31656
31664
  }
31657
31665
  ],
31658
31666
  "slots": [
@@ -31695,6 +31703,14 @@
31695
31703
  "name": "HelixHeadlessChatMessage",
31696
31704
  "module": "src/chat/message/chat-message.ts"
31697
31705
  }
31706
+ },
31707
+ {
31708
+ "description": "What an agent did to arrive at the turn, such as a `Log` of its steps, above the content. A screen reader hears the turn without it.",
31709
+ "name": "work",
31710
+ "inheritedFrom": {
31711
+ "name": "HelixHeadlessChatMessage",
31712
+ "module": "src/chat/message/chat-message.ts"
31713
+ }
31698
31714
  }
31699
31715
  ],
31700
31716
  "members": [
@@ -32850,6 +32866,14 @@
32850
32866
  "module": "src/chat/root/chat-root.ts"
32851
32867
  }
32852
32868
  },
32869
+ {
32870
+ "description": "The box around a turn's `work`, for a turn from `turns`, which has none.",
32871
+ "name": "message-work",
32872
+ "inheritedFrom": {
32873
+ "name": "HelixHeadlessChat",
32874
+ "module": "src/chat/root/chat-root.ts"
32875
+ }
32876
+ },
32853
32877
  {
32854
32878
  "description": "The control shown while the user is scrolled away from the bottom.",
32855
32879
  "name": "resume",
@@ -34917,6 +34941,10 @@
34917
34941
  "min": 420,
34918
34942
  "slug": "reply-with-steps"
34919
34943
  },
34944
+ {
34945
+ "description": "An agent's answer with the work it did to reach it, kept as a log above the reply.",
34946
+ "slug": "reply-with-work"
34947
+ },
34920
34948
  {
34921
34949
  "description": "A drawer from the trailing edge, with the conversation filling the panel.",
34922
34950
  "min": 420,
@@ -124400,6 +124428,14 @@
124400
124428
  "module": "src/log/line/log-line.ts"
124401
124429
  }
124402
124430
  },
124431
+ {
124432
+ "description": "The row of a line that belongs to a step, which the styled tier insets under the step's heading where there is no number.",
124433
+ "name": "line-grouped",
124434
+ "inheritedFrom": {
124435
+ "name": "HelixHeadlessLogLine",
124436
+ "module": "src/log/line/log-line.ts"
124437
+ }
124438
+ },
124403
124439
  {
124404
124440
  "description": "The row of a line `mark-lines` names on the log.",
124405
124441
  "name": "line-marked",
@@ -124827,6 +124863,16 @@
124827
124863
  "module": "src/helix-element/helix-element.ts"
124828
124864
  }
124829
124865
  },
124866
+ {
124867
+ "kind": "field",
124868
+ "name": "separation",
124869
+ "type": {
124870
+ "text": "'outlined' | 'plain' | undefined"
124871
+ },
124872
+ "description": "How the log is set apart from what is around it.\n\n- `outlined`, the resting look, is a box with an edge and a fill of its\n own, which scrolls after `--log-max-block-size`.\n- `plain` has no edge, no fill, no inset and no height of its own: the\n lines start where the text around them does and the log grows with\n them. For a log inside something that already frames it, such as an\n agent's work in a chat turn's `work` slot.\n\nBoth are writable, so a page can say which it means rather than relying\non the absence of an attribute.",
124873
+ "attribute": "separation",
124874
+ "reflects": true
124875
+ },
124830
124876
  {
124831
124877
  "kind": "field",
124832
124878
  "name": "words",
@@ -125372,6 +125418,20 @@
125372
125418
  "module": "src/log/root/log-root.ts"
125373
125419
  }
125374
125420
  },
125421
+ {
125422
+ "kind": "field",
125423
+ "name": "quiet",
125424
+ "type": {
125425
+ "text": "boolean"
125426
+ },
125427
+ "default": "false",
125428
+ "description": "Whether the log says nothing to a screen reader as lines arrive, steps\nfinish, or the run ends. For a log inside something that speaks for it,\nsuch as an agent's work in a chat turn, which the turn announces once it\nsettles.",
125429
+ "attribute": "quiet",
125430
+ "inheritedFrom": {
125431
+ "name": "HelixHeadlessLog",
125432
+ "module": "src/log/root/log-root.ts"
125433
+ }
125434
+ },
125375
125435
  {
125376
125436
  "kind": "field",
125377
125437
  "name": "resumeLabel",
@@ -126922,50 +126982,15 @@
126922
126982
  }
126923
126983
  }
126924
126984
  ],
126925
- "superclass": {
126926
- "name": "HelixHeadlessLog",
126927
- "package": "@fusion.dev/helix-headless/log"
126928
- },
126929
- "summary": "Output that arrives while you watch it, such as a CI run, a deployment, or a build, in a box that follows the newest line.",
126930
- "helix": {
126931
- "category": "feedback",
126932
- "since": "0.200.0",
126933
- "status": "experimental",
126934
- "documentation": "https://fusion.dev/helix/components/log",
126935
- "tier": "styled",
126936
- "group": "Log",
126937
- "part": "Root",
126938
- "examples": [
126939
- {
126940
- "description": "A deployment's output with numbered lines, its steps folded, and the step that failed open.",
126941
- "slug": "preview"
126942
- },
126943
- {
126944
- "description": "A search field in the toolbar that shows only the lines holding what you type, and marks each match.",
126945
- "slug": "search"
126946
- },
126947
- {
126948
- "description": "Lines selected by pressing their numbers, a range with Shift, with the address following the selection.",
126949
- "slug": "selecting"
126950
- },
126951
- {
126952
- "description": "Each line's time into the run, numbers that link to their line, and two lines marked.",
126953
- "slug": "timestamps"
126954
- },
126955
- {
126956
- "description": "A Vercel build log read with its own format: each phase a step, timed from its lines, with its warnings drawn apart.",
126957
- "slug": "vercel"
126958
- },
126959
- {
126960
- "description": "A CI run written to the log as it arrives, with its colors, a progress bar that stays one line, and its steps read off GitHub's markers.",
126961
- "slug": "written"
126962
- }
126963
- ],
126964
- "source": "helix/styled/src/log"
126965
- },
126966
- "tagName": "helix-log",
126967
- "customElement": true,
126968
126985
  "attributes": [
126986
+ {
126987
+ "name": "separation",
126988
+ "type": {
126989
+ "text": "'outlined' | 'plain' | undefined"
126990
+ },
126991
+ "description": "How the log is set apart from what is around it.\n\n- `outlined`, the resting look, is a box with an edge and a fill of its\n own, which scrolls after `--log-max-block-size`.\n- `plain` has no edge, no fill, no inset and no height of its own: the\n lines start where the text around them does and the log grows with\n them. For a log inside something that already frames it, such as an\n agent's work in a chat turn's `work` slot.\n\nBoth are writable, so a page can say which it means rather than relying\non the absence of an attribute.",
126992
+ "fieldName": "separation"
126993
+ },
126969
126994
  {
126970
126995
  "name": "empty-text",
126971
126996
  "type": {
@@ -127223,6 +127248,19 @@
127223
127248
  "module": "src/log/root/log-root.ts"
127224
127249
  }
127225
127250
  },
127251
+ {
127252
+ "name": "quiet",
127253
+ "type": {
127254
+ "text": "boolean"
127255
+ },
127256
+ "default": "false",
127257
+ "description": "Whether the log says nothing to a screen reader as lines arrive, steps\nfinish, or the run ends. For a log inside something that speaks for it,\nsuch as an agent's work in a chat turn, which the turn announces once it\nsettles.",
127258
+ "fieldName": "quiet",
127259
+ "inheritedFrom": {
127260
+ "name": "HelixHeadlessLog",
127261
+ "module": "src/log/root/log-root.ts"
127262
+ }
127263
+ },
127226
127264
  {
127227
127265
  "name": "resume-label",
127228
127266
  "type": {
@@ -127301,6 +127339,49 @@
127301
127339
  }
127302
127340
  }
127303
127341
  ],
127342
+ "superclass": {
127343
+ "name": "HelixHeadlessLog",
127344
+ "package": "@fusion.dev/helix-headless/log"
127345
+ },
127346
+ "summary": "Output that arrives while you watch it, such as a CI run, a deployment, or a build, in a box that follows the newest line.",
127347
+ "helix": {
127348
+ "category": "feedback",
127349
+ "since": "0.200.0",
127350
+ "status": "experimental",
127351
+ "documentation": "https://fusion.dev/helix/components/log",
127352
+ "tier": "styled",
127353
+ "group": "Log",
127354
+ "part": "Root",
127355
+ "examples": [
127356
+ {
127357
+ "description": "A deployment's output with numbered lines, its steps folded, and the step that failed open.",
127358
+ "slug": "preview"
127359
+ },
127360
+ {
127361
+ "description": "A search field in the toolbar that shows only the lines holding what you type, and marks each match.",
127362
+ "slug": "search"
127363
+ },
127364
+ {
127365
+ "description": "Lines selected by pressing their numbers, a range with Shift, with the address following the selection.",
127366
+ "slug": "selecting"
127367
+ },
127368
+ {
127369
+ "description": "Each line's time into the run, numbers that link to their line, and two lines marked.",
127370
+ "slug": "timestamps"
127371
+ },
127372
+ {
127373
+ "description": "A Vercel build log read with its own format: each phase a step, timed from its lines, with its warnings drawn apart.",
127374
+ "slug": "vercel"
127375
+ },
127376
+ {
127377
+ "description": "A CI run written to the log as it arrives, with its colors, a progress bar that stays one line, and its steps read off GitHub's markers.",
127378
+ "slug": "written"
127379
+ }
127380
+ ],
127381
+ "source": "helix/styled/src/log"
127382
+ },
127383
+ "tagName": "helix-log",
127384
+ "customElement": true,
127304
127385
  "slots": [
127305
127386
  {
127306
127387
  "description": "The lines, as `Log.Line` and `Log.Group` elements.",
@@ -127472,6 +127553,14 @@
127472
127553
  "module": "src/log/root/log-root.ts"
127473
127554
  }
127474
127555
  },
127556
+ {
127557
+ "description": "The row of a line drawn from data that belongs to a step.",
127558
+ "name": "line-grouped",
127559
+ "inheritedFrom": {
127560
+ "name": "HelixHeadlessLog",
127561
+ "module": "src/log/root/log-root.ts"
127562
+ }
127563
+ },
127475
127564
  {
127476
127565
  "description": "The row of a line drawn from data that `mark-lines` names.",
127477
127566
  "name": "line-marked",
@@ -178412,7 +178501,7 @@
178412
178501
  }
178413
178502
  }
178414
178503
  ],
178415
- "description": "Serves the frame side of a sandbox preview, in the document its `src` loads.\n\nCall it once from that document, after the elements your examples use are\ndefined. It does what the preview's protocol asks of a frame:\n\n- Posts `helix-preview-ready` once it listens.\n- Writes each `helix-preview-render` into the root: the markup, the\n stylesheet, the direction, the layout and the color mode. Scripts in the\n markup run.\n- Posts every console call, uncaught error, and unhandled promise rejection\n as `helix-preview-console`, an uncaught one marked `uncaught`, which marks\n the preview `failed`.\n- Posts `helix-preview-size` whenever what was drawn changes height.\n- Posts `helix-preview-press` on every press, so menus outside close.\n\nOnly a message from the parent window is rendered. Answers go to `*`, which\nis the only target a sandboxed frame can name, and carry only what the\nexample itself wrote."
178504
+ "description": "Serves the frame side of a sandbox preview, in the document its `src` loads.\n\nCall it once from that document, after the elements your examples use are\ndefined. It does what the preview's protocol asks of a frame:\n\n- Posts `helix-preview-ready` once it listens.\n- Writes each `helix-preview-render` into the root: the markup, the\n stylesheet, the direction, the layout and the color mode. Scripts in the\n markup run.\n- Posts every console call, uncaught error, and unhandled promise rejection\n as `helix-preview-console`, an uncaught one marked `uncaught`, which marks\n the preview `failed`.\n- Posts `helix-preview-rendered` after each render, which shows a frame\n the preview held transparent until it drew.\n- Posts `helix-preview-size` whenever what was drawn changes height.\n- Posts `helix-preview-press` on every press, so menus outside close.\n\nOnly a message from the parent window is rendered. Answers go to `*`, which\nis the only target a sandboxed frame can name, and carry only what the\nexample itself wrote."
178416
178505
  },
178417
178506
  {
178418
178507
  "kind": "function",
@@ -179151,6 +179240,54 @@
179151
179240
  "default": "new DelayController(this, { renders: false })",
179152
179241
  "description": "Holds a coalesced send, so only one is ever queued, and drops it on\ndisconnect.\n\n**It renders nothing**, so it asks for no update when its wait starts or\nends. One that did sent the source at once from that update, ahead of the\nwait, and the send at the end of the wait then cleared `failed` after the\nerror it should have reported."
179153
179242
  },
179243
+ {
179244
+ "kind": "field",
179245
+ "name": "patience",
179246
+ "privacy": "private",
179247
+ "readonly": true,
179248
+ "default": "new DelayController(this, { renders: false })",
179249
+ "description": "Shows a frame that was sent an example and never said it drew it."
179250
+ },
179251
+ {
179252
+ "kind": "field",
179253
+ "name": "blank",
179254
+ "type": {
179255
+ "text": "boolean"
179256
+ },
179257
+ "privacy": "private",
179258
+ "default": "false",
179259
+ "description": "Whether the frame has drawn nothing since its document started loading."
179260
+ },
179261
+ {
179262
+ "kind": "method",
179263
+ "name": "setBlank",
179264
+ "privacy": "private",
179265
+ "return": {
179266
+ "type": {
179267
+ "text": "void"
179268
+ }
179269
+ },
179270
+ "parameters": [
179271
+ {
179272
+ "name": "on",
179273
+ "type": {
179274
+ "text": "boolean"
179275
+ }
179276
+ }
179277
+ ],
179278
+ "description": "Marks the frame `blank`, or shown."
179279
+ },
179280
+ {
179281
+ "kind": "method",
179282
+ "name": "drawn",
179283
+ "privacy": "private",
179284
+ "return": {
179285
+ "type": {
179286
+ "text": "void"
179287
+ }
179288
+ },
179289
+ "description": "The frame has drawn an example, so it is shown."
179290
+ },
179154
179291
  {
179155
179292
  "kind": "method",
179156
179293
  "name": "scheduleSend",
@@ -179755,6 +179892,10 @@
179755
179892
  }
179756
179893
  ],
179757
179894
  "cssStates": [
179895
+ {
179896
+ "description": "From the moment the frame's document starts loading until it has drawn an example. The styled tier keeps the frame transparent meanwhile, so a document that has not yet drawn in the page's color mode does not show as a white flash.",
179897
+ "name": "blank"
179898
+ },
179758
179899
  {
179759
179900
  "description": "Since the example threw an error it did not catch, until the next source is sent.",
179760
179901
  "name": "failed"
@@ -272804,6 +272945,6 @@
272804
272945
  ],
272805
272946
  "helix": {
272806
272947
  "package": "@fusion.dev/helix",
272807
- "version": "0.204.1"
272948
+ "version": "0.205.1"
272808
272949
  }
272809
272950
  }
@@ -1,2 +1,2 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {display: block}:host(:focus-visible) {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1)}[part="message"] {align-items: start;display: grid;grid-template-columns: auto minmax(0, 1fr)}[part="avatar"] > slot::slotted(*) {margin-inline-end: var(--helix-space-sm)}[part="avatar"] {align-items: center;display: flex;font-size: var(--helix-text-sm);grid-column: 1;line-height: var(--helix-leading-normal);min-block-size: calc(1lh + var(--helix-space-xs) * 2)}[part="body"] {grid-column: 2}:host([author="me"]) [part="avatar"] {display: none}[part="body"] {display: grid;gap: var(--helix-space-2xs);justify-items: start;max-inline-size: min(var(--chat-message-measure, 42rem), 80%)}:host([author="me"]) [part="body"] {justify-items: end;justify-self: end}[part="actions"] {opacity: 0;pointer-events: none;transition: opacity var(--helix-duration-fast) var(--helix-easing-standard)}:host(:hover) [part="actions"], :host(:focus-within) [part="actions"] {opacity: 1;pointer-events: auto}@media (hover: none) {[part="actions"] {opacity: 1;pointer-events: auto}}[part="actions"] {--helix-size-control: calc(var(--helix-size-control-sm) - var(--helix-space-2xs));--helix-size-control-loose: calc(var(--helix-size-control) * 1.2);--helix-size-control-tight: calc(var(--helix-size-control) * 0.8);--helix-size-icon: var(--helix-size-icon-sm);--helix-size-icon-loose: calc(var(--helix-size-icon) * 1.2);--helix-size-icon-tight: calc(var(--helix-size-icon) * 0.8);align-items: center;display: inline-flex;gap: var(--helix-space-2xs)}[part="actions"][hidden] {display: none}[part="sources"] {--helix-size-avatar: var(--helix-size-avatar-sm);--helix-size-tag: var(--helix-size-tag-sm);--helix-size-icon: var(--helix-size-icon-sm);--helix-size-icon-loose: calc(var(--helix-size-icon) * 1.2);--helix-size-icon-tight: calc(var(--helix-size-icon) * 0.8);align-items: center;color: var(--helix-color-foreground-muted);display: flex;flex-wrap: wrap;font-family: var(--helix-font-sans);font-size: var(--helix-text-xs);gap: var(--helix-space-2xs);line-height: var(--helix-leading-normal)}[part="sources"][hidden] {display: none}[part="content"] {background-color: var(--chat-message-background-color, color-mix(in oklab, var(--helix-color-foreground) 14%, transparent));border-radius: var(--chat-message-radius, var(--helix-radii-md));color: var(--chat-message-color, var(--helix-color-foreground));font-family: var(--helix-font-sans);font-size: var(--helix-text-sm);line-height: var(--helix-leading-normal);padding-block: var(--chat-message-padding-block, var(--helix-space-xs));padding-inline: var(--chat-message-padding-inline, var(--helix-space-sm))}:host([separation="plain"]) [part="content"] {background-color: transparent;padding-inline: var(--helix-space-none)}:host([separation="plain"]) [part="body"] {justify-items: stretch;max-inline-size: 100%}:host([separation="plain"]) [part="content"] {inline-size: auto}:host([author="me"]) [part="content"] {background-color: var(--chat-message-background-color-me, color-mix(in oklab, var(--helix-color-primary) 28%, transparent));color: var(--chat-message-color-me, var(--chat-message-color, var(--helix-color-foreground)))}[part="meta"] {align-items: center;color: var(--chat-message-meta-color, var(--helix-color-foreground-muted));display: flex;font-family: var(--helix-font-sans);font-size: var(--helix-text-xs);gap: var(--helix-space-2xs)}:host([author="me"]) [part="meta"] {justify-content: flex-end}[part="content"] {inline-size: fit-content;max-inline-size: 100%;min-inline-size: 0;overflow-x: auto}[part="content"] slot[name="indicator"] {display: none}:host([state="streaming"]) [part="content"][data-empty] slot[name="indicator"] {display: block}slot[name="indicator"]::slotted(*) {background-color: var(--chat-indicator-background-color, var(--helix-color-surface-sunken));border-radius: var(--helix-radii-full);font-size: var(--helix-text-xs);padding-block: var(--helix-space-2xs);padding-inline: var(--helix-space-xs);--orb-size: var(--helix-size-icon-sm)}slot[name="indicator"]::slotted(helix-orb) {background-color: transparent;padding: var(--helix-space-none)}:host([state="failed"]) [part="meta"] {color: var(--helix-color-danger)}[part="state"] {align-items: center;display: inline-flex;font-weight: var(--helix-weight-medium);gap: var(--helix-space-2xs)}[part="mark"] {block-size: var(--helix-size-icon-tight);flex: 0 0 auto;inline-size: var(--helix-size-icon-tight)}:host([state="sending"]) [part="content"] {opacity: 0.6}[part="retry"] {background: none;border: 0;border-radius: var(--helix-radii-sm);color: var(--helix-color-foreground);cursor: pointer;font: inherit;font-weight: var(--helix-weight-medium);margin-inline-end: calc(var(--helix-space-2xs) * -1);min-block-size: calc(var(--helix-size-control-tight) - var(--helix-space-2xs));padding-block: var(--helix-space-2xs);padding-inline: var(--helix-space-2xs);text-decoration: underline;text-underline-offset: 0.2em}[part="retry"]:hover {background-color: light-dark(color-mix(in oklab, var(--helix-color-foreground) 8%, transparent), color-mix(in oklab, var(--helix-color-foreground) 12%, transparent))}[part="retry"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: var(--helix-size-focus-offset)}@media print {[part="retry"] {display: none}[part="actions"] {display: none}[part="content"] slot[name="indicator"] {display: none}}`);
2
+ export const styles = createSheet(`:host {display: block}:host(:focus-visible) {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1)}[part="message"] {align-items: start;display: grid;grid-template-columns: auto minmax(0, 1fr)}[part="avatar"] > slot::slotted(*) {margin-inline-end: var(--helix-space-sm)}[part="avatar"] {align-items: center;display: flex;font-size: var(--helix-text-sm);grid-column: 1;line-height: var(--helix-leading-normal);min-block-size: calc(1lh + var(--helix-space-xs) * 2)}[part="body"] {grid-column: 2}:host([author="me"]) [part="avatar"] {display: none}[part="body"] {display: grid;gap: var(--helix-space-2xs);justify-items: start;max-inline-size: min(var(--chat-message-measure, 42rem), 80%)}:host([author="me"]) [part="body"] {justify-items: end;justify-self: end}[part="actions"] {opacity: 0;pointer-events: none;transition: opacity var(--helix-duration-fast) var(--helix-easing-standard)}:host(:hover) [part="actions"], :host(:focus-within) [part="actions"] {opacity: 1;pointer-events: auto}@media (hover: none) {[part="actions"] {opacity: 1;pointer-events: auto}}[part="actions"] {--helix-size-control: calc(var(--helix-size-control-sm) - var(--helix-space-2xs));--helix-size-control-loose: calc(var(--helix-size-control) * 1.2);--helix-size-control-tight: calc(var(--helix-size-control) * 0.8);--helix-size-icon: var(--helix-size-icon-sm);--helix-size-icon-loose: calc(var(--helix-size-icon) * 1.2);--helix-size-icon-tight: calc(var(--helix-size-icon) * 0.8);align-items: center;display: inline-flex;gap: var(--helix-space-2xs)}[part="actions"][hidden] {display: none}[part="sources"] {--helix-size-avatar: var(--helix-size-avatar-sm);--helix-size-tag: var(--helix-size-tag-sm);--helix-size-icon: var(--helix-size-icon-sm);--helix-size-icon-loose: calc(var(--helix-size-icon) * 1.2);--helix-size-icon-tight: calc(var(--helix-size-icon) * 0.8);align-items: center;color: var(--helix-color-foreground-muted);display: flex;flex-wrap: wrap;font-family: var(--helix-font-sans);font-size: var(--helix-text-xs);gap: var(--helix-space-2xs);line-height: var(--helix-leading-normal)}[part="sources"][hidden] {display: none}[part="work"] {color: var(--helix-color-foreground-muted);justify-self: stretch;min-inline-size: 0}[part="work"][hidden] {display: none}[part="content"] {background-color: var(--chat-message-background-color, color-mix(in oklab, var(--helix-color-foreground) 14%, transparent));border-radius: var(--chat-message-radius, var(--helix-radii-md));color: var(--chat-message-color, var(--helix-color-foreground));font-family: var(--helix-font-sans);font-size: var(--helix-text-sm);line-height: var(--helix-leading-normal);padding-block: var(--chat-message-padding-block, var(--helix-space-xs));padding-inline: var(--chat-message-padding-inline, var(--helix-space-sm))}:host([separation="plain"]) [part="content"] {background-color: transparent;padding-inline: var(--helix-space-none)}:host([separation="plain"]) [part="body"] {justify-items: stretch;max-inline-size: 100%}:host([separation="plain"]) [part="content"] {inline-size: auto}:host([author="me"]) [part="content"] {background-color: var(--chat-message-background-color-me, color-mix(in oklab, var(--helix-color-primary) 28%, transparent));color: var(--chat-message-color-me, var(--chat-message-color, var(--helix-color-foreground)))}[part="meta"] {align-items: center;color: var(--chat-message-meta-color, var(--helix-color-foreground-muted));display: flex;font-family: var(--helix-font-sans);font-size: var(--helix-text-xs);gap: var(--helix-space-2xs)}:host([author="me"]) [part="meta"] {justify-content: flex-end}[part="content"] {inline-size: fit-content;max-inline-size: 100%;min-inline-size: 0;overflow-x: auto}[part="content"] slot[name="indicator"] {display: none}:host([state="streaming"]) [part="content"][data-empty] slot[name="indicator"] {display: block}slot[name="indicator"]::slotted(*) {background-color: var(--chat-indicator-background-color, var(--helix-color-surface-sunken));border-radius: var(--helix-radii-full);font-size: var(--helix-text-xs);padding-block: var(--helix-space-2xs);padding-inline: var(--helix-space-xs);--orb-size: var(--helix-size-icon-sm)}slot[name="indicator"]::slotted(helix-orb) {background-color: transparent;padding: var(--helix-space-none)}:host([state="failed"]) [part="meta"] {color: var(--helix-color-danger)}[part="state"] {align-items: center;display: inline-flex;font-weight: var(--helix-weight-medium);gap: var(--helix-space-2xs)}[part="mark"] {block-size: var(--helix-size-icon-tight);flex: 0 0 auto;inline-size: var(--helix-size-icon-tight)}:host([state="sending"]) [part="content"] {opacity: 0.6}[part="retry"] {background: none;border: 0;border-radius: var(--helix-radii-sm);color: var(--helix-color-foreground);cursor: pointer;font: inherit;font-weight: var(--helix-weight-medium);margin-inline-end: calc(var(--helix-space-2xs) * -1);min-block-size: calc(var(--helix-size-control-tight) - var(--helix-space-2xs));padding-block: var(--helix-space-2xs);padding-inline: var(--helix-space-2xs);text-decoration: underline;text-underline-offset: 0.2em}[part="retry"]:hover {background-color: light-dark(color-mix(in oklab, var(--helix-color-foreground) 8%, transparent), color-mix(in oklab, var(--helix-color-foreground) 12%, transparent))}[part="retry"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: var(--helix-size-focus-offset)}@media print {[part="retry"] {display: none}[part="actions"] {display: none}[part="content"] slot[name="indicator"] {display: none}}`);
@@ -1,2 +1,2 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {display: block}[part="summary"] {all: unset;box-sizing: border-box;align-items: center;color: var(--helix-color-foreground);column-gap: var(--helix-space-xs);cursor: pointer;display: flex;font-family: var(--helix-font-sans);font-weight: var(--helix-weight-medium);inline-size: 100%;padding-block: var(--helix-space-2xs);padding-inline: var(--log-padding-inline, var(--helix-space-md));white-space: nowrap}[part="summary"]:hover {background-color: color-mix(in oklab, var(--helix-color-foreground) 5%, transparent)}[part="summary"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1)}[part="mark"] {block-size: var(--helix-size-icon-sm);color: var(--helix-color-foreground-subtle);flex: none;font-family: var(--log-font-family, var(--helix-font-mono));inline-size: var(--helix-size-icon-sm);margin-inline-end: calc(var(--helix-space-md) - var(--helix-space-xs));margin-inline-start: calc(max(var(--helix-size-icon-sm), calc(var(--log-digits, 2) * 1ch)) - var(--helix-size-icon-sm));rotate: -90deg;transition: rotate var(--helix-duration-fast) var(--helix-easing-standard)}:host(:dir(rtl)) [part="mark"] {rotate: 90deg}:host(:state(open)) [part="mark"] {rotate: none}[part="status"] {block-size: var(--helix-size-icon-sm);color: var(--helix-color-foreground-subtle);flex: none;inline-size: var(--helix-size-icon-sm)}:host([status="done"]) [part="status"] {color: var(--helix-color-success)}:host([status="failed"]) [part="status"] {color: var(--helix-color-danger)}:host([status="running"]) [part="status"] {color: var(--helix-color-info)}[part="heading"] {min-inline-size: 0;overflow: hidden;text-overflow: ellipsis}[part="duration"] {color: var(--helix-color-foreground-muted);flex: none;font-variant-numeric: tabular-nums;font-weight: var(--helix-weight-regular);margin-inline-start: auto}[part="content"][hidden] {display: none}@media print {:host {print-color-adjust: economy}}`);
2
+ export const styles = createSheet(`:host {display: block}[part="summary"] {all: unset;box-sizing: border-box;align-items: center;color: var(--helix-color-foreground);column-gap: var(--helix-space-xs);cursor: pointer;display: flex;font-family: var(--helix-font-sans);font-weight: var(--helix-weight-medium);inline-size: 100%;padding-block: var(--helix-space-2xs);padding-inline: var(--log-padding-inline, var(--helix-space-md));white-space: nowrap}[part="summary"]:hover {background-color: color-mix(in oklab, var(--helix-color-foreground) 5%, transparent)}[part="summary"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1)}[part="mark"] {block-size: var(--helix-size-icon-sm);color: var(--helix-color-foreground-subtle);flex: none;font-family: var(--log-font-family, var(--helix-font-mono));inline-size: var(--helix-size-icon-sm);margin-inline-end: calc(var(--helix-space-md) - var(--helix-space-xs));margin-inline-start: calc(max(var(--helix-size-icon-sm), calc(var(--log-digits, 2) * 1ch)) - var(--helix-size-icon-sm));rotate: -90deg;transition: rotate var(--helix-duration-fast) var(--helix-easing-standard)}:host(:dir(rtl)) [part="mark"] {rotate: 90deg}:host(:state(open)) [part="mark"] {rotate: none}[part="status"] {block-size: var(--helix-size-icon-sm);color: var(--helix-color-foreground-subtle);flex: none;inline-size: var(--helix-size-icon-sm)}:host([status="done"]) [part="status"] {color: var(--helix-color-success)}:host([status="failed"]) [part="status"] {color: var(--helix-color-danger)}:host([status="running"]) [part="status"] {color: var(--helix-color-info)}[part="heading"] {min-inline-size: 0;overflow: hidden;text-overflow: ellipsis}[part="duration"] {color: var(--helix-color-foreground-muted);flex: none;font-variant-numeric: tabular-nums;font-weight: var(--helix-weight-regular);margin-inline-start: var(--_log-duration-start, auto)}[part="content"][hidden] {display: none}::slotted(helix-log-group) {margin-inline-start: calc(max(var(--helix-size-icon-sm), calc(var(--log-digits, 2) * 1ch)) + var(--helix-space-md))}@media print {:host {print-color-adjust: economy}}`);
@@ -1,2 +1,2 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {display: block}[part~="line"] {column-gap: var(--helix-space-md);display: flex;inline-size: var(--_log-line-size, max-content);min-inline-size: 100%;padding-inline: var(--log-padding-inline, var(--helix-space-md))}[part~="line"]:hover {background-color: color-mix(in oklab, var(--helix-color-foreground) 4%, transparent)}:where(button[part="number"]) {all: unset;box-sizing: border-box}[part="number"] {color: var(--helix-color-foreground-muted);flex: none;font-variant-numeric: tabular-nums;min-inline-size: max(var(--helix-size-icon-sm), calc(var(--log-digits, 2) * 1ch));text-align: end;text-decoration: none;user-select: none}a[part="number"]:hover, button[part="number"]:hover {color: var(--helix-color-foreground);cursor: pointer}a[part="number"]:hover {text-decoration: underline}a[part="number"]:focus-visible, button[part="number"]:focus-visible {border-radius: var(--helix-radii-sm);outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1)}[part="time"] {color: var(--helix-color-foreground-muted);flex: none;font-variant-numeric: tabular-nums;user-select: none}[part="text"] {flex: 1 1 auto;min-inline-size: 0;overflow-wrap: anywhere;white-space: var(--_log-white-space, pre)}[part~="line-debug"] {color: var(--helix-color-foreground-subtle)}[part~="line-warn"] {background-color: color-mix(in oklab, var(--log-warn-color, var(--helix-color-warning)) 10%, transparent);color: var(--log-warn-color, var(--helix-color-warning))}[part~="line-error"] {background-color: color-mix(in oklab, var(--log-error-color, var(--helix-color-danger)) 10%, transparent);color: var(--log-error-color, var(--helix-color-danger))}[part~="line-marked"] {background-color: var(--log-mark-background-color, color-mix(in oklab, var(--helix-color-primary) 12%, transparent))}[part~="line-selected"] {background-color: var(--log-selected-background-color, color-mix(in oklab, var(--helix-color-info) 14%, transparent))}[part~="line-selected"] > [part="number"] {color: var(--helix-color-foreground)}[part~="run"] {background-color: var(--log-run-background-color, transparent);color: var(--log-run-color, inherit)}[part~="run-bold"] {font-weight: var(--helix-weight-semibold)}[part~="run-dim"] {opacity: 0.7}[part~="run-italic"] {font-style: italic}[part~="run-underline"] {text-decoration-line: underline}[part~="run-strike"] {text-decoration-line: line-through}[part~="run-underline"][part~="run-strike"] {text-decoration-line: underline line-through}[part="match"] {background-color: var(--log-match-background-color, var(--helix-color-warning-surface));border-radius: var(--helix-radii-sm);color: inherit}@media print {[part~="line"] {print-color-adjust: exact}}`);
2
+ export const styles = createSheet(`:host {display: block}[part~="line"] {column-gap: var(--helix-space-md);display: flex;inline-size: var(--_log-line-size, max-content);min-inline-size: 100%;padding-inline: var(--log-padding-inline, var(--helix-space-md))}[part~="line-grouped"]:not(:has(> [part="number"])) {padding-inline-start: calc(var(--log-padding-inline, var(--helix-space-md)) + max(var(--helix-size-icon-sm), calc(var(--log-digits, 2) * 1ch)) + var(--helix-space-md))}[part~="line"]:hover {background-color: color-mix(in oklab, var(--helix-color-foreground) 4%, transparent)}:where(button[part="number"]) {all: unset;box-sizing: border-box}[part="number"] {color: var(--helix-color-foreground-muted);flex: none;font-variant-numeric: tabular-nums;min-inline-size: max(var(--helix-size-icon-sm), calc(var(--log-digits, 2) * 1ch));text-align: end;text-decoration: none;user-select: none}a[part="number"]:hover, button[part="number"]:hover {color: var(--helix-color-foreground);cursor: pointer}a[part="number"]:hover {text-decoration: underline}a[part="number"]:focus-visible, button[part="number"]:focus-visible {border-radius: var(--helix-radii-sm);outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1)}[part="time"] {color: var(--helix-color-foreground-muted);flex: none;font-variant-numeric: tabular-nums;user-select: none}[part="text"] {flex: 1 1 auto;min-inline-size: 0;overflow-wrap: anywhere;white-space: var(--_log-white-space, pre)}[part~="line-debug"] {color: var(--helix-color-foreground-subtle)}[part~="line-warn"] {background-color: color-mix(in oklab, var(--log-warn-color, var(--helix-color-warning)) 10%, transparent);color: var(--log-warn-color, var(--helix-color-warning))}[part~="line-error"] {background-color: color-mix(in oklab, var(--log-error-color, var(--helix-color-danger)) 10%, transparent);color: var(--log-error-color, var(--helix-color-danger))}[part~="line-marked"] {background-color: var(--log-mark-background-color, color-mix(in oklab, var(--helix-color-primary) 12%, transparent))}[part~="line-selected"] {background-color: var(--log-selected-background-color, color-mix(in oklab, var(--helix-color-info) 14%, transparent))}[part~="line-selected"] > [part="number"] {color: var(--helix-color-foreground)}[part~="run"] {background-color: var(--log-run-background-color, transparent);color: var(--log-run-color, inherit)}[part~="run-bold"] {font-weight: var(--helix-weight-semibold)}[part~="run-dim"] {opacity: 0.7}[part~="run-italic"] {font-style: italic}[part~="run-underline"] {text-decoration-line: underline}[part~="run-strike"] {text-decoration-line: line-through}[part~="run-underline"][part~="run-strike"] {text-decoration-line: underline line-through}[part="match"] {background-color: var(--log-match-background-color, var(--helix-color-warning-surface));border-radius: var(--helix-radii-sm);color: inherit}@media print {[part~="line"] {print-color-adjust: exact}}`);
@@ -1,2 +1,2 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {--log-ansi-background: var(--log-background-color, var(--helix-color-background));--log-ansi-black: var(--helix-color-foreground);--log-ansi-blue: var(--helix-color-info);--log-ansi-bright-black: var(--helix-color-foreground-subtle);--log-ansi-bright-blue: var(--helix-color-info);--log-ansi-bright-cyan: color-mix(in oklab, var(--helix-color-info), var(--helix-color-success));--log-ansi-bright-green: var(--helix-color-success);--log-ansi-bright-magenta: var(--helix-color-syntax-callable);--log-ansi-bright-red: var(--helix-color-danger);--log-ansi-bright-white: var(--helix-color-foreground);--log-ansi-bright-yellow: var(--helix-color-warning);--log-ansi-cyan: color-mix(in oklab, var(--helix-color-info), var(--helix-color-success));--log-ansi-foreground: var(--log-color, var(--helix-color-foreground));--log-ansi-green: var(--helix-color-success);--log-ansi-magenta: var(--helix-color-syntax-callable);--log-ansi-red: var(--helix-color-danger);--log-ansi-white: var(--helix-color-foreground-muted);--log-ansi-yellow: var(--helix-color-warning);background-color: var(--log-background-color, var(--helix-color-background));border: var(--helix-border-thin) solid var(--log-border-color, var(--helix-color-border));border-radius: var(--log-radius, var(--helix-radii-lg));color: var(--log-color, var(--helix-color-foreground));display: grid;font-family: var(--log-font-family, var(--helix-font-mono));font-size: var(--log-font-size, var(--helix-text-xs));grid-template-columns: minmax(0, 1fr);grid-template-rows: auto auto minmax(0, 1fr) auto;line-height: var(--log-line-height, var(--helix-leading-normal));max-block-size: var(--log-max-block-size, 30rem);min-block-size: 0;overflow: hidden;tab-size: 4}:host([wrap]) {--_log-line-size: auto;--_log-white-space: pre-wrap}::slotted([slot="toolbar"]) {--helix-size-control: var(--helix-size-control-sm);--helix-size-control-loose: calc(var(--helix-size-control) * 1.2);--helix-size-control-tight: calc(var(--helix-size-control) * 0.8);--helix-size-icon: var(--helix-size-icon-sm);--helix-size-icon-loose: calc(var(--helix-size-icon) * 1.2);--helix-size-icon-tight: calc(var(--helix-size-icon) * 0.8);border-block-end: var(--helix-border-thin) solid var(--log-border-color, var(--helix-color-border));font-family: var(--helix-font-sans);grid-row: 1;padding-block: var(--helix-space-xs);padding-inline: var(--log-padding-inline, var(--helix-space-md))}[part="dropped"] {background-color: var(--helix-color-surface-sunken);border-block-end: var(--helix-border-thin) solid var(--log-border-color, var(--helix-color-border));color: var(--helix-color-foreground-muted);font-family: var(--helix-font-sans);grid-row: 2;margin: var(--helix-space-none);padding-block: var(--helix-space-2xs);padding-inline: var(--log-padding-inline, var(--helix-space-md))}[part="dropped"][hidden], [part="resume"][hidden] {display: none}[part="log"] {grid-row: 3;overflow: auto;overscroll-behavior: contain;padding-block: var(--helix-space-xs);scrollbar-color: var(--log-scrollbar-thumb-color, var(--helix-scrollbar-thumb-color)) var(--log-scrollbar-track-color, var(--helix-scrollbar-track-color));scrollbar-width: thin}[part="log"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1)}[part="row"] {min-inline-size: 100%;inline-size: var(--_log-line-size, max-content)}[part="resume"] {display: grid;grid-row: 4;justify-items: center;margin-block-start: calc(var(--helix-space-xl) * -1 - var(--helix-space-xs));padding-block-end: var(--helix-space-xs);pointer-events: none;position: relative}[part="resume"] > * {pointer-events: auto}[part="resume"] slot::slotted(*) {border: var(--helix-border-floating) solid var(--log-border-color, var(--helix-color-border));box-shadow: var(--helix-shadow-floating)}[part="resume-button"] {all: unset;box-sizing: border-box;align-items: center;background-color: var(--helix-color-surface-raised);block-size: var(--helix-size-control-sm);border: var(--helix-border-floating) solid var(--log-border-color, var(--helix-color-border));border-radius: var(--helix-radii-sm);box-shadow: var(--helix-shadow-floating);color: var(--helix-color-foreground);cursor: pointer;display: inline-flex;font-family: var(--helix-font-sans);font-size: var(--helix-text-xs);font-weight: var(--helix-weight-medium);gap: var(--helix-space-2xs);line-height: var(--helix-leading-tight);padding-inline: var(--helix-space-sm);white-space: nowrap}[part="resume-button"]:hover {background-color: color-mix(in oklab, var(--helix-color-foreground) 6%, var(--helix-color-surface-raised))}[part="resume-button"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: var(--helix-size-focus-offset)}[part="resume-mark"] {block-size: var(--helix-size-icon-sm);display: inline-flex;inline-size: var(--helix-size-icon-sm)}[part="resume-mark"] svg {block-size: 100%;inline-size: 100%}[part="empty"], [part="loading"] {--_collection-inset-block: var(--helix-space-lg);--_collection-inset-inline: var(--helix-space-md)}@media print {:host {max-block-size: none}[part="log"] {overflow: visible}[part="resume"] {display: none}}`);
2
+ export const styles = createSheet(`:host {--log-ansi-background: var(--log-background-color, var(--helix-color-background));--log-ansi-black: var(--helix-color-foreground);--log-ansi-blue: var(--helix-color-info);--log-ansi-bright-black: var(--helix-color-foreground-subtle);--log-ansi-bright-blue: var(--helix-color-info);--log-ansi-bright-cyan: color-mix(in oklab, var(--helix-color-info), var(--helix-color-success));--log-ansi-bright-green: var(--helix-color-success);--log-ansi-bright-magenta: var(--helix-color-syntax-callable);--log-ansi-bright-red: var(--helix-color-danger);--log-ansi-bright-white: var(--helix-color-foreground);--log-ansi-bright-yellow: var(--helix-color-warning);--log-ansi-cyan: color-mix(in oklab, var(--helix-color-info), var(--helix-color-success));--log-ansi-foreground: var(--log-color, var(--helix-color-foreground));--log-ansi-green: var(--helix-color-success);--log-ansi-magenta: var(--helix-color-syntax-callable);--log-ansi-red: var(--helix-color-danger);--log-ansi-white: var(--helix-color-foreground-muted);--log-ansi-yellow: var(--helix-color-warning);background-color: var(--log-background-color, var(--helix-color-background));border: var(--helix-border-thin) solid var(--log-border-color, var(--helix-color-border));border-radius: var(--log-radius, var(--helix-radii-lg));color: var(--log-color, var(--helix-color-foreground));display: grid;font-family: var(--log-font-family, var(--helix-font-mono));font-size: var(--log-font-size, var(--helix-text-xs));grid-template-columns: minmax(0, 1fr);grid-template-rows: auto auto minmax(0, 1fr) auto;line-height: var(--log-line-height, var(--helix-leading-normal));max-block-size: var(--log-max-block-size, 30rem);min-block-size: 0;overflow: hidden;tab-size: 4}:host([separation="plain"]) {--log-padding-inline: var(--helix-space-none);--_log-duration-start: var(--helix-space-xs);background-color: transparent;border: none;border-radius: var(--helix-radii-none);max-block-size: var(--log-max-block-size, none)}:host([separation="plain"]) {color: var(--log-color, inherit)}:host([wrap]) {--_log-line-size: auto;--_log-white-space: pre-wrap}::slotted([slot="toolbar"]) {--helix-size-control: var(--helix-size-control-sm);--helix-size-control-loose: calc(var(--helix-size-control) * 1.2);--helix-size-control-tight: calc(var(--helix-size-control) * 0.8);--helix-size-icon: var(--helix-size-icon-sm);--helix-size-icon-loose: calc(var(--helix-size-icon) * 1.2);--helix-size-icon-tight: calc(var(--helix-size-icon) * 0.8);border-block-end: var(--helix-border-thin) solid var(--log-border-color, var(--helix-color-border));font-family: var(--helix-font-sans);grid-row: 1;padding-block: var(--helix-space-xs);padding-inline: var(--log-padding-inline, var(--helix-space-md))}[part="dropped"] {background-color: var(--helix-color-surface-sunken);border-block-end: var(--helix-border-thin) solid var(--log-border-color, var(--helix-color-border));color: var(--helix-color-foreground-muted);font-family: var(--helix-font-sans);grid-row: 2;margin: var(--helix-space-none);padding-block: var(--helix-space-2xs);padding-inline: var(--log-padding-inline, var(--helix-space-md))}[part="dropped"][hidden], [part="resume"][hidden] {display: none}[part="log"] {grid-row: 3;overflow: auto;overscroll-behavior: contain;padding-block: var(--helix-space-xs);scrollbar-color: var(--log-scrollbar-thumb-color, var(--helix-scrollbar-thumb-color)) var(--log-scrollbar-track-color, var(--helix-scrollbar-track-color));scrollbar-width: thin}:host([separation="plain"]) [part="log"] {padding-block: var(--helix-space-none)}[part="log"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1)}[part="row"] {min-inline-size: 100%;inline-size: var(--_log-line-size, max-content)}[part="resume"] {display: grid;grid-row: 4;justify-items: center;margin-block-start: calc(var(--helix-space-xl) * -1 - var(--helix-space-xs));padding-block-end: var(--helix-space-xs);pointer-events: none;position: relative}[part="resume"] > * {pointer-events: auto}[part="resume"] slot::slotted(*) {border: var(--helix-border-floating) solid var(--log-border-color, var(--helix-color-border));box-shadow: var(--helix-shadow-floating)}[part="resume-button"] {all: unset;box-sizing: border-box;align-items: center;background-color: var(--helix-color-surface-raised);block-size: var(--helix-size-control-sm);border: var(--helix-border-floating) solid var(--log-border-color, var(--helix-color-border));border-radius: var(--helix-radii-sm);box-shadow: var(--helix-shadow-floating);color: var(--helix-color-foreground);cursor: pointer;display: inline-flex;font-family: var(--helix-font-sans);font-size: var(--helix-text-xs);font-weight: var(--helix-weight-medium);gap: var(--helix-space-2xs);line-height: var(--helix-leading-tight);padding-inline: var(--helix-space-sm);white-space: nowrap}[part="resume-button"]:hover {background-color: color-mix(in oklab, var(--helix-color-foreground) 6%, var(--helix-color-surface-raised))}[part="resume-button"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: var(--helix-size-focus-offset)}[part="resume-mark"] {block-size: var(--helix-size-icon-sm);display: inline-flex;inline-size: var(--helix-size-icon-sm)}[part="resume-mark"] svg {block-size: 100%;inline-size: 100%}[part="empty"], [part="loading"] {--_collection-inset-block: var(--helix-space-lg);--_collection-inset-inline: var(--helix-space-md)}@media print {:host {max-block-size: none}[part="log"] {overflow: visible}[part="resume"] {display: none}}`);
@@ -38,6 +38,20 @@ import '../line/log-line.js';
38
38
  */
39
39
  export declare class HelixLog extends HelixHeadlessLog {
40
40
  static tier: string;
41
+ /**
42
+ * How the log is set apart from what is around it.
43
+ *
44
+ * - `outlined`, the resting look, is a box with an edge and a fill of its
45
+ * own, which scrolls after `--log-max-block-size`.
46
+ * - `plain` has no edge, no fill, no inset and no height of its own: the
47
+ * lines start where the text around them does and the log grows with
48
+ * them. For a log inside something that already frames it, such as an
49
+ * agent's work in a chat turn's `work` slot.
50
+ *
51
+ * Both are writable, so a page can say which it means rather than relying
52
+ * on the absence of an attribute.
53
+ */
54
+ separation?: 'outlined' | 'plain';
41
55
  static styles: CSSResultGroup;
42
56
  }
43
57
  declare global {
@@ -1,6 +1,7 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { customElement } from '@fusion.dev/helix-core';
3
3
  import { HelixHeadlessLog } from '@fusion.dev/helix-headless/log';
4
+ import { property } from 'lit/decorators.js';
4
5
  import { styles as collectionStateStyles } from '../../shared/collection/state.css.js';
5
6
  import { styles as liveStyles } from '../../shared/live/live.css.js';
6
7
  import { styles } from './log-root.css.js';
@@ -10,6 +11,9 @@ let HelixLog = class HelixLog extends HelixHeadlessLog {
10
11
  static { this.tier = 'helix-'; }
11
12
  static { this.styles = [liveStyles, collectionStateStyles, styles]; }
12
13
  };
14
+ __decorate([
15
+ property({ reflect: true })
16
+ ], HelixLog.prototype, "separation", void 0);
13
17
  HelixLog = __decorate([
14
18
  customElement('helix-log')
15
19
  ], HelixLog);
@@ -54,6 +54,8 @@ export declare const loggedText: (value: unknown) => string;
54
54
  * - Posts every console call, uncaught error, and unhandled promise rejection
55
55
  * as `helix-preview-console`, an uncaught one marked `uncaught`, which marks
56
56
  * the preview `failed`.
57
+ * - Posts `helix-preview-rendered` after each render, which shows a frame
58
+ * the preview held transparent until it drew.
57
59
  * - Posts `helix-preview-size` whenever what was drawn changes height.
58
60
  * - Posts `helix-preview-press` on every press, so menus outside close.
59
61
  *
@@ -124,6 +124,7 @@ const serveWith = (tools, options = {}) => {
124
124
  sheet.textContent = styles;
125
125
  options.onRender?.(root, fresh);
126
126
  measure();
127
+ post({ type: 'helix-preview-rendered' });
127
128
  };
128
129
  const watcher = new ResizeObserver(measure);
129
130
  const watch = () => {
@@ -1,2 +1,2 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {display: block;min-block-size: 0;position: relative}[part="frame"] {background-color: var(--helix-color-background);block-size: 100%;border: none;display: block;inline-size: 100%}[part="error"] {background-color: var(--helix-color-background);box-sizing: border-box;color: var(--helix-color-danger);font-family: var(--helix-font-mono);font-size: var(--helix-text-xs);inset: 0;line-height: var(--helix-leading-normal);margin: var(--helix-space-none);overflow: auto;padding: var(--helix-space-md);position: absolute;white-space: pre-wrap;word-break: break-word}[part="controls"] {display: flex;font-family: var(--helix-font-sans);font-size: var(--helix-text-xs);gap: var(--helix-space-2xs);inset-block-end: var(--helix-space-xs);inset-inline-end: var(--helix-space-xs);position: absolute}[part="reload"], [part="open"] {background-color: var(--helix-color-surface);border: var(--helix-border-thin) solid var(--helix-color-border);border-radius: var(--helix-radii-sm);color: var(--helix-color-foreground);cursor: pointer;font: inherit;padding: var(--helix-space-2xs) var(--helix-space-xs)}[part="reload"]:hover, [part="open"]:hover {background-color: var(--helix-color-surface-sunken)}[part="reload"]:focus-visible, [part="open"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: var(--helix-size-focus-offset)}`);
2
+ export const styles = createSheet(`:host {display: block;min-block-size: 0;position: relative}[part="frame"] {background-color: var(--helix-color-background);block-size: 100%;border: none;display: block;inline-size: 100%}[part="error"] {background-color: var(--helix-color-background);box-sizing: border-box;color: var(--helix-color-danger);font-family: var(--helix-font-mono);font-size: var(--helix-text-xs);inset: 0;line-height: var(--helix-leading-normal);margin: var(--helix-space-none);overflow: auto;padding: var(--helix-space-md);position: absolute;white-space: pre-wrap;word-break: break-word}[part="controls"] {display: flex;font-family: var(--helix-font-sans);font-size: var(--helix-text-xs);gap: var(--helix-space-2xs);inset-block-end: var(--helix-space-xs);inset-inline-end: var(--helix-space-xs);position: absolute}[part="reload"], [part="open"] {background-color: var(--helix-color-surface);border: var(--helix-border-thin) solid var(--helix-color-border);border-radius: var(--helix-radii-sm);color: var(--helix-color-foreground);cursor: pointer;font: inherit;padding: var(--helix-space-2xs) var(--helix-space-xs)}[part="reload"]:hover, [part="open"]:hover {background-color: var(--helix-color-surface-sunken)}[part="reload"]:focus-visible, [part="open"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: var(--helix-size-focus-offset)}:host(:state(blank)) [part="frame"] {opacity: 0}`);
@@ -35,12 +35,16 @@ export interface PreviewConsole {
35
35
  export interface PreviewPress {
36
36
  type: 'helix-preview-press';
37
37
  }
38
+ /** The frame saying it has drawn the example it was sent. */
39
+ export interface PreviewRendered {
40
+ type: 'helix-preview-rendered';
41
+ }
38
42
  /** How tall the frame says its content is, in CSS pixels. */
39
43
  export interface PreviewSize {
40
44
  size: number;
41
45
  type: 'helix-preview-size';
42
46
  }
43
- export type PreviewMessage = PreviewConsole | PreviewFetch | PreviewPress | PreviewReady | PreviewRender | PreviewSize;
47
+ export type PreviewMessage = PreviewConsole | PreviewFetch | PreviewPress | PreviewReady | PreviewRender | PreviewRendered | PreviewSize;
44
48
  /**
45
49
  * @summary A frame that renders sandbox source in a separate document.
46
50
  *
@@ -140,6 +144,7 @@ export type PreviewMessage = PreviewConsole | PreviewFetch | PreviewPress | Prev
140
144
  * @csspart open - The button that opens the example in a new tab, under `controls`.
141
145
  * @csspart reload - The button that reloads the frame's document, under `controls`.
142
146
  *
147
+ * @cssstate blank - From the moment the frame's document starts loading until it has drawn an example. The styled tier keeps the frame transparent meanwhile, so a document that has not yet drawn in the page's color mode does not show as a white flash.
143
148
  * @cssstate failed - Since the example threw an error it did not catch, until the next source is sent.
144
149
  * @cssstate loading - While the frame's document loads, until it can take the example.
145
150
  */
@@ -368,6 +373,14 @@ export declare class HelixSandboxPreview extends HelixElement {
368
373
  * error it should have reported.
369
374
  */
370
375
  private readonly settle;
376
+ /** Shows a frame that was sent an example and never said it drew it. */
377
+ private readonly patience;
378
+ /** Whether the frame has drawn nothing since its document started loading. */
379
+ private blank;
380
+ /** Marks the frame `blank`, or shown. */
381
+ private setBlank;
382
+ /** The frame has drawn an example, so it is shown. */
383
+ private drawn;
371
384
  /**
372
385
  * Sends once the typing stops, replacing anything already waiting.
373
386
  *
@@ -2,6 +2,7 @@ var HelixSandboxPreview_1;
2
2
  import { __decorate } from "tslib";
3
3
  import { customElement, DelayController, HelixConsoleEvent, HelixElement, HelixResizeEvent, words, } from '@fusion.dev/helix-core';
4
4
  const SETTLE = 120;
5
+ const PAINT_PATIENCE = 1000;
5
6
  import { html, nothing } from 'lit';
6
7
  import { property, state } from 'lit/decorators.js';
7
8
  import { COMPILED, compile } from '../compile.js';
@@ -47,6 +48,9 @@ let HelixSandboxPreview = class HelixSandboxPreview extends HelixElement {
47
48
  this.handleFrameLoad();
48
49
  return;
49
50
  }
51
+ if (data?.type === 'helix-preview-rendered' || data?.type === 'helix-preview-size') {
52
+ this.drawn();
53
+ }
50
54
  if (data?.type === 'helix-preview-console') {
51
55
  this.dispatchEvent(new HelixConsoleEvent({ level: data.level, text: data.text }));
52
56
  if (data.uncaught) {
@@ -62,6 +66,8 @@ let HelixSandboxPreview = class HelixSandboxPreview extends HelixElement {
62
66
  }
63
67
  };
64
68
  this.settle = new DelayController(this, { renders: false });
69
+ this.patience = new DelayController(this, { renders: false });
70
+ this.blank = false;
65
71
  this.loadedMap = '';
66
72
  }
67
73
  static { HelixSandboxPreview_1 = this; }
@@ -139,6 +145,14 @@ let HelixSandboxPreview = class HelixSandboxPreview extends HelixElement {
139
145
  });
140
146
  }
141
147
  static { this.target = '*'; }
148
+ setBlank(on) {
149
+ this.blank = on;
150
+ this.toggleState('blank', on);
151
+ }
152
+ drawn() {
153
+ this.patience.cancel();
154
+ this.setBlank(false);
155
+ }
142
156
  scheduleSend() {
143
157
  this.settle.start(SETTLE, () => {
144
158
  if (this.sending !== this.failedSource) {
@@ -163,6 +177,9 @@ let HelixSandboxPreview = class HelixSandboxPreview extends HelixElement {
163
177
  }
164
178
  this.frame?.contentWindow?.postMessage(this.message, HelixSandboxPreview_1.target);
165
179
  this.sentSource = this.sending;
180
+ if (this.blank) {
181
+ this.patience.start(PAINT_PATIENCE, () => this.drawn());
182
+ }
166
183
  }
167
184
  open() {
168
185
  const tab = window.open('', '_blank');
@@ -223,7 +240,9 @@ frame.onload = () => frame.contentWindow.postMessage(${JSON.stringify(this.messa
223
240
  this.sentSource = undefined;
224
241
  this.failedSource = undefined;
225
242
  this.fail();
243
+ this.patience.cancel();
226
244
  this.toggleState('loading', true);
245
+ this.setBlank(true);
227
246
  }
228
247
  willUpdate(changed) {
229
248
  super.willUpdate(changed);