@fusion.dev/helix-docs 0.208.1 → 0.210.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.
@@ -431,7 +431,7 @@ names the tag to define.
431
431
 
432
432
  [//]: # (renders)
433
433
 
434
- **38 of the 106 headless families interpolate another family's tag**, across 24 distinct children.
434
+ **39 of the 107 headless families interpolate another family's tag**, across 26 distinct children.
435
435
 
436
436
  | Family | Renders |
437
437
  |---|---|
@@ -454,6 +454,7 @@ names the tag to define.
454
454
  | \`pagination\` | \`option\`, \`select\` |
455
455
  | \`select\` | \`listbox\` |
456
456
  | \`steps\`, \`tour\` | \`button\` |
457
+ | \`terminal\` | \`button\`, \`icon-button\`, \`toolbar\` |
457
458
  | \`time-input\` | \`tag\`, \`time-picker\` |
458
459
  | \`time-picker\` | \`listbox\`, \`option\` |
459
460
  | \`video\`, \`video-playlist\` | \`menu\`, \`menu-item\` |
@@ -805,6 +806,7 @@ The board is one tab stop. A card holds it, and Tab leaves the board.
805
806
  | Plus, minus | The board, a card, or a connection | Zoom in or out |
806
807
  | Escape | A card or a connection | Stop connecting, or go out to the board |
807
808
  | Arrow keys | The board, after Escape | Pan the board |
809
+ | Arrow keys | A pan or zoom button | Move between the buttons by where they sit. The buttons are one tab stop |
808
810
 
809
811
  Every drag also works with clicks. Click a selected card's move handle, a
810
812
  corner, a card's connection point, or the end of a selected connection to pick
@@ -3078,7 +3080,8 @@ leaves removing it to your framework.
3078
3080
 
3079
3081
  - The frame is one tab stop. Arrow keys move the drawing, and the plus and
3080
3082
  minus keys zoom it. Set \`controls="pan zoom fullscreen"\` to add buttons that
3081
- move it.
3083
+ move it. The buttons are a toolbar and one tab stop, and arrow keys move
3084
+ between them by where they sit.
3082
3085
  - The list is a listbox, named by \`notes-label\`. Arrow keys, Home, End, Page
3083
3086
  Up, and Page Down move through it, typing a letter moves to the next note
3084
3087
  whose name starts with it, and Enter or Space selects a note.
@@ -4882,6 +4885,9 @@ compass sets \`--map-needle-turn\` to the angle that points north, so an icon in
4882
4885
  \`rotate\` is in \`controls\`, and Shift with Up or Down tilts it while \`tilt\` is.
4883
4886
  Keys with Control, Command, or Alt are left to the browser, so page zoom and
4884
4887
  Back still work with focus on the map.
4888
+ - The buttons in \`controls\` are a toolbar and one tab stop. Arrow keys move
4889
+ between them by where they sit, Shift with an arrow still turns or tilts the
4890
+ map, and Enter or Space presses a button.
4885
4891
  - The markers are one tab stop. Arrow keys move between them in the order you
4886
4892
  wrote them. The map pans to show a marker that is off screen. If your page
4887
4893
  removes the marker that has focus, focus moves to the next marker, or to the
@@ -5121,7 +5127,7 @@ on its own.
5121
5127
 
5122
5128
  | | Raw | Gzip | Brotli |
5123
5129
  |---|---|---|---|
5124
- | Lit and \`@fusion.dev/helix-core\` | 265,008 | 85,811 | 73,175 |
5130
+ | Lit and \`@fusion.dev/helix-core\` | 272,124 | 87,824 | 74,750 |
5125
5131
 
5126
5132
  ## Whole packages
5127
5133
 
@@ -5132,12 +5138,12 @@ either barrel. The per-component tables show what your page pays.
5132
5138
 
5133
5139
  | Package | Raw | Gzip | Brotli | |
5134
5140
  |---|---|---|---|---|
5135
- | \`@fusion.dev/helix-core\` | 264,217 | 85,678 | 72,898 | The element base class, mixins, decorators, and floating positioning. |
5136
- | \`@fusion.dev/helix-headless\` | 1,458,046 | 408,995 | 306,896 | Every headless family. The barrel entry includes all of them. |
5137
- | \`@fusion.dev/helix-icons\` | 56,111 | 17,847 | 15,166 | The whole glyph set. |
5141
+ | \`@fusion.dev/helix-core\` | 271,333 | 87,670 | 74,384 | The element base class, mixins, decorators, and floating positioning. |
5142
+ | \`@fusion.dev/helix-headless\` | 1,478,744 | 414,210 | 310,932 | Every headless family. The barrel entry includes all of them. |
5143
+ | \`@fusion.dev/helix-icons\` | 56,982 | 18,222 | 15,516 | The whole glyph set. |
5138
5144
  | \`@fusion.dev/helix-theme\` | 4,030 | 1,791 | 1,560 | The JavaScript that runs the derivation engine. Most sites run it at build time, and a theme switcher runs it in the browser. |
5139
5145
  | \`fusion_helix_theme_bg.wasm\` | 412,026 | 152,920 | 123,363 | The derivation engine itself, in WebAssembly. The entry above loads it when the engine runs. |
5140
- | \`@fusion.dev/helix\` | 2,178,982 | 564,575 | 402,682 | Every styled family. |
5146
+ | \`@fusion.dev/helix\` | 2,208,000 | 571,244 | 407,379 | Every styled family. |
5141
5147
  | \`lit\` | 15,394 | 6,118 | 5,460 | Lit itself, listed so you can subtract it from every row above. |
5142
5148
 
5143
5149
  ## Stylesheets
@@ -5151,20 +5157,20 @@ shows the whole cost of using the base layer on its own.
5151
5157
  | File | Raw | Gzip | Brotli | |
5152
5158
  |---|---|---|---|---|
5153
5159
  | \`base.css\` | 33,986 | 4,785 | 4,158 | The base layer. It styles markup Helix does not render, and it works with no JavaScript. |
5154
- | \`elements.css\` | 19,633 | 2,937 | 2,632 | Hides each element until its definition loads. It is generated from the tags in \`@fusion.dev/helix\`. |
5160
+ | \`elements.css\` | 19,686 | 2,942 | 2,638 | Hides each element until its definition loads. It is generated from the tags in \`@fusion.dev/helix\`. |
5155
5161
  | \`helix.css\` | 207 | 148 | 118 | The other four stylesheets in one import, in the order they must load. |
5156
5162
  | \`primitives.css\` | 7,511 | 1,401 | 1,221 | The primitive layer. It is private, and it ships because \`tokens.css\` refers to it. |
5157
5163
  | \`tokens.css\` | 23,030 | 2,795 | 2,319 | The 200 semantic tokens. Every styled component needs them. |
5158
5164
 
5159
5165
  ## What the numbers say
5160
5166
 
5161
- **Most of your first component is the shared runtime.** The median styled family is 19,331 bytes gzipped alone, and it adds 4,366 to a page that already has Helix. The shared runtime is 77 percent of the first component, and the component itself is 23 percent. Ten typical components cost the first number once, plus nine of the added number. The two columns in the tables below let you work that out for your own components.
5167
+ **Most of your first component is the shared runtime.** The median styled family is 19,792 bytes gzipped alone, and it adds 4,543 to a page that already has Helix. The shared runtime is 77 percent of the first component, and the component itself is 23 percent. Ten typical components cost the first number once, plus nine of the added number. The two columns in the tables below let you work that out for your own components.
5162
5168
 
5163
- Across the 113 styled components, the smallest is \`code\` at 8,561 bytes gzipped alone, and the largest is \`data-table\` at 67,606. Every family together is 564,575.
5169
+ Across the 114 styled components, the smallest is \`code\` at 8,560 bytes gzipped alone, and the largest is \`data-table\` at 67,607. Every family together is 571,244.
5164
5170
 
5165
- No family imports a barrel. The \`barrels\` rule in \`fusion x workspace\` enforces that. \`@fusion.dev/helix-headless\` marks every module in \`dist\` as having side effects, which is true of a file that calls \`customElements.define\`. A bundler can remove none of it. One \`import { HelixHeadlessButton } from '@fusion.dev/helix-headless'\` costs 408,995 bytes gzipped, whatever else the page imports. That is 21 times the median family above. All 113 styled families import the headless family they extend directly. The rule checks the shape of the import, so it applies to any package that sets \`sideEffects\`, whatever its name.
5171
+ No family imports a barrel. The \`barrels\` rule in \`fusion x workspace\` enforces that. \`@fusion.dev/helix-headless\` marks every module in \`dist\` as having side effects, which is true of a file that calls \`customElements.define\`. A bundler can remove none of it. One \`import { HelixHeadlessButton } from '@fusion.dev/helix-headless'\` costs 414,210 bytes gzipped, whatever else the page imports. That is 21 times the median family above. All 114 styled families import the headless family they extend directly. The rule checks the shape of the import, so it applies to any package that sets \`sideEffects\`, whatever its name.
5166
5172
 
5167
- The headless tier never had the problem, so it serves as the control. \`@fusion.dev/helix-core\` is \`sideEffects: false\`, and the median headless family is 18,197 bytes gzipped alone.
5173
+ The headless tier never had the problem, so it serves as the control. \`@fusion.dev/helix-core\` is \`sideEffects: false\`, and the median headless family is 18,409 bytes gzipped alone.
5168
5174
 
5169
5175
  ## Compared with other systems
5170
5176
 
@@ -5176,43 +5182,43 @@ The table has no whole-library row. That row would compare how many components e
5176
5182
 
5177
5183
  | Component | System | Raw | Gzip | Brotli |
5178
5184
  |---|---|---|---|---|
5179
- | \`button\` | **Helix** | 42,729 | 14,402 | 12,816 |
5185
+ | \`button\` | **Helix** | 42,729 | 14,401 | 12,850 |
5180
5186
  | | Carbon | 133,058 | 20,959 | 17,685 |
5181
5187
  | | Material Web | 47,060 | 14,173 | 12,591 |
5182
5188
  | | Spectrum | 98,792 | 22,045 | 18,674 |
5183
5189
  | | Web Awesome | 136,044 | 33,730 | 28,760 |
5184
- | \`checkbox\` | **Helix** | 47,728 | 15,518 | 13,864 |
5190
+ | \`checkbox\` | **Helix** | 47,728 | 15,518 | 13,821 |
5185
5191
  | | Carbon | 60,255 | 15,609 | 13,550 |
5186
5192
  | | Material Web | 43,785 | 13,556 | 12,015 |
5187
5193
  | | Spectrum | 62,492 | 15,437 | 13,481 |
5188
5194
  | | Web Awesome | 115,251 | 28,728 | 24,420 |
5189
- | \`dialog\` | **Helix** | 44,311 | 15,225 | 13,594 |
5195
+ | \`dialog\` | **Helix** | 44,311 | 15,228 | 13,599 |
5190
5196
  | | Carbon | 510,866 | 67,390 | 39,189 |
5191
5197
  | | Material Web | 34,238 | 11,510 | 10,229 |
5192
5198
  | | Spectrum | 155,708 | 31,899 | 26,262 |
5193
5199
  | | Web Awesome | 148,657 | 36,692 | 31,388 |
5194
- | \`radio\` | **Helix** | 51,120 | 16,281 | 14,513 |
5200
+ | \`radio\` | **Helix** | 51,120 | 16,283 | 14,517 |
5195
5201
  | | Carbon | 63,055 | 16,887 | 14,605 |
5196
5202
  | | Material Web | 41,044 | 13,234 | 11,757 |
5197
5203
  | | Spectrum | 38,685 | 10,660 | 9,370 |
5198
5204
  | | Web Awesome | 112,026 | 27,416 | 23,128 |
5199
- | \`switch\` | **Helix** | 44,449 | 14,978 | 13,362 |
5205
+ | \`switch\` | **Helix** | 44,449 | 14,979 | 13,332 |
5200
5206
  | | Carbon | 69,423 | 17,127 | 14,764 |
5201
5207
  | | Material Web | 50,155 | 14,577 | 12,935 |
5202
5208
  | | Spectrum | 62,322 | 15,059 | 13,321 |
5203
5209
  | | Web Awesome | 45,876 | 15,003 | 13,475 |
5204
- | \`tabs\` | **Helix** | 56,031 | 18,048 | 16,068 |
5210
+ | \`tabs\` | **Helix** | 56,031 | 18,046 | 16,057 |
5205
5211
  | | Carbon | 578,766 | 73,537 | 43,235 |
5206
5212
  | | Material Web | 38,883 | 12,820 | 11,368 |
5207
5213
  | | Spectrum | 64,875 | 18,298 | 16,283 |
5208
5214
  | | Web Awesome | 153,439 | 37,030 | 31,737 |
5209
- | \`tooltip\` | **Helix** | 62,502 | 22,262 | 19,723 |
5215
+ | \`tooltip\` | **Helix** | 62,502 | 22,264 | 19,815 |
5210
5216
  | | Carbon | 189,382 | 30,354 | 22,273 |
5211
5217
  | | Material Web | | not shipped | |
5212
5218
  | | Spectrum | 136,599 | 40,552 | 35,286 |
5213
5219
  | | Web Awesome | 70,568 | 24,005 | 21,107 |
5214
5220
 
5215
- At least one system is smaller than Helix on \`button\`, \`checkbox\`, \`dialog\`, \`radio\`, \`switch\`, \`tabs\`. The largest gap is radio against Spectrum, at 5,621 bytes gzipped. 8 of 27 peer measurements are smaller than the Helix row.
5221
+ At least one system is smaller than Helix on \`button\`, \`checkbox\`, \`dialog\`, \`radio\`, \`switch\`, \`tabs\`. The largest gap is radio against Spectrum, at 5,623 bytes gzipped. 8 of 27 peer measurements are smaller than the Helix row.
5216
5222
 
5217
5223
  Helix's \`radio\` family includes Radio Group, so its row carries an element that some peer rows measure without.
5218
5224
 
@@ -5286,112 +5292,113 @@ Structure, accessibility, state, and form participation. It has no presentation
5286
5292
 
5287
5293
  | Family | Alone raw | Alone gzip | Alone brotli | Added raw | Added gzip | Added brotli |
5288
5294
  |---|---|---|---|---|---|---|
5289
- | \`accordion\` | 32,671 | 12,095 | 10,732 | 5,377 | 1,563 | 1,217 |
5290
- | \`announcement\` | 37,661 | 13,706 | 12,236 | 4,700 | 1,377 | 933 |
5291
- | \`app-header\` | 33,168 | 12,242 | 10,880 | 5,900 | 1,765 | 1,247 |
5292
- | \`area-chart\` | 99,355 | 34,967 | 30,847 | 14,417 | 4,435 | 3,591 |
5293
- | \`avatar\` | 31,887 | 12,152 | 10,870 | 3,999 | 1,244 | 863 |
5294
- | \`badge\` | 28,118 | 10,943 | 9,778 | 2,960 | 892 | 772 |
5295
- | \`bar-chart\` | 107,369 | 37,644 | 33,296 | 21,901 | 6,897 | 5,707 |
5296
- | \`blockquote\` | 24,679 | 9,638 | 8,541 | 2,400 | 888 | 754 |
5297
- | \`breadcrumbs\` | 37,419 | 14,329 | 12,787 | 7,381 | 2,409 | 1,945 |
5298
- | \`button\` | 36,221 | 12,969 | 11,566 | 5,127 | 1,529 | 1,084 |
5299
- | \`button-group\` | 28,214 | 10,617 | 9,418 | 4,923 | 1,515 | 1,204 |
5300
- | \`callout\` | 36,284 | 13,987 | 12,431 | 2,884 | 964 | 662 |
5301
- | \`canvas\` | 109,988 | 35,327 | 30,867 | 68,989 | 21,044 | 17,591 |
5302
- | \`card\` | 24,397 | 9,311 | 8,259 | 2,090 | 619 | 454 |
5303
- | \`carousel\` | 45,167 | 16,067 | 14,393 | 15,330 | 4,234 | 3,238 |
5304
- | \`chat\` | 81,069 | 27,036 | 23,922 | 27,682 | 8,066 | 6,458 |
5305
- | \`checkbox\` | 41,242 | 14,016 | 12,511 | 3,107 | 956 | 621 |
5306
- | \`checkbox-group\` | 48,465 | 15,944 | 14,238 | 8,321 | 2,359 | 1,719 |
5307
- | \`code\` | 20,869 | 8,248 | 7,311 | 138 | 68 | 106 |
5308
- | \`code-block\` | 104,774 | 35,632 | 31,448 | 37,349 | 10,781 | 8,882 |
5309
- | \`color-input\` | 143,744 | 45,826 | 39,930 | 55,780 | 14,210 | 11,791 |
5310
- | \`color-picker\` | 105,363 | 33,633 | 29,439 | 47,900 | 12,700 | 10,486 |
5311
- | \`combobox\` | 133,766 | 42,655 | 37,502 | 35,968 | 9,137 | 7,196 |
5312
- | \`command\` | 101,170 | 32,142 | 28,248 | 30,351 | 8,162 | 6,451 |
5313
- | \`copy-button\` | 82,225 | 28,295 | 25,025 | 18,756 | 5,080 | 4,094 |
5314
- | \`data-table\` | 202,025 | 62,201 | 53,125 | 89,966 | 24,057 | 19,128 |
5315
- | \`date-input\` | 143,049 | 45,174 | 39,742 | 38,666 | 9,518 | 7,653 |
5316
- | \`date-picker\` | 63,093 | 21,512 | 19,285 | 20,720 | 5,657 | 4,461 |
5317
- | \`description-list\` | 23,472 | 8,993 | 7,982 | 1,565 | 504 | 351 |
5318
- | \`dialog\` | 39,175 | 13,971 | 12,446 | 5,948 | 1,761 | 1,202 |
5319
- | \`divider\` | 23,564 | 9,144 | 8,084 | 1,414 | 503 | 381 |
5320
- | \`donut-chart\` | 92,673 | 32,268 | 28,536 | 14,717 | 4,503 | 3,685 |
5321
- | \`drawer\` | 43,812 | 15,481 | 13,858 | 7,798 | 2,315 | 1,785 |
5322
- | \`drilldown\` | 43,527 | 15,249 | 13,575 | 9,709 | 2,689 | 2,036 |
5323
- | \`empty\` | 25,007 | 9,578 | 8,499 | 1,976 | 631 | 433 |
5324
- | \`file-input\` | 59,118 | 20,550 | 18,263 | 13,152 | 4,125 | 3,216 |
5325
- | \`filter-input\` | 99,578 | 33,494 | 29,683 | 21,569 | 6,163 | 4,922 |
5326
- | \`format-date\` | 31,209 | 11,674 | 10,418 | 4,474 | 1,269 | 1,013 |
5327
- | \`graph\` | 76,986 | 25,237 | 22,347 | 23,180 | 6,770 | 5,506 |
5328
- | \`heatmap\` | 101,735 | 34,695 | 30,630 | 19,071 | 5,589 | 4,451 |
5329
- | \`icon\` | 83,516 | 28,587 | 24,464 | 58,618 | 20,089 | 16,093 |
5330
- | \`icon-button\` | 36,332 | 13,001 | 11,591 | 5,236 | 1,571 | 1,099 |
5331
- | \`image\` | 26,373 | 9,844 | 8,745 | 3,845 | 1,144 | 789 |
5332
- | \`input\` | 47,049 | 16,178 | 14,339 | 7,005 | 2,238 | 1,612 |
5333
- | \`kbd\` | 28,084 | 10,789 | 9,553 | 3,518 | 1,108 | 857 |
5334
- | \`legend\` | 36,396 | 13,369 | 11,949 | 2,955 | 983 | 760 |
5335
- | \`lightbox\` | 57,138 | 19,382 | 17,257 | 16,760 | 4,615 | 3,552 |
5336
- | \`line-chart\` | 102,350 | 35,823 | 31,650 | 16,812 | 5,051 | 4,182 |
5337
- | \`list\` | 62,949 | 21,721 | 19,372 | 15,258 | 4,388 | 3,488 |
5338
- | \`listbox\` | 78,070 | 25,948 | 22,931 | 15,605 | 4,570 | 3,443 |
5339
- | \`loader\` | 27,341 | 10,451 | 9,312 | 2,785 | 940 | 657 |
5340
- | \`log\` | 80,937 | 27,697 | 24,580 | 37,582 | 11,605 | 9,859 |
5341
- | \`map\` | 81,046 | 25,212 | 22,069 | 37,496 | 10,234 | 8,125 |
5342
- | \`megamenu\` | 61,165 | 22,169 | 19,590 | 8,723 | 2,440 | 1,739 |
5343
- | \`menu\` | 98,510 | 32,960 | 29,081 | 30,262 | 7,986 | 6,490 |
5344
- | \`meter\` | 32,921 | 12,484 | 11,132 | 4,980 | 1,457 | 1,193 |
5345
- | \`motion-toggle\` | 26,353 | 10,248 | 9,109 | 1,426 | 509 | 385 |
5346
- | \`navigation\` | 33,861 | 12,731 | 11,315 | 3,364 | 1,168 | 899 |
5347
- | \`notifications\` | 59,565 | 20,343 | 18,160 | 18,280 | 5,028 | 4,056 |
5348
- | \`number-input\` | 57,629 | 19,358 | 17,235 | 13,579 | 3,624 | 2,757 |
5349
- | \`object-inspector\` | 115,897 | 39,008 | 34,355 | 36,018 | 10,393 | 8,285 |
5350
- | \`option\` | 27,049 | 9,970 | 8,859 | 4,522 | 1,208 | 864 |
5351
- | \`outline\` | 34,611 | 12,985 | 11,535 | 7,888 | 2,549 | 1,930 |
5352
- | \`pagination\` | 138,030 | 44,303 | 38,421 | 45,681 | 11,904 | 9,500 |
5353
- | \`pin-input\` | 48,848 | 17,044 | 15,218 | 7,207 | 2,382 | 1,701 |
5354
- | \`popover\` | 64,882 | 23,350 | 20,626 | 6,460 | 1,852 | 1,345 |
5355
- | \`progress\` | 29,235 | 11,153 | 9,999 | 3,006 | 939 | 761 |
5356
- | \`qr-code\` | 43,669 | 17,003 | 15,118 | 17,002 | 6,284 | 5,346 |
5357
- | \`quote\` | 23,088 | 9,112 | 8,040 | 1,209 | 488 | 387 |
5358
- | \`radio\` | 43,333 | 14,777 | 13,184 | 3,815 | 1,212 | 927 |
5359
- | \`rating\` | 51,593 | 17,779 | 15,868 | 8,057 | 2,439 | 1,810 |
5360
- | \`scatter-chart\` | 98,654 | 34,303 | 30,255 | 20,338 | 6,384 | 5,082 |
5361
- | \`scroll-area\` | 31,294 | 11,434 | 10,149 | 8,518 | 2,593 | 1,918 |
5362
- | \`select\` | 116,719 | 38,717 | 33,936 | 26,155 | 7,162 | 5,538 |
5363
- | \`skeleton\` | 22,900 | 8,871 | 7,876 | 991 | 380 | 238 |
5364
- | \`skip-link\` | 24,547 | 9,608 | 8,524 | 1,223 | 462 | 394 |
5365
- | \`slider\` | 54,642 | 18,411 | 16,524 | 13,623 | 3,852 | 3,036 |
5366
- | \`sparkline\` | 49,258 | 17,982 | 16,066 | 5,982 | 2,080 | 1,585 |
5367
- | \`spatial-bar-chart\` | 105,167 | 37,122 | 32,678 | 19,854 | 6,512 | 5,245 |
5368
- | \`spatial-heatmap\` | 117,089 | 39,972 | 35,099 | 31,736 | 9,634 | 7,832 |
5369
- | \`spatial-ribbon-chart\` | 104,288 | 36,728 | 32,377 | 20,791 | 6,921 | 5,711 |
5370
- | \`spatial-scatter-chart\` | 102,521 | 35,980 | 31,686 | 19,085 | 6,282 | 5,029 |
5371
- | \`spatial-surface-chart\` | 105,443 | 37,265 | 32,856 | 21,949 | 7,457 | 6,132 |
5372
- | \`spatial-treemap\` | 106,561 | 37,910 | 33,342 | 21,370 | 7,340 | 5,906 |
5373
- | \`speed-dial\` | 69,618 | 25,069 | 22,188 | 10,934 | 2,960 | 2,303 |
5374
- | \`splitter\` | 45,071 | 15,639 | 13,983 | 14,506 | 3,861 | 3,097 |
5375
- | \`stat\` | 26,285 | 10,056 | 8,959 | 2,322 | 758 | 663 |
5376
- | \`steps\` | 54,926 | 19,122 | 17,008 | 13,804 | 3,877 | 3,151 |
5377
- | \`switch\` | 40,096 | 13,832 | 12,333 | 1,679 | 617 | 440 |
5378
- | \`table\` | 119,434 | 37,421 | 32,554 | 45,149 | 12,313 | 9,988 |
5379
- | \`tabs\` | 47,080 | 16,201 | 14,414 | 10,491 | 2,858 | 2,153 |
5380
- | \`tag\` | 43,623 | 15,992 | 14,300 | 8,450 | 2,507 | 1,843 |
5381
- | \`textarea\` | 44,973 | 15,361 | 13,719 | 5,489 | 1,620 | 1,217 |
5382
- | \`time-input\` | 170,882 | 53,314 | 46,306 | 48,574 | 12,337 | 9,817 |
5383
- | \`time-picker\` | 101,126 | 32,099 | 28,232 | 33,987 | 9,210 | 7,320 |
5384
- | \`timeline\` | 32,429 | 12,280 | 11,015 | 4,086 | 1,190 | 870 |
5385
- | \`toast\` | 52,298 | 18,497 | 16,512 | 12,164 | 3,516 | 2,702 |
5386
- | \`toggle\` | 46,246 | 15,541 | 13,887 | 6,005 | 1,797 | 1,392 |
5387
- | \`toolbar\` | 31,817 | 11,859 | 10,566 | 5,156 | 1,635 | 1,183 |
5388
- | \`tooltip\` | 59,698 | 21,530 | 19,098 | 8,504 | 2,355 | 1,754 |
5389
- | \`tour\` | 85,264 | 29,314 | 25,877 | 20,091 | 5,516 | 4,361 |
5390
- | \`tree\` | 68,641 | 23,150 | 20,581 | 17,198 | 4,915 | 3,943 |
5391
- | \`trend\` | 30,937 | 12,023 | 10,748 | 3,590 | 1,095 | 855 |
5392
- | \`video\` | 143,863 | 45,087 | 39,331 | 66,787 | 16,899 | 14,022 |
5393
- | \`video-playlist\` | 128,994 | 41,833 | 36,735 | 42,860 | 11,196 | 9,182 |
5394
- | \`virtual-list\` | 64,382 | 21,913 | 19,490 | 23,393 | 7,161 | 5,755 |
5295
+ | \`accordion\` | 32,671 | 12,094 | 10,735 | 5,378 | 1,529 | 1,131 |
5296
+ | \`announcement\` | 37,661 | 13,707 | 12,239 | 4,701 | 1,370 | 1,025 |
5297
+ | \`app-header\` | 33,168 | 12,240 | 10,876 | 5,901 | 1,738 | 1,302 |
5298
+ | \`area-chart\` | 99,355 | 34,965 | 30,843 | 14,419 | 4,407 | 3,485 |
5299
+ | \`avatar\` | 31,887 | 12,152 | 10,893 | 4,000 | 1,210 | 907 |
5300
+ | \`badge\` | 28,118 | 10,943 | 9,778 | 2,961 | 863 | 583 |
5301
+ | \`bar-chart\` | 107,369 | 37,640 | 33,276 | 21,900 | 6,919 | 5,782 |
5302
+ | \`blockquote\` | 24,679 | 9,637 | 8,534 | 2,401 | 855 | 582 |
5303
+ | \`breadcrumbs\` | 37,419 | 14,327 | 12,788 | 7,382 | 2,390 | 1,919 |
5304
+ | \`button\` | 36,221 | 12,969 | 11,568 | 5,128 | 1,500 | 1,138 |
5305
+ | \`button-group\` | 28,214 | 10,616 | 9,417 | 4,921 | 1,479 | 1,032 |
5306
+ | \`callout\` | 36,284 | 13,987 | 12,428 | 2,884 | 935 | 620 |
5307
+ | \`canvas\` | 116,881 | 37,636 | 32,848 | 68,987 | 21,053 | 17,481 |
5308
+ | \`card\` | 24,397 | 9,311 | 8,257 | 2,090 | 595 | 406 |
5309
+ | \`carousel\` | 45,167 | 16,073 | 14,342 | 15,328 | 4,237 | 3,358 |
5310
+ | \`chat\` | 81,069 | 27,037 | 23,873 | 27,683 | 8,099 | 6,434 |
5311
+ | \`checkbox\` | 41,242 | 14,016 | 12,498 | 3,107 | 926 | 725 |
5312
+ | \`checkbox-group\` | 48,465 | 15,944 | 14,235 | 8,322 | 2,341 | 1,776 |
5313
+ | \`code\` | 20,869 | 8,247 | 7,309 | 138 | 52 | -30 |
5314
+ | \`code-block\` | 104,774 | 35,631 | 31,417 | 37,347 | 10,692 | 8,924 |
5315
+ | \`color-input\` | 143,744 | 45,822 | 39,991 | 55,778 | 14,318 | 11,805 |
5316
+ | \`color-picker\` | 105,363 | 33,633 | 29,452 | 47,898 | 12,634 | 10,411 |
5317
+ | \`combobox\` | 133,766 | 42,657 | 37,513 | 35,966 | 9,125 | 7,190 |
5318
+ | \`command\` | 101,170 | 32,144 | 28,271 | 30,349 | 8,191 | 6,634 |
5319
+ | \`copy-button\` | 82,225 | 28,295 | 25,084 | 18,757 | 5,061 | 4,114 |
5320
+ | \`data-table\` | 202,025 | 62,203 | 53,145 | 89,964 | 24,071 | 19,302 |
5321
+ | \`date-input\` | 143,049 | 45,173 | 39,648 | 38,664 | 9,426 | 7,590 |
5322
+ | \`date-picker\` | 63,093 | 21,512 | 19,243 | 20,720 | 5,612 | 4,512 |
5323
+ | \`description-list\` | 23,472 | 8,992 | 7,982 | 1,565 | 477 | 336 |
5324
+ | \`dialog\` | 39,175 | 13,971 | 12,449 | 5,948 | 1,758 | 1,349 |
5325
+ | \`divider\` | 23,564 | 9,143 | 8,083 | 1,415 | 472 | 281 |
5326
+ | \`donut-chart\` | 92,673 | 32,264 | 28,524 | 14,719 | 4,470 | 3,604 |
5327
+ | \`drawer\` | 43,812 | 15,482 | 13,794 | 7,799 | 2,285 | 1,747 |
5328
+ | \`drilldown\` | 43,527 | 15,250 | 13,592 | 9,707 | 2,700 | 2,115 |
5329
+ | \`empty\` | 25,007 | 9,577 | 8,495 | 1,976 | 595 | 443 |
5330
+ | \`file-input\` | 59,118 | 20,551 | 18,289 | 13,152 | 4,120 | 3,251 |
5331
+ | \`filter-input\` | 99,578 | 33,491 | 29,727 | 21,571 | 6,167 | 4,908 |
5332
+ | \`format-date\` | 31,209 | 11,674 | 10,454 | 4,475 | 1,250 | 975 |
5333
+ | \`graph\` | 80,826 | 26,446 | 23,401 | 22,944 | 6,679 | 5,419 |
5334
+ | \`heatmap\` | 101,735 | 34,690 | 30,643 | 19,070 | 5,601 | 4,500 |
5335
+ | \`icon\` | 84,375 | 28,942 | 24,812 | 59,478 | 20,544 | 16,372 |
5336
+ | \`icon-button\` | 36,332 | 12,998 | 11,586 | 5,237 | 1,534 | 1,172 |
5337
+ | \`image\` | 26,373 | 9,843 | 8,743 | 3,846 | 1,132 | 845 |
5338
+ | \`input\` | 47,049 | 16,178 | 14,343 | 7,006 | 2,220 | 1,494 |
5339
+ | \`kbd\` | 28,084 | 10,786 | 9,543 | 3,516 | 1,084 | 695 |
5340
+ | \`legend\` | 39,951 | 14,498 | 12,941 | 2,765 | 879 | 676 |
5341
+ | \`lightbox\` | 57,138 | 19,379 | 17,227 | 16,760 | 4,606 | 3,501 |
5342
+ | \`line-chart\` | 102,350 | 35,824 | 31,648 | 16,812 | 5,035 | 4,213 |
5343
+ | \`list\` | 62,949 | 21,720 | 19,365 | 15,256 | 4,375 | 3,434 |
5344
+ | \`listbox\` | 78,070 | 25,949 | 22,983 | 15,603 | 4,545 | 3,450 |
5345
+ | \`loader\` | 27,341 | 10,450 | 9,309 | 2,786 | 900 | 638 |
5346
+ | \`log\` | 80,937 | 27,697 | 24,614 | 37,582 | 11,477 | 9,828 |
5347
+ | \`map\` | 87,568 | 27,296 | 23,896 | 37,497 | 10,138 | 8,124 |
5348
+ | \`megamenu\` | 61,165 | 22,170 | 19,604 | 8,724 | 2,430 | 1,782 |
5349
+ | \`menu\` | 98,510 | 32,958 | 29,062 | 30,262 | 8,005 | 6,518 |
5350
+ | \`meter\` | 32,921 | 12,484 | 11,169 | 4,982 | 1,447 | 1,225 |
5351
+ | \`motion-toggle\` | 26,353 | 10,249 | 9,108 | 1,426 | 480 | 223 |
5352
+ | \`navigation\` | 33,861 | 12,731 | 11,314 | 3,365 | 1,113 | 842 |
5353
+ | \`notifications\` | 59,565 | 20,343 | 18,136 | 18,281 | 5,014 | 4,085 |
5354
+ | \`number-input\` | 57,629 | 19,358 | 17,243 | 13,581 | 3,616 | 2,916 |
5355
+ | \`object-inspector\` | 115,897 | 39,007 | 34,322 | 36,016 | 10,271 | 8,342 |
5356
+ | \`option\` | 27,049 | 9,970 | 8,856 | 4,523 | 1,163 | 917 |
5357
+ | \`outline\` | 34,611 | 12,984 | 11,533 | 7,888 | 2,547 | 2,031 |
5358
+ | \`pagination\` | 138,030 | 44,309 | 38,499 | 45,679 | 11,783 | 9,558 |
5359
+ | \`pin-input\` | 48,848 | 17,045 | 15,223 | 7,208 | 2,350 | 1,700 |
5360
+ | \`popover\` | 64,882 | 23,347 | 20,625 | 6,461 | 1,844 | 1,370 |
5361
+ | \`progress\` | 29,235 | 11,152 | 9,980 | 3,007 | 911 | 797 |
5362
+ | \`qr-code\` | 43,669 | 17,003 | 15,110 | 17,003 | 6,259 | 5,294 |
5363
+ | \`quote\` | 23,088 | 9,111 | 8,047 | 1,210 | 472 | 286 |
5364
+ | \`radio\` | 43,333 | 14,777 | 13,182 | 3,815 | 1,181 | 823 |
5365
+ | \`rating\` | 51,593 | 17,779 | 15,843 | 8,058 | 2,433 | 1,758 |
5366
+ | \`scatter-chart\` | 98,654 | 34,305 | 30,248 | 20,340 | 6,363 | 5,126 |
5367
+ | \`scroll-area\` | 31,294 | 11,432 | 10,150 | 8,518 | 2,568 | 1,953 |
5368
+ | \`select\` | 116,719 | 38,718 | 33,938 | 26,153 | 7,156 | 5,491 |
5369
+ | \`skeleton\` | 22,900 | 8,871 | 7,873 | 991 | 351 | 199 |
5370
+ | \`skip-link\` | 24,547 | 9,607 | 8,523 | 1,224 | 434 | 230 |
5371
+ | \`slider\` | 54,642 | 18,409 | 16,468 | 13,625 | 3,834 | 2,997 |
5372
+ | \`sparkline\` | 49,258 | 17,982 | 16,053 | 5,984 | 2,084 | 1,649 |
5373
+ | \`spatial-bar-chart\` | 105,167 | 37,124 | 32,670 | 19,854 | 6,504 | 5,241 |
5374
+ | \`spatial-heatmap\` | 117,089 | 39,971 | 35,128 | 31,741 | 9,529 | 7,796 |
5375
+ | \`spatial-ribbon-chart\` | 104,288 | 36,724 | 32,350 | 20,793 | 6,946 | 5,745 |
5376
+ | \`spatial-scatter-chart\` | 102,521 | 35,979 | 31,684 | 19,087 | 6,257 | 5,166 |
5377
+ | \`spatial-surface-chart\` | 105,443 | 37,265 | 32,849 | 21,949 | 7,431 | 6,112 |
5378
+ | \`spatial-treemap\` | 106,561 | 37,909 | 33,331 | 21,370 | 7,341 | 5,940 |
5379
+ | \`speed-dial\` | 69,618 | 25,071 | 22,199 | 10,935 | 2,929 | 2,358 |
5380
+ | \`splitter\` | 45,071 | 15,638 | 13,975 | 14,504 | 3,856 | 3,119 |
5381
+ | \`stat\` | 26,285 | 10,055 | 8,954 | 2,323 | 726 | 564 |
5382
+ | \`steps\` | 54,926 | 19,118 | 17,041 | 13,805 | 3,855 | 3,067 |
5383
+ | \`switch\` | 40,096 | 13,831 | 12,327 | 1,679 | 583 | 381 |
5384
+ | \`table\` | 119,434 | 37,420 | 32,549 | 45,147 | 12,187 | 10,003 |
5385
+ | \`tabs\` | 47,080 | 16,201 | 14,418 | 10,491 | 2,854 | 2,171 |
5386
+ | \`tag\` | 43,623 | 15,997 | 14,326 | 8,451 | 2,496 | 1,821 |
5387
+ | \`terminal\` | 73,881 | 24,510 | 21,682 | 26,338 | 7,296 | 5,898 |
5388
+ | \`textarea\` | 44,973 | 15,362 | 13,730 | 5,490 | 1,604 | 1,165 |
5389
+ | \`time-input\` | 170,882 | 53,314 | 46,321 | 48,572 | 12,208 | 9,873 |
5390
+ | \`time-picker\` | 101,126 | 32,099 | 28,228 | 33,985 | 9,124 | 7,186 |
5391
+ | \`timeline\` | 32,429 | 12,280 | 11,015 | 4,087 | 1,187 | 908 |
5392
+ | \`toast\` | 52,298 | 18,495 | 16,465 | 12,165 | 3,483 | 2,679 |
5393
+ | \`toggle\` | 46,246 | 15,538 | 13,858 | 6,005 | 1,788 | 1,350 |
5394
+ | \`toolbar\` | 34,345 | 12,794 | 11,419 | 1,366 | 456 | 331 |
5395
+ | \`tooltip\` | 59,698 | 21,530 | 19,116 | 8,505 | 2,343 | 1,854 |
5396
+ | \`tour\` | 85,264 | 29,311 | 25,920 | 20,089 | 5,511 | 4,398 |
5397
+ | \`tree\` | 68,641 | 23,148 | 20,588 | 17,196 | 4,917 | 3,909 |
5398
+ | \`trend\` | 30,937 | 12,024 | 10,755 | 3,592 | 1,088 | 885 |
5399
+ | \`video\` | 143,863 | 45,086 | 39,311 | 66,785 | 16,938 | 13,922 |
5400
+ | \`video-playlist\` | 128,994 | 41,833 | 36,743 | 42,860 | 11,076 | 9,240 |
5401
+ | \`virtual-list\` | 64,382 | 21,914 | 19,517 | 23,394 | 7,180 | 5,801 |
5395
5402
 
5396
5403
  ### Styled tier
5397
5404
 
@@ -5399,119 +5406,120 @@ The headless tier plus presentation. \`bun add @fusion.dev/helix\` installs this
5399
5406
 
5400
5407
  | Family | Alone raw | Alone gzip | Alone brotli | Added raw | Added gzip | Added brotli |
5401
5408
  |---|---|---|---|---|---|---|
5402
- | \`accordion\` | 36,104 | 12,942 | 11,494 | 8,794 | 2,422 | 1,890 |
5403
- | \`announcement\` | 42,276 | 14,774 | 13,216 | 9,296 | 2,447 | 1,882 |
5404
- | \`app-header\` | 38,326 | 13,450 | 11,973 | 11,045 | 2,963 | 2,310 |
5405
- | \`area-chart\` | 107,559 | 36,866 | 32,511 | 22,602 | 6,323 | 5,276 |
5406
- | \`aura\` | 59,567 | 20,253 | 17,956 | 31,767 | 9,657 | 8,191 |
5407
- | \`avatar\` | 34,890 | 12,911 | 11,563 | 6,987 | 1,977 | 1,645 |
5408
- | \`badge\` | 33,626 | 12,190 | 10,866 | 8,458 | 2,162 | 1,717 |
5409
- | \`bar-chart\` | 122,404 | 40,671 | 35,922 | 36,918 | 9,901 | 8,245 |
5410
- | \`blockquote\` | 26,905 | 10,186 | 9,000 | 4,610 | 1,410 | 1,197 |
5411
- | \`breadcrumbs\` | 44,356 | 15,535 | 13,940 | 14,306 | 3,647 | 3,036 |
5412
- | \`button\` | 42,729 | 14,402 | 12,816 | 11,617 | 2,943 | 2,248 |
5413
- | \`button-group\` | 31,709 | 11,295 | 10,031 | 8,408 | 2,217 | 1,623 |
5414
- | \`callout\` | 40,077 | 14,932 | 13,276 | 6,659 | 1,926 | 1,450 |
5415
- | \`canvas\` | 131,027 | 39,298 | 34,385 | 89,671 | 24,901 | 20,865 |
5416
- | \`card\` | 28,297 | 10,317 | 9,175 | 5,976 | 1,646 | 1,192 |
5417
- | \`carousel\` | 55,653 | 17,867 | 16,011 | 25,801 | 6,071 | 4,882 |
5418
- | \`chat\` | 96,362 | 29,759 | 26,398 | 42,968 | 10,845 | 8,877 |
5419
- | \`checkbox\` | 47,728 | 15,518 | 13,864 | 9,579 | 2,487 | 2,023 |
5420
- | \`checkbox-group\` | 55,688 | 17,587 | 15,650 | 15,535 | 3,998 | 3,141 |
5421
- | \`code\` | 21,726 | 8,561 | 7,605 | 976 | 387 | 288 |
5422
- | \`code-block\` | 129,247 | 39,457 | 34,868 | 61,803 | 14,550 | 12,162 |
5423
- | \`color-input\` | 186,215 | 52,107 | 45,496 | 98,238 | 20,729 | 17,288 |
5424
- | \`color-picker\` | 142,389 | 39,199 | 34,442 | 84,910 | 18,384 | 15,218 |
5425
- | \`combobox\` | 149,120 | 45,610 | 40,084 | 51,305 | 12,020 | 9,752 |
5426
- | \`command\` | 112,469 | 34,490 | 30,347 | 41,644 | 10,571 | 8,606 |
5427
- | \`copy-button\` | 94,256 | 30,467 | 26,950 | 30,769 | 7,266 | 5,817 |
5428
- | \`data-table\` | 232,690 | 67,606 | 57,944 | 120,614 | 29,571 | 23,964 |
5429
- | \`date-input\` | 164,353 | 48,935 | 42,969 | 59,950 | 13,135 | 10,915 |
5430
- | \`date-picker\` | 71,139 | 22,979 | 20,555 | 28,748 | 7,131 | 5,617 |
5431
- | \`description-list\` | 26,427 | 9,731 | 8,675 | 4,508 | 1,267 | 971 |
5432
- | \`dialog\` | 44,311 | 15,225 | 13,594 | 11,064 | 3,043 | 2,451 |
5433
- | \`divider\` | 25,863 | 9,772 | 8,637 | 3,697 | 1,116 | 942 |
5434
- | \`donut-chart\` | 102,652 | 34,419 | 30,424 | 24,673 | 6,680 | 5,535 |
5435
- | \`drawer\` | 49,642 | 16,870 | 15,055 | 13,612 | 3,740 | 2,936 |
5436
- | \`drilldown\` | 49,204 | 16,541 | 14,754 | 15,375 | 4,009 | 3,115 |
5437
- | \`empty\` | 26,316 | 10,056 | 8,903 | 3,267 | 1,086 | 868 |
5438
- | \`file-input\` | 70,648 | 22,941 | 20,391 | 24,668 | 6,538 | 5,412 |
5439
- | \`filter-input\` | 110,412 | 35,679 | 31,658 | 32,396 | 8,385 | 6,773 |
5440
- | \`flex\` | 26,312 | 9,424 | 8,374 | 4,761 | 1,036 | 821 |
5441
- | \`format-date\` | 31,463 | 11,789 | 10,583 | 4,712 | 1,380 | 1,031 |
5442
- | \`graph\` | 92,818 | 27,924 | 24,702 | 38,992 | 9,573 | 7,748 |
5443
- | \`grid\` | 27,762 | 10,137 | 9,023 | 5,655 | 1,454 | 1,216 |
5444
- | \`heatmap\` | 110,057 | 36,548 | 32,255 | 27,373 | 7,432 | 6,176 |
5445
- | \`icon\` | 85,551 | 29,192 | 25,026 | 60,473 | 20,655 | 16,547 |
5446
- | \`icon-button\` | 44,066 | 14,349 | 12,786 | 12,955 | 2,913 | 2,319 |
5447
- | \`image\` | 27,760 | 10,306 | 9,131 | 5,216 | 1,618 | 1,266 |
5448
- | \`input\` | 51,304 | 17,264 | 15,288 | 11,243 | 3,351 | 2,489 |
5449
- | \`kbd\` | 30,078 | 11,329 | 10,047 | 5,494 | 1,664 | 1,208 |
5450
- | \`legend\` | 41,634 | 14,661 | 13,023 | 8,065 | 2,240 | 1,737 |
5451
- | \`lightbox\` | 63,432 | 20,711 | 18,428 | 23,035 | 5,920 | 4,697 |
5452
- | \`line-chart\` | 113,713 | 38,278 | 33,800 | 28,159 | 7,543 | 6,253 |
5453
- | \`list\` | 69,295 | 23,266 | 20,793 | 21,585 | 5,923 | 4,803 |
5454
- | \`listbox\` | 82,511 | 27,062 | 23,942 | 20,034 | 5,671 | 4,387 |
5455
- | \`loader\` | 30,222 | 11,214 | 10,002 | 5,652 | 1,708 | 1,342 |
5456
- | \`log\` | 92,717 | 29,992 | 26,631 | 49,350 | 13,833 | 11,891 |
5457
- | \`map\` | 114,692 | 30,616 | 26,827 | 71,126 | 15,712 | 13,000 |
5458
- | \`megamenu\` | 66,134 | 23,308 | 20,618 | 13,673 | 3,606 | 2,736 |
5459
- | \`menu\` | 109,435 | 35,106 | 30,931 | 41,177 | 10,169 | 8,340 |
5460
- | \`meter\` | 39,093 | 13,830 | 12,405 | 11,136 | 2,819 | 2,365 |
5461
- | \`motion-toggle\` | 27,988 | 10,725 | 9,532 | 3,044 | 986 | 740 |
5462
- | \`navigation\` | 37,585 | 13,566 | 12,045 | 7,077 | 2,007 | 1,606 |
5463
- | \`notifications\` | 73,053 | 22,902 | 20,452 | 31,757 | 7,626 | 6,300 |
5464
- | \`number-input\` | 62,610 | 20,544 | 18,304 | 18,544 | 4,831 | 3,761 |
5465
- | \`object-inspector\` | 132,306 | 41,847 | 36,810 | 52,407 | 13,134 | 10,871 |
5466
- | \`option\` | 30,122 | 10,930 | 9,729 | 7,585 | 2,154 | 1,712 |
5467
- | \`orb\` | 36,885 | 14,019 | 12,487 | 10,014 | 3,686 | 3,126 |
5468
- | \`outline\` | 38,845 | 13,847 | 12,314 | 12,105 | 3,427 | 2,667 |
5469
- | \`pagination\` | 154,907 | 47,576 | 41,367 | 62,541 | 15,108 | 12,386 |
5470
- | \`pin-input\` | 52,228 | 17,955 | 16,035 | 10,570 | 3,302 | 2,568 |
5471
- | \`popover\` | 68,034 | 24,118 | 21,309 | 9,594 | 2,641 | 2,021 |
5472
- | \`progress\` | 36,415 | 12,815 | 11,459 | 10,169 | 2,608 | 2,255 |
5473
- | \`qr-code\` | 45,270 | 17,490 | 15,562 | 18,586 | 6,783 | 5,723 |
5474
- | \`quote\` | 23,646 | 9,303 | 8,221 | 1,750 | 697 | 611 |
5475
- | \`radio\` | 51,120 | 16,281 | 14,513 | 11,591 | 2,742 | 2,116 |
5476
- | \`rating\` | 55,527 | 19,005 | 16,938 | 11,973 | 3,666 | 2,857 |
5477
- | \`sandbox\` | 108,218 | 32,974 | 28,855 | 74,725 | 20,349 | 17,077 |
5478
- | \`scatter-chart\` | 108,028 | 36,473 | 32,170 | 29,693 | 8,583 | 7,005 |
5479
- | \`scroll-area\` | 36,301 | 12,384 | 11,044 | 13,508 | 3,569 | 2,862 |
5480
- | \`select\` | 125,846 | 40,630 | 35,662 | 35,267 | 9,117 | 7,201 |
5481
- | \`skeleton\` | 26,848 | 9,947 | 8,859 | 4,755 | 1,403 | 1,129 |
5482
- | \`skip-link\` | 26,118 | 10,115 | 8,948 | 2,778 | 961 | 727 |
5483
- | \`slider\` | 69,605 | 20,729 | 18,554 | 28,572 | 6,252 | 5,141 |
5484
- | \`sparkline\` | 54,716 | 19,331 | 17,289 | 11,422 | 3,437 | 2,815 |
5485
- | \`spatial-bar-chart\` | 114,232 | 39,173 | 34,473 | 28,899 | 8,554 | 6,991 |
5486
- | \`spatial-heatmap\` | 126,828 | 42,153 | 37,017 | 41,457 | 11,707 | 9,742 |
5487
- | \`spatial-ribbon-chart\` | 113,204 | 38,749 | 34,175 | 29,690 | 8,962 | 7,372 |
5488
- | \`spatial-scatter-chart\` | 111,501 | 37,967 | 33,342 | 28,039 | 8,233 | 6,710 |
5489
- | \`spatial-surface-chart\` | 113,878 | 39,172 | 34,508 | 30,366 | 9,349 | 7,849 |
5490
- | \`spatial-treemap\` | 115,578 | 39,956 | 35,155 | 30,367 | 9,373 | 7,745 |
5491
- | \`speed-dial\` | 76,667 | 26,452 | 23,477 | 17,966 | 4,366 | 3,498 |
5492
- | \`splitter\` | 51,121 | 16,689 | 14,957 | 20,542 | 4,916 | 4,035 |
5493
- | \`stat\` | 29,171 | 10,751 | 9,606 | 5,193 | 1,472 | 1,129 |
5494
- | \`steps\` | 69,006 | 21,901 | 19,478 | 27,872 | 6,743 | 5,557 |
5495
- | \`strands\` | 63,680 | 23,697 | 20,888 | 38,177 | 13,700 | 11,957 |
5496
- | \`switch\` | 44,449 | 14,978 | 13,362 | 6,021 | 1,770 | 1,267 |
5497
- | \`table\` | 136,974 | 40,483 | 35,291 | 62,692 | 15,345 | 12,667 |
5498
- | \`tabs\` | 56,031 | 18,048 | 16,068 | 19,434 | 4,726 | 3,848 |
5499
- | \`tag\` | 48,197 | 17,125 | 15,291 | 13,011 | 3,615 | 2,827 |
5500
- | \`text\` | 29,286 | 10,213 | 9,030 | 7,182 | 1,478 | 1,170 |
5501
- | \`textarea\` | 48,905 | 16,375 | 14,607 | 9,403 | 2,651 | 2,167 |
5502
- | \`time-input\` | 195,137 | 57,471 | 50,031 | 72,814 | 16,512 | 13,551 |
5503
- | \`time-picker\` | 113,325 | 34,508 | 30,445 | 46,180 | 11,559 | 9,388 |
5504
- | \`timeline\` | 39,321 | 13,741 | 12,307 | 10,973 | 2,694 | 2,182 |
5505
- | \`toast\` | 60,192 | 20,339 | 18,183 | 20,046 | 5,404 | 4,414 |
5506
- | \`toggle\` | 51,106 | 16,791 | 14,924 | 10,851 | 3,070 | 2,454 |
5507
- | \`toolbar\` | 34,496 | 12,352 | 10,989 | 7,820 | 2,142 | 1,661 |
5508
- | \`tooltip\` | 62,502 | 22,262 | 19,723 | 11,290 | 3,106 | 2,499 |
5509
- | \`tour\` | 95,356 | 31,307 | 27,682 | 30,161 | 7,569 | 6,132 |
5510
- | \`tree\` | 77,329 | 25,058 | 22,338 | 25,871 | 6,853 | 5,682 |
5511
- | \`trend\` | 32,854 | 12,575 | 11,202 | 5,487 | 1,650 | 1,185 |
5512
- | \`video\` | 164,366 | 48,811 | 42,542 | 87,272 | 20,644 | 17,140 |
5513
- | \`video-playlist\` | 144,942 | 44,812 | 39,353 | 58,789 | 14,036 | 11,719 |
5514
- | \`virtual-list\` | 66,376 | 22,417 | 19,953 | 25,370 | 7,669 | 6,422 |
5409
+ | \`accordion\` | 36,104 | 12,946 | 11,493 | 8,795 | 2,438 | 2,015 |
5410
+ | \`announcement\` | 42,276 | 14,773 | 13,228 | 9,297 | 2,441 | 1,945 |
5411
+ | \`app-header\` | 38,326 | 13,449 | 11,965 | 11,046 | 2,961 | 2,410 |
5412
+ | \`area-chart\` | 107,559 | 36,864 | 32,534 | 22,604 | 6,351 | 5,183 |
5413
+ | \`aura\` | 59,567 | 20,253 | 17,973 | 31,768 | 9,529 | 8,133 |
5414
+ | \`avatar\` | 34,890 | 12,911 | 11,562 | 6,988 | 1,971 | 1,653 |
5415
+ | \`badge\` | 33,626 | 12,189 | 10,864 | 8,459 | 2,129 | 1,684 |
5416
+ | \`bar-chart\` | 122,404 | 40,669 | 35,860 | 36,917 | 9,799 | 8,287 |
5417
+ | \`blockquote\` | 26,905 | 10,185 | 9,024 | 4,611 | 1,382 | 1,074 |
5418
+ | \`breadcrumbs\` | 44,356 | 15,532 | 13,886 | 14,307 | 3,641 | 2,960 |
5419
+ | \`button\` | 42,729 | 14,401 | 12,850 | 11,618 | 2,964 | 2,327 |
5420
+ | \`button-group\` | 31,709 | 11,294 | 10,026 | 8,406 | 2,181 | 1,681 |
5421
+ | \`callout\` | 40,077 | 14,933 | 13,281 | 6,659 | 1,911 | 1,457 |
5422
+ | \`canvas\` | 137,925 | 41,609 | 36,407 | 89,669 | 24,934 | 20,870 |
5423
+ | \`card\` | 28,297 | 10,317 | 9,156 | 5,976 | 1,615 | 1,373 |
5424
+ | \`carousel\` | 55,653 | 17,867 | 15,977 | 25,799 | 6,101 | 4,896 |
5425
+ | \`chat\` | 96,362 | 29,760 | 26,321 | 42,966 | 10,732 | 8,887 |
5426
+ | \`checkbox\` | 47,728 | 15,518 | 13,821 | 9,579 | 2,443 | 1,968 |
5427
+ | \`checkbox-group\` | 55,688 | 17,586 | 15,667 | 15,536 | 3,987 | 3,044 |
5428
+ | \`code\` | 21,726 | 8,560 | 7,605 | 976 | 358 | 282 |
5429
+ | \`code-block\` | 129,247 | 39,451 | 34,768 | 61,801 | 14,607 | 12,215 |
5430
+ | \`color-input\` | 186,215 | 52,096 | 45,578 | 98,239 | 20,718 | 17,290 |
5431
+ | \`color-picker\` | 142,389 | 39,198 | 34,385 | 84,914 | 18,382 | 15,428 |
5432
+ | \`combobox\` | 149,120 | 45,609 | 40,082 | 51,303 | 11,936 | 9,826 |
5433
+ | \`command\` | 112,469 | 34,492 | 30,378 | 41,642 | 10,461 | 8,644 |
5434
+ | \`copy-button\` | 94,256 | 30,462 | 26,999 | 30,770 | 7,297 | 5,952 |
5435
+ | \`data-table\` | 232,690 | 67,607 | 57,861 | 120,612 | 29,559 | 23,913 |
5436
+ | \`date-input\` | 164,353 | 48,937 | 43,030 | 59,948 | 13,105 | 10,860 |
5437
+ | \`date-picker\` | 71,139 | 22,978 | 20,578 | 28,748 | 7,098 | 5,699 |
5438
+ | \`description-list\` | 26,427 | 9,730 | 8,674 | 4,508 | 1,225 | 891 |
5439
+ | \`dialog\` | 44,311 | 15,228 | 13,599 | 11,066 | 3,031 | 2,424 |
5440
+ | \`divider\` | 25,863 | 9,771 | 8,637 | 3,698 | 1,104 | 824 |
5441
+ | \`donut-chart\` | 102,652 | 34,414 | 30,451 | 24,675 | 6,693 | 5,539 |
5442
+ | \`drawer\` | 49,642 | 16,867 | 15,046 | 13,613 | 3,701 | 3,068 |
5443
+ | \`drilldown\` | 49,204 | 16,542 | 14,780 | 15,373 | 3,987 | 3,249 |
5444
+ | \`empty\` | 26,316 | 10,055 | 8,905 | 3,267 | 1,056 | 776 |
5445
+ | \`file-input\` | 70,648 | 22,939 | 20,406 | 24,670 | 6,538 | 5,430 |
5446
+ | \`filter-input\` | 110,412 | 35,681 | 31,658 | 32,398 | 8,359 | 6,821 |
5447
+ | \`flex\` | 26,312 | 9,424 | 8,372 | 4,762 | 1,026 | 818 |
5448
+ | \`format-date\` | 31,463 | 11,789 | 10,532 | 4,713 | 1,381 | 1,078 |
5449
+ | \`graph\` | 96,656 | 29,106 | 25,728 | 38,756 | 9,375 | 7,813 |
5450
+ | \`grid\` | 27,762 | 10,136 | 8,994 | 5,654 | 1,436 | 1,267 |
5451
+ | \`heatmap\` | 110,057 | 36,550 | 32,248 | 27,372 | 7,501 | 6,025 |
5452
+ | \`icon\` | 86,410 | 29,545 | 25,462 | 61,333 | 21,068 | 16,867 |
5453
+ | \`icon-button\` | 44,066 | 14,347 | 12,788 | 12,956 | 2,923 | 2,256 |
5454
+ | \`image\` | 27,760 | 10,305 | 9,128 | 5,217 | 1,605 | 1,245 |
5455
+ | \`input\` | 51,304 | 17,264 | 15,256 | 11,244 | 3,336 | 2,493 |
5456
+ | \`kbd\` | 30,078 | 11,327 | 10,001 | 5,492 | 1,634 | 1,308 |
5457
+ | \`legend\` | 45,189 | 15,799 | 14,053 | 7,875 | 2,176 | 1,706 |
5458
+ | \`lightbox\` | 63,432 | 20,710 | 18,430 | 23,035 | 5,943 | 4,668 |
5459
+ | \`line-chart\` | 113,713 | 38,274 | 33,766 | 28,161 | 7,544 | 6,242 |
5460
+ | \`list\` | 69,295 | 23,264 | 20,679 | 21,583 | 5,912 | 4,722 |
5461
+ | \`listbox\` | 82,511 | 27,060 | 23,919 | 20,032 | 5,677 | 4,351 |
5462
+ | \`loader\` | 30,222 | 11,213 | 9,999 | 5,653 | 1,662 | 1,289 |
5463
+ | \`log\` | 92,972 | 30,032 | 26,592 | 49,607 | 13,927 | 11,909 |
5464
+ | \`map\` | 121,211 | 32,727 | 28,658 | 71,127 | 15,725 | 12,890 |
5465
+ | \`megamenu\` | 66,134 | 23,305 | 20,632 | 13,674 | 3,617 | 2,824 |
5466
+ | \`menu\` | 109,435 | 35,104 | 30,964 | 41,175 | 10,054 | 8,346 |
5467
+ | \`meter\` | 39,093 | 13,831 | 12,343 | 11,138 | 2,813 | 2,414 |
5468
+ | \`motion-toggle\` | 27,988 | 10,725 | 9,532 | 3,044 | 963 | 776 |
5469
+ | \`navigation\` | 37,585 | 13,566 | 12,089 | 7,076 | 1,965 | 1,545 |
5470
+ | \`notifications\` | 73,053 | 22,903 | 20,461 | 31,758 | 7,678 | 6,404 |
5471
+ | \`number-input\` | 62,610 | 20,544 | 18,287 | 18,546 | 4,822 | 3,813 |
5472
+ | \`object-inspector\` | 132,306 | 41,847 | 36,835 | 52,410 | 13,107 | 10,910 |
5473
+ | \`option\` | 30,122 | 10,928 | 9,722 | 7,587 | 2,121 | 1,648 |
5474
+ | \`orb\` | 36,885 | 14,019 | 12,530 | 10,017 | 3,705 | 3,048 |
5475
+ | \`outline\` | 38,845 | 13,846 | 12,302 | 12,105 | 3,422 | 2,749 |
5476
+ | \`pagination\` | 154,907 | 47,575 | 41,395 | 62,539 | 15,123 | 12,355 |
5477
+ | \`pin-input\` | 52,228 | 17,953 | 16,007 | 10,571 | 3,277 | 2,491 |
5478
+ | \`popover\` | 68,034 | 24,114 | 21,294 | 9,595 | 2,626 | 2,076 |
5479
+ | \`progress\` | 36,415 | 12,815 | 11,450 | 10,170 | 2,587 | 2,253 |
5480
+ | \`qr-code\` | 45,270 | 17,490 | 15,561 | 18,587 | 6,717 | 5,690 |
5481
+ | \`quote\` | 23,646 | 9,303 | 8,218 | 1,751 | 657 | 490 |
5482
+ | \`radio\` | 51,120 | 16,283 | 14,517 | 11,591 | 2,753 | 2,149 |
5483
+ | \`rating\` | 55,527 | 19,004 | 16,932 | 11,974 | 3,649 | 2,789 |
5484
+ | \`sandbox\` | 108,218 | 32,974 | 28,902 | 74,723 | 20,381 | 17,121 |
5485
+ | \`scatter-chart\` | 108,028 | 36,473 | 32,151 | 29,695 | 8,491 | 7,008 |
5486
+ | \`scroll-area\` | 36,301 | 12,383 | 11,024 | 13,508 | 3,566 | 2,871 |
5487
+ | \`select\` | 125,846 | 40,635 | 35,649 | 35,265 | 9,068 | 7,299 |
5488
+ | \`skeleton\` | 26,848 | 9,946 | 8,858 | 4,755 | 1,357 | 1,110 |
5489
+ | \`skip-link\` | 26,118 | 10,114 | 8,948 | 2,779 | 938 | 633 |
5490
+ | \`slider\` | 69,605 | 20,727 | 18,562 | 28,574 | 6,243 | 5,084 |
5491
+ | \`sparkline\` | 54,716 | 19,331 | 17,260 | 11,424 | 3,460 | 2,851 |
5492
+ | \`spatial-bar-chart\` | 114,232 | 39,176 | 34,472 | 28,901 | 8,489 | 7,087 |
5493
+ | \`spatial-heatmap\` | 126,828 | 42,151 | 37,089 | 41,460 | 11,579 | 9,728 |
5494
+ | \`spatial-ribbon-chart\` | 113,204 | 38,745 | 34,084 | 29,691 | 8,873 | 7,332 |
5495
+ | \`spatial-scatter-chart\` | 111,501 | 37,966 | 33,439 | 28,039 | 8,193 | 6,844 |
5496
+ | \`spatial-surface-chart\` | 113,878 | 39,175 | 34,587 | 30,366 | 9,282 | 7,818 |
5497
+ | \`spatial-treemap\` | 115,580 | 39,959 | 35,165 | 30,369 | 9,300 | 7,809 |
5498
+ | \`speed-dial\` | 76,667 | 26,447 | 23,471 | 17,968 | 4,356 | 3,535 |
5499
+ | \`splitter\` | 51,121 | 16,688 | 14,961 | 20,540 | 4,922 | 3,984 |
5500
+ | \`stat\` | 29,171 | 10,750 | 9,582 | 5,194 | 1,435 | 1,160 |
5501
+ | \`steps\` | 69,006 | 21,901 | 19,517 | 27,874 | 6,754 | 5,588 |
5502
+ | \`strands\` | 63,680 | 23,699 | 20,875 | 38,176 | 13,677 | 11,865 |
5503
+ | \`switch\` | 44,449 | 14,979 | 13,332 | 6,021 | 1,742 | 1,343 |
5504
+ | \`table\` | 136,974 | 40,481 | 35,251 | 62,690 | 15,343 | 12,807 |
5505
+ | \`tabs\` | 56,031 | 18,046 | 16,057 | 19,435 | 4,729 | 3,839 |
5506
+ | \`tag\` | 48,197 | 17,125 | 15,318 | 13,012 | 3,616 | 2,722 |
5507
+ | \`terminal\` | 98,724 | 28,103 | 24,913 | 51,173 | 10,887 | 8,968 |
5508
+ | \`text\` | 29,286 | 10,212 | 9,013 | 7,183 | 1,452 | 1,231 |
5509
+ | \`textarea\` | 48,905 | 16,375 | 14,607 | 9,404 | 2,650 | 2,094 |
5510
+ | \`time-input\` | 195,137 | 57,469 | 50,006 | 72,812 | 16,513 | 13,536 |
5511
+ | \`time-picker\` | 113,325 | 34,508 | 30,350 | 46,178 | 11,438 | 9,383 |
5512
+ | \`timeline\` | 39,321 | 13,742 | 12,306 | 10,975 | 2,680 | 2,186 |
5513
+ | \`toast\` | 60,192 | 20,339 | 18,186 | 20,047 | 5,371 | 4,334 |
5514
+ | \`toggle\` | 51,106 | 16,787 | 14,917 | 10,853 | 3,046 | 2,468 |
5515
+ | \`toolbar\` | 37,026 | 13,290 | 11,886 | 4,030 | 972 | 735 |
5516
+ | \`tooltip\` | 62,502 | 22,264 | 19,815 | 11,291 | 3,099 | 2,519 |
5517
+ | \`tour\` | 95,356 | 31,302 | 27,676 | 30,159 | 7,622 | 6,095 |
5518
+ | \`tree\` | 77,329 | 25,056 | 22,278 | 25,869 | 6,869 | 5,623 |
5519
+ | \`trend\` | 32,854 | 12,576 | 11,197 | 5,489 | 1,642 | 1,273 |
5520
+ | \`video\` | 164,366 | 48,823 | 42,543 | 87,276 | 20,680 | 17,274 |
5521
+ | \`video-playlist\` | 144,942 | 44,815 | 39,345 | 58,787 | 14,057 | 11,751 |
5522
+ | \`virtual-list\` | 66,376 | 22,416 | 19,953 | 25,371 | 7,675 | 6,253 |
5515
5523
 
5516
5524
  ## What an install adds to \`node_modules\`
5517
5525
 
@@ -5524,12 +5532,12 @@ without its whitespace, and the sizes count each one that way.
5524
5532
 
5525
5533
  | Package | Unpacked | Files | Source maps stripped | Runtime dependencies |
5526
5534
  |---|---|---|---|---|
5527
- | \`@fusion.dev/helix-core\` | 2,192,783 | 587 | 791,390 | \`@floating-ui/dom\`, \`@fusion.dev/helix-icons\`, \`tslib\` |
5528
- | \`@fusion.dev/helix-headless\` | 23,982,207 | 772 | 2,535,098 | \`@fusion.dev/helix-core\`, \`@fusion.dev/helix-icons\`, \`tslib\`, \`uqr\` |
5529
- | \`@fusion.dev/helix-icons\` | 152,695 | 21 | 49,995 | \`svgo\` |
5530
- | \`@fusion.dev/helix-styles\` | 122,338 | 6 | 0 | none |
5535
+ | \`@fusion.dev/helix-core\` | 2,242,970 | 601 | 813,398 | \`@floating-ui/dom\`, \`@fusion.dev/helix-icons\`, \`tslib\` |
5536
+ | \`@fusion.dev/helix-headless\` | 24,200,613 | 778 | 2,554,230 | \`@fusion.dev/helix-core\`, \`@fusion.dev/helix-icons\`, \`tslib\`, \`uqr\` |
5537
+ | \`@fusion.dev/helix-icons\` | 154,507 | 21 | 50,303 | \`svgo\` |
5538
+ | \`@fusion.dev/helix-styles\` | 122,391 | 6 | 0 | none |
5531
5539
  | \`@fusion.dev/helix-theme\` | 453,157 | 8 | 6,257 | none |
5532
- | \`@fusion.dev/helix\` | 24,619,675 | 1,023 | 566,915 | \`@fusion.dev/helix-core\`, \`@fusion.dev/helix-headless\`, \`@fusion.dev/helix-styles\`, \`tslib\` |
5540
+ | \`@fusion.dev/helix\` | 24,830,508 | 1,029 | 569,278 | \`@fusion.dev/helix-core\`, \`@fusion.dev/helix-headless\`, \`@fusion.dev/helix-styles\`, \`tslib\` |
5533
5541
 
5534
5542
  ## Not measured yet
5535
5543
 
@@ -8347,6 +8355,429 @@ A declared \`value\`, \`open\`, \`checked\`, or \`active\` is a seed. The elemen
8347
8355
  with that value and then applies its own changes. To refuse a change, cancel the
8348
8356
  matching \`helix-before-*\` event. Skipping a state update does not refuse it. See
8349
8357
  [State and control](./state-and-control).
8358
+ `,
8359
+ terminals: `---
8360
+ description: Add a terminal that runs your own shell or process to your site, styled with your theme and drawn by xterm.js.
8361
+ section: Essentials
8362
+ title: Terminals
8363
+ ---
8364
+
8365
+ # Terminals
8366
+
8367
+ Helix Terminal puts a frame around a terminal drawn by xterm.js or an emulator
8368
+ of your own. The frame adds a header with the terminal's name and controls, a
8369
+ find bar, and a status line for a process that exited. \`@fusion.dev/helix-terminal\`
8370
+ connects the frame to the emulator and themes it from your tokens. Helix does
8371
+ not start processes. You connect the frame to yours, such as a pseudo-terminal
8372
+ on your server or in a desktop app.
8373
+
8374
+ ## Add a terminal
8375
+
8376
+ Install Helix, the terminal connector, xterm.js, and the xterm.js addons you
8377
+ want:
8378
+
8379
+ \`\`\`sh
8380
+ bun add @fusion.dev/helix @fusion.dev/helix-terminal @xterm/xterm @xterm/addon-fit @xterm/addon-search @xterm/addon-web-links
8381
+ \`\`\`
8382
+
8383
+ Add the frame and an element for xterm.js to draw in:
8384
+
8385
+ \`\`\`html
8386
+ <helix-terminal label="~/project">
8387
+ <div id="terminal"></div>
8388
+ </helix-terminal>
8389
+ \`\`\`
8390
+
8391
+ Create the terminal in your theme, open it in the frame, then connect the two:
8392
+
8393
+ \`\`\`js
8394
+ import '@fusion.dev/helix/terminal'
8395
+ import '@xterm/xterm/css/xterm.css'
8396
+ import { connectTerminal, terminalThemeReady } from '@fusion.dev/helix-terminal'
8397
+ import { xtermDriver, xtermOptions } from '@fusion.dev/helix-terminal/xterm'
8398
+ import { FitAddon } from '@xterm/addon-fit'
8399
+ import { SearchAddon } from '@xterm/addon-search'
8400
+ import { WebLinksAddon } from '@xterm/addon-web-links'
8401
+ import { Terminal } from '@xterm/xterm'
8402
+
8403
+ const frame = document.querySelector('helix-terminal')
8404
+ const terminal = new Terminal(xtermOptions(await terminalThemeReady(frame)))
8405
+ terminal.open(document.getElementById('terminal'))
8406
+
8407
+ const connection = connectTerminal(
8408
+ frame,
8409
+ xtermDriver(terminal, {
8410
+ fit: new FitAddon(),
8411
+ search: new SearchAddon(),
8412
+ webLinks: WebLinksAddon,
8413
+ }),
8414
+ )
8415
+
8416
+ // Later, when the terminal goes away:
8417
+ connection.disconnect()
8418
+ terminal.dispose()
8419
+ \`\`\`
8420
+
8421
+ \`terminalThemeReady\` waits until your tokens can be read and the monospaced
8422
+ face has loaded. xterm.js measures its cells in the face it opens with, so a
8423
+ terminal created before the face loads keeps the fallback face's cell size.
8424
+
8425
+ Pass each addon new. The driver loads them, so do not load them yourself.
8426
+
8427
+ ## Connect a process
8428
+
8429
+ The frame takes the process's output and sends what the reader types and the
8430
+ size of the grid. This example connects a pseudo-terminal on your server over
8431
+ a WebSocket:
8432
+
8433
+ \`\`\`js
8434
+ const socket = new WebSocket('wss://example.com/pty')
8435
+ socket.binaryType = 'arraybuffer'
8436
+
8437
+ // The process's output, as the bytes it wrote.
8438
+ socket.addEventListener('message', (event) => frame.write(new Uint8Array(event.data)))
8439
+
8440
+ // What the reader types and pastes, encoded for the program.
8441
+ frame.addEventListener('helix-terminal-input', (event) => {
8442
+ socket.send(JSON.stringify({ input: event.detail.data }))
8443
+ })
8444
+
8445
+ // The grid's size, which the pseudo-terminal takes as rows and columns.
8446
+ frame.addEventListener('helix-terminal-resize', (event) => {
8447
+ const { columns, rows } = event.detail
8448
+ socket.send(JSON.stringify({ columns, rows }))
8449
+ })
8450
+ \`\`\`
8451
+
8452
+ In a Tauri app, a command writes input to the pseudo-terminal and an event
8453
+ carries its output back. The frame takes the same three calls.
8454
+
8455
+ - \`write(data)\` takes a string or a \`Uint8Array\` of UTF-8. Output written
8456
+ before \`connectTerminal\` runs is held and written first, so the process can
8457
+ start before xterm.js loads.
8458
+ - \`helix-terminal-input\` carries \`data\` and \`binary\`. \`binary\` is \`true\` for
8459
+ some mouse reports, whose characters are each one byte: write them as bytes
8460
+ with \`Uint8Array.from(data, (character) => character.charCodeAt(0))\`.
8461
+ - \`helix-terminal-resize\` carries \`columns\` and \`rows\`, and \`width\` and
8462
+ \`height\` in CSS pixels, which a pseudo-terminal's size also takes. It is sent
8463
+ once when the frame connects and again whenever the grid changes size.
8464
+ - \`paste(text)\` inputs text as a paste does. It arrives as
8465
+ \`helix-terminal-input\`, wrapped in the bracketed paste codes when the program
8466
+ asked for them.
8467
+
8468
+ ### Keep up with a fast process
8469
+
8470
+ \`write()\` returns a promise that resolves once xterm.js has parsed the output.
8471
+ A process can write faster than a terminal draws, so pause it while too much
8472
+ is waiting:
8473
+
8474
+ \`\`\`js
8475
+ let waiting = 0
8476
+
8477
+ pty.onData(async (chunk) => {
8478
+ waiting += chunk.length
8479
+ if (waiting > 1_000_000) {
8480
+ pty.pause()
8481
+ }
8482
+ await frame.write(chunk)
8483
+ waiting -= chunk.length
8484
+ if (waiting < 100_000) {
8485
+ pty.resume()
8486
+ }
8487
+ })
8488
+ \`\`\`
8489
+
8490
+ ### When the process exits
8491
+
8492
+ Set \`exit-code\` when the process exits. The status line says how it exited,
8493
+ the frame stops sending input, and a Restart button appears. Restart sends
8494
+ \`helix-terminal-restart\`. Start a new process, clear \`exitCode\`, and write the
8495
+ new output:
8496
+
8497
+ Put buttons of your own beside Restart in the \`exit-actions\` slot, such as one
8498
+ that opens the whole log. They show once the process exits.
8499
+
8500
+ \`\`\`js
8501
+ pty.onExit((code) => {
8502
+ frame.exitCode = code
8503
+ })
8504
+
8505
+ frame.addEventListener('helix-terminal-restart', () => {
8506
+ frame.exitCode = undefined
8507
+ frame.reset()
8508
+ pty = start()
8509
+ })
8510
+ \`\`\`
8511
+
8512
+ ## What the connector does
8513
+
8514
+ \`connectTerminal\` links the frame to the emulator:
8515
+
8516
+ - The frame's output reaches the emulator, and the reader's input reaches the
8517
+ frame.
8518
+ - The grid fits the frame and fits again when the frame changes size. Set
8519
+ \`columns\` and \`rows\` on the frame for a grid of a fixed size.
8520
+ - The emulator is themed from your tokens, and themed again when your theme or
8521
+ color mode changes.
8522
+ - Every cell's text keeps a contrast of 4.5:1 against its ground, so a color a
8523
+ program chose stays readable on your theme. Pass \`{ contrast: 7 }\` for a
8524
+ higher floor, or \`{ contrast: 1 }\` to draw every color as the program wrote
8525
+ it.
8526
+ - The cursor stops blinking and scrolling stops animating when a reader has
8527
+ asked for reduced motion.
8528
+ - \`connection.fit()\` fits the grid again, for a page that resized the frame in
8529
+ a way the connector cannot see.
8530
+ - \`connection.disconnect()\` puts back everything \`connectTerminal\` changed.
8531
+
8532
+ Use \`xtermDriver(terminal, addons)\` for xterm.js 6. xterm.js is not bundled
8533
+ with Helix, so you can use the version you already have.
8534
+
8535
+ ## Use other xterm.js addons
8536
+
8537
+ You create the xterm.js terminal, so you load any addon on it the way
8538
+ xterm.js describes, before or after you connect. This loads the WebGL renderer
8539
+ and the Unicode 11 character widths:
8540
+
8541
+ \`\`\`js
8542
+ import { Unicode11Addon } from '@xterm/addon-unicode11'
8543
+ import { WebglAddon } from '@xterm/addon-webgl'
8544
+
8545
+ const terminal = new Terminal({
8546
+ ...xtermOptions(await terminalThemeReady(frame)),
8547
+ allowProposedApi: true,
8548
+ })
8549
+ terminal.open(document.getElementById('terminal'))
8550
+ terminal.loadAddon(new WebglAddon())
8551
+ terminal.loadAddon(new Unicode11Addon())
8552
+ terminal.unicode.activeVersion = '11'
8553
+ \`\`\`
8554
+
8555
+ The connector sets the theme, the face, and its options on the terminal
8556
+ itself, so an addon such as the WebGL renderer draws in your theme and keeps
8557
+ the contrast floor.
8558
+
8559
+ - **Fit, search, and web links go to the driver.** Pass them to \`xtermDriver\`
8560
+ unloaded, and the driver loads them: an addon loaded twice breaks. They are
8561
+ also what draws the frame's find bar and sends \`helix-terminal-link\`. With a
8562
+ search addon of your own, the frame draws no Find control, and with a web
8563
+ links addon of your own, a link it finds skips the event.
8564
+ - **Some addons need xterm.js's proposed API.** xterm.js refuses its Unicode
8565
+ handling, decorations, markers, and character joiners until
8566
+ \`allowProposedApi\` is on, and the Unicode 11 addon uses the first of these.
8567
+ The driver turns the option on while it holds a search addon and puts it
8568
+ back as it was on disconnect, so set it when you create the terminal for any
8569
+ other addon that needs it.
8570
+ - **The connection owns the link handler.** While connected, the driver sets
8571
+ xterm.js's \`linkHandler\` so every link reaches \`helix-terminal-link\`, and it
8572
+ puts yours back on disconnect. Listen for the event to handle a link.
8573
+ - **The key handler stays yours.** The frame takes its own keys before xterm.js
8574
+ sees them, so \`attachCustomKeyEventHandler\` is free for keys of your own.
8575
+
8576
+ ## Style the terminal with your theme
8577
+
8578
+ The frame reads each color from a custom property, and the connector draws
8579
+ the terminal in it. The styled frame sets every one from your tokens. Set one
8580
+ on the terminal to choose a color yourself:
8581
+
8582
+ \`\`\`css
8583
+ helix-terminal {
8584
+ --terminal-ansi-blue: #3b82f6;
8585
+ --terminal-cursor-color: var(--helix-color-accent);
8586
+ }
8587
+ \`\`\`
8588
+
8589
+ | Property | Default | Draws |
8590
+ |---|---|---|
8591
+ | \`--terminal-active-match-background-color\` | Warning, mixed with the ground | The current match of a search |
8592
+ | \`--terminal-active-match-border-color\` | \`--helix-color-warning\` | The edge of the current match |
8593
+ | \`--terminal-ansi-black\` | \`--helix-color-foreground\` in light, \`--helix-color-border\` in dark | ANSI black |
8594
+ | \`--terminal-ansi-blue\` | \`--helix-color-info\` | ANSI blue |
8595
+ | \`--terminal-ansi-cyan\` | Info mixed with success | ANSI cyan |
8596
+ | \`--terminal-ansi-green\` | \`--helix-color-success\` | ANSI green |
8597
+ | \`--terminal-ansi-magenta\` | \`--helix-color-syntax-callable\` | ANSI magenta |
8598
+ | \`--terminal-ansi-red\` | \`--helix-color-danger\` | ANSI red |
8599
+ | \`--terminal-ansi-white\` | \`--helix-color-foreground-subtle\` in light, between muted and the foreground in dark | ANSI white |
8600
+ | \`--terminal-ansi-yellow\` | \`--helix-color-warning\` | ANSI yellow |
8601
+ | \`--terminal-background-color\` | \`--helix-color-background\` | The ground |
8602
+ | \`--terminal-color\` | \`--helix-color-foreground\` | Text where the program sets no color |
8603
+ | \`--terminal-cursor-color\` | \`--helix-color-primary\` | The cursor |
8604
+ | \`--terminal-match-background-color\` | Warning, mixed more quietly with the ground | Every other match of a search |
8605
+ | \`--terminal-scrollbar-thumb-color\` | \`--helix-scrollbar-thumb-color\` | The scrollbar |
8606
+ | \`--terminal-selection-background-color\` | Primary at 30% | Selected text |
8607
+
8608
+ Each bright color has a property of its own, such as \`--terminal-ansi-bright-red\`,
8609
+ and defaults to its color mixed a quarter of the way to \`--helix-color-foreground\`,
8610
+ so it is lighter in dark mode and darker in light. Set a color alone and its
8611
+ bright form follows it. The bright gray, \`--terminal-ansi-bright-black\`,
8612
+ defaults to \`--helix-color-foreground-muted\`, and bright white to
8613
+ \`--helix-color-border\` in light and \`--helix-color-foreground\` in dark.
8614
+
8615
+ On the headless tier, \`helix-headless-terminal\` sets none of them. Set the
8616
+ ones you want, and xterm.js keeps its own color for the rest.
8617
+
8618
+ The colors share Log's hues, so a program's output reads the same in a log and
8619
+ in a terminal side by side. The four grays keep their order from dark to light
8620
+ in each color mode: a program that fills a panel with black expects it to be
8621
+ dark. Text a program writes in a gray that is faint against your ground is
8622
+ lifted to the contrast floor.
8623
+
8624
+ The grid is drawn in the viewport's face, which the styled frame sets from
8625
+ \`--terminal-font-family\`, the monospaced face by default, and
8626
+ \`--terminal-font-size\`, the small text step. It also takes
8627
+ \`--terminal-block-size\`, \`--terminal-border-color\`,
8628
+ \`--terminal-header-background-color\`, \`--terminal-padding\`, and
8629
+ \`--terminal-radius\`. The [Terminal reference](/helix/components/terminal) lists
8630
+ what each one draws.
8631
+
8632
+ ## Show a command's output
8633
+
8634
+ Set \`readonly\` to show output that takes no input, such as a command an agent
8635
+ ran. The frame draws no cursor and sends no input. Set \`columns\` and \`rows\` to
8636
+ draw the output at the size the command ran at:
8637
+
8638
+ \`\`\`html
8639
+ <helix-terminal controls="find copy" label="bun run build" readonly columns="80" rows="12">
8640
+ <div id="transcript"></div>
8641
+ </helix-terminal>
8642
+ \`\`\`
8643
+
8644
+ ## Fill a pane
8645
+
8646
+ Set \`fill\` for a terminal that fills a pane, such as one side of a \`Splitter\`.
8647
+ The frame covers its container, which needs a position of its own, such as
8648
+ \`position: relative\`. Set \`separation="plain"\` where the pane already draws its
8649
+ edges. Put buttons of your own in the \`actions\` slot, before the built-in
8650
+ controls, and in \`find-actions\` for the find bar. Each takes the size of the
8651
+ buttons beside it:
8652
+
8653
+ \`\`\`html
8654
+ <div class="pane">
8655
+ <helix-terminal fill label="zsh" separation="plain">
8656
+ <helix-icon-button label="New terminal" slot="actions">
8657
+ <helix-icon name="plus"></helix-icon>
8658
+ </helix-icon-button>
8659
+ <div id="terminal"></div>
8660
+ </helix-terminal>
8661
+ </div>
8662
+ \`\`\`
8663
+
8664
+ The frame keeps its own \`label\` when a program sets its title.
8665
+ \`helix-terminal-title\` carries the new title, so you can show it where it
8666
+ belongs, such as on the tab the terminal sits under.
8667
+
8668
+ ## Links
8669
+
8670
+ A link in the output sends \`helix-terminal-link\` with its \`href\` when a reader
8671
+ activates it. Left alone, the frame opens an \`http\` or \`https\` address in a new
8672
+ tab and opens nothing else, since a program can write any address. Cancel the
8673
+ event to open the link yourself, as a desktop app does through the system's
8674
+ browser:
8675
+
8676
+ \`\`\`js
8677
+ frame.addEventListener('helix-terminal-link', (event) => {
8678
+ event.preventDefault()
8679
+ openInBrowser(event.detail.href)
8680
+ })
8681
+ \`\`\`
8682
+
8683
+ Links a program writes as hyperlinks always work. Pass \`WebLinksAddon\` to
8684
+ \`xtermDriver\` to also make the addresses in plain text into links.
8685
+
8686
+ ## Keyboard and screen readers
8687
+
8688
+ - Every key goes to the program, including Tab, Shift+Tab, and Escape, except
8689
+ the keys below.
8690
+ - Control+Shift+F, or Command+F on a Mac, opens the find bar. Enter moves to
8691
+ the next match and Shift+Enter to the previous one. Escape closes the bar and
8692
+ returns focus to the terminal. Screen readers hear how many matches there are.
8693
+ - Control+Shift+C copies the selection. On a Mac, Command+C does.
8694
+ - Control+M, or Control+Shift+M on a Mac, switches Tab between typing in the
8695
+ terminal and moving focus out of it. The status line says when Tab moves
8696
+ focus, and screen readers hear each change. The terminal's input describes
8697
+ this key to a screen reader. In a terminal, Control+M types the same
8698
+ character as Enter.
8699
+ - The frame is a named group. Its controls come before the terminal in the
8700
+ tab order, as one toolbar: Tab reaches it once, and the arrow keys move
8701
+ between its buttons, including the ones you put in \`actions\`. The find bar's
8702
+ buttons are a second toolbar after its field. The terminal's input is one tab
8703
+ stop. Name each terminal with \`label\` so a reader can tell several apart.
8704
+ - A terminal draws its grid as a picture of text, which a screen reader cannot
8705
+ read. Set \`screen-reader-mode\` to have xterm.js keep the grid as lines a
8706
+ screen reader can move through, and announce new output as it arrives. It
8707
+ costs time on every write, so it is off by default. A browser cannot tell
8708
+ whether a screen reader is running, so connect it to a setting your reader
8709
+ can turn on:
8710
+
8711
+ \`\`\`js
8712
+ frame.screenReaderMode = settings.screenReader
8713
+ \`\`\`
8714
+
8715
+ - \`text()\` returns the lines on screen as plain text, and \`text('all')\`
8716
+ returns every line the scrollback holds, which is how an assistant reads a
8717
+ terminal it has been allowed to see.
8718
+
8719
+ ## Write a driver
8720
+
8721
+ To use another emulator, write a driver: an object that draws the frame's
8722
+ output and tells the frame what the reader typed. \`connectTerminal\` calls it.
8723
+ \`xtermDriver\` is one, and the \`TerminalDriver\` type in
8724
+ \`@fusion.dev/helix-terminal\` describes every method.
8725
+
8726
+ ### Required methods
8727
+
8728
+ - \`write(data, done)\` draws the program's output, a string or a \`Uint8Array\`,
8729
+ and calls \`done\` once it has been parsed.
8730
+ - \`onInput(input)\` calls \`input(data, binary)\` with what the reader types or
8731
+ pastes, encoded for the program, and returns a function that stops.
8732
+
8733
+ ### Optional methods
8734
+
8735
+ Each optional method turns on a feature. Without it, the feature is off and
8736
+ nothing fails. A control in the header that a driver cannot answer is not
8737
+ drawn.
8738
+
8739
+ | Method | What it must do | Turns on |
8740
+ |---|---|---|
8741
+ | \`clear()\` | Clear the scrollback, keeping the cursor's line | The clear button, and \`clear()\` |
8742
+ | \`element()\` | Return the element the emulator draws in | Refitting when it changes size |
8743
+ | \`fit()\` | Fit the grid to its element, and report the new size through \`onResize\` | A grid that fills the frame |
8744
+ | \`focus()\` | Focus the emulator's input | \`focus()\`, and focus returning from the find bar |
8745
+ | \`input()\` | Return the element that takes keys | Naming the input for screen readers |
8746
+ | \`onBell(rang)\` | Call \`rang\` on the bell, and return a function that stops | \`helix-terminal-bell\` and the flash |
8747
+ | \`onLink(activated)\` | Call \`activated(href)\` when a link is used, and return a function that stops | \`helix-terminal-link\` |
8748
+ | \`onResize(resized)\` | Call \`resized({ columns, rows })\` when the grid changes size | \`helix-terminal-resize\` after the first |
8749
+ | \`onSelection(changed)\` | Call \`changed\` when the selection changes | The copy button's state |
8750
+ | \`onTitle(changed)\` | Call \`changed(title)\` when the program sets its title | \`helix-terminal-title\` |
8751
+ | \`options(options)\` | Apply \`contrast\`, \`cursor\`, \`input\`, \`motion\`, and \`screenReader\` | Read-only output, the contrast floor, reduced motion, and screen reader mode |
8752
+ | \`paste(text)\` | Input text as a paste does | \`paste()\` |
8753
+ | \`pixels()\` | Return the grid's \`width\` and \`height\` in CSS pixels | The pixel size in \`helix-terminal-resize\` |
8754
+ | \`release()\` | Put back what the driver changed | A clean \`disconnect()\` |
8755
+ | \`reset()\` | Reset the emulator | \`reset()\` |
8756
+ | \`resize(columns, rows)\` | Set the grid's size in cells | \`columns\` and \`rows\` on the frame |
8757
+ | \`search\` | An object with \`find(query, options, matches)\`, \`end()\`, and \`onResults(found)\` | The find bar |
8758
+ | \`selection()\` | Return the selected text | The copy button and its key |
8759
+ | \`size()\` | Return the grid's \`{ columns, rows }\` | The first \`helix-terminal-resize\` |
8760
+ | \`text(scope)\` | Return the screen, or with \`all\` the scrollback, as text | \`text()\` |
8761
+ | \`theme(theme)\` | Draw in \`theme.colors\` and \`theme.font\` | Theming |
8762
+
8763
+ \`connection.disconnect()\` calls every function a method returned, detaches the
8764
+ driver from the frame, and calls \`release()\`.
8765
+
8766
+ ### Draw your own terminal
8767
+
8768
+ A page that draws a terminal without a driver hands the frame a renderer of
8769
+ its own with \`frame.attach(renderer)\`. It returns the calls that tell the frame
8770
+ what happened: \`input\`, \`resized\`, \`title\`, \`bell\`, \`link\`, \`selected\`, \`found\`,
8771
+ and \`detach\`. The \`TerminalRenderer\` and \`TerminalSink\` types in
8772
+ \`@fusion.dev/helix-headless/terminal\` describe both.
8773
+
8774
+ ### Test a driver
8775
+
8776
+ Our specs test the xterm.js driver twice. A stand-in terminal records what the
8777
+ driver asks of it, which runs anywhere. Then the browser specs connect a frame
8778
+ to the real xterm.js, write output, type, search, and check what the frame
8779
+ said. Test your driver the same way: connect it to a frame, write to the frame,
8780
+ and read \`text()\` back.
8350
8781
  `,
8351
8782
  'theme-builder': `---
8352
8783
  description: Enter your theme inputs and see every token Helix computes from them.