@rogieking/figui3 3.23.0 → 4.1.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.
Files changed (4) hide show
  1. package/README.md +3 -4
  2. package/components.css +15 -331
  3. package/fig.js +1088 -2730
  4. package/package.json +1 -1
package/README.md CHANGED
@@ -1001,10 +1001,9 @@ An image display component with optional upload, aspect ratio, and object-fit co
1001
1001
  | Attribute | Type | Default | Description |
1002
1002
  |---|---|---|---|
1003
1003
  | `src` | string | — | Image URL |
1004
- | `upload` | boolean | `false` | Show upload button |
1005
- | `download` | boolean | `false` | Show download button |
1006
- | `label` | string | — | Upload button label |
1007
- | `aspect-ratio` | string | — | CSS aspect-ratio (e.g. `"16 / 9"`) |
1004
+ | `upload` | boolean | `false` | Show upload overlay (`fig-input-file`) |
1005
+ | `label` | string | `"Upload"` | Upload button label |
1006
+ | `aspect-ratio` | string | — | CSS aspect-ratio, or `"auto"` for lazy dimension detection |
1008
1007
  | `fit` | string | — | CSS object-fit (`"cover"`, `"contain"`, etc.) |
1009
1008
  | `checkerboard` | boolean | `false` | Show checkerboard behind transparent images |
1010
1009
 
package/components.css CHANGED
@@ -1364,10 +1364,9 @@ fig-input-file {
1364
1364
  flex-shrink: 0;
1365
1365
  }
1366
1366
 
1367
- &[dragover] {
1368
- outline: 2px dashed var(--figma-color-border-brand);
1369
- outline-offset: -2px;
1370
- border-radius: var(--radius-small);
1367
+ &[dragover] fig-button {
1368
+ outline: 1px dashed var(--figma-color-border-brand);
1369
+ outline-offset: -1px;
1371
1370
  }
1372
1371
  }
1373
1372
 
@@ -1395,8 +1394,12 @@ fig-image {
1395
1394
  opacity: 1;
1396
1395
  }
1397
1396
  }
1398
- &:not([src]):not([src=""]) fig-button,
1399
- &:hover fig-button {
1397
+ > fig-input-file[data-generated] {
1398
+ opacity: 0;
1399
+ pointer-events: none;
1400
+ }
1401
+ &:not([src]):not([src=""]) > fig-input-file[data-generated],
1402
+ &:hover > fig-input-file[data-generated] {
1400
1403
  opacity: 1;
1401
1404
  pointer-events: all;
1402
1405
  }
@@ -1420,25 +1423,6 @@ fig-image {
1420
1423
  aspect-ratio: var(--aspect-ratio) !important;
1421
1424
  }
1422
1425
  }
1423
- > div {
1424
- display: flex;
1425
- gap: var(--spacer-2);
1426
- opacity: 0;
1427
- pointer-events: none;
1428
- }
1429
- &:not([src]):not([src=""]) > div,
1430
- &:hover > div {
1431
- opacity: 1;
1432
- pointer-events: all;
1433
- }
1434
- fig-button[type="download"] {
1435
- display: none;
1436
- }
1437
- &[src]:not([src=""]) {
1438
- fig-button[type="download"] {
1439
- display: inline-flex;
1440
- }
1441
- }
1442
1426
  }
1443
1427
 
1444
1428
  /* Easing Curve */
@@ -1905,6 +1889,12 @@ fig-origin-grid {
1905
1889
  }
1906
1890
 
1907
1891
  /* Combo input */
1892
+ fig-combo-input {
1893
+ display: inline-flex;
1894
+ flex: 1;
1895
+ min-width: 0;
1896
+ }
1897
+
1908
1898
  .input-combo {
1909
1899
  display: inline-flex;
1910
1900
  flex-wrap: nowrap;
@@ -3565,171 +3555,6 @@ fig-field,
3565
3555
  }
3566
3556
  }
3567
3557
 
3568
- fig-field-slider {
3569
- display: block;
3570
- position: relative;
3571
- width: 100%;
3572
- --field-text-shadow: 0 1px 1.5px
3573
- light-dark(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2));
3574
-
3575
- label {
3576
- pointer-events: none;
3577
- z-index: 1;
3578
- }
3579
-
3580
- &[disabled]:not([disabled="false"]) {
3581
- pointer-events: none;
3582
-
3583
- label,
3584
- input {
3585
- color: var(--figma-color-text-disabled);
3586
- }
3587
- fig-slider {
3588
- filter: grayscale(100%) opacity(0.5);
3589
- }
3590
- }
3591
- &[type="hue"] {
3592
- label,
3593
- input {
3594
- text-shadow: var(--field-text-shadow);
3595
- color: white;
3596
- }
3597
- }
3598
-
3599
- fig-field {
3600
- position: relative;
3601
- padding-left: var(--spacer-2-5);
3602
-
3603
- &[direction="horizontal"] > label {
3604
- min-width: 0;
3605
- max-width: none;
3606
- width: 100%;
3607
- flex: 1 1 auto;
3608
- }
3609
-
3610
- fig-slider {
3611
- position: absolute;
3612
- inset: 0;
3613
- --slider-height: 2rem;
3614
- --slider-field-height: 2rem;
3615
- --slider-thumb-width: var(--spacer-1);
3616
- --slider-thumb-color: light-dark(
3617
- var(--figma-color-text-secondary),
3618
- var(--figma-color-text)
3619
- );
3620
- --slider-thumb-height: calc(
3621
- var(--spacer-2) + (var(--spacer-3) - var(--spacer-2)) *
3622
- min(var(--slider-complete), calc(1 - var(--slider-complete))) * 2
3623
- );
3624
- --slider-border-radius: var(--radius-medium);
3625
- --slider-tick-width: 0.125rem;
3626
- --slider-tick-height: var(--spacer-2);
3627
- --slider-tick-radius: var(--radius-medium);
3628
- --slider-stepper-padding: 0;
3629
- --slider-handle-shadow: inset 0 0 0 var(--slider-thumb-height)
3630
- var(--slider-thumb-color) !important;
3631
- --slider-thumb-opacity: calc(
3632
- min(var(--slider-complete), calc(1 - var(--slider-complete))) * 2
3633
- );
3634
- --slider-tick-opacity: 1;
3635
-
3636
- &:has(input[type="range"]:focus-within) {
3637
- --slider-thumb-outline: 1.5px solid var(--figma-color-border-selected) !important;
3638
- --slider-thumb-outline-offset: 2px !important;
3639
- }
3640
-
3641
- .fig-slider-input-container {
3642
- box-shadow: none !important;
3643
- &:hover,
3644
- &:focus-within {
3645
- &::after {
3646
- content: "";
3647
- position: absolute;
3648
- inset: 0;
3649
- pointer-events: none;
3650
- border-radius: var(--slider-border-radius);
3651
- box-shadow: inset 0 0 0 1px var(--figma-color-border) !important;
3652
- }
3653
- }
3654
- &::before {
3655
- background: var(--figma-color-bg-tertiary) !important;
3656
- min-width: 0 !important;
3657
- box-shadow: none !important;
3658
- }
3659
- input[type="range"] {
3660
- border-radius: 0 !important;
3661
- }
3662
- }
3663
-
3664
- &:not([type="delta"]) .fig-slider-input-container::before {
3665
- width: var(--slider-percent) !important;
3666
- }
3667
-
3668
- &[type="delta"] .fig-slider-input-container::before {
3669
- --left-start: calc(
3670
- var(--start-percent) - var(--slider-thumb-width) / 2
3671
- ) !important;
3672
- left: min(
3673
- var(--left-start),
3674
- calc(
3675
- var(--slider-percent) - var(--slider-complete) *
3676
- var(--slider-thumb-width)
3677
- )
3678
- ) !important;
3679
- --width: calc(var(--slider-percent) - var(--start-percent)) !important;
3680
- --abs-width: max(
3681
- calc(
3682
- var(--width) + var(--slider-thumb-width) / 2 +
3683
- (1 - var(--slider-complete)) * var(--slider-thumb-width)
3684
- ),
3685
- calc(
3686
- -1 * var(--width) + var(--slider-thumb-width) / 2 +
3687
- var(--slider-complete) * var(--slider-thumb-width)
3688
- )
3689
- ) !important;
3690
- width: var(--abs-width) !important;
3691
- }
3692
- }
3693
- datalist {
3694
- mask-image: linear-gradient(
3695
- to right,
3696
- transparent 0,
3697
- transparent var(--spacer-4),
3698
- white,
3699
- transparent calc(100% - var(--spacer-4)),
3700
- transparent 100%
3701
- );
3702
- }
3703
- fig-input-number {
3704
- background-color: transparent;
3705
- box-shadow: none !important;
3706
- position: absolute;
3707
- right: var(--spacer-1);
3708
- width: fit-content;
3709
- min-width: fit-content;
3710
- max-width: max-content;
3711
- flex: 0 0 auto;
3712
- border-radius: var(--radius-small);
3713
-
3714
- &:hover,
3715
- &:has(input:focus) {
3716
- box-shadow: none !important;
3717
- }
3718
- &:has(input:focus) {
3719
- box-shadow: inset 0 0 0 1px var(--figma-color-border-selected) !important;
3720
- }
3721
- input {
3722
- field-sizing: content;
3723
- border-radius: var(--radius-small);
3724
- width: auto;
3725
- flex: 0 0 auto;
3726
- text-align: right;
3727
- color: var(--field-text-color);
3728
- }
3729
- }
3730
- }
3731
- }
3732
-
3733
3558
  fig-spinner {
3734
3559
  width: 1rem;
3735
3560
  height: 1rem;
@@ -4060,74 +3885,6 @@ fig-joystick {
4060
3885
  }
4061
3886
  }
4062
3887
 
4063
- fig-input-angle {
4064
- --size: 1.5rem;
4065
- display: inline-flex;
4066
- align-items: center;
4067
- gap: var(--spacer-2);
4068
- user-select: none;
4069
-
4070
- > fig-input-number {
4071
- flex: 0 0 auto;
4072
- width: auto;
4073
- }
4074
-
4075
- &[full]:not([full="false"]) {
4076
- display: flex;
4077
- width: 100%;
4078
-
4079
- > fig-input-number {
4080
- flex: 1 1 auto;
4081
- min-width: 0;
4082
- width: auto;
4083
- }
4084
- }
4085
-
4086
- /* When inside horizontal fig-field, grow to fill and let inputs expand */
4087
- fig-field[direction="horizontal"] & {
4088
- flex: 1;
4089
- min-width: 0;
4090
-
4091
- fig-input-number {
4092
- flex: 0 0 auto;
4093
- width: auto;
4094
- }
4095
- }
4096
-
4097
- .fig-input-angle-plane {
4098
- display: inline-grid;
4099
- place-items: center;
4100
- width: var(--size);
4101
- height: var(--size);
4102
- aspect-ratio: 1/1;
4103
- flex-shrink: 0;
4104
- background-color: var(--figma-color-bg-secondary);
4105
- border-radius: 100%;
4106
- box-shadow: inset 0 0 0 1px var(--figma-color-border);
4107
- &:focus,
4108
- &.dragging {
4109
- outline: 0;
4110
- box-shadow: inset 0 0 0 1px var(--figma-color-border-selected);
4111
- }
4112
- }
4113
- .fig-input-angle-handle {
4114
- display: inline-grid;
4115
- place-items: center;
4116
- grid-area: 1/1;
4117
- width: calc(0.5rem + 2px);
4118
- height: calc(0.5rem + 2px);
4119
- &::before {
4120
- content: "";
4121
- display: block;
4122
- width: 0.5rem;
4123
- height: 0.5rem;
4124
- background: var(--handle-color);
4125
- box-shadow: var(--handle-shadow);
4126
- border-radius: 50%;
4127
- }
4128
- }
4129
- }
4130
-
4131
3888
  /* Layer */
4132
3889
  fig-layer {
4133
3890
  --indent: var(--spacer-2);
@@ -5187,76 +4944,3 @@ fig-color-tip {
5187
4944
  }
5188
4945
  }
5189
4946
 
5190
- /* Canvas Control */
5191
- fig-canvas-control {
5192
- display: contents;
5193
- --fig-canvas-control-line-stroke: light-dark(
5194
- rgba(255, 255, 255, 1),
5195
- rgba(255, 255, 255, 0.5)
5196
- );
5197
- --fig-canvas-control-line-stroke-hover: var(--figma-color-bg-brand);
5198
- --fig-canvas-control-line-stroke-active: var(--figma-color-bg-brand);
5199
- --fig-canvas-control-line-stroke-width: 1.25px;
5200
-
5201
- & > fig-handle,
5202
- & > fig-tooltip:has(fig-handle:not([size="small"])) {
5203
- z-index: 1;
5204
- }
5205
-
5206
- .fig-canvas-control-radius {
5207
- position: absolute;
5208
- pointer-events: none;
5209
- overflow: visible;
5210
-
5211
- circle {
5212
- fill: none;
5213
- stroke: var(--fig-canvas-control-line-stroke);
5214
- stroke-width: var(--fig-canvas-control-line-stroke-width);
5215
- paint-order: stroke fill;
5216
- filter: drop-shadow(0 0 0.5px rgba(0, 0, 0, 0.3))
5217
- drop-shadow(0 0.5px 1px rgba(0, 0, 0, 0.12));
5218
- }
5219
-
5220
- .fig-canvas-control-radius-hit {
5221
- stroke: transparent;
5222
- stroke-width: 12px;
5223
- pointer-events: stroke;
5224
- filter: none;
5225
-
5226
- &:hover ~ circle {
5227
- stroke: var(--fig-canvas-control-line-stroke-hover);
5228
- }
5229
- }
5230
- }
5231
-
5232
- &:has(.fig-canvas-control-radius-hit:hover) .fig-canvas-control-angle-line,
5233
- &.fig-canvas-control-ring-active .fig-canvas-control-angle-line {
5234
- stroke: var(--fig-canvas-control-line-stroke-active);
5235
- }
5236
-
5237
- &.fig-canvas-control-ring-active
5238
- .fig-canvas-control-radius
5239
- circle:not(.fig-canvas-control-radius-hit) {
5240
- stroke: var(--fig-canvas-control-line-stroke-active);
5241
- }
5242
-
5243
- .fig-canvas-control-angle-svg {
5244
- pointer-events: none;
5245
- }
5246
-
5247
- .fig-canvas-control-angle-line {
5248
- stroke: var(--fig-canvas-control-line-stroke);
5249
- stroke-width: var(--fig-canvas-control-line-stroke-width);
5250
- paint-order: stroke fill;
5251
- filter: drop-shadow(0 0 0.5px rgba(0, 0, 0, 0.3))
5252
- drop-shadow(0 0.5px 1px rgba(0, 0, 0, 0.12));
5253
- }
5254
-
5255
- fig-handle[size="small"] {
5256
- z-index: 2;
5257
-
5258
- .fig-handle-hit-area {
5259
- cursor: grab;
5260
- }
5261
- }
5262
- }