@rogieking/figui3 3.9.3 → 3.13.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 (5) hide show
  1. package/README.md +30 -1
  2. package/components.css +600 -299
  3. package/dist/fig.js +133 -76
  4. package/fig.js +1771 -276
  5. package/package.json +1 -1
package/components.css CHANGED
@@ -327,6 +327,7 @@
327
327
  --icon-close: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.2242 7.08154C16.4182 6.95348 16.6823 6.97551 16.8531 7.146C17.024 7.31683 17.0457 7.58084 16.9176 7.7749L16.8531 7.85303L12.7067 11.9995L16.8531 16.146L16.9176 16.2241C17.0457 16.4182 17.024 16.6822 16.8531 16.853C16.6823 17.0239 16.4183 17.0456 16.2242 16.9175L16.1461 16.853L11.9996 12.7065L7.85315 16.853C7.65789 17.0483 7.34138 17.0483 7.14612 16.853C6.95128 16.6577 6.95101 16.3411 7.14612 16.146L11.2926 11.9995L7.14612 7.85303L7.08167 7.7749C6.95389 7.58087 6.97541 7.3167 7.14612 7.146C7.31683 6.97532 7.58101 6.95376 7.77502 7.08154L7.85315 7.146L11.9996 11.2925L16.1461 7.146L16.2242 7.08154Z' fill='currentColor'/%3E%3C/svg%3E");
328
328
  --icon-rotate: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.2325 6.47442C11.2088 5.49811 12.7917 5.49811 13.768 6.47442L15.2931 7.99955H14.0002C13.7241 7.99955 13.5002 8.2234 13.5002 8.49955C13.5002 8.77569 13.7241 8.99955 14.0002 8.99955H16.5002C16.7764 8.99955 17.0002 8.77569 17.0002 8.49955V5.99955C17.0002 5.7234 16.7764 5.49955 16.5002 5.49955C16.2241 5.49955 16.0002 5.7234 16.0002 5.99955V7.29244L14.4751 5.76731C13.1083 4.40048 10.8922 4.40048 9.52537 5.76731L7.14669 8.14599C6.95143 8.34126 6.95143 8.65784 7.14669 8.8531C7.34195 9.04836 7.65854 9.04836 7.8538 8.8531L10.2325 6.47442ZM13.0609 9.64599C12.4751 9.06021 11.5254 9.06021 10.9396 9.64599L7.64669 12.9389C7.06091 13.5247 7.0609 14.4744 7.64669 15.0602L10.9396 18.3531C11.5254 18.9389 12.4751 18.9389 13.0609 18.3531L16.3538 15.0602C16.9396 14.4744 16.9396 13.5247 16.3538 12.9389L13.0609 9.64599ZM11.6467 10.3531C11.842 10.1578 12.1585 10.1578 12.3538 10.3531L15.6467 13.646C15.842 13.8413 15.842 14.1578 15.6467 14.3531L12.3538 17.646C12.1585 17.8413 11.842 17.8413 11.6467 17.646L8.3538 14.3531C8.15854 14.1578 8.15854 13.8413 8.3538 13.646L11.6467 10.3531Z' fill='currentColor'/%3E%3C/svg%3E");
329
329
  --icon-swap: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.35355 6.35355C8.54882 6.15829 8.54882 5.84171 8.35355 5.64645C8.15829 5.45118 7.84171 5.45118 7.64645 5.64645L5.14645 8.14645C4.95118 8.34171 4.95118 8.65829 5.14645 8.85355L7.64645 11.3536C7.84171 11.5488 8.15829 11.5488 8.35355 11.3536C8.54882 11.1583 8.54882 10.8417 8.35355 10.6464L6.70711 9H18.5C18.7761 9 19 8.77614 19 8.5C19 8.22386 18.7761 8 18.5 8H6.70711L8.35355 6.35355ZM15.6464 13.3536C15.4512 13.1583 15.4512 12.8417 15.6464 12.6464C15.8417 12.4512 16.1583 12.4512 16.3536 12.6464L18.8536 15.1464C19.0488 15.3417 19.0488 15.6583 18.8536 15.8536L16.3536 18.3536C16.1583 18.5488 15.8417 18.5488 15.6464 18.3536C15.4512 18.1583 15.4512 17.8417 15.6464 17.6464L17.2929 16H5.5C5.22386 16 5 15.7761 5 15.5C5 15.2239 5.22386 15 5.5 15H17.2929L15.6464 13.3536Z' fill='currentColor'/%3E%3C/svg%3E");
330
+ --tip-pointer: path("M3 3L0 0H6L3 3Z");
330
331
 
331
332
  /* Elevations — light-dark() handles theme switching inline */
332
333
  --figma-elevation-100:
@@ -601,7 +602,7 @@ input[type="text"][list] {
601
602
  margin: 0 calc(var(--spacer-1) * -1);
602
603
  margin-left: calc((var(--spacer-1) * 2 + var(--spacer-1)) * -1);
603
604
  }
604
- &:not(:first-child) {
605
+ &:not(:first-child):not(:first-of-type) {
605
606
  margin-top: var(--spacer-2);
606
607
  padding-top: var(--spacer-3);
607
608
 
@@ -1066,6 +1067,7 @@ fig-tab-content,
1066
1067
  /* Avatar */
1067
1068
  fig-avatar,
1068
1069
  .fig-avatar {
1070
+ contain: layout paint;
1069
1071
  --size: 1.5rem;
1070
1072
  width: var(--size);
1071
1073
  display: inline-grid;
@@ -1173,6 +1175,7 @@ input[type="color"] {
1173
1175
  }
1174
1176
 
1175
1177
  fig-chit {
1178
+ contain: layout paint;
1176
1179
  --size: 1.5rem;
1177
1180
  --chit-background: #d9d9d9;
1178
1181
  --chit-bg-size: cover;
@@ -1907,6 +1910,7 @@ fig-origin-grid {
1907
1910
 
1908
1911
  /* Switch */
1909
1912
  input[type="checkbox"].switch {
1913
+ contain: strict;
1910
1914
  display: inline-flex;
1911
1915
  margin: 0;
1912
1916
  vertical-align: middle;
@@ -1976,6 +1980,7 @@ input[type="checkbox"].switch:checked:focus {
1976
1980
 
1977
1981
  /* Checkbox */
1978
1982
  input[type="checkbox"]:not(.switch) {
1983
+ contain: strict;
1979
1984
  --size: 1rem;
1980
1985
  appearance: none;
1981
1986
  border-radius: var(--radius-medium);
@@ -2040,6 +2045,7 @@ label.checkbox:has([type="checkbox"]) {
2040
2045
 
2041
2046
  /* Radio */
2042
2047
  input[type="radio"] {
2048
+ contain: strict;
2043
2049
  appearance: none;
2044
2050
  border-radius: 0.5rem;
2045
2051
  width: 1rem;
@@ -2569,6 +2575,7 @@ fig-slider {
2569
2575
  dialog,
2570
2576
  .popover,
2571
2577
  [popover] {
2578
+ contain: layout;
2572
2579
  padding: 0;
2573
2580
  outline: 0;
2574
2581
  border: 0;
@@ -2659,6 +2666,7 @@ dialog[is="fig-dialog"] {
2659
2666
  }
2660
2667
 
2661
2668
  dialog[is="fig-popup"] {
2669
+ contain: layout;
2662
2670
  --z-index: 999999;
2663
2671
  --beak-offset: 1px;
2664
2672
  z-index: var(--z-index);
@@ -2739,6 +2747,7 @@ dialog[is="fig-popup"] {
2739
2747
  }
2740
2748
 
2741
2749
  dialog[is="fig-toast"] {
2750
+ contain: layout paint;
2742
2751
  --z-index: 999999;
2743
2752
  z-index: var(--z-index);
2744
2753
  box-shadow: var(--figma-elevation-100);
@@ -2808,8 +2817,10 @@ fig-tooltip {
2808
2817
  display: contents;
2809
2818
  }
2810
2819
  .fig-tooltip {
2820
+ contain: layout;
2811
2821
  inset: unset;
2812
2822
  display: inline-block;
2823
+ overflow: visible;
2813
2824
  color: var(--color-tooltip);
2814
2825
  background-color: var(--bg-tooltip);
2815
2826
  padding: var(--spacer-1) var(--spacer-2);
@@ -2818,6 +2829,10 @@ fig-tooltip {
2818
2829
  border-radius: var(--radius-medium, 0.3125rem);
2819
2830
  max-width: 180px;
2820
2831
  width: max-content;
2832
+ box-shadow: inset 0 0.5px 0 0 rgba(255, 255, 255, 0.1);
2833
+ filter: drop-shadow(0px 1px 1.5px rgba(0, 0, 0, 0.1))
2834
+ drop-shadow(0px 2.5px 6px rgba(0, 0, 0, 0.13))
2835
+ drop-shadow(0px 0px 0.5px rgba(0, 0, 0, 0.15));
2821
2836
 
2822
2837
  & > span {
2823
2838
  text-wrap: balance;
@@ -2831,47 +2846,14 @@ fig-tooltip {
2831
2846
  width: auto;
2832
2847
  }
2833
2848
 
2834
- &:after {
2835
- content: "";
2836
- background-color: var(--bg-tooltip);
2837
- clip-path: path(
2838
- "M16 0H0L0 1H0.757359C1.55301 1 2.31607 1.31607 2.87868 1.87868L6.29587 5.29587C7.23704 6.23704 8.76296 6.23704 9.70413 5.29587L13.1213 1.87868C13.6839 1.31607 14.447 1 15.2426 1H16V0Z"
2839
- );
2840
- width: 1rem;
2841
- height: 6px;
2842
- position: absolute;
2843
- top: calc(100% - 1px);
2844
- left: var(--beak-offset, 50%);
2845
- z-index: 2;
2846
- transform: translate(-50%);
2847
- }
2848
-
2849
- &[position="bottom"] {
2850
- &:after {
2851
- top: 1px;
2852
- left: var(--beak-offset, 50%);
2853
- transform: translate(-50%, -100%) scaleY(-1);
2854
- }
2855
- }
2856
- }
2857
-
2858
- .fig-tooltip {
2859
- overflow: visible;
2860
- box-shadow: inset 0 0.5px 0 0 rgba(255, 255, 255, 0.1);
2861
- filter: drop-shadow(0px 1px 1.5px rgba(0, 0, 0, 0.1))
2862
- drop-shadow(0px 2.5px 6px rgba(0, 0, 0, 0.13))
2863
- drop-shadow(0px 0px 0.5px rgba(0, 0, 0, 0.15));
2864
-
2865
2849
  &:after {
2866
2850
  content: "";
2867
2851
  background-color: inherit;
2868
- clip-path: path(
2869
- "M16 0H0L0 1H0.757359C1.55301 1 2.31607 1.31607 2.87868 1.87868L6.29587 5.29587C7.23704 6.23704 8.76296 6.23704 9.70413 5.29587L13.1213 1.87868C13.6839 1.31607 14.447 1 15.2426 1H16V0Z"
2870
- );
2871
- width: 1rem;
2872
- height: 6px;
2852
+ clip-path: var(--tip-pointer);
2853
+ width: 6px;
2854
+ height: 3px;
2873
2855
  position: absolute;
2874
- top: calc(100% - 1px);
2856
+ top: 100%;
2875
2857
  left: var(--beak-offset, 50%);
2876
2858
  z-index: 2;
2877
2859
  transform: translate(-50%);
@@ -2879,7 +2861,7 @@ fig-tooltip {
2879
2861
 
2880
2862
  &[position="bottom"] {
2881
2863
  &:after {
2882
- top: 1px;
2864
+ top: 0px;
2883
2865
  left: var(--beak-offset, 50%);
2884
2866
  transform: translate(-50%, -100%) scaleY(-1);
2885
2867
  }
@@ -2892,6 +2874,7 @@ fig-icon {
2892
2874
  }
2893
2875
 
2894
2876
  fig-icon.close {
2877
+ contain: strict;
2895
2878
  width: 1rem;
2896
2879
  height: 1rem;
2897
2880
  background-color: var(--figma-color-text);
@@ -2906,6 +2889,7 @@ fig-content,
2906
2889
  fig-slider,
2907
2890
  fig-switch,
2908
2891
  fig-input-color,
2892
+ fig-input-gradient,
2909
2893
  fig-input-fill,
2910
2894
  fig-checkbox,
2911
2895
  fig-radio,
@@ -3121,14 +3105,39 @@ fig-input-text[type="number"] > [slot] {
3121
3105
  }
3122
3106
 
3123
3107
  fig-input-color,
3108
+ fig-input-gradient,
3124
3109
  fig-input-fill {
3110
+ background-color: var(--figma-color-bg-secondary);
3111
+ border-radius: var(--radius-medium);
3112
+ box-shadow: none !important;
3113
+ &:focus,
3114
+ &:focus-within,
3115
+ &.has-popup-open {
3116
+ outline: 1px solid var(--figma-color-border-selected) !important;
3117
+ outline-offset: -1px !important;
3118
+ }
3119
+
3125
3120
  & > .input-combo > fig-chit:not(:only-child),
3126
- & > .input-combo > fig-chit:not(:only-child) > input,
3121
+ & > .input-combo > fig-chit:not(:only-child) input,
3127
3122
  & > .input-combo > fig-fill-picker:not(:only-child),
3128
3123
  & > .input-combo > fig-fill-picker:not(:only-child) > fig-chit > input,
3129
- & fig-fill-picker:not(:only-child) {
3130
- border-top-right-radius: 0 !important;
3131
- border-bottom-right-radius: 0 !important;
3124
+ & > .input-combo > label,
3125
+ & fig-fill-picker:not(:only-child),
3126
+ fig-input-text,
3127
+ fig-chit {
3128
+ &,
3129
+ &:focus,
3130
+ &:hover {
3131
+ background-color: transparent !important;
3132
+ box-shadow: none !important;
3133
+ border: 0 !important;
3134
+ }
3135
+ }
3136
+ fig-chit ~ fig-input-text > input,
3137
+ fig-chit ~ label,
3138
+ fig-fill-picker ~ fig-input-text > input,
3139
+ fig-fill-picker ~ label {
3140
+ padding-left: 0 !important;
3132
3141
  }
3133
3142
 
3134
3143
  & > .input-combo {
@@ -3139,6 +3148,8 @@ fig-input-fill {
3139
3148
  fig-input-number {
3140
3149
  flex: 0;
3141
3150
  flex-basis: 3rem;
3151
+ box-shadow: inset 1px 0 0 0 var(--figma-color-bg) !important;
3152
+ background-color: transparent !important;
3142
3153
  }
3143
3154
 
3144
3155
  &[disabled]:not([disabled="false"]) {
@@ -3152,6 +3163,45 @@ fig-input-fill {
3152
3163
  min-width: 0;
3153
3164
  }
3154
3165
  }
3166
+ fig-input-gradient {
3167
+ position: relative;
3168
+
3169
+ &:focus,
3170
+ &:active,
3171
+ &:focus-within {
3172
+ outline: 1px solid var(--figma-color-border-selected) !important;
3173
+ outline-offset: -1px !important;
3174
+ }
3175
+ fig-chit {
3176
+ flex: 1 1 auto;
3177
+ width: 100%;
3178
+ min-width: 0;
3179
+ &::before,
3180
+ &::after {
3181
+ width: auto;
3182
+ height: auto;
3183
+ place-self: stretch;
3184
+ border-radius: var(--radius-large) !important;
3185
+ }
3186
+ &[data-type="gradient"]::after {
3187
+ width: calc(100% - 0.625rem);
3188
+ height: 0.875rem;
3189
+ justify-self: center;
3190
+ align-self: center;
3191
+ }
3192
+ }
3193
+
3194
+ .fig-input-gradient-track {
3195
+ position: absolute;
3196
+ inset: calc(var(--spacer-1) + 2px) var(--spacer-2-5);
3197
+ pointer-events: auto;
3198
+
3199
+ fig-handle {
3200
+ pointer-events: auto;
3201
+ cursor: default;
3202
+ }
3203
+ }
3204
+ }
3155
3205
 
3156
3206
  fig-slider {
3157
3207
  display: flex;
@@ -3439,6 +3489,7 @@ fig-spinner {
3439
3489
  /* Segmented control */
3440
3490
  .segmented-control,
3441
3491
  fig-segmented-control {
3492
+ contain: layout paint;
3442
3493
  display: inline-flex;
3443
3494
  user-select: none;
3444
3495
  background-color: var(--figma-color-bg-secondary);
@@ -3756,7 +3807,6 @@ fig-joystick {
3756
3807
  fig-handle {
3757
3808
  position: absolute;
3758
3809
  z-index: 4;
3759
- transform: translate(-50%, -50%);
3760
3810
  }
3761
3811
  }
3762
3812
 
@@ -3956,17 +4006,42 @@ fig-layer {
3956
4006
  }
3957
4007
  }
3958
4008
  }
3959
-
4009
+ @keyframes fig-shimmer-text {
4010
+ from {
4011
+ background-position: var(--shimmer-text-from, 100% 0%);
4012
+ }
4013
+ to {
4014
+ background-position: var(--shimmer-text-to, 0% 0%);
4015
+ }
4016
+ }
4017
+ @keyframes fig-shimmer-mask {
4018
+ from {
4019
+ mask-position: var(--shimmer-mask-from, 100% 0%);
4020
+ }
4021
+ to {
4022
+ mask-position: var(--shimmer-mask-to, 0% 0%);
4023
+ }
4024
+ }
3960
4025
  /* Shimmer */
3961
4026
  fig-shimmer {
3962
4027
  display: contents;
3963
4028
  --shimmer-angle: 90deg;
3964
4029
  --shimmer-size: 250% 100%;
3965
4030
  --shimmer-duration: 1.5s;
4031
+ --shimmer-mask-from: 100% 0%;
4032
+ --shimmer-mask-to: 0% 0%;
4033
+ --shimmer-text-from: 100% 0%;
4034
+ --shimmer-text-to: 0% 0%;
4035
+ --shimmer-subtle-fill-color: var(--figma-color-bg-transparent);
4036
+ --shimmer-bright-fill-color: var(--figma-color-bg-tertiary);
4037
+ --shimmer-subtle-text-color: var(--figma-color-text-tertiary);
4038
+ --shimmer-bright-text-color: var(--figma-color-text);
3966
4039
 
3967
4040
  &[direction="vertical"] {
3968
4041
  --shimmer-angle: 180deg;
3969
4042
  --shimmer-size: 100% 250%;
4043
+ --shimmer-mask-from: 0% 100%;
4044
+ --shimmer-text-from: 0% 100%;
3970
4045
  }
3971
4046
  &[direction="diagonal"] {
3972
4047
  --shimmer-angle: 135deg;
@@ -3974,30 +4049,116 @@ fig-shimmer {
3974
4049
  }
3975
4050
 
3976
4051
  /* When not playing, remove shimmer effect entirely */
3977
- &[playing="false"] > * {
4052
+ &[playing="false"] * {
3978
4053
  background: none;
4054
+ background-size: unset;
4055
+ animation: none;
4056
+ }
4057
+ &[playing="false"] :where(*:not(:has(*)):not(:empty)) {
3979
4058
  -webkit-background-clip: unset;
3980
4059
  background-clip: unset;
3981
4060
  -webkit-text-fill-color: unset;
3982
- animation: none;
4061
+ }
4062
+ /* Only apply shimmer when playing (default) or playing="true" */
4063
+ &:not([playing="false"]) :where(*:has(*), *:empty) {
4064
+ mask: linear-gradient(
4065
+ var(--shimmer-angle),
4066
+ var(--shimmer-subtle-fill-color) 0%,
4067
+ var(--shimmer-subtle-fill-color) 40%,
4068
+ var(--shimmer-bright-fill-color) 50%,
4069
+ var(--shimmer-subtle-fill-color) 60%,
4070
+ var(--shimmer-subtle-fill-color) 100%
4071
+ );
4072
+ mask-size: var(--shimmer-size);
4073
+ animation: fig-shimmer-mask var(--shimmer-duration) linear infinite;
4074
+ }
4075
+ &:not([playing="false"]) :where(*:not(:has(*)):not(:empty)) {
4076
+ mask: none;
4077
+ background: linear-gradient(
4078
+ var(--shimmer-angle),
4079
+ var(--shimmer-subtle-text-color) 0%,
4080
+ var(--shimmer-subtle-text-color) 40%,
4081
+ var(--shimmer-bright-text-color) 50%,
4082
+ var(--shimmer-subtle-text-color) 60%,
4083
+ var(--shimmer-subtle-text-color) 100%
4084
+ );
4085
+ background-size: var(--shimmer-size);
4086
+ animation: fig-shimmer-text var(--shimmer-duration) linear infinite;
4087
+ -webkit-background-clip: text !important;
4088
+ background-clip: text !important;
4089
+ -webkit-text-fill-color: transparent !important;
3983
4090
  }
3984
4091
  }
4092
+ /* Skeleton */
4093
+ fig-skeleton {
4094
+ display: contents;
4095
+ --shimmer-angle: 90deg;
4096
+ --shimmer-size: 250% 100%;
4097
+ --shimmer-duration: 1.5s;
4098
+ --shimmer-mask-from: 100% 0%;
4099
+ --shimmer-mask-to: 0% 0%;
4100
+ --shimmer-subtle-mask-color: rgba(0, 0, 0, 0.75);
4101
+ --shimmer-bright-mask-color: rgba(0, 0, 0, 1);
3985
4102
 
3986
- /* Only apply shimmer when playing (default) or playing="true" */
3987
- fig-shimmer:not([playing="false"]) > * {
3988
- background: linear-gradient(
3989
- var(--shimmer-angle),
3990
- var(--figma-color-text-tertiary) 0%,
3991
- var(--figma-color-text-tertiary) 40%,
3992
- var(--figma-color-text) 50%,
3993
- var(--figma-color-text-tertiary) 60%,
3994
- var(--figma-color-text-tertiary) 100%
3995
- );
3996
- background-size: var(--shimmer-size);
3997
- -webkit-background-clip: text;
3998
- background-clip: text;
3999
- -webkit-text-fill-color: transparent;
4000
- animation: fig-shimmer var(--shimmer-duration) linear infinite;
4103
+ &[direction="vertical"] {
4104
+ --shimmer-angle: 180deg;
4105
+ --shimmer-size: 100% 400%;
4106
+ --shimmer-mask-from: 0% 100%;
4107
+ }
4108
+ &[direction="diagonal"] {
4109
+ --shimmer-angle: 135deg;
4110
+ --shimmer-size: 250% 250%;
4111
+ }
4112
+
4113
+ &:not([playing="false"]) * {
4114
+ mask: linear-gradient(
4115
+ var(--shimmer-angle),
4116
+ var(--shimmer-subtle-mask-color) 0%,
4117
+ var(--shimmer-subtle-mask-color) 40%,
4118
+ var(--shimmer-bright-mask-color) 50%,
4119
+ var(--shimmer-subtle-mask-color) 60%,
4120
+ var(--shimmer-subtle-mask-color) 100%
4121
+ );
4122
+ mask-size: var(--shimmer-size);
4123
+ animation: fig-shimmer-mask var(--shimmer-duration) linear infinite;
4124
+ * {
4125
+ color: transparent;
4126
+ }
4127
+ }
4128
+ label,
4129
+ h3,
4130
+ h2,
4131
+ p,
4132
+ span {
4133
+ background: var(--figma-color-bg-secondary);
4134
+ border-radius: var(--radius-medium);
4135
+ }
4136
+
4137
+ *:not(fig-field, fig-header) {
4138
+ background: var(--figma-color-bg-secondary) !important;
4139
+ box-shadow: none !important;
4140
+ border-radius: var(--radius-medium);
4141
+ color: var(--figma-color-bg-secondary) !important;
4142
+ pointer-events: none;
4143
+ user-select: none;
4144
+ }
4145
+ *::placeholder {
4146
+ color: transparent !important;
4147
+ }
4148
+ *::after,
4149
+ *::before,
4150
+ *::marker,
4151
+ *::picker-icon,
4152
+ *::-webkit-slider-thumb,
4153
+ *::-webkit-slider-runnable-track,
4154
+ *::-webkit-color-swatch,
4155
+ *::-webkit-color-swatch-wrapper,
4156
+ *::-webkit-details-marker,
4157
+ *::-webkit-inner-spin-button,
4158
+ *::-webkit-outer-spin-button,
4159
+ *::-webkit-calendar-picker-indicator {
4160
+ display: none !important;
4161
+ }
4001
4162
  }
4002
4163
 
4003
4164
  /* Fill Picker */
@@ -4009,11 +4170,39 @@ fig-fill-picker {
4009
4170
  }
4010
4171
  }
4011
4172
 
4173
+ fig-preview {
4174
+ display: inline-grid;
4175
+ place-items: center;
4176
+ aspect-ratio: 1;
4177
+ width: calc(100% - var(--spacer-3) * 2);
4178
+ margin: 0 var(--spacer-3);
4179
+ margin-top: var(--spacer-2);
4180
+ margin-bottom: var(--spacer-2);
4181
+ border-radius: var(--radius-medium);
4182
+ position: relative;
4183
+ &::before,
4184
+ &::after,
4185
+ > * {
4186
+ grid-area: 1/1;
4187
+ place-self: center;
4188
+ width: 100%;
4189
+ height: 100%;
4190
+ border-radius: inherit;
4191
+ }
4192
+ &::after {
4193
+ content: "";
4194
+ grid-area: 1/1;
4195
+ place-self: center;
4196
+ box-shadow: inset 0 0 0 1px var(--figma-color-bordertranslucent);
4197
+ }
4198
+ }
4199
+
4012
4200
  .fig-fill-picker-dialog {
4201
+ contain: layout;
4013
4202
  width: 240px;
4014
4203
  padding: 0;
4015
4204
 
4016
- fig-header {
4205
+ & > fig-header {
4017
4206
  padding: var(--spacer-2);
4018
4207
  display: flex;
4019
4208
  justify-content: space-between;
@@ -4024,294 +4213,298 @@ fig-fill-picker {
4024
4213
  font-size: 0.6875rem;
4025
4214
  padding: var(--spacer-1) var(--spacer-1);
4026
4215
  }
4027
- }
4028
-
4029
- .fig-fill-picker-type-label {
4030
- font-size: var(--font-size-small);
4031
- font-weight: var(--font-weight-medium);
4032
- color: var(--figma-color-text);
4033
- padding: var(--spacer-1) var(--spacer-2);
4034
- }
4035
-
4036
- .fig-fill-picker-content {
4037
- padding: var(--spacer-3);
4038
- }
4039
-
4040
- .fig-fill-picker-tab {
4041
- display: none;
4216
+ & > fig-content {
4217
+ padding-bottom: var(--spacer-2-5);
4218
+ }
4219
+ .fig-fill-picker-type-label {
4220
+ font-size: var(--font-size-small);
4221
+ font-weight: var(--font-weight-medium);
4222
+ color: var(--figma-color-text);
4223
+ padding: var(--spacer-1) var(--spacer-2);
4224
+ }
4042
4225
 
4043
- &:first-child {
4044
- display: block;
4226
+ .fig-fill-picker-gamut {
4227
+ margin-left: auto;
4045
4228
  }
4046
- }
4047
4229
 
4048
- /* Solid Tab */
4049
- .fig-fill-picker-color-area {
4050
- position: relative;
4051
- width: 100%;
4052
- aspect-ratio: 1;
4053
- border-radius: var(--radius-medium);
4054
- overflow: visible;
4055
- margin-bottom: var(--spacer-2);
4230
+ .fig-fill-picker-tab {
4231
+ display: none;
4056
4232
 
4057
- canvas {
4058
- width: 100%;
4059
- height: 100%;
4060
- border-radius: var(--radius-medium);
4233
+ &:first-child {
4234
+ display: block;
4235
+ }
4061
4236
  }
4062
- }
4063
4237
 
4064
- .fig-fill-picker-handle {
4065
- position: absolute;
4066
- width: 1rem;
4067
- height: 1rem;
4068
- border-radius: 50%;
4069
- background: var(--picker-color);
4070
- box-shadow:
4071
- inset 0 0 0 0.125rem var(--handle-color),
4072
- 0px 0 0 0.5px rgba(0, 0, 0, 0.1),
4073
- var(--elevation-100-canvas);
4074
- transform: translate(-50%, -50%);
4075
- z-index: 1;
4076
- &:hover {
4077
- transform: translate(-50%, -50%);
4238
+ .fig-fill-picker-color-area {
4239
+ canvas {
4240
+ width: 100%;
4241
+ height: 100%;
4242
+ border-radius: var(--radius-medium);
4243
+ }
4078
4244
  }
4079
- }
4080
-
4081
- .fig-fill-picker-sliders {
4082
- display: flex;
4083
- flex-direction: column;
4084
- gap: var(--spacer-2);
4085
- margin-bottom: var(--spacer-2);
4086
4245
 
4087
- fig-slider {
4088
- width: 100%;
4246
+ .fig-fill-picker-color-area fig-handle {
4247
+ --width: 1rem;
4248
+ --height: 1rem;
4249
+ --border-radius: 50%;
4250
+ --box-shadow:
4251
+ inset 0 0 0 0.125rem var(--handle-color),
4252
+ 0px 0 0 0.5px rgba(0, 0, 0, 0.1), var(--elevation-100-canvas);
4253
+ z-index: 1;
4089
4254
  }
4090
- }
4091
4255
 
4092
- .fig-fill-picker-inputs {
4093
- display: flex;
4094
- gap: var(--spacer-1);
4095
- align-items: center;
4256
+ .fig-fill-picker-sliders {
4257
+ display: grid;
4258
+ grid-template-columns: calc(3.5rem + var(--spacer-3)) 1fr;
4259
+ grid-template-rows: 1fr 1fr;
4260
+ align-items: center;
4261
+ padding-right: var(--spacer-3);
4262
+ gap: var(--spacer-2);
4263
+ padding-bottom: var(--spacer-1);
4096
4264
 
4097
- .fig-fill-picker-color-input {
4098
- flex: 1;
4265
+ .fig-fill-picker-eyedropper {
4266
+ grid-column: 1;
4267
+ grid-row: 1 / 3;
4268
+ place-self: center;
4269
+ margin-right: calc(var(--spacer-3) * -1);
4270
+ width: 3.5rem;
4271
+ aspect-ratio: 1 / 1;
4272
+ height: 3.5rem;
4273
+ }
4274
+
4275
+ fig-slider {
4276
+ grid-column: 2;
4277
+ min-width: 0;
4278
+ }
4099
4279
  }
4100
- }
4101
4280
 
4102
- /* Gradient Tab */
4103
- .fig-fill-picker-gradient-header {
4104
- display: flex;
4105
- gap: var(--spacer-2);
4106
- align-items: center;
4107
- margin-bottom: var(--spacer-2);
4281
+ .fig-fill-picker-inputs {
4282
+ .fig-fill-picker-input-mode {
4283
+ width: 3.5rem;
4284
+ }
4285
+ .fig-fill-picker-input-fields {
4286
+ flex: 1;
4287
+ min-width: 0;
4288
+ display: flex;
4108
4289
 
4109
- & > *:last-child fig-button {
4110
- margin-left: auto;
4111
- }
4290
+ .input-combo {
4291
+ flex: 1;
4292
+ min-width: 0;
4293
+ }
4112
4294
 
4113
- .fig-fill-picker-gradient-center {
4114
- fig-input-number {
4115
- width: 48px;
4295
+ fig-input-text {
4296
+ flex: 1;
4297
+ min-width: 0;
4298
+ }
4116
4299
  }
4117
4300
  }
4118
- }
4119
-
4120
- .fig-fill-picker-gradient-preview {
4121
- position: relative;
4122
- width: 100%;
4123
- aspect-ratio: 1;
4124
- border-radius: var(--radius-medium);
4125
- overflow: hidden;
4126
- margin-bottom: var(--spacer-2);
4127
- }
4128
4301
 
4129
- .fig-fill-picker-gradient-bar {
4130
- position: absolute;
4131
- inset: 0;
4132
- border-radius: var(--radius-medium);
4133
- background: linear-gradient(90deg, #d9d9d9 0%, #737373 100%);
4134
- }
4302
+ /* Gradient Tab */
4303
+ .fig-fill-picker-gradient-header {
4304
+ .fig-fill-picker-gradient-type {
4305
+ flex: 1;
4306
+ min-width: 0;
4307
+ }
4135
4308
 
4136
- .fig-fill-picker-gradient-stops-handles {
4137
- position: absolute;
4138
- top: 0;
4139
- left: 0;
4140
- right: 0;
4141
- bottom: 0;
4142
- pointer-events: none;
4143
- }
4309
+ & > *:last-child fig-button {
4310
+ margin-left: auto;
4311
+ }
4144
4312
 
4145
- .fig-fill-picker-gradient-stops {
4146
- .fig-fill-picker-gradient-stops-header {
4147
- display: flex;
4148
- justify-content: space-between;
4149
- align-items: center;
4150
- margin-bottom: var(--spacer-1);
4151
- font-size: 0.75rem;
4152
- color: var(--figma-color-text-secondary);
4313
+ .fig-fill-picker-gradient-center {
4314
+ fig-input-number {
4315
+ width: 48px;
4316
+ }
4317
+ }
4153
4318
  }
4154
- }
4155
4319
 
4156
- .fig-fill-picker-gradient-stops-list {
4157
- display: flex;
4158
- flex-direction: column;
4159
- gap: var(--spacer-1);
4160
- }
4161
-
4162
- .fig-fill-picker-gradient-stop-row {
4163
- display: flex;
4164
- gap: var(--spacer-1);
4165
- align-items: center;
4320
+ .fig-fill-picker-gradient-bar {
4321
+ background: linear-gradient(90deg, #d9d9d9 0%, #737373 100%);
4322
+ }
4166
4323
 
4167
- & > .fig-fill-picker-stop-position {
4168
- flex: 0;
4169
- flex-basis: 3rem;
4170
- min-width: 0;
4171
- width: 3rem;
4324
+ .fig-fill-picker-gradient-stops-handles {
4325
+ position: absolute;
4326
+ top: 0;
4327
+ left: 0;
4328
+ right: 0;
4329
+ bottom: 0;
4330
+ pointer-events: none;
4172
4331
  }
4173
4332
 
4174
- .fig-fill-picker-stop-color {
4175
- flex: 1;
4176
- min-width: 0;
4177
- fig-input-text {
4178
- min-width: 0;
4333
+ .fig-fill-picker-gradient-stops {
4334
+ .fig-fill-picker-gradient-stops-header {
4335
+ > span {
4336
+ flex: 1;
4337
+ }
4179
4338
  }
4180
4339
  }
4181
4340
 
4182
- .fig-fill-picker-stop-remove {
4183
- flex-shrink: 0;
4341
+ .fig-fill-picker-gradient-stops-list {
4342
+ display: flex;
4343
+ flex-direction: column;
4344
+ gap: var(--spacer-1);
4184
4345
  }
4185
- }
4186
4346
 
4187
- /* Media Tabs (Image/Video/Webcam) */
4188
- .fig-fill-picker-media-header {
4189
- display: flex;
4190
- gap: var(--spacer-1);
4191
- align-items: center;
4192
- margin-bottom: var(--spacer-2);
4347
+ .fig-fill-picker-gradient-stop-row {
4348
+ padding-right: var(--spacer-2);
4349
+ & > .fig-fill-picker-stop-position {
4350
+ flex: 0;
4351
+ flex-basis: 3rem;
4352
+ min-width: 0;
4353
+ width: 3rem;
4354
+ }
4193
4355
 
4194
- .fig-fill-picker-scale-mode {
4195
- flex: 1;
4196
- }
4356
+ .fig-fill-picker-stop-color {
4357
+ flex: 1;
4358
+ min-width: 0;
4359
+ fig-input-text {
4360
+ min-width: 0;
4361
+ }
4362
+ }
4197
4363
 
4198
- .fig-fill-picker-scale {
4199
- width: 56px;
4364
+ .fig-fill-picker-stop-remove {
4365
+ flex-shrink: 0;
4366
+ }
4200
4367
  }
4201
- }
4202
4368
 
4203
- .fig-fill-picker-media-preview {
4204
- position: relative;
4205
- aspect-ratio: 1;
4206
- border-radius: var(--radius-medium);
4207
- overflow: hidden;
4208
- display: flex;
4209
- align-items: center;
4210
- justify-content: center;
4369
+ /* Media Tabs (Image/Video/Webcam) */
4370
+ .fig-fill-picker-media-header {
4371
+ .fig-fill-picker-scale-mode {
4372
+ flex: 1;
4373
+ }
4211
4374
 
4212
- &.dragover {
4213
- outline: 2px dashed var(--figma-color-border-brand);
4214
- outline-offset: -2px;
4375
+ .fig-fill-picker-scale {
4376
+ width: 56px;
4377
+ }
4215
4378
  }
4216
4379
 
4217
- &.has-media {
4218
- fig-button {
4219
- visibility: hidden;
4380
+ .fig-fill-picker-media-preview {
4381
+ position: relative;
4382
+ aspect-ratio: 1;
4383
+ margin: var(--spacer-1) var(--spacer-3);
4384
+ border-radius: var(--radius-medium);
4385
+ overflow: hidden;
4386
+ display: flex;
4387
+ align-items: center;
4388
+ justify-content: center;
4389
+
4390
+ &.dragover {
4391
+ outline: 2px dashed var(--figma-color-border-brand);
4392
+ outline-offset: -2px;
4220
4393
  }
4221
- &:hover {
4394
+
4395
+ &.has-media {
4222
4396
  fig-button {
4223
- visibility: visible;
4397
+ visibility: hidden;
4398
+ }
4399
+ &:hover {
4400
+ fig-button {
4401
+ visibility: visible;
4402
+ }
4224
4403
  }
4225
4404
  }
4226
4405
  }
4227
- }
4228
4406
 
4229
- .fig-fill-picker-checkerboard {
4230
- position: absolute;
4231
- inset: 0;
4232
- background-image:
4233
- linear-gradient(45deg, var(--figma-color-bg-tertiary) 25%, transparent 25%),
4234
- linear-gradient(
4235
- -45deg,
4236
- var(--figma-color-bg-tertiary) 25%,
4237
- transparent 25%
4238
- ),
4239
- linear-gradient(45deg, transparent 75%, var(--figma-color-bg-tertiary) 75%),
4240
- linear-gradient(-45deg, transparent 75%, var(--figma-color-bg-tertiary) 75%);
4241
- background-size: 16px 16px;
4242
- background-position:
4243
- 0 0,
4244
- 0 8px,
4245
- 8px -8px,
4246
- -8px 0px;
4247
- }
4407
+ .fig-fill-picker-checkerboard {
4408
+ position: absolute;
4409
+ inset: 0;
4410
+ background-image:
4411
+ linear-gradient(
4412
+ 45deg,
4413
+ var(--figma-color-bg-tertiary) 25%,
4414
+ transparent 25%
4415
+ ),
4416
+ linear-gradient(
4417
+ -45deg,
4418
+ var(--figma-color-bg-tertiary) 25%,
4419
+ transparent 25%
4420
+ ),
4421
+ linear-gradient(
4422
+ 45deg,
4423
+ transparent 75%,
4424
+ var(--figma-color-bg-tertiary) 75%
4425
+ ),
4426
+ linear-gradient(
4427
+ -45deg,
4428
+ transparent 75%,
4429
+ var(--figma-color-bg-tertiary) 75%
4430
+ );
4431
+ background-size: 16px 16px;
4432
+ background-position:
4433
+ 0 0,
4434
+ 0 8px,
4435
+ 8px -8px,
4436
+ -8px 0px;
4437
+ }
4248
4438
 
4249
- .fig-fill-picker-image-preview {
4250
- position: absolute;
4251
- inset: 0;
4252
- width: 100%;
4253
- height: 100%;
4254
- display: none;
4255
- }
4439
+ .fig-fill-picker-image-preview {
4440
+ position: absolute;
4441
+ inset: 0;
4442
+ width: 100%;
4443
+ height: 100%;
4444
+ display: none;
4445
+ }
4256
4446
 
4257
- .fig-fill-picker-video-preview {
4258
- position: absolute;
4259
- inset: 0;
4260
- width: 100%;
4261
- height: 100%;
4262
- object-fit: cover;
4263
- display: none;
4264
- }
4447
+ .fig-fill-picker-video-preview {
4448
+ position: absolute;
4449
+ inset: 0;
4450
+ width: 100%;
4451
+ height: 100%;
4452
+ object-fit: cover;
4453
+ display: none;
4454
+ }
4265
4455
 
4266
- .fig-fill-picker-upload {
4267
- position: relative;
4268
- z-index: 1;
4269
- }
4456
+ .fig-fill-picker-upload {
4457
+ position: relative;
4458
+ z-index: 1;
4459
+ }
4270
4460
 
4271
- /* Webcam Tab */
4272
- .fig-fill-picker-webcam-preview {
4273
- position: relative;
4274
- aspect-ratio: 1;
4275
- border-radius: var(--radius-medium);
4276
- overflow: hidden;
4277
- margin-bottom: var(--spacer-2);
4278
- }
4461
+ /* Webcam Tab */
4462
+ .fig-fill-picker-webcam-preview {
4463
+ position: relative;
4464
+ aspect-ratio: 1;
4465
+ margin: 0 var(--spacer-3);
4466
+ border-radius: var(--radius-medium);
4467
+ overflow: hidden;
4468
+ margin-bottom: var(--spacer-2);
4469
+ }
4279
4470
 
4280
- .fig-fill-picker-webcam-video {
4281
- position: absolute;
4282
- inset: 0;
4283
- width: 100%;
4284
- height: 100%;
4285
- object-fit: cover;
4286
- }
4471
+ .fig-fill-picker-webcam-video {
4472
+ position: absolute;
4473
+ inset: 0;
4474
+ width: 100%;
4475
+ height: 100%;
4476
+ object-fit: cover;
4477
+ }
4287
4478
 
4288
- .fig-fill-picker-webcam-status {
4289
- position: absolute;
4290
- inset: 0;
4291
- display: flex;
4292
- align-items: center;
4293
- justify-content: center;
4294
- background: var(--figma-color-bg-secondary);
4295
- color: var(--figma-color-text-secondary);
4296
- font-size: 0.75rem;
4297
- }
4479
+ .fig-fill-picker-webcam-status {
4480
+ position: absolute;
4481
+ inset: 0;
4482
+ display: flex;
4483
+ align-items: center;
4484
+ justify-content: center;
4485
+ background: var(--figma-color-bg-secondary);
4486
+ color: var(--figma-color-text-secondary);
4487
+ font-size: 0.75rem;
4488
+ }
4298
4489
 
4299
- .fig-fill-picker-webcam-controls {
4300
- display: flex;
4301
- gap: var(--spacer-1);
4490
+ .fig-fill-picker-webcam-controls {
4491
+ display: flex;
4492
+ gap: var(--spacer-1);
4302
4493
 
4303
- .fig-fill-picker-camera-select {
4304
- flex: 1;
4305
- }
4494
+ .fig-fill-picker-camera-select {
4495
+ flex: 1;
4496
+ }
4306
4497
 
4307
- .fig-fill-picker-webcam-capture {
4308
- flex-shrink: 0;
4498
+ .fig-fill-picker-webcam-capture {
4499
+ flex-shrink: 0;
4500
+ }
4309
4501
  }
4310
4502
  }
4311
4503
 
4312
4504
  /* Utilities */
4313
4505
 
4314
4506
  .fig-mask-icon {
4507
+ contain: strict;
4315
4508
  --size: var(--spacer-4);
4316
4509
  --icon: var(--icon-add);
4317
4510
  display: inline-flex;
@@ -4550,12 +4743,14 @@ fig-choice {
4550
4743
  }
4551
4744
 
4552
4745
  fig-handle {
4746
+ contain: strict;
4553
4747
  --width: 0.75rem;
4554
4748
  --height: 0.75rem;
4555
4749
  --fill: var(--figma-color-bg-brand);
4556
4750
  --border-radius: 50%;
4751
+ --ring-width: 1.25px;
4557
4752
  --box-shadow:
4558
- inset 0 0 0 0.09375rem var(--handle-color),
4753
+ inset 0 0 0 var(--ring-width) var(--handle-color),
4559
4754
  0px 0 0 0.5px rgba(0, 0, 0, 0.1), var(--elevation-100-canvas);
4560
4755
  --outline: none;
4561
4756
  --border: none;
@@ -4568,13 +4763,119 @@ fig-handle {
4568
4763
  box-shadow: var(--box-shadow);
4569
4764
  outline: var(--outline);
4570
4765
  border: var(--border);
4766
+
4767
+ &[size="small"] {
4768
+ --width: 0.5625rem;
4769
+ --height: 0.5625rem;
4770
+ }
4771
+
4772
+ &[drag]:not([drag="false"]) {
4773
+ position: absolute;
4774
+ touch-action: none;
4775
+ }
4776
+
4777
+ &[selected]:not([selected="false"]) {
4778
+ outline: var(--ring-width) solid var(--figma-color-border-selected);
4779
+ outline-offset: var(--ring-width);
4780
+ }
4781
+
4782
+ &[disabled]:not([disabled="false"]),
4783
+ &[aria-disabled="true"] {
4784
+ pointer-events: none;
4785
+ opacity: 0.4;
4786
+ cursor: default;
4787
+ }
4788
+
4789
+ &[type="color"] {
4790
+ contain: layout style;
4791
+ overflow: visible;
4792
+ position: relative;
4793
+
4794
+ fig-color-tip {
4795
+ position: absolute;
4796
+ bottom: calc(100% + 6px);
4797
+ left: 50%;
4798
+ transform: translateX(-50%);
4799
+ z-index: 10;
4800
+ }
4801
+ }
4571
4802
  }
4572
4803
 
4573
- @keyframes fig-shimmer {
4574
- 0% {
4575
- background-position: 100% 100%;
4804
+ fig-color-tip {
4805
+ --tip-selection-width: 1px;
4806
+ --tip-selection-scale: 1;
4807
+ --beak-offset: 50%;
4808
+
4809
+ contain: layout;
4810
+ inset: unset;
4811
+ display: inline-grid;
4812
+ place-items: center;
4813
+ overflow: visible;
4814
+ position: relative;
4815
+ color: var(--text-primary);
4816
+ color-scheme: light only;
4817
+ aspect-ratio: 1 / 1;
4818
+ flex-shrink: 0;
4819
+ min-width: max-content;
4820
+ min-height: max-content;
4821
+ background-color: var(--figma-color-bg);
4822
+ border-radius: var(--radius-medium, 0.3125rem);
4823
+ box-shadow: inset 0 0.5px 0 0 rgba(255, 255, 255, 0.1);
4824
+ filter: drop-shadow(0px 1px 1.5px rgba(0, 0, 0, 0.1))
4825
+ drop-shadow(0px 2.5px 6px rgba(0, 0, 0, 0.13))
4826
+ drop-shadow(0px 0px 0.5px rgba(0, 0, 0, 0.15));
4827
+
4828
+ fig-chit {
4829
+ input[type="color"] {
4830
+ background: transparent;
4831
+ }
4832
+ }
4833
+
4834
+ &[selected]:not([selected="false"]) {
4835
+ outline: var(--tip-selection-width) solid var(--figma-color-border-selected);
4576
4836
  }
4577
- 100% {
4578
- background-position: 0% 0%;
4837
+
4838
+ &[selected]:not([selected="false"]):before {
4839
+ content: "";
4840
+ background: var(--figma-color-border-selected);
4841
+ clip-path: var(--tip-pointer);
4842
+ width: 6px;
4843
+ height: 3px;
4844
+ position: absolute;
4845
+ top: calc(100% + 1px);
4846
+ left: var(--beak-offset, 50%);
4847
+ z-index: 1;
4848
+ pointer-events: none;
4849
+ transform: translate(-50%, 0) scale(var(--tip-selection-scale));
4850
+ transform-origin: 50% 0;
4851
+ }
4852
+
4853
+ &:after {
4854
+ content: "";
4855
+ background-color: inherit;
4856
+ clip-path: var(--tip-pointer);
4857
+ width: 6px;
4858
+ height: 3px;
4859
+ position: absolute;
4860
+ top: 100%;
4861
+ left: var(--beak-offset, 50%);
4862
+ z-index: 2;
4863
+ transform: translate(-50%);
4864
+ }
4865
+
4866
+ &[position="bottom"] {
4867
+ &[selected]:not([selected="false"]):before {
4868
+ top: 1px;
4869
+ left: var(--beak-offset, 50%);
4870
+ transform: translate(-50%, -100%) scale(var(--tip-selection-scale))
4871
+ scaleY(-1);
4872
+ transform-origin: 50% 100%;
4873
+ }
4874
+
4875
+ &:after {
4876
+ top: 1px;
4877
+ left: var(--beak-offset, 50%);
4878
+ transform: translate(-50%, -100%) scaleY(-1);
4879
+ }
4579
4880
  }
4580
4881
  }