@hanzo/ui 8.29.38 → 8.29.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/backends/gui/textarea.cjs +10 -1
  2. package/dist/backends/gui/textarea.d.ts.map +1 -1
  3. package/dist/backends/gui/textarea.js +10 -1
  4. package/dist/backends/gui/textarea.js.map +1 -1
  5. package/dist/chat/Composer.cjs +87 -32
  6. package/dist/chat/Composer.d.ts +35 -19
  7. package/dist/chat/Composer.d.ts.map +1 -1
  8. package/dist/chat/Composer.js +87 -32
  9. package/dist/chat/Composer.js.map +1 -1
  10. package/dist/chat/Dictation.cjs +6 -6
  11. package/dist/chat/Dictation.d.ts +2 -4
  12. package/dist/chat/Dictation.d.ts.map +1 -1
  13. package/dist/chat/Dictation.js +6 -6
  14. package/dist/chat/Dictation.js.map +1 -1
  15. package/dist/chat/Palette.cjs +2 -1
  16. package/dist/chat/Palette.d.ts.map +1 -1
  17. package/dist/chat/Palette.js +2 -1
  18. package/dist/chat/Palette.js.map +1 -1
  19. package/dist/chat/Plus.cjs +2 -2
  20. package/dist/chat/Plus.js +2 -2
  21. package/dist/chat/Plus.js.map +1 -1
  22. package/dist/chat/Tune.cjs +31 -16
  23. package/dist/chat/Tune.d.ts +5 -3
  24. package/dist/chat/Tune.d.ts.map +1 -1
  25. package/dist/chat/Tune.js +32 -17
  26. package/dist/chat/Tune.js.map +1 -1
  27. package/dist/chat/look.cjs +28 -0
  28. package/dist/chat/look.d.ts +36 -0
  29. package/dist/chat/look.d.ts.map +1 -0
  30. package/dist/chat/look.js +26 -0
  31. package/dist/chat/look.js.map +1 -0
  32. package/dist/consent/Consent.cjs +2 -2
  33. package/dist/consent/Consent.d.ts +8 -1
  34. package/dist/consent/Consent.d.ts.map +1 -1
  35. package/dist/consent/Consent.js +2 -2
  36. package/dist/consent/Consent.js.map +1 -1
  37. package/dist/consent/icon.cjs +3 -2
  38. package/dist/consent/icon.d.ts +2 -1
  39. package/dist/consent/icon.d.ts.map +1 -1
  40. package/dist/consent/icon.js +3 -2
  41. package/dist/consent/icon.js.map +1 -1
  42. package/dist/gallery.html +102 -38
  43. package/dist/glass.css +78 -13
  44. package/dist/models/ModelPicker.cjs +2 -2
  45. package/dist/models/ModelPicker.d.ts +1 -1
  46. package/dist/models/ModelPicker.d.ts.map +1 -1
  47. package/dist/models/ModelPicker.js +2 -2
  48. package/dist/models/ModelPicker.js.map +1 -1
  49. package/dist/product/ChipSelect.cjs +9 -6
  50. package/dist/product/ChipSelect.d.ts +5 -4
  51. package/dist/product/ChipSelect.d.ts.map +1 -1
  52. package/dist/product/ChipSelect.js +9 -6
  53. package/dist/product/ChipSelect.js.map +1 -1
  54. package/dist/styles.css +99 -35
  55. package/dist/theme.css +78 -13
  56. package/package.json +1 -1
  57. package/dist/chat/Dial.cjs +0 -101
  58. package/dist/chat/Dial.d.ts +0 -13
  59. package/dist/chat/Dial.d.ts.map +0 -1
  60. package/dist/chat/Dial.js +0 -99
  61. package/dist/chat/Dial.js.map +0 -1
  62. package/dist/chat/ring.cjs +0 -9
  63. package/dist/chat/ring.d.ts +0 -11
  64. package/dist/chat/ring.d.ts.map +0 -1
  65. package/dist/chat/ring.js +0 -7
  66. package/dist/chat/ring.js.map +0 -1
package/dist/styles.css CHANGED
@@ -2630,15 +2630,80 @@
2630
2630
  background-position: 0 1px !important;
2631
2631
  }
2632
2632
 
2633
- /* The composer's fill, under a name of its own. A host darkens the composer
2634
- (a private chat) by setting `--composer-fill` on it or any ancestor, and
2635
- leaves design's `--background`, which everything else reads, alone. Unset,
2636
- the fallback is the material's own fill, written out the same, so the
2637
- composer is the glass every other surface is. The slot and the class
2638
- outweigh the material's bare `.glass`, so of the two !important fills
2639
- this one is the composer's. */
2633
+ /* The composer's ground, under the material's fill: `--composer-ground` (below),
2634
+ or what a host sets as `--composer-fill` on it or any ancestor. No prism along
2635
+ its lip: the composer is the thing a reader looks at longest, and a coloured
2636
+ line across its top read as a stroke somebody drew. The slot and the class
2637
+ outweigh the material's bare `.glass`, so of the two !important fills this
2638
+ one is the composer's. */
2640
2639
  [data-slot="composer"].glass {
2641
- background-color: var(--composer-fill, color-mix(in oklab, var(--background) 72%, transparent)) !important;
2640
+ background-color: var(--composer-fill, var(--composer-ground)) !important;
2641
+ background-image: none !important;
2642
+ }
2643
+ }
2644
+
2645
+ /* ── The composer ────────────────────────────────────────────────────────────
2646
+ ONE rounded rectangle a step above the ground it stands on, ONE even 1px edge
2647
+ all the way round, and nothing inset along its top: the rungs' lit lip
2648
+ (`--edge-highlight`) is right for a menu and on the composer read as a
2649
+ doubled, brighter top edge against three plain sides.
2650
+
2651
+ Dark: a white wash over whatever is under it — a #2a card on the app's #14
2652
+ pane, a #1e one on the bare page — under design's hairline (`--border`, white
2653
+ 10%). Light: design's emphasis card (#fdfdfd) under the control edge
2654
+ (`--border-control`, black 15%) with a soft, wide drop, since on white a
2655
+ ground step alone moves no pixels. The edge brightens a little under a
2656
+ pointer and a little more on focus — design's `--ring`, softened, so focus is
2657
+ the edge itself and never a glow.
2658
+
2659
+ A CONVERSATION NOTHING KEEPS (`data-forgetful`, a private chat) is the same
2660
+ frame with no ground and no drop, its edge dashed: the one cue, where the
2661
+ field is.
2662
+
2663
+ Ground, edge and drop ease (design's fast duration, ease-out); under reduced
2664
+ motion nothing eases. */
2665
+ :root {
2666
+ --composer-ground: var(--white-10, rgb(255 255 255 / .10));
2667
+ --composer-edge: var(--border, rgb(255 255 255 / .10));
2668
+ --composer-drop: none;
2669
+ }
2670
+ .light, :root.t_light, .t_light {
2671
+ --composer-ground: var(--surface-card-emphasis, #fdfdfd);
2672
+ --composer-edge: var(--border-control, rgb(0 0 0 / .15));
2673
+ --composer-drop: 0 1px 2px rgb(0 0 0 / .04), 0 4px 16px -4px rgb(0 0 0 / .06);
2674
+ }
2675
+ [data-slot="composer"].glass {
2676
+ border-color: var(--composer-edge) !important;
2677
+ box-shadow: var(--composer-drop) !important;
2678
+ transition:
2679
+ background-color var(--duration-fast, 150ms) var(--ease-out, ease-out),
2680
+ border-color var(--duration-fast, 150ms) var(--ease-out, ease-out),
2681
+ box-shadow var(--duration-fast, 150ms) var(--ease-out, ease-out);
2682
+ }
2683
+ [data-slot="composer"].glass:hover {
2684
+ border-color: color-mix(in srgb, var(--ring, rgb(255 255 255 / .4)) 40%, var(--composer-edge)) !important;
2685
+ }
2686
+ [data-slot="composer"][data-forgetful].glass {
2687
+ background-color: transparent !important;
2688
+ box-shadow: none !important;
2689
+ border-style: dashed !important;
2690
+ -webkit-backdrop-filter: none;
2691
+ backdrop-filter: none;
2692
+ }
2693
+ /* The field grows a line at a time, eased; below its ceiling it never shows a
2694
+ scrollbar while it catches up (Textarea marks `data-capped` at the ceiling). */
2695
+ [data-slot="composer-field"] {
2696
+ transition: height var(--duration-fast, 150ms) var(--ease-out, ease-out);
2697
+ }
2698
+ [data-slot="composer-field"]:not([data-capped]) {
2699
+ overflow-y: hidden;
2700
+ }
2701
+ @media (prefers-reduced-motion: reduce) {
2702
+ [data-slot="composer"].glass,
2703
+ [data-slot="composer-field"],
2704
+ [data-slot="composer"] *,
2705
+ [data-slot="composer-foot"] * {
2706
+ transition: none !important;
2642
2707
  }
2643
2708
  }
2644
2709
 
@@ -2838,9 +2903,9 @@
2838
2903
  as one control the way a chat composer everywhere does, and focus is drawn on
2839
2904
  that box rather than round the field inside it. An offset ring stood a gap
2840
2905
  outside the box and read as a second frame; the box's own 1px edge, lifted
2841
- from the hairline to a third of the ink, says the same thing in place, in both
2842
- themes, for a pointer and a keyboard alike (a textarea is :focus-visible on
2843
- any focus).
2906
+ from the hairline toward design's `--ring` (two thirds of the way), says the
2907
+ same thing in place, softly, in both themes, for a pointer and a keyboard
2908
+ alike (a textarea is :focus-visible on any focus).
2844
2909
 
2845
2910
  THE FIELD DOES NOT ABSTAIN, and control.ts is right that it must not: gui
2846
2911
  compiles `focusVisibleStyle` to `:root:root:root:root … !important`, past any
@@ -2857,8 +2922,8 @@
2857
2922
  /* `:root` first, because gui writes each edge's colour as `:root ._btc-x._btc-x`
2858
2923
  (0,3,0), injected after this sheet: at equal weight the later rule won and
2859
2924
  the edge never moved. One more step of weight is the whole fix. */
2860
- :root [data-slot='composer']:has([data-slot='composer-field']:focus-visible) {
2861
- border-color: color-mix(in srgb, var(--foreground) 32%, transparent);
2925
+ :root [data-slot='composer'].glass:has([data-slot='composer-field']:focus-visible) {
2926
+ border-color: color-mix(in srgb, var(--ring, rgb(255 255 255 / .4)) 66%, var(--composer-edge)) !important;
2862
2927
  }
2863
2928
 
2864
2929
  [data-slot='composer']:has([data-slot='composer-field']:focus-visible)
@@ -4285,15 +4350,14 @@ a svg,
4285
4350
  :root ._bblr-100000px{border-bottom-left-radius:100000px;}
4286
4351
  :root ._bblr-1000px{border-bottom-left-radius:1000px;}
4287
4352
  :root ._bblr-10px{border-bottom-left-radius:10px;}
4288
- :root ._bblr-12px{border-bottom-left-radius:12px;}
4353
+ :root ._bblr-16px{border-bottom-left-radius:16px;}
4289
4354
  :root ._bblr-1px{border-bottom-left-radius:1px;}
4290
4355
  :root ._bblr-3px{border-bottom-left-radius:3px;}
4291
4356
  :root ._bblr-4px{border-bottom-left-radius:4px;}
4292
- :root ._bblr-6px{border-bottom-left-radius:6px;}
4293
4357
  :root ._bblr-7px{border-bottom-left-radius:7px;}
4358
+ :root ._bblr-8px{border-bottom-left-radius:8px;}
4294
4359
  :root ._bblr-9999px{border-bottom-left-radius:9999px;}
4295
4360
  :root ._bblr-999px{border-bottom-left-radius:999px;}
4296
- @media (max-width: 639.98px){:root:root:root:root:root:root:root:root ._bblr-_maxsm_24px{border-bottom-left-radius:24px;}}
4297
4361
  :root ._bblr-c-radius-1{border-bottom-left-radius:var(--c-radius-1);}
4298
4362
  :root ._bblr-c-radius-10{border-bottom-left-radius:var(--c-radius-10);}
4299
4363
  :root ._bblr-c-radius-2{border-bottom-left-radius:var(--c-radius-2);}
@@ -4309,15 +4373,14 @@ a svg,
4309
4373
  :root ._bbrr-100000px{border-bottom-right-radius:100000px;}
4310
4374
  :root ._bbrr-1000px{border-bottom-right-radius:1000px;}
4311
4375
  :root ._bbrr-10px{border-bottom-right-radius:10px;}
4312
- :root ._bbrr-12px{border-bottom-right-radius:12px;}
4376
+ :root ._bbrr-16px{border-bottom-right-radius:16px;}
4313
4377
  :root ._bbrr-1px{border-bottom-right-radius:1px;}
4314
4378
  :root ._bbrr-3px{border-bottom-right-radius:3px;}
4315
4379
  :root ._bbrr-4px{border-bottom-right-radius:4px;}
4316
- :root ._bbrr-6px{border-bottom-right-radius:6px;}
4317
4380
  :root ._bbrr-7px{border-bottom-right-radius:7px;}
4381
+ :root ._bbrr-8px{border-bottom-right-radius:8px;}
4318
4382
  :root ._bbrr-9999px{border-bottom-right-radius:9999px;}
4319
4383
  :root ._bbrr-999px{border-bottom-right-radius:999px;}
4320
- @media (max-width: 639.98px){:root:root:root:root:root:root:root:root ._bbrr-_maxsm_24px{border-bottom-right-radius:24px;}}
4321
4384
  :root ._bbrr-c-radius-1{border-bottom-right-radius:var(--c-radius-1);}
4322
4385
  :root ._bbrr-c-radius-10{border-bottom-right-radius:var(--c-radius-10);}
4323
4386
  :root ._bbrr-c-radius-2{border-bottom-right-radius:var(--c-radius-2);}
@@ -4659,15 +4722,14 @@ a svg,
4659
4722
  :root ._btlr-100000px{border-top-left-radius:100000px;}
4660
4723
  :root ._btlr-1000px{border-top-left-radius:1000px;}
4661
4724
  :root ._btlr-10px{border-top-left-radius:10px;}
4662
- :root ._btlr-12px{border-top-left-radius:12px;}
4725
+ :root ._btlr-16px{border-top-left-radius:16px;}
4663
4726
  :root ._btlr-1px{border-top-left-radius:1px;}
4664
4727
  :root ._btlr-3px{border-top-left-radius:3px;}
4665
4728
  :root ._btlr-4px{border-top-left-radius:4px;}
4666
- :root ._btlr-6px{border-top-left-radius:6px;}
4667
4729
  :root ._btlr-7px{border-top-left-radius:7px;}
4730
+ :root ._btlr-8px{border-top-left-radius:8px;}
4668
4731
  :root ._btlr-9999px{border-top-left-radius:9999px;}
4669
4732
  :root ._btlr-999px{border-top-left-radius:999px;}
4670
- @media (max-width: 639.98px){:root:root:root:root:root:root:root:root ._btlr-_maxsm_24px{border-top-left-radius:24px;}}
4671
4733
  :root ._btlr-c-radius-1{border-top-left-radius:var(--c-radius-1);}
4672
4734
  :root ._btlr-c-radius-10{border-top-left-radius:var(--c-radius-10);}
4673
4735
  :root ._btlr-c-radius-2{border-top-left-radius:var(--c-radius-2);}
@@ -4683,15 +4745,14 @@ a svg,
4683
4745
  :root ._btrr-100000px{border-top-right-radius:100000px;}
4684
4746
  :root ._btrr-1000px{border-top-right-radius:1000px;}
4685
4747
  :root ._btrr-10px{border-top-right-radius:10px;}
4686
- :root ._btrr-12px{border-top-right-radius:12px;}
4748
+ :root ._btrr-16px{border-top-right-radius:16px;}
4687
4749
  :root ._btrr-1px{border-top-right-radius:1px;}
4688
4750
  :root ._btrr-3px{border-top-right-radius:3px;}
4689
4751
  :root ._btrr-4px{border-top-right-radius:4px;}
4690
- :root ._btrr-6px{border-top-right-radius:6px;}
4691
4752
  :root ._btrr-7px{border-top-right-radius:7px;}
4753
+ :root ._btrr-8px{border-top-right-radius:8px;}
4692
4754
  :root ._btrr-9999px{border-top-right-radius:9999px;}
4693
4755
  :root ._btrr-999px{border-top-right-radius:999px;}
4694
- @media (max-width: 639.98px){:root:root:root:root:root:root:root:root ._btrr-_maxsm_24px{border-top-right-radius:24px;}}
4695
4756
  :root ._btrr-c-radius-1{border-top-right-radius:var(--c-radius-1);}
4696
4757
  :root ._btrr-c-radius-10{border-top-right-radius:var(--c-radius-10);}
4697
4758
  :root ._btrr-c-radius-2{border-top-right-radius:var(--c-radius-2);}
@@ -4765,6 +4826,7 @@ a svg,
4765
4826
  :root ._cur-pointer{cursor:pointer;}
4766
4827
  :root ._cur-progress{cursor:progress;}
4767
4828
  :root ._cur-row-resize{cursor:row-resize;}
4829
+ :root ._cur-text{cursor:text;}
4768
4830
  :root ._direction-ltr{direction:ltr;}
4769
4831
  :root ._dsp--webkit-box{display:-webkit-box;}
4770
4832
  @media (max-width: 767.98px){:root:root:root:root:root:root:root ._dsp-_maxmd_none{display:none;}}
@@ -4874,7 +4936,6 @@ a svg,
4874
4936
  :root ._height-22px{height:22px;}
4875
4937
  :root ._height-23px{height:23px;}
4876
4938
  :root ._height-24px{height:24px;}
4877
- :root ._height-26px{height:26px;}
4878
4939
  :root ._height-28px{height:28px;}
4879
4940
  :root ._height-2px{height:2px;}
4880
4941
  :root ._height-30px{height:30px;}
@@ -4901,7 +4962,6 @@ a svg,
4901
4962
  :root ._height-96px{height:96px;}
4902
4963
  :root ._height-NaNpx{height:NaNpx;}
4903
4964
  @media (max-width: 639.98px){:root:root:root:root:root:root:root:root ._height-_maxsm_36px{height:36px;}}
4904
- @media (max-width: 639.98px){:root:root:root:root:root:root:root:root ._height-_maxsm_44px{height:44px;}}
4905
4965
  @media (pointer: coarse){:root:root ._height-_touchable_44px{height:44px;}}
4906
4966
  @media (pointer: coarse){:root:root ._height-_touchable_auto{height:auto;}}
4907
4967
  :root ._height-auto{height:auto;}
@@ -4970,16 +5030,16 @@ a svg,
4970
5030
  :root ._marginInlineStart--1px{margin-inline-start:-1px;}
4971
5031
  :root ._marginInlineStart--3px{margin-inline-start:-3px;}
4972
5032
  :root ._marginInlineStart--8px{margin-inline-start:-8px;}
5033
+ :root ._marginInlineStart-12px{margin-inline-start:12px;}
4973
5034
  :root ._marginInlineStart-16px{margin-inline-start:16px;}
4974
- :root ._marginInlineStart-4px{margin-inline-start:4px;}
4975
5035
  :root ._marginInlineStart-auto{margin-inline-start:auto;}
4976
5036
  :root ._marginInlineStart-c-space-1{margin-inline-start:var(--c-space-1);}
4977
5037
  :root ._marginInlineStart-c-space-2{margin-inline-start:var(--c-space-2);}
4978
5038
  :root ._maxH-0px{max-height:0px;}
4979
5039
  :root ._maxH-12px{max-height:12px;}
4980
5040
  :root ._maxH-14px{max-height:14px;}
5041
+ :root ._maxH-160px{max-height:160px;}
4981
5042
  :root ._maxH-16px{max-height:16px;}
4982
- :root ._maxH-200px{max-height:200px;}
4983
5043
  :root ._maxH-24px{max-height:24px;}
4984
5044
  :root ._maxH-300px{max-height:300px;}
4985
5045
  :root ._maxH-32px{max-height:32px;}
@@ -5032,7 +5092,6 @@ a svg,
5032
5092
  :root ._minH-20px{min-height:20px;}
5033
5093
  :root ._minH-23px{min-height:23px;}
5034
5094
  :root ._minH-24px{min-height:24px;}
5035
- :root ._minH-26px{min-height:26px;}
5036
5095
  :root ._minH-28px{min-height:28px;}
5037
5096
  :root ._minH-30px{min-height:30px;}
5038
5097
  :root ._minH-32px{min-height:32px;}
@@ -5179,10 +5238,11 @@ a svg,
5179
5238
  :root ._pb-c-space-4{padding-bottom:var(--c-space-4);}
5180
5239
  :root ._pb-c-space-5{padding-bottom:var(--c-space-5);}
5181
5240
  :root ._pb-c-space-6{padding-bottom:var(--c-space-6);}
5241
+ :root ._pe-auto{pointer-events:auto !important;}
5182
5242
  :root ._pe-boxnone{pointer-events:none !important;}
5183
5243
  :root ._pe-none{pointer-events:none !important;}
5184
5244
  :root ._pl-0px{padding-left:0px;}
5185
- :root ._pl-10px{padding-left:10px;}
5245
+ :root ._pl-11px{padding-left:11px;}
5186
5246
  :root ._pl-12px{padding-left:12px;}
5187
5247
  :root ._pl-16px{padding-left:16px;}
5188
5248
  :root ._pl-1px{padding-left:1px;}
@@ -5190,10 +5250,11 @@ a svg,
5190
5250
  :root ._pl-2px{padding-left:2px;}
5191
5251
  :root ._pl-3px{padding-left:3px;}
5192
5252
  :root ._pl-4px{padding-left:4px;}
5253
+ :root ._pl-5px{padding-left:5px;}
5193
5254
  :root ._pl-6px{padding-left:6px;}
5194
5255
  :root ._pl-8px{padding-left:8px;}
5256
+ :root ._pl-9px{padding-left:9px;}
5195
5257
  @media (max-width: 767.98px){:root:root:root:root:root:root:root ._pl-_maxmd_c-space-4{padding-left:var(--c-space-4);}}
5196
- @media (max-width: 639.98px){:root:root:root:root:root:root:root:root ._pl-_maxsm_12px{padding-left:12px;}}
5197
5258
  @media (min-width: 768px){:root:root:root:root:root:root:root:root:root:root:root:root:root:root:root:root:root:root ._pl-_md_c-space-4{padding-left:var(--c-space-4);}}
5198
5259
  :root ._pl-c-space-0--53{padding-left:var(--c-space-0--5);}
5199
5260
  :root ._pl-c-space-1{padding-left:var(--c-space-1);}
@@ -5210,7 +5271,7 @@ a svg,
5210
5271
  :root ._pos-fixed{position:fixed;}
5211
5272
  :root ._pos-relative{position:relative;}
5212
5273
  :root ._pr-0px{padding-right:0px;}
5213
- :root ._pr-10px{padding-right:10px;}
5274
+ :root ._pr-11px{padding-right:11px;}
5214
5275
  :root ._pr-12px{padding-right:12px;}
5215
5276
  :root ._pr-16px{padding-right:16px;}
5216
5277
  :root ._pr-1px{padding-right:1px;}
@@ -5218,10 +5279,11 @@ a svg,
5218
5279
  :root ._pr-2px{padding-right:2px;}
5219
5280
  :root ._pr-3px{padding-right:3px;}
5220
5281
  :root ._pr-4px{padding-right:4px;}
5282
+ :root ._pr-5px{padding-right:5px;}
5221
5283
  :root ._pr-6px{padding-right:6px;}
5222
5284
  :root ._pr-8px{padding-right:8px;}
5285
+ :root ._pr-9px{padding-right:9px;}
5223
5286
  @media (max-width: 767.98px){:root:root:root:root:root:root:root ._pr-_maxmd_c-space-4{padding-right:var(--c-space-4);}}
5224
- @media (max-width: 639.98px){:root:root:root:root:root:root:root:root ._pr-_maxsm_12px{padding-right:12px;}}
5225
5287
  @media (min-width: 768px){:root:root:root:root:root:root:root:root:root:root:root:root:root:root:root:root:root:root ._pr-_md_c-space-4{padding-right:var(--c-space-4);}}
5226
5288
  :root ._pr-c-space-0--53{padding-right:var(--c-space-0--5);}
5227
5289
  :root ._pr-c-space-1{padding-right:var(--c-space-1);}
@@ -5235,7 +5297,6 @@ a svg,
5235
5297
  :root ._pr-c-space-6{padding-right:var(--c-space-6);}
5236
5298
  :root ._pr-c-space-tru101{padding-right:var(--c-space-true);}
5237
5299
  :root ._pt-0px{padding-top:0px;}
5238
- :root ._pt-10px{padding-top:10px;}
5239
5300
  :root ._pt-112px{padding-top:112px;}
5240
5301
  :root ._pt-12px{padding-top:12px;}
5241
5302
  :root ._pt-16px{padding-top:16px;}
@@ -5264,6 +5325,7 @@ a svg,
5264
5325
  :root ._pt-c-space-6{padding-top:var(--c-space-6);}
5265
5326
  :root ._r-0px{right:0px;}
5266
5327
  :root ._r-6037{right:60%;}
5328
+ :root ._rowGap-2px{row-gap:2px;}
5267
5329
  :root ._rowGap-4px{row-gap:4px;}
5268
5330
  :root ._rowGap-c-space-3{row-gap:var(--c-space-3);}
5269
5331
  :root ._select-auto{user-select:auto;-webkit-user-select:auto;}
@@ -5289,11 +5351,13 @@ a svg,
5289
5351
  :root ._text-end{text-align:end;}
5290
5352
  :root ._text-start{text-align:start;}
5291
5353
  :root ._textOverflow-ellipsis{text-overflow:ellipsis;}
5354
+ :root:root:root ._tr-0active-scale0--921281:active{transform:scale(0.92) !important;}
5292
5355
  @media (hover) {:root:root ._tr-0hover-scale0--951281:hover{transform:scale(0.95) !important;}}
5293
5356
  :root ._tr-rotate0deg1281{transform:rotate(0deg);}
5294
5357
  :root ._tr-rotate180de41674{transform:rotate(180deg);}
5295
5358
  :root ._tr-rotate90deg1281{transform:rotate(90deg);}
5296
5359
  :root ._tr-scale0--851281{transform:scale(0.85);}
5360
+ :root ._tr-scale0--91281{transform:scale(0.9);}
5297
5361
  :root ._tr-scale0--951281{transform:scale(0.95);}
5298
5362
  :root ._tr-scale1--11281{transform:scale(1.1);}
5299
5363
  :root ._tr-scale11281{transform:scale(1);}
package/dist/theme.css CHANGED
@@ -2628,15 +2628,80 @@
2628
2628
  background-position: 0 1px !important;
2629
2629
  }
2630
2630
 
2631
- /* The composer's fill, under a name of its own. A host darkens the composer
2632
- (a private chat) by setting `--composer-fill` on it or any ancestor, and
2633
- leaves design's `--background`, which everything else reads, alone. Unset,
2634
- the fallback is the material's own fill, written out the same, so the
2635
- composer is the glass every other surface is. The slot and the class
2636
- outweigh the material's bare `.glass`, so of the two !important fills
2637
- this one is the composer's. */
2631
+ /* The composer's ground, under the material's fill: `--composer-ground` (below),
2632
+ or what a host sets as `--composer-fill` on it or any ancestor. No prism along
2633
+ its lip: the composer is the thing a reader looks at longest, and a coloured
2634
+ line across its top read as a stroke somebody drew. The slot and the class
2635
+ outweigh the material's bare `.glass`, so of the two !important fills this
2636
+ one is the composer's. */
2638
2637
  [data-slot="composer"].glass {
2639
- background-color: var(--composer-fill, color-mix(in oklab, var(--background) 72%, transparent)) !important;
2638
+ background-color: var(--composer-fill, var(--composer-ground)) !important;
2639
+ background-image: none !important;
2640
+ }
2641
+ }
2642
+
2643
+ /* ── The composer ────────────────────────────────────────────────────────────
2644
+ ONE rounded rectangle a step above the ground it stands on, ONE even 1px edge
2645
+ all the way round, and nothing inset along its top: the rungs' lit lip
2646
+ (`--edge-highlight`) is right for a menu and on the composer read as a
2647
+ doubled, brighter top edge against three plain sides.
2648
+
2649
+ Dark: a white wash over whatever is under it — a #2a card on the app's #14
2650
+ pane, a #1e one on the bare page — under design's hairline (`--border`, white
2651
+ 10%). Light: design's emphasis card (#fdfdfd) under the control edge
2652
+ (`--border-control`, black 15%) with a soft, wide drop, since on white a
2653
+ ground step alone moves no pixels. The edge brightens a little under a
2654
+ pointer and a little more on focus — design's `--ring`, softened, so focus is
2655
+ the edge itself and never a glow.
2656
+
2657
+ A CONVERSATION NOTHING KEEPS (`data-forgetful`, a private chat) is the same
2658
+ frame with no ground and no drop, its edge dashed: the one cue, where the
2659
+ field is.
2660
+
2661
+ Ground, edge and drop ease (design's fast duration, ease-out); under reduced
2662
+ motion nothing eases. */
2663
+ :root {
2664
+ --composer-ground: var(--white-10, rgb(255 255 255 / .10));
2665
+ --composer-edge: var(--border, rgb(255 255 255 / .10));
2666
+ --composer-drop: none;
2667
+ }
2668
+ .light, :root.t_light, .t_light {
2669
+ --composer-ground: var(--surface-card-emphasis, #fdfdfd);
2670
+ --composer-edge: var(--border-control, rgb(0 0 0 / .15));
2671
+ --composer-drop: 0 1px 2px rgb(0 0 0 / .04), 0 4px 16px -4px rgb(0 0 0 / .06);
2672
+ }
2673
+ [data-slot="composer"].glass {
2674
+ border-color: var(--composer-edge) !important;
2675
+ box-shadow: var(--composer-drop) !important;
2676
+ transition:
2677
+ background-color var(--duration-fast, 150ms) var(--ease-out, ease-out),
2678
+ border-color var(--duration-fast, 150ms) var(--ease-out, ease-out),
2679
+ box-shadow var(--duration-fast, 150ms) var(--ease-out, ease-out);
2680
+ }
2681
+ [data-slot="composer"].glass:hover {
2682
+ border-color: color-mix(in srgb, var(--ring, rgb(255 255 255 / .4)) 40%, var(--composer-edge)) !important;
2683
+ }
2684
+ [data-slot="composer"][data-forgetful].glass {
2685
+ background-color: transparent !important;
2686
+ box-shadow: none !important;
2687
+ border-style: dashed !important;
2688
+ -webkit-backdrop-filter: none;
2689
+ backdrop-filter: none;
2690
+ }
2691
+ /* The field grows a line at a time, eased; below its ceiling it never shows a
2692
+ scrollbar while it catches up (Textarea marks `data-capped` at the ceiling). */
2693
+ [data-slot="composer-field"] {
2694
+ transition: height var(--duration-fast, 150ms) var(--ease-out, ease-out);
2695
+ }
2696
+ [data-slot="composer-field"]:not([data-capped]) {
2697
+ overflow-y: hidden;
2698
+ }
2699
+ @media (prefers-reduced-motion: reduce) {
2700
+ [data-slot="composer"].glass,
2701
+ [data-slot="composer-field"],
2702
+ [data-slot="composer"] *,
2703
+ [data-slot="composer-foot"] * {
2704
+ transition: none !important;
2640
2705
  }
2641
2706
  }
2642
2707
 
@@ -2836,9 +2901,9 @@
2836
2901
  as one control the way a chat composer everywhere does, and focus is drawn on
2837
2902
  that box rather than round the field inside it. An offset ring stood a gap
2838
2903
  outside the box and read as a second frame; the box's own 1px edge, lifted
2839
- from the hairline to a third of the ink, says the same thing in place, in both
2840
- themes, for a pointer and a keyboard alike (a textarea is :focus-visible on
2841
- any focus).
2904
+ from the hairline toward design's `--ring` (two thirds of the way), says the
2905
+ same thing in place, softly, in both themes, for a pointer and a keyboard
2906
+ alike (a textarea is :focus-visible on any focus).
2842
2907
 
2843
2908
  THE FIELD DOES NOT ABSTAIN, and control.ts is right that it must not: gui
2844
2909
  compiles `focusVisibleStyle` to `:root:root:root:root … !important`, past any
@@ -2855,8 +2920,8 @@
2855
2920
  /* `:root` first, because gui writes each edge's colour as `:root ._btc-x._btc-x`
2856
2921
  (0,3,0), injected after this sheet: at equal weight the later rule won and
2857
2922
  the edge never moved. One more step of weight is the whole fix. */
2858
- :root [data-slot='composer']:has([data-slot='composer-field']:focus-visible) {
2859
- border-color: color-mix(in srgb, var(--foreground) 32%, transparent);
2923
+ :root [data-slot='composer'].glass:has([data-slot='composer-field']:focus-visible) {
2924
+ border-color: color-mix(in srgb, var(--ring, rgb(255 255 255 / .4)) 66%, var(--composer-edge)) !important;
2860
2925
  }
2861
2926
 
2862
2927
  [data-slot='composer']:has([data-slot='composer-field']:focus-visible)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanzo/ui",
3
- "version": "8.29.38",
3
+ "version": "8.29.40",
4
4
  "type": "module",
5
5
  "description": "Hanzo UI — the one canonical Hanzo component library, on @hanzo/gui + @hanzo/design. ONE substrate: every component renders through @hanzo/gui primitives, so the same import works on web, native (expo) and desktop (Tauri). Self-contained (theme.css), presentational, host-agnostic, clean-room.",
6
6
  "exports": {
@@ -1,101 +0,0 @@
1
- 'use client';"use strict";
2
- 'use client';
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.Dial = Dial;
5
- const jsx_runtime_1 = require("react/jsx-runtime");
6
- /**
7
- * The effort, as ONE small icon button — a gauge with the level in a tiny pip —
8
- * the same in Chat and Dev, in the composer's end row beside the mic.
9
- *
10
- * press opens a compact list of the levels, the one in force checked
11
- * drag press the icon and move along the row: each step of the finger
12
- * is a level (`STEP` px), snapped to the surface's own list, with a
13
- * small label above the icon naming the level while it is held
14
- * ← ↓ / → ↑ the arrows move one level, in the reading direction
15
- * Enter, Space opens the list
16
- *
17
- * The list is the surface's (`Modes`): a chat offers six levels, a coding run four.
18
- * The pointer events are the page's own — nothing is captured past the press.
19
- */
20
- const gui_1 = require("@hanzo/gui");
21
- const react_1 = require("@hanzo/i18n/react");
22
- const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
23
- const react_2 = require("react");
24
- const gui_2 = require("../backends/gui/index.cjs");
25
- const ring_1 = require("./ring.cjs");
26
- const Tune_1 = require("./Tune.cjs");
27
- /** How far the finger travels for one level, px. */
28
- const STEP = 22;
29
- /** The pip: the level in a letter or two, so the icon says where it stands without a word. */
30
- const PIP = { auto: 'A', low: 'L', medium: 'M', high: 'H', xhigh: 'XH', max: 'MAX' };
31
- const pip = (id, label) => PIP[id] ?? label.slice(0, 1).toUpperCase();
32
- /**
33
- * `narrow`, a phone: the level stands BESIDE the gauge on the row's centreline
34
- * rather than tucked under its corner, where at a phone's size it crowds the
35
- * glyph. The button keeps the row's height and grows as wide as the level needs.
36
- */
37
- function Dial({ effort, size = 36, disabled = false, narrow = false }) {
38
- const { t, dir } = (0, react_1.useI18n)();
39
- const [open, setOpen] = (0, react_2.useState)(false);
40
- // The level under the finger while it is held, as a place in the list.
41
- const [held, setHeld] = (0, react_2.useState)(null);
42
- const press = (0, react_2.useRef)(null);
43
- const index = Math.max(0, effort.items.findIndex((e) => e.id === effort.value));
44
- const now = effort.items[index] ?? effort.items[0];
45
- const shown = held === null ? now : (effort.items[held] ?? now);
46
- const flip = dir === 'rtl' ? -1 : 1;
47
- const clamp = (i) => Math.max(0, Math.min(effort.items.length - 1, i));
48
- const go = (i) => {
49
- const next = effort.items[clamp(i)];
50
- if (next && next.id !== effort.value)
51
- effort.set(next.id);
52
- };
53
- return ((0, jsx_runtime_1.jsxs)(gui_2.Popover, { open: open, onOpenChange: setOpen, allowFlip: true, placement: "top-end", children: [(0, jsx_runtime_1.jsx)(gui_2.PopoverAnchor, { asChild: true, children: (0, jsx_runtime_1.jsxs)(gui_1.XStack, { position: "relative", shrink: 0, "data-slot": "dial", children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { render: "button", "data-slot": "dial-button", "aria-label": t('Effort: {level}', { level: t(now.label) }), "aria-haspopup": "listbox", "aria-expanded": open, "aria-disabled": disabled || undefined, tabIndex: disabled ? -1 : 0, ...(narrow ? { minW: size, px: 8, gap: 3 } : { width: size }), height: size, rounded: 999, items: "center", justify: "center", shrink: 0, position: "relative", cursor: disabled ? 'default' : 'ew-resize', opacity: disabled ? 0.5 : 1, bg: open || held !== null ? '$hover' : 'transparent', hoverStyle: disabled ? undefined : { bg: '$hover' }, focusVisibleStyle: ring_1.RING,
54
- // inline-style: the page must not scroll or select under a drag along the icon.
55
- style: { touchAction: 'none', userSelect: 'none' }, onPointerDown: (e) => {
56
- if (disabled)
57
- return;
58
- press.current = { x: e.clientX, at: index, moved: false };
59
- e.currentTarget?.setPointerCapture?.(e.pointerId);
60
- }, onPointerMove: (e) => {
61
- const p = press.current;
62
- if (!p)
63
- return;
64
- const dx = (e.clientX - p.x) * flip;
65
- if (Math.abs(dx) > 4)
66
- p.moved = true;
67
- if (p.moved)
68
- setHeld(clamp(p.at + Math.round(dx / STEP)));
69
- }, onPointerUp: (e) => {
70
- const p = press.current;
71
- press.current = null;
72
- e.currentTarget?.releasePointerCapture?.(e.pointerId);
73
- if (!p)
74
- return;
75
- if (p.moved) {
76
- go(held ?? p.at);
77
- setHeld(null);
78
- }
79
- else
80
- setOpen((o) => !o);
81
- }, onPointerCancel: () => {
82
- press.current = null;
83
- setHeld(null);
84
- }, onKeyDown: (e) => {
85
- if (disabled)
86
- return;
87
- const key = e?.key;
88
- const step = key === 'ArrowRight' || key === 'ArrowUp' ? flip : key === 'ArrowLeft' || key === 'ArrowDown' ? -flip : 0;
89
- if (step) {
90
- e.preventDefault?.();
91
- go(index + step);
92
- }
93
- else if (key === 'Enter' || key === ' ') {
94
- e.preventDefault?.();
95
- setOpen((o) => !o);
96
- }
97
- }, children: [(0, jsx_runtime_1.jsx)(lucide_icons_2_1.Gauge, { size: 18, color: "var(--foreground)", "aria-hidden": true }), narrow ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { "data-slot": "dial-pip", "aria-hidden": true, fontSize: 12, lineHeight: 16, fontWeight: "600", color: "$quiet", children: pip(shown.id, t(shown.label)) })) : ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { "data-slot": "dial-pip", "aria-hidden": true, position: "absolute", b: 3, insetInlineEnd: 2, fontSize: 9, lineHeight: 10, fontWeight: "700", color: "$ink", px: 2, rounded: 4, bg: "$background", children: pip(shown.id, t(shown.label)) }))] }), held !== null ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { "data-slot": "dial-tip", role: "status", position: "absolute", b: size + 6, self: "center", px: 8, py: 3, rounded: 6, bg: "$ink", pointerEvents: "none", style: { whiteSpace: 'nowrap' }, children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { fontSize: 12, color: "$background", children: t(shown.label) }) })) : null] }) }), (0, jsx_runtime_1.jsx)(gui_2.PopoverContent, { solid: true, p: 6, width: 288, maxW: "calc(100vw - 24px)", children: (0, jsx_runtime_1.jsx)(Tune_1.Choices, { title: t('Effort'), items: effort.items, value: effort.value, onPick: (id) => {
98
- effort.set(id);
99
- setOpen(false);
100
- } }) })] }));
101
- }
@@ -1,13 +0,0 @@
1
- import { type Modes } from './Tune.js';
2
- /**
3
- * `narrow`, a phone: the level stands BESIDE the gauge on the row's centreline
4
- * rather than tucked under its corner, where at a phone's size it crowds the
5
- * glyph. The button keeps the row's height and grows as wide as the level needs.
6
- */
7
- export declare function Dial({ effort, size, disabled, narrow }: {
8
- effort: Modes;
9
- size?: number;
10
- disabled?: boolean;
11
- narrow?: boolean;
12
- }): import("react").JSX.Element;
13
- //# sourceMappingURL=Dial.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dial.d.ts","sourceRoot":"","sources":["../../src/chat/Dial.tsx"],"names":[],"mappings":"AAuBA,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAA;AAU5C;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,EAAE,MAAM,EAAE,IAAS,EAAE,QAAgB,EAAE,MAAc,EAAE,EAAE;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,+BA4InJ"}