@rogieking/figui3 9.0.4 → 9.0.6

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.
@@ -416,6 +416,21 @@ Handlers below assume `onInput` / `onChange` / `onClick` from [react.md](react.m
416
416
 
417
417
  - Attrs: `position` (`right` | `left` | `middle`), `tooltip`, `tail`
418
418
 
419
+ ### `.fig-overflow-fade`
420
+
421
+ ```tsx
422
+ <div className="fig-overflow-fade" style={{ maxHeight: "12rem" }}>
423
+ {content}
424
+ </div>
425
+ ```
426
+
427
+ - Apply the class directly to a height-constrained vertical scroll container.
428
+ - Add `fig-overflow-fade-horizontal` for a horizontal scroll container.
429
+ - CSS custom property: `--fig-overflow-fade-size` (default: `var(--spacer-5)`).
430
+ - CSS custom property: `--fig-overflow-fade-clear-top` (default: `0px`) keeps a sticky header fully visible.
431
+ - CSS custom property: `--fig-overflow-fade-clear-left` (default: `0px`) reserves a visible area at the start of a horizontal scroller.
432
+ - The direction-aware mask is enabled only when self scroll timelines are supported; other browsers retain normal scrolling without fades.
433
+
419
434
  ## Overlays
420
435
 
421
436
  ### `dialog is="fig-dialog"`
@@ -44,6 +44,14 @@ Public API: `README.md`. React recipes: [components.md](components.md).
44
44
  - `direction="horizontal|vertical"`
45
45
  - `label` or a child `<label>`
46
46
 
47
+ ## `.fig-overflow-fade`
48
+
49
+ - Apply the class to a vertical scroll container and constrain its height; add `fig-overflow-fade-horizontal` for horizontal scrolling.
50
+ - Fade size: `--fig-overflow-fade-size` (default `var(--spacer-5)`).
51
+ - Sticky-header clearance: `--fig-overflow-fade-clear-top` (default `0px`).
52
+ - Horizontal start clearance: `--fig-overflow-fade-clear-left` (default `0px`).
53
+ - Direction-aware fades require self scroll timeline support; unsupported browsers scroll normally without a mask.
54
+
47
55
  ## `fig-popup` vs `fig-dialog`
48
56
 
49
57
  Dialog: `modal`, `drag`, `resizable`, `autoresize`, `handle`, `closedby="any|closerequest|none"`, `position` (viewport: `top left` … `bottom right`).
package/README.md CHANGED
@@ -1014,6 +1014,42 @@ For `point-point`, both handles support direct drag (with a dynamic directional
1014
1014
 
1015
1015
  ### Layout & Feedback
1016
1016
 
1017
+ #### Overflow Fade
1018
+
1019
+ `.fig-overflow-fade` — [demo](https://rog.ie/figui3/#overflow-fade)
1020
+
1021
+ A progressively enhanced scroll utility that fades its edges when more content
1022
+ is available in that direction. Apply the class to a height-constrained
1023
+ container for vertical scrolling. Add `.fig-overflow-fade-horizontal` for
1024
+ horizontal scrolling.
1025
+
1026
+ | Custom property | Default | Description |
1027
+ |---|---|---|---|
1028
+ | `--fig-overflow-fade-size` | `var(--spacer-5)` | Size of each fade edge |
1029
+ | `--fig-overflow-fade-clear-top` | `0px` | Fully visible area reserved for a sticky header |
1030
+ | `--fig-overflow-fade-clear-left` | `0px` | Fully visible area reserved at the start of a horizontal scroller |
1031
+
1032
+ The mask and animations are applied only when the browser supports self scroll
1033
+ timelines. Unsupported browsers retain ordinary scrolling without a fade.
1034
+
1035
+ ```html
1036
+ <div class="fig-overflow-fade" style="max-height: 12rem;">
1037
+ <fig-content>
1038
+ <!-- Long content -->
1039
+ </fig-content>
1040
+ </div>
1041
+ ```
1042
+
1043
+ ```html
1044
+ <div class="fig-overflow-fade fig-overflow-fade-horizontal">
1045
+ <div style="display: flex; width: max-content;">
1046
+ <!-- Wide content -->
1047
+ </div>
1048
+ </div>
1049
+ ```
1050
+
1051
+ ---
1052
+
1017
1053
  #### Field
1018
1054
 
1019
1055
  `<fig-field>` — [demo](https://rog.ie/figui3/#field)
package/components.css CHANGED
@@ -5027,6 +5027,347 @@ fig-skeleton {
5027
5027
 
5028
5028
  /* Utilities */
5029
5029
 
5030
+ @property --fig-overflow-fade-top {
5031
+ syntax: "<length>";
5032
+ inherits: false;
5033
+ initial-value: 0px;
5034
+ }
5035
+
5036
+ @property --fig-overflow-fade-bottom {
5037
+ syntax: "<length>";
5038
+ inherits: false;
5039
+ initial-value: 0px;
5040
+ }
5041
+
5042
+ @property --fig-overflow-fade-left {
5043
+ syntax: "<length>";
5044
+ inherits: false;
5045
+ initial-value: 0px;
5046
+ }
5047
+
5048
+ @property --fig-overflow-fade-right {
5049
+ syntax: "<length>";
5050
+ inherits: false;
5051
+ initial-value: 0px;
5052
+ }
5053
+
5054
+ .fig-overflow-fade {
5055
+ --fig-overflow-fade-size: var(--spacer-5);
5056
+ --fig-overflow-fade-clear-top: 0px;
5057
+
5058
+ overflow-y: auto;
5059
+ }
5060
+
5061
+ .fig-overflow-fade.fig-overflow-fade-horizontal {
5062
+ --fig-overflow-fade-clear-left: 0px;
5063
+
5064
+ overflow-x: auto;
5065
+ overflow-y: hidden;
5066
+ }
5067
+
5068
+ @supports (animation-timeline: scroll(self block)) {
5069
+ .fig-overflow-fade:not(.fig-overflow-fade-horizontal) {
5070
+ mask-image: linear-gradient(
5071
+ to bottom,
5072
+ black 0,
5073
+ black var(--fig-overflow-fade-clear-top),
5074
+ transparent var(--fig-overflow-fade-clear-top),
5075
+ rgba(0, 0, 0, 0.04)
5076
+ calc(
5077
+ var(--fig-overflow-fade-clear-top) +
5078
+ var(--fig-overflow-fade-top) * 0.125
5079
+ ),
5080
+ rgba(0, 0, 0, 0.16)
5081
+ calc(
5082
+ var(--fig-overflow-fade-clear-top) +
5083
+ var(--fig-overflow-fade-top) * 0.25
5084
+ ),
5085
+ rgba(0, 0, 0, 0.32)
5086
+ calc(
5087
+ var(--fig-overflow-fade-clear-top) +
5088
+ var(--fig-overflow-fade-top) * 0.375
5089
+ ),
5090
+ rgba(0, 0, 0, 0.5)
5091
+ calc(
5092
+ var(--fig-overflow-fade-clear-top) +
5093
+ var(--fig-overflow-fade-top) * 0.5
5094
+ ),
5095
+ rgba(0, 0, 0, 0.68)
5096
+ calc(
5097
+ var(--fig-overflow-fade-clear-top) +
5098
+ var(--fig-overflow-fade-top) * 0.625
5099
+ ),
5100
+ rgba(0, 0, 0, 0.84)
5101
+ calc(
5102
+ var(--fig-overflow-fade-clear-top) +
5103
+ var(--fig-overflow-fade-top) * 0.75
5104
+ ),
5105
+ rgba(0, 0, 0, 0.96)
5106
+ calc(
5107
+ var(--fig-overflow-fade-clear-top) +
5108
+ var(--fig-overflow-fade-top) * 0.875
5109
+ ),
5110
+ black calc(
5111
+ var(--fig-overflow-fade-clear-top) + var(--fig-overflow-fade-top)
5112
+ ),
5113
+ black calc(100% - var(--fig-overflow-fade-bottom)),
5114
+ rgba(0, 0, 0, 0.96)
5115
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.875),
5116
+ rgba(0, 0, 0, 0.84)
5117
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.75),
5118
+ rgba(0, 0, 0, 0.68)
5119
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.625),
5120
+ rgba(0, 0, 0, 0.5)
5121
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.5),
5122
+ rgba(0, 0, 0, 0.32)
5123
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.375),
5124
+ rgba(0, 0, 0, 0.16)
5125
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.25),
5126
+ rgba(0, 0, 0, 0.04)
5127
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.125),
5128
+ transparent 100%
5129
+ );
5130
+ -webkit-mask-image: linear-gradient(
5131
+ to bottom,
5132
+ black 0,
5133
+ black var(--fig-overflow-fade-clear-top),
5134
+ transparent var(--fig-overflow-fade-clear-top),
5135
+ rgba(0, 0, 0, 0.04)
5136
+ calc(
5137
+ var(--fig-overflow-fade-clear-top) +
5138
+ var(--fig-overflow-fade-top) * 0.125
5139
+ ),
5140
+ rgba(0, 0, 0, 0.16)
5141
+ calc(
5142
+ var(--fig-overflow-fade-clear-top) +
5143
+ var(--fig-overflow-fade-top) * 0.25
5144
+ ),
5145
+ rgba(0, 0, 0, 0.32)
5146
+ calc(
5147
+ var(--fig-overflow-fade-clear-top) +
5148
+ var(--fig-overflow-fade-top) * 0.375
5149
+ ),
5150
+ rgba(0, 0, 0, 0.5)
5151
+ calc(
5152
+ var(--fig-overflow-fade-clear-top) +
5153
+ var(--fig-overflow-fade-top) * 0.5
5154
+ ),
5155
+ rgba(0, 0, 0, 0.68)
5156
+ calc(
5157
+ var(--fig-overflow-fade-clear-top) +
5158
+ var(--fig-overflow-fade-top) * 0.625
5159
+ ),
5160
+ rgba(0, 0, 0, 0.84)
5161
+ calc(
5162
+ var(--fig-overflow-fade-clear-top) +
5163
+ var(--fig-overflow-fade-top) * 0.75
5164
+ ),
5165
+ rgba(0, 0, 0, 0.96)
5166
+ calc(
5167
+ var(--fig-overflow-fade-clear-top) +
5168
+ var(--fig-overflow-fade-top) * 0.875
5169
+ ),
5170
+ black calc(
5171
+ var(--fig-overflow-fade-clear-top) + var(--fig-overflow-fade-top)
5172
+ ),
5173
+ black calc(100% - var(--fig-overflow-fade-bottom)),
5174
+ rgba(0, 0, 0, 0.96)
5175
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.875),
5176
+ rgba(0, 0, 0, 0.84)
5177
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.75),
5178
+ rgba(0, 0, 0, 0.68)
5179
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.625),
5180
+ rgba(0, 0, 0, 0.5)
5181
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.5),
5182
+ rgba(0, 0, 0, 0.32)
5183
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.375),
5184
+ rgba(0, 0, 0, 0.16)
5185
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.25),
5186
+ rgba(0, 0, 0, 0.04)
5187
+ calc(100% - var(--fig-overflow-fade-bottom) * 0.125),
5188
+ transparent 100%
5189
+ );
5190
+
5191
+ animation:
5192
+ fig-overflow-fade-in-top 1ms linear both,
5193
+ fig-overflow-fade-out-bottom 1ms linear both;
5194
+ animation-timeline: scroll(self block);
5195
+ animation-range:
5196
+ 0 var(--fig-overflow-fade-size),
5197
+ calc(100% - var(--fig-overflow-fade-size)) 100%;
5198
+ }
5199
+
5200
+ }
5201
+
5202
+ @supports (animation-timeline: scroll(self inline)) {
5203
+ .fig-overflow-fade.fig-overflow-fade-horizontal {
5204
+ mask-image: linear-gradient(
5205
+ to right,
5206
+ black 0,
5207
+ black var(--fig-overflow-fade-clear-left),
5208
+ transparent var(--fig-overflow-fade-clear-left),
5209
+ rgba(0, 0, 0, 0.04)
5210
+ calc(
5211
+ var(--fig-overflow-fade-clear-left) +
5212
+ var(--fig-overflow-fade-left) * 0.125
5213
+ ),
5214
+ rgba(0, 0, 0, 0.16)
5215
+ calc(
5216
+ var(--fig-overflow-fade-clear-left) +
5217
+ var(--fig-overflow-fade-left) * 0.25
5218
+ ),
5219
+ rgba(0, 0, 0, 0.32)
5220
+ calc(
5221
+ var(--fig-overflow-fade-clear-left) +
5222
+ var(--fig-overflow-fade-left) * 0.375
5223
+ ),
5224
+ rgba(0, 0, 0, 0.5)
5225
+ calc(
5226
+ var(--fig-overflow-fade-clear-left) +
5227
+ var(--fig-overflow-fade-left) * 0.5
5228
+ ),
5229
+ rgba(0, 0, 0, 0.68)
5230
+ calc(
5231
+ var(--fig-overflow-fade-clear-left) +
5232
+ var(--fig-overflow-fade-left) * 0.625
5233
+ ),
5234
+ rgba(0, 0, 0, 0.84)
5235
+ calc(
5236
+ var(--fig-overflow-fade-clear-left) +
5237
+ var(--fig-overflow-fade-left) * 0.75
5238
+ ),
5239
+ rgba(0, 0, 0, 0.96)
5240
+ calc(
5241
+ var(--fig-overflow-fade-clear-left) +
5242
+ var(--fig-overflow-fade-left) * 0.875
5243
+ ),
5244
+ black calc(
5245
+ var(--fig-overflow-fade-clear-left) + var(--fig-overflow-fade-left)
5246
+ ),
5247
+ black calc(100% - var(--fig-overflow-fade-right)),
5248
+ rgba(0, 0, 0, 0.96)
5249
+ calc(100% - var(--fig-overflow-fade-right) * 0.875),
5250
+ rgba(0, 0, 0, 0.84)
5251
+ calc(100% - var(--fig-overflow-fade-right) * 0.75),
5252
+ rgba(0, 0, 0, 0.68)
5253
+ calc(100% - var(--fig-overflow-fade-right) * 0.625),
5254
+ rgba(0, 0, 0, 0.5)
5255
+ calc(100% - var(--fig-overflow-fade-right) * 0.5),
5256
+ rgba(0, 0, 0, 0.32)
5257
+ calc(100% - var(--fig-overflow-fade-right) * 0.375),
5258
+ rgba(0, 0, 0, 0.16)
5259
+ calc(100% - var(--fig-overflow-fade-right) * 0.25),
5260
+ rgba(0, 0, 0, 0.04)
5261
+ calc(100% - var(--fig-overflow-fade-right) * 0.125),
5262
+ transparent 100%
5263
+ );
5264
+ -webkit-mask-image: linear-gradient(
5265
+ to right,
5266
+ black 0,
5267
+ black var(--fig-overflow-fade-clear-left),
5268
+ transparent var(--fig-overflow-fade-clear-left),
5269
+ rgba(0, 0, 0, 0.04)
5270
+ calc(
5271
+ var(--fig-overflow-fade-clear-left) +
5272
+ var(--fig-overflow-fade-left) * 0.125
5273
+ ),
5274
+ rgba(0, 0, 0, 0.16)
5275
+ calc(
5276
+ var(--fig-overflow-fade-clear-left) +
5277
+ var(--fig-overflow-fade-left) * 0.25
5278
+ ),
5279
+ rgba(0, 0, 0, 0.32)
5280
+ calc(
5281
+ var(--fig-overflow-fade-clear-left) +
5282
+ var(--fig-overflow-fade-left) * 0.375
5283
+ ),
5284
+ rgba(0, 0, 0, 0.5)
5285
+ calc(
5286
+ var(--fig-overflow-fade-clear-left) +
5287
+ var(--fig-overflow-fade-left) * 0.5
5288
+ ),
5289
+ rgba(0, 0, 0, 0.68)
5290
+ calc(
5291
+ var(--fig-overflow-fade-clear-left) +
5292
+ var(--fig-overflow-fade-left) * 0.625
5293
+ ),
5294
+ rgba(0, 0, 0, 0.84)
5295
+ calc(
5296
+ var(--fig-overflow-fade-clear-left) +
5297
+ var(--fig-overflow-fade-left) * 0.75
5298
+ ),
5299
+ rgba(0, 0, 0, 0.96)
5300
+ calc(
5301
+ var(--fig-overflow-fade-clear-left) +
5302
+ var(--fig-overflow-fade-left) * 0.875
5303
+ ),
5304
+ black calc(
5305
+ var(--fig-overflow-fade-clear-left) + var(--fig-overflow-fade-left)
5306
+ ),
5307
+ black calc(100% - var(--fig-overflow-fade-right)),
5308
+ rgba(0, 0, 0, 0.96)
5309
+ calc(100% - var(--fig-overflow-fade-right) * 0.875),
5310
+ rgba(0, 0, 0, 0.84)
5311
+ calc(100% - var(--fig-overflow-fade-right) * 0.75),
5312
+ rgba(0, 0, 0, 0.68)
5313
+ calc(100% - var(--fig-overflow-fade-right) * 0.625),
5314
+ rgba(0, 0, 0, 0.5)
5315
+ calc(100% - var(--fig-overflow-fade-right) * 0.5),
5316
+ rgba(0, 0, 0, 0.32)
5317
+ calc(100% - var(--fig-overflow-fade-right) * 0.375),
5318
+ rgba(0, 0, 0, 0.16)
5319
+ calc(100% - var(--fig-overflow-fade-right) * 0.25),
5320
+ rgba(0, 0, 0, 0.04)
5321
+ calc(100% - var(--fig-overflow-fade-right) * 0.125),
5322
+ transparent 100%
5323
+ );
5324
+
5325
+ animation:
5326
+ fig-overflow-fade-in-left 1ms linear both,
5327
+ fig-overflow-fade-out-right 1ms linear both;
5328
+ animation-timeline: scroll(self inline);
5329
+ animation-range:
5330
+ 0 var(--fig-overflow-fade-size),
5331
+ calc(100% - var(--fig-overflow-fade-size)) 100%;
5332
+ }
5333
+ }
5334
+
5335
+ @keyframes fig-overflow-fade-in-top {
5336
+ from {
5337
+ --fig-overflow-fade-top: 0px;
5338
+ }
5339
+ to {
5340
+ --fig-overflow-fade-top: var(--fig-overflow-fade-size);
5341
+ }
5342
+ }
5343
+
5344
+ @keyframes fig-overflow-fade-out-bottom {
5345
+ from {
5346
+ --fig-overflow-fade-bottom: var(--fig-overflow-fade-size);
5347
+ }
5348
+ to {
5349
+ --fig-overflow-fade-bottom: 0px;
5350
+ }
5351
+ }
5352
+
5353
+ @keyframes fig-overflow-fade-in-left {
5354
+ from {
5355
+ --fig-overflow-fade-left: 0px;
5356
+ }
5357
+ to {
5358
+ --fig-overflow-fade-left: var(--fig-overflow-fade-size);
5359
+ }
5360
+ }
5361
+
5362
+ @keyframes fig-overflow-fade-out-right {
5363
+ from {
5364
+ --fig-overflow-fade-right: var(--fig-overflow-fade-size);
5365
+ }
5366
+ to {
5367
+ --fig-overflow-fade-right: 0px;
5368
+ }
5369
+ }
5370
+
5030
5371
  .fig-mask-icon,
5031
5372
  fig-icon {
5032
5373
  /* size only — paint containment skips mask-image when `name` / `--icon` updates
@@ -5457,7 +5798,8 @@ fig-choice {
5457
5798
  }
5458
5799
 
5459
5800
  &[padding]:not([padding="false"]) {
5460
- --fig-choice-padding: var(--spacer-2);
5801
+ --fig-choice-padding: var(--spacer-1);
5802
+ --fig-choice-border-radius: var(--radius-medium-large);
5461
5803
  }
5462
5804
 
5463
5805
  &[selected]:not([selected="false"]) {
@@ -5467,11 +5809,10 @@ fig-choice {
5467
5809
  position: absolute;
5468
5810
  inset: 0;
5469
5811
  border-radius: calc(
5470
- var(--fig-choice-border-radius) + var(--fig-choice-selection-ring-width)
5812
+ var(--fig-choice-border-radius)
5471
5813
  );
5472
5814
  pointer-events: none;
5473
5815
  z-index: 1;
5474
- box-shadow: inset 0 0 0 calc(var(--fig-choice-selection-ring-width)*2) var(--figma-color-bg);
5475
5816
  outline: var(--fig-choice-selection-ring-width) solid
5476
5817
  var(--figma-color-border-selected);
5477
5818
  outline-offset: calc(var(--fig-choice-selection-ring-width) * -1);