@rogieking/figui3 4.15.3 → 4.15.8

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.
package/README.md CHANGED
@@ -89,6 +89,7 @@ Minimal example:
89
89
  | [Tooltip](#tooltip) | `<fig-tooltip>` | Hover/click tooltip |
90
90
  | [Header](#header) | `<fig-header>` | Section header |
91
91
  | [Layer](#layer) | `<fig-layer>` | Collapsible layer list item |
92
+ | [Preview](#preview) | `<fig-preview>` | Thin visual preview layer |
92
93
  | [Media](#media) | `<fig-media>` | Shared media host for image/video |
93
94
  | [Image](#image) | `<fig-image>` | Image display/upload |
94
95
  | [Video](#video) | `<fig-video>` | Video display/upload with playback controls |
@@ -998,6 +999,29 @@ A collapsible layer list item with expand/collapse and visibility toggling. Supp
998
999
 
999
1000
  ---
1000
1001
 
1002
+ #### Preview
1003
+
1004
+ `<fig-preview>`
1005
+
1006
+ A thin styled layer for arbitrary visual content. Use it for generated previews, canvas output, SVG, images, or other custom rendered surfaces when you do not need media upload behavior.
1007
+
1008
+ | Attribute | Type | Default | Description |
1009
+ |---|---|---|---|
1010
+ | `full` | boolean | `false` | Stretch to the available width |
1011
+ | `checkerboard` | boolean | `false` | Show checkerboard behind transparent content |
1012
+
1013
+ ```html
1014
+ <fig-preview full style="height: 96px">
1015
+ <canvas width="320" height="180"></canvas>
1016
+ </fig-preview>
1017
+
1018
+ <fig-preview checkerboard>
1019
+ <img src="photo.png" alt="Preview">
1020
+ </fig-preview>
1021
+ ```
1022
+
1023
+ ---
1024
+
1001
1025
  #### Media
1002
1026
 
1003
1027
  `<fig-media>`
package/base.css CHANGED
@@ -104,6 +104,9 @@ p {
104
104
  margin: var(--spacer-2) 0;
105
105
  line-height: 1rem;
106
106
  color: var(--figma-color-text-secondary);
107
+ &:last-child{
108
+ margin-bottom: 0;
109
+ }
107
110
  }
108
111
 
109
112
  label {
@@ -114,3 +117,11 @@ h2 {
114
117
  font-weight: var(--body-medium-strong-fontWeight);
115
118
  margin: var(--spacer-2) 0;
116
119
  }
120
+
121
+ a{
122
+ color: var(--figma-color-text-brand);
123
+ text-decoration: none;
124
+ &:hover{
125
+ text-decoration: underline;
126
+ }
127
+ }
package/components.css CHANGED
@@ -282,11 +282,21 @@
282
282
  rgba(255, 255, 255, 0.2) 0% 50%
283
283
  )
284
284
  0 0 / 0.5rem 0.5rem;
285
- --checkerboard-chit: repeating-conic-gradient(
285
+ --checkerboard-chit: repeating-conic-gradient(
286
286
  rgba(0, 0, 0, 0.2) 0% 25%,
287
287
  rgba(255, 255, 255, 0.2) 0% 50%
288
288
  )
289
- 0 0 / 14px 14px;
289
+ 0 0 / 0.875rem 0.875rem;
290
+ --checkerboard-slider: repeating-conic-gradient(
291
+ rgba(0, 0, 0, 0.2) 0% 25%,
292
+ rgba(255, 255, 255, 0.2) 0% 50%
293
+ )
294
+ 0 0 / 0.375rem 0.375rem;
295
+ --checkerboard-handle: repeating-conic-gradient(
296
+ rgba(0, 0, 0, 0.2) 0% 25%,
297
+ rgba(255, 255, 255, 0.2) 0% 50%
298
+ )
299
+ 0 0 / 0.625rem 0.625rem;
290
300
  --bg-hue: linear-gradient(
291
301
  90deg,
292
302
  rgba(255, 0, 0, 1),
@@ -1910,6 +1920,7 @@ fig-origin-grid {
1910
1920
  --width: var(--origin-grid-handle-size);
1911
1921
  --height: var(--origin-grid-handle-size);
1912
1922
  --border-radius: var(--radius-small);
1923
+
1913
1924
  position: absolute;
1914
1925
  left: 50%;
1915
1926
  top: 50%;
@@ -2404,6 +2415,7 @@ fig-slider {
2404
2415
  0 0 0 1px var(--figma-color-border-selected);
2405
2416
  --slider-transition: none;
2406
2417
  --handle-transition: var(--slider-transition);
2418
+ --slider-checkerboard: var(--checkerboard);
2407
2419
 
2408
2420
  display: flex;
2409
2421
  align-items: center;
@@ -2575,7 +2587,7 @@ fig-slider {
2575
2587
  &.opacity::-webkit-slider-runnable-track {
2576
2588
  background:
2577
2589
  linear-gradient(to right, transparent, var(--color)),
2578
- var(--checkerboard);
2590
+ var(--slider-checkerboard);
2579
2591
  }
2580
2592
 
2581
2593
  /* Firefox thumb */
@@ -2630,7 +2642,7 @@ fig-slider {
2630
2642
  &.opacity::-moz-range-track {
2631
2643
  background:
2632
2644
  linear-gradient(to right, transparent, var(--color)),
2633
- var(--checkerboard);
2645
+ var( --slider-checkerboard);
2634
2646
  }
2635
2647
  }
2636
2648
 
@@ -2684,6 +2696,7 @@ fig-slider {
2684
2696
  var(--slider-thumb-color),
2685
2697
  0 0 0 0.75px rgba(0, 0, 0, 0.075), inset 0 0 0 5px rgba(0, 0, 0, 0.1),
2686
2698
  var(--figma-elevation-100);
2699
+ --slider-checkerboard: var(--checkerboard-slider);
2687
2700
 
2688
2701
  background-color: var(--figma-color-bg-secondary);
2689
2702
  border-radius: var(--radius-medium);
@@ -2716,6 +2729,7 @@ fig-slider {
2716
2729
  height: auto;
2717
2730
  }
2718
2731
  }
2732
+
2719
2733
  }
2720
2734
  }
2721
2735
 
@@ -2748,14 +2762,6 @@ dialog,
2748
2762
  overscroll-behavior: contain;
2749
2763
  }
2750
2764
 
2751
- footer,
2752
- fig-footer {
2753
- display: flex;
2754
- justify-content: flex-end;
2755
- padding: var(--spacer-2);
2756
- gap: var(--spacer-2);
2757
- }
2758
-
2759
2765
  p {
2760
2766
  padding: 0 var(--spacer-3);
2761
2767
  }
@@ -3014,10 +3020,6 @@ dialog[is="fig-toast"] {
3014
3020
  background-color: var(--figma-color-bg-success);
3015
3021
  color-scheme: dark;
3016
3022
  }
3017
-
3018
- &[theme="auto"] {
3019
- /* color-scheme is resolved at runtime by FigToast JS */
3020
- }
3021
3023
  }
3022
3024
 
3023
3025
 
@@ -3026,6 +3028,55 @@ dialog[is="fig-toast"] {
3026
3028
  fig-tooltip {
3027
3029
  display: contents;
3028
3030
  }
3031
+
3032
+ fig-preview {
3033
+ --fig-preview-fit: contain;
3034
+
3035
+ display: inline-grid;
3036
+ place-items: center;
3037
+ min-width: 0;
3038
+ max-width: 100%;
3039
+ background-color: var(--figma-color-bg-secondary);
3040
+ border-radius: var(--radius-medium);
3041
+ position: relative;
3042
+
3043
+ &[full]:not([full="false"]) {
3044
+ width: 100%;
3045
+ }
3046
+
3047
+ &[checkerboard]:not([checkerboard="false"]) {
3048
+ background: var(--checkerboard);
3049
+ }
3050
+
3051
+ &::after {
3052
+ content: "";
3053
+ grid-area: 1/1;
3054
+ place-self: stretch;
3055
+ border-radius: inherit;
3056
+ box-shadow: inset 0 0 0 1px var(--figma-color-bordertranslucent);
3057
+ pointer-events: none;
3058
+ z-index: 2;
3059
+ }
3060
+
3061
+ > * {
3062
+ grid-area: 1/1;
3063
+ min-width: 0;
3064
+ min-height: 0;
3065
+ }
3066
+
3067
+ > :is(img, video, canvas, svg) {
3068
+ display: block;
3069
+ max-width: 100%;
3070
+ max-height: 100%;
3071
+ object-fit: var(--fig-preview-fit);
3072
+ object-position: center;
3073
+ border-radius: 0;
3074
+ }
3075
+ > canvas{
3076
+ border-radius: inherit;
3077
+ }
3078
+ }
3079
+
3029
3080
  /* Web Components */
3030
3081
  fig-button,
3031
3082
  fig-content,
@@ -3157,11 +3208,10 @@ fig-group {
3157
3208
 
3158
3209
  fig-footer {
3159
3210
  display: flex;
3160
- align-items: center;
3211
+ align-items: flex-start;
3161
3212
  justify-content: flex-end;
3162
3213
  gap: var(--spacer-2);
3163
- height: var(--spacer-6);
3164
- padding: var(--spacer-1) var(--spacer-2) var(--spacer-1) var(--spacer-3);
3214
+ padding: var(--spacer-2-5) var(--spacer-3);
3165
3215
  box-shadow: inset 0 1px 0 0 var(--figma-color-border);
3166
3216
 
3167
3217
  & h3 {
@@ -3172,6 +3222,19 @@ fig-footer {
3172
3222
  gap: var(--spacer-half);
3173
3223
  }
3174
3224
 
3225
+ & > label {
3226
+ flex-grow: 1;
3227
+ align-items: baseline;
3228
+ gap: var(--spacer-half);
3229
+ min-height: var(--spacer-4);
3230
+ display: flex;
3231
+ align-items: center;
3232
+ }
3233
+
3234
+ & > fig-button{
3235
+ flex-shrink: 0;
3236
+ }
3237
+
3175
3238
  &[borderless] {
3176
3239
  box-shadow: none;
3177
3240
  }
@@ -3188,6 +3251,11 @@ fig-footer {
3188
3251
  fig-content {
3189
3252
  padding: var(--spacer-2) 0;
3190
3253
  display: block;
3254
+
3255
+ p{
3256
+ margin: 0 0 var(--spacer-2) 0;
3257
+ padding: 0 var(--spacer-3);
3258
+ }
3191
3259
  }
3192
3260
 
3193
3261
  vstack,
@@ -3201,12 +3269,24 @@ vstack,
3201
3269
  }
3202
3270
 
3203
3271
  hstack,
3204
- .hstack,
3205
- [hstack] {
3272
+ .hstack{
3206
3273
  display: flex;
3207
- gap: var(--spacer-2);
3208
- align-items: start;
3209
- flex-wrap: nowrap;
3274
+ gap: var(--hstack-gap, var(--spacer-2));
3275
+ align-items: var(--hstack-align, center);
3276
+ justify-content: var(--hstack-justify, flex-start);
3277
+ flex-wrap: var(--hstack-wrap, nowrap);
3278
+
3279
+ &[align="start"] {
3280
+ --hstack-align: flex-start;
3281
+ }
3282
+
3283
+ &[align="end"] {
3284
+ --hstack-align: flex-end;
3285
+ }
3286
+
3287
+ &[align="stretch"] {
3288
+ --hstack-align: stretch;
3289
+ }
3210
3290
  }
3211
3291
 
3212
3292
  fig-input-text,
@@ -3459,7 +3539,6 @@ fig-input-palette {
3459
3539
  "inline button";
3460
3540
  gap: var(--spacer-2);
3461
3541
  min-width: 0;
3462
- border-radius: var(--radius-medium);
3463
3542
 
3464
3543
  > .palette-colors-inline {
3465
3544
  grid-area: inline;
@@ -3569,6 +3648,12 @@ fig-input-palette {
3569
3648
  border-radius: var(--radius-medium) !important;
3570
3649
  }
3571
3650
  }
3651
+ fig-field &{
3652
+ grid-template-columns: 1fr calc(var(--spacer-3) + var(--spacer-1));
3653
+ .palette-colors-expanded {
3654
+ grid-template-columns: [input] 1fr [button] calc(var(--spacer-3) + var(--spacer-1));
3655
+ }
3656
+ }
3572
3657
  }
3573
3658
 
3574
3659
  fig-field {
@@ -3641,6 +3726,10 @@ fig-field {
3641
3726
  &[columns="half"] {
3642
3727
  --fig-field-label-ratio: 2fr;
3643
3728
  }
3729
+ &[columns="2/5"] {
3730
+ --fig-field-label-ratio: 2fr;
3731
+ --fig-field-input-ratio: 3fr;
3732
+ }
3644
3733
  & > label {
3645
3734
  overflow: hidden;
3646
3735
  text-overflow: ellipsis;
@@ -3648,11 +3737,6 @@ fig-field {
3648
3737
  margin-right: var(--fig-field-gap);
3649
3738
  min-width: 0;
3650
3739
  }
3651
- /* If the field has no label, set the input ratio to 1fr */
3652
- &:not(:has(> label)) {
3653
- /*--fig-field-input-ratio: 1fr;
3654
- --fig-field-label-ratio: 0fr;*/
3655
- }
3656
3740
  /* labelless fields can have a few inputs */
3657
3741
  &:not(:has(> label)) {
3658
3742
  grid-template-columns:
@@ -4317,33 +4401,6 @@ fig-fill-picker {
4317
4401
  }
4318
4402
  }
4319
4403
 
4320
- fig-preview {
4321
- display: inline-grid;
4322
- place-items: center;
4323
- aspect-ratio: 1;
4324
- width: calc(100% - var(--spacer-3) * 2);
4325
- margin: 0 var(--spacer-3);
4326
- margin-top: var(--spacer-2);
4327
- margin-bottom: var(--spacer-2);
4328
- border-radius: var(--radius-medium);
4329
- position: relative;
4330
- &::before,
4331
- &::after,
4332
- > * {
4333
- grid-area: 1/1;
4334
- place-self: center;
4335
- width: 100%;
4336
- height: 100%;
4337
- border-radius: inherit;
4338
- }
4339
- &::after {
4340
- content: "";
4341
- grid-area: 1/1;
4342
- place-self: center;
4343
- box-shadow: inset 0 0 0 1px var(--figma-color-bordertranslucent);
4344
- }
4345
- }
4346
-
4347
4404
  .fig-fill-picker-dialog {
4348
4405
  contain: layout;
4349
4406
  width: 240px;
@@ -4383,6 +4440,17 @@ fig-preview {
4383
4440
  }
4384
4441
 
4385
4442
  .fig-fill-picker-color-area {
4443
+ aspect-ratio: 1;
4444
+ width: calc(100% - var(--spacer-3) * 2);
4445
+ margin: var(--spacer-2) var(--spacer-3);
4446
+
4447
+ > *:not(fig-handle) {
4448
+ place-self: center;
4449
+ width: 100%;
4450
+ height: 100%;
4451
+ border-radius: inherit;
4452
+ }
4453
+
4386
4454
  canvas {
4387
4455
  width: 100%;
4388
4456
  height: 100%;
@@ -4438,6 +4506,14 @@ fig-preview {
4438
4506
  }
4439
4507
 
4440
4508
  /* Gradient Tab */
4509
+ .fig-fill-picker-gradient-preview {
4510
+ aspect-ratio: auto;
4511
+ width: calc(100% - var(--spacer-3) * 2);
4512
+ margin: var(--spacer-2) var(--spacer-3);
4513
+ margin-top: var(--spacer-4);
4514
+ background: transparent;
4515
+ }
4516
+
4441
4517
  .fig-fill-picker-gradient-header {
4442
4518
  padding-right: var(--spacer-2);
4443
4519
  display: flex;
@@ -4459,12 +4535,6 @@ fig-preview {
4459
4535
  }
4460
4536
  }
4461
4537
 
4462
- .fig-fill-picker-gradient-preview {
4463
- aspect-ratio: auto;
4464
- padding: var(--spacer-2-5) 0 0 0;
4465
-
4466
- }
4467
-
4468
4538
  .fig-fill-picker-gradient-stops {
4469
4539
  .fig-fill-picker-gradient-stops-header {
4470
4540
  > span {
@@ -4574,7 +4644,7 @@ fig-preview {
4574
4644
  -8px 0px;
4575
4645
  }
4576
4646
 
4577
- .fig-fill-picker-image-preview {
4647
+ div.fig-fill-picker-image-preview {
4578
4648
  position: absolute;
4579
4649
  inset: 0;
4580
4650
  width: 100%;
@@ -4582,7 +4652,13 @@ fig-preview {
4582
4652
  display: none;
4583
4653
  }
4584
4654
 
4585
- .fig-fill-picker-video-preview {
4655
+ fig-image.fig-fill-picker-image-preview {
4656
+ max-width: none;
4657
+ max-height: none;
4658
+ width: auto;
4659
+ }
4660
+
4661
+ video.fig-fill-picker-video-preview {
4586
4662
  position: absolute;
4587
4663
  inset: 0;
4588
4664
  width: 100%;
@@ -4591,6 +4667,12 @@ fig-preview {
4591
4667
  display: none;
4592
4668
  }
4593
4669
 
4670
+ fig-media.fig-fill-picker-video-preview {
4671
+ max-width: none;
4672
+ max-height: none;
4673
+ width: auto;
4674
+ }
4675
+
4594
4676
  .fig-fill-picker-upload {
4595
4677
  position: relative;
4596
4678
  z-index: 1;
@@ -4934,6 +5016,7 @@ fig-handle {
4934
5016
  --border: none;
4935
5017
  --fig-handle-hit-area-opacity: 0;
4936
5018
  --fig-handle-hit-area-size: 0;
5019
+ --fig-handle-checkerboard: var(--checkerboard);
4937
5020
 
4938
5021
  margin: 0;
4939
5022
  padding: 0;
@@ -4964,7 +5047,9 @@ fig-handle {
4964
5047
  width: calc(var(--width) - var(--ring-width) * 2);
4965
5048
  height: calc(var(--height) - var(--ring-width) * 2);
4966
5049
  background:
4967
- linear-gradient(var(--fill), var(--fill)), var(--checkerboard-chit);
5050
+ linear-gradient(var(--fill), var(--fill)), var(--fig-handle-checkerboard);
5051
+ background-position: 0 0;
5052
+ background-size: 0.625rem 0.625rem;
4968
5053
  border-radius: var(--border-radius);
4969
5054
  box-shadow: inset 0 0 0 1px var(--figma-color-bordertranslucent);
4970
5055
  place-self: center;
package/dist/base.css CHANGED
@@ -1 +1 @@
1
- html,:host{width:100%;height:100%;color:var(--figma-color-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:var(--font-family);font-size:16px;font-weight:var(--body-medium-fontWeight);letter-spacing:var(--body-letter-spacing);background-color:var(--figma-color-bg);margin:0;padding:0}body,:host{font-size:var(--body-medium-fontSize);letter-spacing:var(--body-letter-spacing)}h1,h2{font-weight:var(--body-large-strong-fontWeight);font-size:var(--body-large-fontSize)}h3{font-weight:var(--body-medium-strong-fontWeight);font-size:var(--body-medium-fontSize)}hr{background-color:var(--figma-color-border);width:100%;height:1px;margin:var(--spacer-2) 0;border:none;&[vertical]{width:1px;height:100%;margin:0 var(--spacer-2)}}iframe{background-color:#0000;border:0;flex:auto;width:100%;max-width:100%;height:max-content;min-height:0;max-height:100%;margin:0;display:block}*,:before,:after{box-sizing:border-box}::selection{background-color:var(--figma-color-text-selection)}::selection{background-color:var(--figma-color-text-selection)}::-webkit-scrollbar{width:var(--spacer-1);height:var(--spacer-1)}::-webkit-scrollbar-thumb{background-color:var(--figma-color-bg-tertiary);border-radius:calc(var(--spacer-1) / 2)}::-webkit-scrollbar-thumb:hover{background-color:var(--figma-color-bg-secondary)}*{scrollbar-width:thin;scrollbar-color:var(--figma-color-bg-tertiary) var(--figma-color-bg-secondary)}.subtle{color:var(--figma-color-text-tertiary)}p{margin:var(--spacer-2) 0;color:var(--figma-color-text-secondary);line-height:1rem}label{color:var(--figma-color-text-secondary)}h2{font-weight:var(--body-medium-strong-fontWeight);margin:var(--spacer-2) 0}
1
+ html,:host{width:100%;height:100%;color:var(--figma-color-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:var(--font-family);font-size:16px;font-weight:var(--body-medium-fontWeight);letter-spacing:var(--body-letter-spacing);background-color:var(--figma-color-bg);margin:0;padding:0}body,:host{font-size:var(--body-medium-fontSize);letter-spacing:var(--body-letter-spacing)}h1,h2{font-weight:var(--body-large-strong-fontWeight);font-size:var(--body-large-fontSize)}h3{font-weight:var(--body-medium-strong-fontWeight);font-size:var(--body-medium-fontSize)}hr{background-color:var(--figma-color-border);width:100%;height:1px;margin:var(--spacer-2) 0;border:none;&[vertical]{width:1px;height:100%;margin:0 var(--spacer-2)}}iframe{background-color:#0000;border:0;flex:auto;width:100%;max-width:100%;height:max-content;min-height:0;max-height:100%;margin:0;display:block}*,:before,:after{box-sizing:border-box}::selection{background-color:var(--figma-color-text-selection)}::selection{background-color:var(--figma-color-text-selection)}::-webkit-scrollbar{width:var(--spacer-1);height:var(--spacer-1)}::-webkit-scrollbar-thumb{background-color:var(--figma-color-bg-tertiary);border-radius:calc(var(--spacer-1) / 2)}::-webkit-scrollbar-thumb:hover{background-color:var(--figma-color-bg-secondary)}*{scrollbar-width:thin;scrollbar-color:var(--figma-color-bg-tertiary) var(--figma-color-bg-secondary)}.subtle{color:var(--figma-color-text-tertiary)}p{margin:var(--spacer-2) 0;color:var(--figma-color-text-secondary);line-height:1rem;&:last-child{margin-bottom:0}}label{color:var(--figma-color-text-secondary)}h2{font-weight:var(--body-medium-strong-fontWeight);margin:var(--spacer-2) 0}a{color:var(--figma-color-text-brand);text-decoration:none;&:hover{text-decoration:underline}}