@rogieking/figui3 11.6.1 → 11.6.3
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/.cursor/skills/fig-editor/components.md +10 -5
- package/.cursor/skills/fig-editor/reference.md +10 -4
- package/.cursor/skills/figui3/reference.md +8 -0
- package/CHANGELOG.md +32 -0
- package/README.md +28 -7
- package/dist/fig-color.js +1 -0
- package/dist/fig-editor.css +1 -1
- package/dist/fig-editor.js +3 -3
- package/dist/fig-property.css +1 -1
- package/dist/fig.js +5 -5
- package/fig-color.js +406 -0
- package/fig-editor.css +1 -16
- package/fig-editor.js +39 -594
- package/fig-gradient-editor.css +6 -1
- package/fig-gradient-editor.js +622 -237
- package/fig-palette-editor.css +20 -0
- package/fig-palette-editor.js +815 -0
- package/fig-popup-gradient.js +9 -1
- package/fig-popup-palette.js +13 -2
- package/fig-property.css +4 -0
- package/fig.js +16 -165
- package/package.json +7 -2
package/fig-popup-gradient.js
CHANGED
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
import "./fig.js";
|
|
3
3
|
import "./fig-gradient-editor.js";
|
|
4
4
|
|
|
5
|
-
const GRADIENT_ATTRIBUTES = [
|
|
5
|
+
const GRADIENT_ATTRIBUTES = [
|
|
6
|
+
"value",
|
|
7
|
+
"color-space",
|
|
8
|
+
"disabled",
|
|
9
|
+
"overflow",
|
|
10
|
+
"show-rows",
|
|
11
|
+
];
|
|
6
12
|
|
|
7
13
|
customElements.whenDefined("fig-popup").then(() => {
|
|
8
14
|
if (customElements.get("fig-popup-gradient")) return;
|
|
@@ -16,6 +22,8 @@ customElements.whenDefined("fig-popup").then(() => {
|
|
|
16
22
|
* @attr {string} value - JSON gradient config or full gradient fill value
|
|
17
23
|
* @attr {string} color-space - `srgb` or `display-p3`
|
|
18
24
|
* @attr {boolean} disabled - Disables gradient editing
|
|
25
|
+
* @attr {"fade"|"visible"} overflow - Stop-list overflow mode
|
|
26
|
+
* @attr {number} show-rows - Visible stop rows before overflow
|
|
19
27
|
* @fires input - During gradient edits
|
|
20
28
|
* @fires change - On committed gradient edits
|
|
21
29
|
*/
|
package/fig-popup-palette.js
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
/* Copyright (c) 2026 Rogie King. PolyForm Shield 1.0.0. See LICENSE. */
|
|
2
2
|
import "./fig.js";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import "./fig-palette-editor.js";
|
|
4
|
+
|
|
5
|
+
const PALETTE_ATTRIBUTES = [
|
|
6
|
+
"value",
|
|
7
|
+
"min",
|
|
8
|
+
"max",
|
|
9
|
+
"fixed",
|
|
10
|
+
"disabled",
|
|
11
|
+
"overflow",
|
|
12
|
+
"show-rows",
|
|
13
|
+
];
|
|
5
14
|
|
|
6
15
|
function normalizePaletteValue(value) {
|
|
7
16
|
let entries = value;
|
|
@@ -56,6 +65,8 @@ customElements.whenDefined("fig-popup").then(() => {
|
|
|
56
65
|
* @attr {number} max - Maximum number of colors
|
|
57
66
|
* @attr {boolean} fixed - Locks the palette length
|
|
58
67
|
* @attr {boolean} disabled - Disables palette editing
|
|
68
|
+
* @attr {"fade"|"visible"} overflow - Vertical overflow mode
|
|
69
|
+
* @attr {number} show-rows - Visible rows before overflow
|
|
59
70
|
* @fires input - During editing with the normalized color array in detail
|
|
60
71
|
* @fires change - On committed edits with the normalized color array in detail
|
|
61
72
|
*/
|
package/fig-property.css
CHANGED
|
@@ -29,6 +29,10 @@ fig-property {
|
|
|
29
29
|
padding: var(--fig-property-top-padding) 0
|
|
30
30
|
var(--fig-property-bottom-padding);
|
|
31
31
|
|
|
32
|
+
&[selected]:not([selected="false"]) {
|
|
33
|
+
background-color: var(--figma-color-bg-selected);
|
|
34
|
+
}
|
|
35
|
+
|
|
32
36
|
&[show-trailing]:not([show-trailing="hover"]):has(> fig-button[slot="trailing"][variant="ghost"]),
|
|
33
37
|
&[show-trailing]:not([show-trailing="hover"]):has(> [slot="trailing"] fig-button[variant="ghost"]) {
|
|
34
38
|
--fig-property-right-padding: var(--spacer-2);
|
package/fig.js
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import "./fig-layer.js";
|
|
2
|
+
import {
|
|
3
|
+
figHexToRGB,
|
|
4
|
+
figHslToRGB,
|
|
5
|
+
figInterpolateHue,
|
|
6
|
+
figLinearToSRGB,
|
|
7
|
+
figOklabToOklch,
|
|
8
|
+
figOklabToRGB,
|
|
9
|
+
figOklchToOklab,
|
|
10
|
+
figRGBToHsl as figRgbToHsl,
|
|
11
|
+
figRGBToLinear,
|
|
12
|
+
figRGBToOklab,
|
|
13
|
+
} from "./fig-color.js";
|
|
2
14
|
|
|
3
15
|
/**
|
|
4
16
|
* Generates a unique ID string using timestamp and random values
|
|
@@ -9809,96 +9821,6 @@ function figLooksLikeVideoUrl(raw) {
|
|
|
9809
9821
|
}
|
|
9810
9822
|
}
|
|
9811
9823
|
|
|
9812
|
-
function figHexToRGB(hex) {
|
|
9813
|
-
const h = hex.replace(/^#/, "");
|
|
9814
|
-
return {
|
|
9815
|
-
r: parseInt(h.substring(0, 2), 16),
|
|
9816
|
-
g: parseInt(h.substring(2, 4), 16),
|
|
9817
|
-
b: parseInt(h.substring(4, 6), 16),
|
|
9818
|
-
};
|
|
9819
|
-
}
|
|
9820
|
-
|
|
9821
|
-
function figRGBToLinear(c) {
|
|
9822
|
-
const s = c / 255;
|
|
9823
|
-
return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
|
|
9824
|
-
}
|
|
9825
|
-
|
|
9826
|
-
function figLinearToSRGB(c) {
|
|
9827
|
-
const v = c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;
|
|
9828
|
-
return Math.round(Math.max(0, Math.min(1, v)) * 255);
|
|
9829
|
-
}
|
|
9830
|
-
|
|
9831
|
-
function figRGBToOklab(r, g, b) {
|
|
9832
|
-
const lr = figRGBToLinear(r);
|
|
9833
|
-
const lg = figRGBToLinear(g);
|
|
9834
|
-
const lb = figRGBToLinear(b);
|
|
9835
|
-
const l_ = Math.cbrt(
|
|
9836
|
-
0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb,
|
|
9837
|
-
);
|
|
9838
|
-
const m_ = Math.cbrt(
|
|
9839
|
-
0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb,
|
|
9840
|
-
);
|
|
9841
|
-
const s_ = Math.cbrt(
|
|
9842
|
-
0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb,
|
|
9843
|
-
);
|
|
9844
|
-
return {
|
|
9845
|
-
l: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,
|
|
9846
|
-
a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,
|
|
9847
|
-
b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,
|
|
9848
|
-
};
|
|
9849
|
-
}
|
|
9850
|
-
|
|
9851
|
-
function figOklabToRGB(L, a, b) {
|
|
9852
|
-
const l_ = L + 0.3963377774 * a + 0.2158037573 * b;
|
|
9853
|
-
const m_ = L - 0.1055613458 * a - 0.0638541728 * b;
|
|
9854
|
-
const s_ = L - 0.0894841775 * a - 1.291485548 * b;
|
|
9855
|
-
const l = l_ * l_ * l_;
|
|
9856
|
-
const m = m_ * m_ * m_;
|
|
9857
|
-
const s = s_ * s_ * s_;
|
|
9858
|
-
return {
|
|
9859
|
-
r: figLinearToSRGB(+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),
|
|
9860
|
-
g: figLinearToSRGB(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),
|
|
9861
|
-
b: figLinearToSRGB(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),
|
|
9862
|
-
};
|
|
9863
|
-
}
|
|
9864
|
-
|
|
9865
|
-
function figOklabToOklch(L, a, b) {
|
|
9866
|
-
return {
|
|
9867
|
-
l: L,
|
|
9868
|
-
c: Math.sqrt(a * a + b * b),
|
|
9869
|
-
h: (Math.atan2(b, a) * 180) / Math.PI,
|
|
9870
|
-
};
|
|
9871
|
-
}
|
|
9872
|
-
|
|
9873
|
-
function figOklchToOklab(l, c, h) {
|
|
9874
|
-
const hRad = (h * Math.PI) / 180;
|
|
9875
|
-
return { l, a: c * Math.cos(hRad), b: c * Math.sin(hRad) };
|
|
9876
|
-
}
|
|
9877
|
-
|
|
9878
|
-
function figInterpolateHue(h1, h2, t, mode) {
|
|
9879
|
-
let a = ((h1 % 360) + 360) % 360;
|
|
9880
|
-
let b = ((h2 % 360) + 360) % 360;
|
|
9881
|
-
let diff = b - a;
|
|
9882
|
-
switch (mode) {
|
|
9883
|
-
case "longer":
|
|
9884
|
-
if (diff > 0 && diff < 180) diff -= 360;
|
|
9885
|
-
else if (diff < 0 && diff > -180) diff += 360;
|
|
9886
|
-
else if (diff === 0) diff = 0;
|
|
9887
|
-
break;
|
|
9888
|
-
case "increasing":
|
|
9889
|
-
if (diff < 0) diff += 360;
|
|
9890
|
-
break;
|
|
9891
|
-
case "decreasing":
|
|
9892
|
-
if (diff > 0) diff -= 360;
|
|
9893
|
-
break;
|
|
9894
|
-
default:
|
|
9895
|
-
if (diff > 180) diff -= 360;
|
|
9896
|
-
else if (diff < -180) diff += 360;
|
|
9897
|
-
break;
|
|
9898
|
-
}
|
|
9899
|
-
return (((a + diff * t) % 360) + 360) % 360;
|
|
9900
|
-
}
|
|
9901
|
-
|
|
9902
9824
|
function figSampleGradientAt(
|
|
9903
9825
|
stops,
|
|
9904
9826
|
position,
|
|
@@ -9964,10 +9886,10 @@ function figSampleGradientAt(
|
|
|
9964
9886
|
);
|
|
9965
9887
|
const S = hsl1.s + (hsl2.s - hsl1.s) * t;
|
|
9966
9888
|
const L = hsl1.l + (hsl2.l - hsl1.l) * t;
|
|
9967
|
-
const rgb =
|
|
9968
|
-
r = rgb
|
|
9969
|
-
g = rgb
|
|
9970
|
-
b = rgb
|
|
9889
|
+
const rgb = figHslToRGB(H, S, L);
|
|
9890
|
+
r = rgb.r;
|
|
9891
|
+
g = rgb.g;
|
|
9892
|
+
b = rgb.b;
|
|
9971
9893
|
} else if (space === "srgb") {
|
|
9972
9894
|
r = Math.round(c1.r + (c2.r - c1.r) * t);
|
|
9973
9895
|
g = Math.round(c1.g + (c2.g - c1.g) * t);
|
|
@@ -9987,77 +9909,6 @@ function figSampleGradientAt(
|
|
|
9987
9909
|
return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`.toUpperCase();
|
|
9988
9910
|
}
|
|
9989
9911
|
|
|
9990
|
-
function figRgbToHsl(r, g, b) {
|
|
9991
|
-
const R = r / 255;
|
|
9992
|
-
const G = g / 255;
|
|
9993
|
-
const B = b / 255;
|
|
9994
|
-
const max = Math.max(R, G, B);
|
|
9995
|
-
const min = Math.min(R, G, B);
|
|
9996
|
-
const l = (max + min) / 2;
|
|
9997
|
-
if (max === min) {
|
|
9998
|
-
return { h: 0, s: 0, l: l * 100 };
|
|
9999
|
-
}
|
|
10000
|
-
const d = max - min;
|
|
10001
|
-
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
10002
|
-
let h;
|
|
10003
|
-
switch (max) {
|
|
10004
|
-
case R:
|
|
10005
|
-
h = ((G - B) / d + (G < B ? 6 : 0)) / 6;
|
|
10006
|
-
break;
|
|
10007
|
-
case G:
|
|
10008
|
-
h = ((B - R) / d + 2) / 6;
|
|
10009
|
-
break;
|
|
10010
|
-
default:
|
|
10011
|
-
h = ((R - G) / d + 4) / 6;
|
|
10012
|
-
break;
|
|
10013
|
-
}
|
|
10014
|
-
return { h: h * 360, s: s * 100, l: l * 100 };
|
|
10015
|
-
}
|
|
10016
|
-
|
|
10017
|
-
function hslToP3(h, s, l) {
|
|
10018
|
-
const sRGB = hslToSRGB(h, s, l);
|
|
10019
|
-
return sRGB.map((c) => +(c / 255).toFixed(4));
|
|
10020
|
-
}
|
|
10021
|
-
|
|
10022
|
-
function hslToSRGB(h, s, l) {
|
|
10023
|
-
s /= 100;
|
|
10024
|
-
l /= 100;
|
|
10025
|
-
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
10026
|
-
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
10027
|
-
const m = l - c / 2;
|
|
10028
|
-
let r, g, b;
|
|
10029
|
-
if (h < 60) {
|
|
10030
|
-
r = c;
|
|
10031
|
-
g = x;
|
|
10032
|
-
b = 0;
|
|
10033
|
-
} else if (h < 120) {
|
|
10034
|
-
r = x;
|
|
10035
|
-
g = c;
|
|
10036
|
-
b = 0;
|
|
10037
|
-
} else if (h < 180) {
|
|
10038
|
-
r = 0;
|
|
10039
|
-
g = c;
|
|
10040
|
-
b = x;
|
|
10041
|
-
} else if (h < 240) {
|
|
10042
|
-
r = 0;
|
|
10043
|
-
g = x;
|
|
10044
|
-
b = c;
|
|
10045
|
-
} else if (h < 300) {
|
|
10046
|
-
r = x;
|
|
10047
|
-
g = 0;
|
|
10048
|
-
b = c;
|
|
10049
|
-
} else {
|
|
10050
|
-
r = c;
|
|
10051
|
-
g = 0;
|
|
10052
|
-
b = x;
|
|
10053
|
-
}
|
|
10054
|
-
return [
|
|
10055
|
-
Math.round((r + m) * 255),
|
|
10056
|
-
Math.round((g + m) * 255),
|
|
10057
|
-
Math.round((b + m) * 255),
|
|
10058
|
-
];
|
|
10059
|
-
}
|
|
10060
|
-
|
|
10061
9912
|
/**
|
|
10062
9913
|
* A fill input that supports solid colors, gradients, images, videos, and webcam.
|
|
10063
9914
|
* @attr {string} value - JSON string with fill data
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rogieking/figui3",
|
|
3
|
-
"version": "11.6.
|
|
3
|
+
"version": "11.6.3",
|
|
4
4
|
"description": "A lightweight web components library for building Figma plugin and widget UIs with native look and feel",
|
|
5
5
|
"author": "Rogie King",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"exports": {
|
|
11
11
|
".": "./dist/fig.js",
|
|
12
12
|
"./fig.js": "./dist/fig.js",
|
|
13
|
+
"./fig-color.js": "./dist/fig-color.js",
|
|
13
14
|
"./fig-layer.js": "./dist/fig-layer.js",
|
|
14
15
|
"./fig-property.js": "./dist/fig-property.js",
|
|
15
16
|
"./fig-editor.js": "./dist/fig-editor.js",
|
|
@@ -22,6 +23,7 @@
|
|
|
22
23
|
"./base.css": "./dist/base.css",
|
|
23
24
|
"./components.css": "./dist/components.css",
|
|
24
25
|
"./src/fig.js": "./fig.js",
|
|
26
|
+
"./src/fig-color.js": "./fig-color.js",
|
|
25
27
|
"./src/fig-layer.js": "./fig-layer.js",
|
|
26
28
|
"./src/fig-property.js": "./fig-property.js",
|
|
27
29
|
"./src/fig-editor.js": "./fig-editor.js",
|
|
@@ -36,9 +38,11 @@
|
|
|
36
38
|
},
|
|
37
39
|
"files": [
|
|
38
40
|
"fig.js",
|
|
41
|
+
"fig-color.js",
|
|
39
42
|
"fig-layer.js",
|
|
40
43
|
"fig-property.js",
|
|
41
44
|
"fig-gradient-editor.js",
|
|
45
|
+
"fig-palette-editor.js",
|
|
42
46
|
"fig-popup-easing.js",
|
|
43
47
|
"fig-popup-gradient.js",
|
|
44
48
|
"fig-popup-palette.js",
|
|
@@ -48,6 +52,7 @@
|
|
|
48
52
|
"fig-layer.css",
|
|
49
53
|
"fig-property.css",
|
|
50
54
|
"fig-gradient-editor.css",
|
|
55
|
+
"fig-palette-editor.css",
|
|
51
56
|
"fig-popup-easing.css",
|
|
52
57
|
"fig-popup-gradient.css",
|
|
53
58
|
"fig-popup-palette.css",
|
|
@@ -71,7 +76,7 @@
|
|
|
71
76
|
],
|
|
72
77
|
"scripts": {
|
|
73
78
|
"dev": "bun --hot server.ts",
|
|
74
|
-
"build": "bun build fig.js --minify --outdir dist && bun build fig-layer.js --minify --outdir dist && bun build fig-property.js --minify --outdir dist --external ./fig.js && bun build fig-editor.js --minify --outdir dist --external ./fig.js --external ./fig-property.js --external ./fig-lab.js && bun build fig-lab.js --minify --outdir dist --external ./fig.js --external ./fig-editor.js && npm run build:css",
|
|
79
|
+
"build": "bun build fig-color.js --minify --outdir dist && bun build fig.js --minify --outdir dist --external ./fig-color.js && bun build fig-layer.js --minify --outdir dist && bun build fig-property.js --minify --outdir dist --external ./fig.js && bun build fig-editor.js --minify --outdir dist --external ./fig.js --external ./fig-color.js --external ./fig-property.js --external ./fig-lab.js && bun build fig-lab.js --minify --outdir dist --external ./fig.js --external ./fig-editor.js && npm run build:css",
|
|
75
80
|
"build:css": "node scripts/build-css.mjs",
|
|
76
81
|
"dev:playground": "node playground/dev.mjs",
|
|
77
82
|
"build:playground": "cd playground && npm run build",
|