@rogieking/figui3 2.0.3 → 2.0.5

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/components.css +181 -1
  2. package/example.html +855 -227
  3. package/fig.js +172 -2
  4. package/package.json +1 -1
package/components.css CHANGED
@@ -2371,7 +2371,7 @@ fig-slider {
2371
2371
 
2372
2372
  & fig-input-text[type="number"],
2373
2373
  & fig-input-number {
2374
- width: 3rem;
2374
+ width: 5rem;
2375
2375
  }
2376
2376
  }
2377
2377
 
@@ -2480,6 +2480,7 @@ fig-input-joystick {
2480
2480
  flex-grow: 0;
2481
2481
  align-items: center;
2482
2482
  justify-content: center;
2483
+ position: relative;
2483
2484
  &:focus {
2484
2485
  outline: 0;
2485
2486
  }
@@ -2495,6 +2496,10 @@ fig-input-joystick {
2495
2496
  cursor: grab;
2496
2497
  --size: 3rem;
2497
2498
  z-index: 2;
2499
+ position: absolute;
2500
+ top: 50%;
2501
+ left: 50%;
2502
+ transform: translate(-50%, -50%);
2498
2503
  }
2499
2504
  }
2500
2505
  .fig-input-joystick-plane > * {
@@ -2615,6 +2620,172 @@ fig-input-angle {
2615
2620
  }
2616
2621
  }
2617
2622
 
2623
+ /* Layer */
2624
+ fig-layer {
2625
+ --indent: var(--spacer-4);
2626
+ display: block;
2627
+ color: var(--figma-color-text);
2628
+ position: relative;
2629
+ user-select: none;
2630
+ border-radius: var(--radius-medium);
2631
+
2632
+ &:has(fig-layer)[open]:not([open="false"]),
2633
+ &:has(fig-layer):hover {
2634
+ & > .fig-layer-row::before {
2635
+ visibility: visible;
2636
+ }
2637
+ }
2638
+
2639
+ &:not(:has(.fig-layer-icon)) {
2640
+ & > .fig-layer-row {
2641
+ padding-left: var(--spacer-3);
2642
+ }
2643
+ }
2644
+
2645
+ & > .fig-layer-row {
2646
+ display: flex;
2647
+ align-items: center;
2648
+ gap: var(--spacer-1);
2649
+ padding: var(--spacer-1) var(--spacer-2);
2650
+ margin-left: var(--spacer-2);
2651
+ border-radius: var(--radius-medium);
2652
+ cursor: pointer;
2653
+ position: relative;
2654
+
2655
+ /* Chevron using mask-image approach like details */
2656
+ &::before {
2657
+ content: "";
2658
+ mask-image: var(--icon-chevron);
2659
+ mask-size: contain;
2660
+ mask-repeat: no-repeat;
2661
+ mask-position: center;
2662
+ display: flex;
2663
+ visibility: hidden;
2664
+ margin-left: calc(-1 * (var(--spacer-3) + var(--spacer-1) + 2px));
2665
+ margin-right: calc(-1 * (var(--spacer-1) + 2px));
2666
+ background: var(--figma-color-text-tertiary);
2667
+ width: var(--spacer-3);
2668
+ height: var(--spacer-3);
2669
+ flex-shrink: 0;
2670
+ transform: rotate(-90deg);
2671
+ transition: transform 0.15s;
2672
+ }
2673
+
2674
+ &:hover {
2675
+ background: var(--figma-color-bg-secondary);
2676
+
2677
+ .fig-layer-actions {
2678
+ opacity: 1;
2679
+ }
2680
+ }
2681
+
2682
+ /* Layer icon */
2683
+ .fig-layer-icon {
2684
+ flex-shrink: 0;
2685
+ width: var(--spacer-3);
2686
+ height: var(--spacer-3);
2687
+ color: var(--figma-color-icon);
2688
+ }
2689
+
2690
+ > label {
2691
+ flex: 1;
2692
+ min-width: 0;
2693
+ overflow: hidden;
2694
+ text-overflow: ellipsis;
2695
+ white-space: nowrap;
2696
+ cursor: pointer;
2697
+ color: var(--figma-color-text);
2698
+ }
2699
+ }
2700
+
2701
+ .fig-layer-actions {
2702
+ display: flex;
2703
+ margin-right: calc(-1 * var(--spacer-1));
2704
+ gap: 0;
2705
+ opacity: 0;
2706
+ transition: opacity 0.15s;
2707
+ flex-shrink: 0;
2708
+
2709
+ > * {
2710
+ flex-shrink: 0;
2711
+ }
2712
+ }
2713
+
2714
+ /* Nested layers indentation */
2715
+ > fig-layer {
2716
+ padding-left: var(--indent);
2717
+ margin-top: 1px;
2718
+ }
2719
+
2720
+ /* Collapsed state - hide children */
2721
+ &:not([open]) > fig-layer,
2722
+ &[open="false"] > fig-layer {
2723
+ display: none;
2724
+ }
2725
+
2726
+ /* Rotate chevron when open */
2727
+ &[open]:not([open="false"]) .fig-layer-row::before {
2728
+ transform: rotate(0deg);
2729
+ }
2730
+
2731
+ /* Dimmed when not visible */
2732
+ &[visible="false"] > .fig-layer-row {
2733
+ & > label {
2734
+ color: var(--figma-color-text-tertiary);
2735
+ }
2736
+ }
2737
+
2738
+ /* Selected state */
2739
+ &[selected]:not([selected="false"]) {
2740
+ & > .fig-layer-row {
2741
+ background: var(--figma-color-bg-selected);
2742
+ }
2743
+ }
2744
+ }
2745
+
2746
+ /* Shimmer */
2747
+ fig-shimmer {
2748
+ display: contents;
2749
+ --shimmer-angle: 90deg;
2750
+ --shimmer-size: 250% 100%;
2751
+ --shimmer-duration: 1.5s;
2752
+
2753
+ &[direction="vertical"] {
2754
+ --shimmer-angle: 180deg;
2755
+ --shimmer-size: 100% 250%;
2756
+ }
2757
+ &[direction="diagonal"] {
2758
+ --shimmer-angle: 135deg;
2759
+ --shimmer-size: 250% 250%;
2760
+ }
2761
+
2762
+ /* When not playing, remove shimmer effect entirely */
2763
+ &[playing="false"] > * {
2764
+ background: none;
2765
+ -webkit-background-clip: unset;
2766
+ background-clip: unset;
2767
+ -webkit-text-fill-color: unset;
2768
+ animation: none;
2769
+ }
2770
+ }
2771
+
2772
+ /* Only apply shimmer when playing (default) or playing="true" */
2773
+ fig-shimmer:not([playing="false"]) > * {
2774
+ background: linear-gradient(
2775
+ var(--shimmer-angle),
2776
+ var(--figma-color-text-tertiary) 0%,
2777
+ var(--figma-color-text-tertiary) 40%,
2778
+ var(--figma-color-text) 50%,
2779
+ var(--figma-color-text-tertiary) 60%,
2780
+ var(--figma-color-text-tertiary) 100%
2781
+ );
2782
+ background-size: var(--shimmer-size);
2783
+ -webkit-background-clip: text;
2784
+ background-clip: text;
2785
+ -webkit-text-fill-color: transparent;
2786
+ animation: fig-shimmer var(--shimmer-duration) linear infinite;
2787
+ }
2788
+
2618
2789
  /* Utilities */
2619
2790
 
2620
2791
  @keyframes fig-spinner-spin {
@@ -2626,3 +2797,12 @@ fig-input-angle {
2626
2797
  transform: rotate(360deg);
2627
2798
  }
2628
2799
  }
2800
+
2801
+ @keyframes fig-shimmer {
2802
+ 0% {
2803
+ background-position: 100% 100%;
2804
+ }
2805
+ 100% {
2806
+ background-position: 0% 0%;
2807
+ }
2808
+ }