@rogieking/figui3 11.5.0 → 11.6.1
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/SKILL.md +2 -1
- package/.cursor/skills/fig-editor/components.md +87 -0
- package/.cursor/skills/fig-editor/reference.md +37 -0
- package/.cursor/skills/figui3/components.md +6 -1
- package/.cursor/skills/figui3/react.md +1 -0
- package/CHANGELOG.md +28 -0
- package/README.md +84 -4
- package/components.css +30 -1
- package/dist/components.css +1 -1
- package/dist/fig-editor.css +1 -1
- package/dist/fig-editor.js +3 -3
- package/dist/fig.css +1 -1
- package/dist/fig.js +6 -6
- package/fig-editor.css +4 -168
- package/fig-editor.js +46 -7
- package/fig-gradient-editor.css +76 -0
- package/fig-gradient-editor.js +598 -0
- package/fig-popup-easing.css +8 -0
- package/fig-popup-easing.js +141 -0
- package/fig-popup-gradient.css +11 -0
- package/fig-popup-gradient.js +138 -0
- package/fig-popup-palette.css +7 -0
- package/fig-popup-palette.js +173 -0
- package/fig.js +404 -109
- package/package.json +9 -1
|
@@ -3,7 +3,7 @@ name: fig-editor
|
|
|
3
3
|
description: >-
|
|
4
4
|
Guides FigUI3 editor bundle (`fig-editor.js` / `fig-editor.css`): fig-select,
|
|
5
5
|
fig-select-options, fig-select-option, fig-property, fig-input-point,
|
|
6
|
-
fig-fill-picker, fig-palette-editor, fig-reorder, and fig-interpolation-swatch,
|
|
6
|
+
fig-fill-picker, fig-palette-editor, fig-gradient-editor, fig-reorder, and fig-interpolation-swatch,
|
|
7
7
|
including React JSX usage. Use when building custom selects, grouped option lists,
|
|
8
8
|
sticky separators, ghost selects, composable property rows, fill picker dialogs,
|
|
9
9
|
reorderable lists, or interpolation swatches.
|
|
@@ -40,6 +40,7 @@ Registered tags:
|
|
|
40
40
|
| `fig-property` | Composable property row with leading, input, and trailing slots |
|
|
41
41
|
| `fig-input-point` | Paired X/Y numeric point input |
|
|
42
42
|
| `fig-palette-editor` | Ordered palette editor |
|
|
43
|
+
| `fig-gradient-editor` | Full gradient editor with reorderable stops |
|
|
43
44
|
| `fig-reorder` | Pointer- and keyboard-reorderable direct-child list |
|
|
44
45
|
| `fig-interpolation-swatch` | Gradient interpolation preview swatch |
|
|
45
46
|
|
|
@@ -113,6 +113,17 @@ Generated accessories:
|
|
|
113
113
|
</fig-property>
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
+
Authored trailing accessory (`/figui3#property/custom-accessory`):
|
|
117
|
+
|
|
118
|
+
```html
|
|
119
|
+
<fig-property label="Opacity" show-trailing>
|
|
120
|
+
<fig-slider slot="input" value="75" min="0" max="100" units="%" text="true" full></fig-slider>
|
|
121
|
+
<fig-button slot="trailing" variant="ghost" icon aria-label="Reset opacity">
|
|
122
|
+
<fig-icon name="reset"></fig-icon>
|
|
123
|
+
</fig-button>
|
|
124
|
+
</fig-property>
|
|
125
|
+
```
|
|
126
|
+
|
|
116
127
|
- Attrs: `label`, `leading` (`drag` | `chevron`), `trailing` (`remove` | `add` | `bind`), `show-leading`, `show-trailing`
|
|
117
128
|
- Slots: `input` (one direct primary control), `label`, `leading`, `trailing`
|
|
118
129
|
- Authored label markup overrides the `label` attribute.
|
|
@@ -121,6 +132,25 @@ Generated accessories:
|
|
|
121
132
|
- Generated trailing controls emit bubbling, composed `remove`, `add`, or `bind` events with the slotted control in `detail.input`.
|
|
122
133
|
- Child input events bubble unchanged.
|
|
123
134
|
|
|
135
|
+
## `fig-popup-easing`
|
|
136
|
+
|
|
137
|
+
Reusable easing dialog with an internal
|
|
138
|
+
`<fig-easing-curve aspect-ratio="4/3">`.
|
|
139
|
+
|
|
140
|
+
```html
|
|
141
|
+
<fig-button id="easing-trigger">Edit easing</fig-button>
|
|
142
|
+
<dialog
|
|
143
|
+
is="fig-popup-easing"
|
|
144
|
+
anchor="#easing-trigger"
|
|
145
|
+
value="0.42, 0, 0.58, 1"
|
|
146
|
+
open
|
|
147
|
+
></dialog>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
- Attrs: `value`, `mode`, `precision`, `edit`, `presets`, `text`, plus inherited `fig-popup` attributes.
|
|
151
|
+
- Events: bubbling `input` / `change` forwarded from the easing curve.
|
|
152
|
+
- Create it as `<dialog is="fig-popup-easing">`, not `<fig-popup-easing>`.
|
|
153
|
+
|
|
124
154
|
## `fig-palette-editor`
|
|
125
155
|
|
|
126
156
|
Reusable ordered palette editor used by `fig-input-palette edit="picker"`.
|
|
@@ -138,6 +168,63 @@ Reusable ordered palette editor used by `fig-input-palette edit="picker"`.
|
|
|
138
168
|
- Events: `input` / `change` with the normalized ordered color array in `detail`
|
|
139
169
|
- Uses `fig-reorder` for pointer and keyboard reordering.
|
|
140
170
|
|
|
171
|
+
## `fig-gradient-editor`
|
|
172
|
+
|
|
173
|
+
Reusable full gradient editor used by the Gradient tab in `fig-fill-picker`.
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
<fig-gradient-editor
|
|
177
|
+
value='{"type":"linear","angle":90,"stops":[{"position":0,"color":"#0D99FF","opacity":100},{"position":100,"color":"#9747FF","opacity":100}]}'
|
|
178
|
+
onInput={onInput}
|
|
179
|
+
onChange={onChange}
|
|
180
|
+
/>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
- Attrs: `value`, `color-space` (`srgb` | `display-p3`), `disabled`.
|
|
184
|
+
- Property: `value` is the normalized gradient config; `cssValue` is the rendered CSS gradient.
|
|
185
|
+
- Property: `pickerAnchor` accepts an element used to anchor nested stop color pickers.
|
|
186
|
+
- Events: `input` / `change` with `{ type: "gradient", gradient, css }`.
|
|
187
|
+
- Includes type, flip/rotate, stop bar, add/remove, and pointer/keyboard reorder controls.
|
|
188
|
+
|
|
189
|
+
## `fig-popup-gradient`
|
|
190
|
+
|
|
191
|
+
Reusable popup containing one `fig-gradient-editor`. It is the picker opened by
|
|
192
|
+
`fig-input-gradient edit="picker"`.
|
|
193
|
+
|
|
194
|
+
```html
|
|
195
|
+
<fig-button id="gradient-trigger">Edit gradient</fig-button>
|
|
196
|
+
<dialog
|
|
197
|
+
is="fig-popup-gradient"
|
|
198
|
+
anchor="#gradient-trigger"
|
|
199
|
+
value='{"type":"linear","angle":90,"stops":[{"position":0,"color":"#0D99FF","opacity":100},{"position":100,"color":"#9747FF","opacity":100}]}'
|
|
200
|
+
open
|
|
201
|
+
></dialog>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
- Attrs: `value`, `color-space`, `disabled`, plus inherited `fig-popup` attributes.
|
|
205
|
+
- Events: bubbling `input` / `change` with `{ type: "gradient", gradient, css }`.
|
|
206
|
+
- Create it as `<dialog is="fig-popup-gradient">`.
|
|
207
|
+
|
|
208
|
+
## `fig-popup-palette`
|
|
209
|
+
|
|
210
|
+
Reusable palette dialog used by `fig-input-palette edit="picker"`. It extends
|
|
211
|
+
`fig-popup` and owns its `fig-palette-editor`.
|
|
212
|
+
|
|
213
|
+
```html
|
|
214
|
+
<fig-button id="palette-trigger">Edit palette</fig-button>
|
|
215
|
+
<dialog
|
|
216
|
+
is="fig-popup-palette"
|
|
217
|
+
anchor="#palette-trigger"
|
|
218
|
+
value='["#94BD00","#83AD00","#1A632A","#003905"]'
|
|
219
|
+
open
|
|
220
|
+
></dialog>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
- Attrs: `value`, `min`, `max`, `fixed`, `disabled`, plus inherited `fig-popup` attributes.
|
|
224
|
+
- Property: `value` returns the normalized `{ color, alpha }[]`.
|
|
225
|
+
- Events: bubbling `input` / `change` with the normalized color array in `detail`.
|
|
226
|
+
- Create it as `<dialog is="fig-popup-palette">`, not `<fig-popup-palette>`.
|
|
227
|
+
|
|
141
228
|
## `fig-reorder`
|
|
142
229
|
|
|
143
230
|
```tsx
|
|
@@ -60,6 +60,15 @@ Events: `input`, `change`, `optionhover`, `optionfocus`.
|
|
|
60
60
|
- Generated trailing events bubble across shadow roots with `detail: { input }`.
|
|
61
61
|
- Child control events are not normalized or re-emitted.
|
|
62
62
|
|
|
63
|
+
## Easing popup
|
|
64
|
+
|
|
65
|
+
`dialog[is="fig-popup-easing"]` extends `fig-popup` and owns a
|
|
66
|
+
`fig-easing-curve` with `aspect-ratio="4/3"`.
|
|
67
|
+
|
|
68
|
+
- Observes and forwards `value`, `mode`, `precision`, `edit`, `presets`, and `text`.
|
|
69
|
+
- Forwards bubbling `input` / `change` events and reflects the current easing value.
|
|
70
|
+
- Defaults: `position="bottom left"`, `offset="0 8"`, `viewport-margin="8"`, and `popover="manual"`.
|
|
71
|
+
|
|
63
72
|
## Reorder
|
|
64
73
|
|
|
65
74
|
`fig-reorder` observes `axis`, `handle`, `items`, `indicator`, and `disabled`.
|
|
@@ -78,6 +87,34 @@ Events: `input`, `change`, `optionhover`, `optionfocus`.
|
|
|
78
87
|
- `value` property and `input` / `change` event `detail`: normalized ordered `{ color, alpha }[]`
|
|
79
88
|
- Rows are direct `fig-reorder` items and support pointer or keyboard reordering.
|
|
80
89
|
|
|
90
|
+
## Gradient editor
|
|
91
|
+
|
|
92
|
+
`fig-gradient-editor` observes `value`, `color-space`, and `disabled`.
|
|
93
|
+
|
|
94
|
+
- `value` accepts a gradient config or `{ type: "gradient", gradient }` and returns a normalized gradient config.
|
|
95
|
+
- `cssValue` returns the current CSS gradient.
|
|
96
|
+
- `pickerAnchor` anchors nested stop color pickers.
|
|
97
|
+
- Bubbling `input` / `change` detail is `{ type: "gradient", gradient, css }`.
|
|
98
|
+
- Interpolation remains locked to sRGB to match the fill picker’s current behavior.
|
|
99
|
+
|
|
100
|
+
## Gradient popup
|
|
101
|
+
|
|
102
|
+
`dialog[is="fig-popup-gradient"]` extends `fig-popup`, owns a
|
|
103
|
+
`fig-gradient-editor`, and observes `value`, `color-space`, and `disabled`.
|
|
104
|
+
|
|
105
|
+
- Defaults: `position="bottom left"`, `offset="0 8"`, `viewport-margin="8"`, and `popover="manual"`.
|
|
106
|
+
- Bubbling `input` / `change` detail is `{ type: "gradient", gradient, css }`.
|
|
107
|
+
|
|
108
|
+
## Palette popup
|
|
109
|
+
|
|
110
|
+
`dialog[is="fig-popup-palette"]` extends `fig-popup`, owns a
|
|
111
|
+
`fig-palette-editor`, and observes `value`, `min`, `max`, `fixed`, and
|
|
112
|
+
`disabled` in addition to inherited popup attributes.
|
|
113
|
+
|
|
114
|
+
- `value` property and bubbling `input` / `change` detail are normalized `{ color, alpha }[]`.
|
|
115
|
+
- Defaults: `position="bottom left"`, `offset="0 8"`, `viewport-margin="8"`, and `popover="manual"`.
|
|
116
|
+
- Import through `fig-editor.js`; create it with `document.createElement("dialog", { is: "fig-popup-palette" })` or matching HTML.
|
|
117
|
+
|
|
81
118
|
## Fill picker modes
|
|
82
119
|
|
|
83
120
|
Built-in: `solid`, `gradient`, `image`, `video`, `webcam`.
|
|
@@ -170,7 +170,7 @@ Handlers below assume `onInput` / `onChange` / `onClick` from [react.md](react.m
|
|
|
170
170
|
|
|
171
171
|
- Attrs: `preview`, `label`, `accepts`, `multiple`, `disabled`, `variant` (forwards `fig-button` variants; defaults to `property`)
|
|
172
172
|
- Blank or omitted `label` defaults to `Upload audio`, `Upload image`, or `Upload file` based on the known file type. An explicit label overrides it.
|
|
173
|
-
- `preview`
|
|
173
|
+
- For known audio files, `preview` shows the audio icon and filename at rest, reveals play and waveform controls on hover/focus, and keeps pause plus waveform visible while playing.
|
|
174
174
|
- `accepts` controls the native chooser filter; file icons and previews are detected independently.
|
|
175
175
|
- Events: `change` / `input` with files on the host
|
|
176
176
|
|
|
@@ -321,6 +321,7 @@ Handlers below assume `onInput` / `onChange` / `onClick` from [react.md](react.m
|
|
|
321
321
|
```
|
|
322
322
|
|
|
323
323
|
- Attrs: `value`, `edit`, `mode` (`handle` | `tip`), `disabled`
|
|
324
|
+
- `edit="picker"` opens `dialog[is="fig-popup-gradient"]` when `fig-editor.js` is loaded.
|
|
324
325
|
|
|
325
326
|
### `fig-swatch`
|
|
326
327
|
|
|
@@ -713,6 +714,10 @@ toastRef.current?.showToast();
|
|
|
713
714
|
Set `mode="bezier"` or `mode="spring"` to constrain the editor and preset list
|
|
714
715
|
to one curve type.
|
|
715
716
|
|
|
717
|
+
With `edit="false"`, the compact preset control opens `fig-popup-easing` when
|
|
718
|
+
`fig-editor.js` is loaded; without the editor bundle it retains the preset
|
|
719
|
+
dropdown fallback.
|
|
720
|
+
|
|
716
721
|
### `fig-3d-rotate`
|
|
717
722
|
|
|
718
723
|
```tsx
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [11.6.1]
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Refined color tips with the tooltip surface color and inset highlight in dark mode.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Kept recursively nested and portaled popups open while interacting with their owning popup chain.
|
|
14
|
+
- Ensured gradient editors keep only one color-stop handle selected at a time.
|
|
15
|
+
|
|
16
|
+
## [11.6.0]
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- Added reusable `fig-gradient-editor`, `fig-popup-gradient`, `fig-popup-palette`, and `fig-popup-easing` editor components.
|
|
21
|
+
- Added package source files, playground examples, tests, manifests, typings, and skill documentation for the new editor components.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- Rebuilt the fill picker’s gradient tab with `fig-gradient-editor`.
|
|
26
|
+
- Routed gradient, palette, and compact easing picker modes through their dedicated reusable popups.
|
|
27
|
+
- Refined audio file previews to show the filename at rest, waveform controls on hover, and persistent playback state with focus styling.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- Kept gradient and easing popup values, trigger previews, and selected preset labels synchronized while editing.
|
|
32
|
+
|
|
5
33
|
## [11.5.0]
|
|
6
34
|
|
|
7
35
|
### Added
|
package/README.md
CHANGED
|
@@ -117,6 +117,9 @@ Minimal example:
|
|
|
117
117
|
| [Input Palette](#input-palette) | `<fig-input-palette>` | Editable multi-color palette |
|
|
118
118
|
| [Property](#property) | `<fig-property>` | Composable editor property row |
|
|
119
119
|
| [Palette Editor](#palette-editor) | `<fig-palette-editor>` | Reusable reorderable palette editor |
|
|
120
|
+
| [Gradient Editor](#gradient-editor) | `<fig-gradient-editor>` | Full gradient editor with reorderable stops |
|
|
121
|
+
| [Gradient Popup](#gradient-popup) | `<dialog is="fig-popup-gradient">` | Reusable full gradient editor popup |
|
|
122
|
+
| [Palette Popup](#palette-popup) | `<dialog is="fig-popup-palette">` | Reusable palette editor popup |
|
|
120
123
|
| [Reorder](#reorder) | `<fig-reorder>` | Pointer- and keyboard-reorderable list |
|
|
121
124
|
| [Gradient Input](#gradient-input) | `<fig-input-gradient>` | Gradient editor with stops |
|
|
122
125
|
| [Fill Input](#fill-input) | `<fig-input-fill>` | Solid, gradient, image, video fill |
|
|
@@ -130,6 +133,7 @@ Minimal example:
|
|
|
130
133
|
| [Joystick](#joystick) | `<fig-joystick>` | 2D position input |
|
|
131
134
|
| [Origin Grid](#origin-grid) | `<fig-origin-grid>` | Transform-origin grid |
|
|
132
135
|
| [Easing Curve](#easing-curve) | `<fig-easing-curve>` | Bezier/spring curve editor |
|
|
136
|
+
| [Easing Popup](#easing-popup) | `<dialog is="fig-popup-easing">` | Reusable easing editor popup |
|
|
133
137
|
| [3D Rotate](#3d-rotate) | `<fig-3d-rotate>` | 3D cube rotation control |
|
|
134
138
|
| [Handle](#handle) | `<fig-handle>` | Draggable handle on a surface |
|
|
135
139
|
| [Canvas Control](#canvas-control) | `<fig-canvas-control>` | Point with optional radius, angle, or second point |
|
|
@@ -546,7 +550,7 @@ Requires `fig-editor.js` and `fig-editor.css`.
|
|
|
546
550
|
| `disabled` | boolean | `false` | Disabled state |
|
|
547
551
|
| `variant` | string | `"property"` | Internal button variant |
|
|
548
552
|
|
|
549
|
-
Known image and audio files use media-specific icons; unmatched files retain the upload icon. A present or `"true"` `preview` uses the compact image swatch, audio
|
|
553
|
+
Known image and audio files use media-specific icons; unmatched files retain the upload icon. A present or `"true"` `preview` uses the compact image swatch, audio playback preview, or video icon. Audio previews show the audio icon and filename at rest, reveal play and waveform controls on hover or focus, and keep the pause control and waveform visible while playing. `preview="large"` renders known images and videos as upload-enabled `fig-image` or `fig-video` previews; audio and other formats retain their compact preview behavior. `preview="false"` disables previews. Image preview supports `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.svg`, and `.avif`; audio playback supports `.mp3`, `.wav`, `.aac`, `.m4a`, `.ogg`, and `.flac`; video detection supports common formats including `.mp4`, `.webm`, `.mov`, `.m4v`, `.avi`, `.mkv`, `.ogv`, `.mpeg`, `.mpg`, and `.3gp`.
|
|
550
554
|
|
|
551
555
|
```html
|
|
552
556
|
<fig-input-file accepts="image/*"></fig-input-file>
|
|
@@ -731,6 +735,61 @@ A reusable editor-bundle component for ordered color arrays. It uses `<fig-reord
|
|
|
731
735
|
<fig-palette-editor value='["#94BD00","#83AD00","#1A632A","#003905"]'></fig-palette-editor>
|
|
732
736
|
```
|
|
733
737
|
|
|
738
|
+
#### Gradient Editor
|
|
739
|
+
|
|
740
|
+
`<fig-gradient-editor>`
|
|
741
|
+
|
|
742
|
+
A reusable editor-bundle component for gradient type, direction, stop handles,
|
|
743
|
+
and reorderable stop rows. It supports `value`, `color-space`, and `disabled`;
|
|
744
|
+
its `value` property is the normalized gradient config. Bubbling `input` and
|
|
745
|
+
`change` events include `{ type, gradient, css }`.
|
|
746
|
+
|
|
747
|
+
```html
|
|
748
|
+
<fig-gradient-editor
|
|
749
|
+
value='{"type":"linear","angle":90,"stops":[{"position":0,"color":"#0D99FF","opacity":100},{"position":100,"color":"#9747FF","opacity":100}]}'
|
|
750
|
+
></fig-gradient-editor>
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
`fig-fill-picker` uses this component for its Gradient tab.
|
|
754
|
+
|
|
755
|
+
#### Gradient Popup
|
|
756
|
+
|
|
757
|
+
`<dialog is="fig-popup-gradient">`
|
|
758
|
+
|
|
759
|
+
A reusable `fig-popup` subclass that owns a `<fig-gradient-editor>`. It
|
|
760
|
+
supports `value`, `color-space`, and `disabled`, plus inherited popup
|
|
761
|
+
positioning. Its bubbling `input` and `change` events include
|
|
762
|
+
`{ type, gradient, css }`.
|
|
763
|
+
|
|
764
|
+
```html
|
|
765
|
+
<fig-button id="gradient-trigger">Edit gradient</fig-button>
|
|
766
|
+
<dialog
|
|
767
|
+
is="fig-popup-gradient"
|
|
768
|
+
anchor="#gradient-trigger"
|
|
769
|
+
value='{"type":"linear","angle":90,"stops":[{"position":0,"color":"#0D99FF","opacity":100},{"position":100,"color":"#9747FF","opacity":100}]}'
|
|
770
|
+
open
|
|
771
|
+
></dialog>
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
#### Palette Popup
|
|
775
|
+
|
|
776
|
+
`<dialog is="fig-popup-palette">`
|
|
777
|
+
|
|
778
|
+
A reusable `fig-popup` subclass that owns a `<fig-palette-editor>`. It supports
|
|
779
|
+
`value`, `min`, `max`, `fixed`, and `disabled`, plus the standard popup
|
|
780
|
+
positioning attributes. Its `value` property and bubbling `input` / `change`
|
|
781
|
+
events use normalized `{ color, alpha }[]` values.
|
|
782
|
+
|
|
783
|
+
```html
|
|
784
|
+
<fig-button id="palette-trigger">Edit palette</fig-button>
|
|
785
|
+
<dialog
|
|
786
|
+
is="fig-popup-palette"
|
|
787
|
+
anchor="#palette-trigger"
|
|
788
|
+
value='["#94BD00","#83AD00","#1A632A","#003905"]'
|
|
789
|
+
open
|
|
790
|
+
></dialog>
|
|
791
|
+
```
|
|
792
|
+
|
|
734
793
|
#### Reorder
|
|
735
794
|
|
|
736
795
|
`<fig-reorder>`
|
|
@@ -752,7 +811,7 @@ Attributes: `axis`, `handle`, `items`, `indicator`, and `disabled`. The bubbling
|
|
|
752
811
|
|
|
753
812
|
`<fig-input-gradient>`
|
|
754
813
|
|
|
755
|
-
A gradient editor with draggable stops. With `edit="picker"` and the
|
|
814
|
+
A gradient editor with draggable stops. With `edit="picker"` and the editor bundle registered, it opens the reusable `dialog[is="fig-popup-gradient"]`; otherwise it renders the gradient swatch without opening a picker.
|
|
756
815
|
|
|
757
816
|
| Attribute | Type | Default | Description |
|
|
758
817
|
|---|---|---|---|
|
|
@@ -1058,7 +1117,7 @@ An interactive bezier or spring easing curve editor with a preset dropdown and m
|
|
|
1058
1117
|
| `mode` | string | — | Optional `"bezier"` or `"spring"` constraint; filters presets and rejects the other value type |
|
|
1059
1118
|
| `precision` | number | `2` | Decimal places |
|
|
1060
1119
|
| `aspect-ratio` | string | — | Editor aspect ratio |
|
|
1061
|
-
| `edit` | boolean | `true` | Show the editor
|
|
1120
|
+
| `edit` | boolean | `true` | Show the inline editor; `"false"` uses the compact preset control and opens `fig-popup-easing` when `fig-editor.js` is loaded |
|
|
1062
1121
|
| `presets` | boolean | `true` | Show the preset selector; set to `"false"` to hide it |
|
|
1063
1122
|
| `text` | boolean | `true` | Show the bezier value or normalized spring bounce input; set to `"false"` to hide it |
|
|
1064
1123
|
|
|
@@ -1107,6 +1166,24 @@ In spring mode, the compact number input edits normalized bounce from `0` (criti
|
|
|
1107
1166
|
|
|
1108
1167
|
Editable bezier and spring handles are keyboard operable. Bezier handles keep tab order aligned with the visual handle order.
|
|
1109
1168
|
|
|
1169
|
+
#### Easing Popup
|
|
1170
|
+
|
|
1171
|
+
`<dialog is="fig-popup-easing">`
|
|
1172
|
+
|
|
1173
|
+
A reusable `fig-popup` subclass containing a
|
|
1174
|
+
`<fig-easing-curve aspect-ratio="4/3">`. Easing attributes and events are
|
|
1175
|
+
forwarded through the popup.
|
|
1176
|
+
|
|
1177
|
+
```html
|
|
1178
|
+
<fig-button id="easing-trigger">Edit easing</fig-button>
|
|
1179
|
+
<dialog
|
|
1180
|
+
is="fig-popup-easing"
|
|
1181
|
+
anchor="#easing-trigger"
|
|
1182
|
+
value="0.42, 0, 0.58, 1"
|
|
1183
|
+
open
|
|
1184
|
+
></dialog>
|
|
1185
|
+
```
|
|
1186
|
+
|
|
1110
1187
|
---
|
|
1111
1188
|
|
|
1112
1189
|
#### 3D Rotate
|
|
@@ -1431,7 +1508,10 @@ An anchored floating surface built on `<dialog>` with collision-aware positionin
|
|
|
1431
1508
|
</dialog>
|
|
1432
1509
|
```
|
|
1433
1510
|
|
|
1434
|
-
Popups restore focus on close. Escape dismissal is scoped so nested menu and
|
|
1511
|
+
Popups restore focus on close. Escape dismissal is scoped so nested menu and
|
|
1512
|
+
overlay behavior can keep its own keyboard handling. Anchored popups may be
|
|
1513
|
+
rendered in the global overlay root; interacting with a child popup keeps every
|
|
1514
|
+
owning ancestor popup open, including recursively nested chains.
|
|
1435
1515
|
|
|
1436
1516
|
---
|
|
1437
1517
|
|
package/components.css
CHANGED
|
@@ -433,6 +433,7 @@
|
|
|
433
433
|
--icon-24-image: 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='M7.5 6C6.67157 6 6 6.67157 6 7.5V16.5C6 17.3284 6.67157 18 7.5 18H16.5C17.3284 18 18 17.3284 18 16.5V7.5C18 6.67157 17.3284 6 16.5 6H7.5ZM7 7.5C7 7.22386 7.22386 7 7.5 7H16.5C16.7761 7 17 7.22386 17 7.5V14.793L14.3536 12.1464C14.1583 11.9512 13.8417 11.9512 13.6464 12.1464L12 13.7929L9.85355 11.6464C9.65829 11.4512 9.34171 11.4512 9.14645 11.6464L7 13.7929V7.5ZM7 15.2071V16.5C7 16.7761 7.22386 17 7.5 17H16.5C16.7761 17 17 16.7761 17 16.5V16.2071L14 13.2071L12.3536 14.8536C12.1583 15.0488 11.8417 15.0488 11.6464 14.8536L9.5 12.7071L7 15.2071ZM13.5 8C14.3284 8 15 8.67157 15 9.5C15 10.3284 14.3284 11 13.5 11C12.6716 11 12 10.3284 12 9.5C12 8.67157 12.6716 8 13.5 8ZM13.5 9C13.2239 9 13 9.22386 13 9.5C13 9.77614 13.2239 10 13.5 10C13.7761 10 14 9.77614 14 9.5C14 9.22386 13.7761 9 13.5 9Z' fill='black' fill-opacity='0.9'/%3E%3C/svg%3E");
|
|
434
434
|
--icon-24-video: 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 6C17.1046 6 18 6.89543 18 8V16C18 17.1046 17.1046 18 16 18H8C6.89543 18 6 17.1046 6 16V8C6 6.89543 6.89543 6 8 6H16ZM8 7C7.44772 7 7 7.44772 7 8V16C7 16.5523 7.44772 17 8 17H16C16.5523 17 17 16.5523 17 16V8C17 7.44772 16.5523 7 16 7H8ZM9.99805 9.13477C10.3063 8.95591 10.6866 8.955 10.9961 9.13184L14.4961 11.1318C14.8077 11.3099 15 11.6411 15 12C15 12.3589 14.8077 12.6901 14.4961 12.8682L10.9961 14.8682C10.6866 15.045 10.3063 15.0441 9.99805 14.8652C9.68973 14.6863 9.5 14.3565 9.5 14V10C9.5 9.64353 9.68973 9.31369 9.99805 9.13477ZM10.5 14L14 12L10.5 10V14Z' fill='black' fill-opacity='0.9'/%3E%3C/svg%3E");
|
|
435
435
|
--icon-16-video: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5 3C12.3284 3 13 3.67157 13 4.5V11.5C13 12.3284 12.3284 13 11.5 13H4.5L4.34668 12.9922C3.59028 12.9154 3 12.2767 3 11.5V4.5C3 3.67157 3.67157 3 4.5 3H11.5ZM4.5 4C4.22386 4 4 4.22386 4 4.5V11.5C4 11.7761 4.22386 12 4.5 12H11.5C11.7761 12 12 11.7761 12 11.5V4.5C12 4.22386 11.7761 4 11.5 4H4.5ZM6.50684 5.62988C6.82034 5.45238 7.20572 5.45722 7.51465 5.64258L10.0146 7.14258C10.3158 7.32332 10.5 7.64879 10.5 8C10.5 8.35121 10.3158 8.67668 10.0146 8.85742L7.51465 10.3574C7.20572 10.5428 6.82034 10.5476 6.50684 10.3701C6.19356 10.1926 6 9.86012 6 9.5V6.5C6 6.13988 6.19356 5.80744 6.50684 5.62988ZM7 9.5L9.5 8L7 6.5V9.5Z' fill='black' fill-opacity='0.9'/%3E%3C/svg%3E");
|
|
436
|
+
--icon-24-audio: 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='M14.6656 6.26416C15.3163 6.0337 15.9993 6.51735 15.9996 7.20752V13.9995C15.9996 14.0271 15.9951 14.0542 15.9908 14.0806C16.0105 14.4275 15.8783 14.7588 15.6842 15.0229C15.4249 15.3758 15.0243 15.6647 14.5553 15.8354C14.0864 16.006 13.5949 16.0416 13.1696 15.938C12.7483 15.8354 12.3322 15.5752 12.1627 15.1099C11.9933 14.6444 12.1442 14.1771 12.401 13.8276C12.6603 13.4748 13.0609 13.1868 13.5299 13.0161C13.9989 12.8455 14.4903 12.809 14.9156 12.9126C14.9438 12.9195 14.9716 12.9287 14.9996 12.937V9.58154L9.99963 11.353V15.7495C9.99963 15.7513 9.99868 15.7536 9.99866 15.7554C9.99828 16.073 9.87635 16.3744 9.69885 16.6196C9.44355 16.9721 9.04803 17.26 8.58362 17.4292C8.11893 17.5983 7.62996 17.6327 7.20764 17.5269C6.78881 17.4217 6.37881 17.1587 6.21057 16.6968C6.04238 16.2347 6.18775 15.7693 6.44104 15.4194C6.69651 15.067 7.09269 14.7789 7.55725 14.6099C8.02183 14.4409 8.51007 14.4073 8.93225 14.5132C8.95486 14.5189 8.97711 14.5261 8.99963 14.5327V8.97803C9.00002 8.55491 9.26679 8.17702 9.66565 8.03564L14.6656 6.26416ZM8.68811 15.4829C8.48414 15.4318 8.201 15.4405 7.89905 15.5503C7.59687 15.6603 7.37402 15.836 7.25061 16.0063C7.12544 16.1792 7.13042 16.2972 7.151 16.354C7.17165 16.4107 7.24354 16.5051 7.45081 16.5571C7.65482 16.6083 7.93868 16.5996 8.24084 16.4897C8.54293 16.3797 8.7659 16.204 8.88928 16.0337C9.01464 15.8606 9.00954 15.7418 8.98889 15.6851C8.96813 15.6283 8.89516 15.5349 8.68811 15.4829ZM14.6793 13.8843C14.4709 13.8335 14.181 13.843 13.8717 13.9556C13.5624 14.0682 13.3338 14.2465 13.2067 14.4194C13.0773 14.5954 13.0838 14.7134 13.1031 14.7671C13.1226 14.8206 13.1934 14.9155 13.4059 14.9673C13.6144 15.0181 13.9041 15.0076 14.2135 14.895C14.5229 14.7824 14.7515 14.6041 14.8785 14.4312C15.008 14.2549 15.0015 14.137 14.9821 14.0835C14.9626 14.03 14.8916 13.9361 14.6793 13.8843ZM9.99963 8.97803V10.2915L14.9996 8.52002V7.20752L9.99963 8.97803Z' fill='black'/%3E%3C/svg%3E");
|
|
436
437
|
--icon-16-drag-handle: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 11.5C11 11.7761 10.7761 12 10.5 12H5.5C5.22386 12 5 11.7761 5 11.5C5 11.2239 5.22386 11 5.5 11H10.5C10.7761 11 11 11.2239 11 11.5ZM11 8C11 8.27614 10.7761 8.5 10.5 8.5H5.5C5.22386 8.5 5 8.27614 5 8C5 7.72386 5.22386 7.5 5.5 7.5H10.5C10.7761 7.5 11 7.72386 11 8ZM11 4.5C11 4.77614 10.7761 5 10.5 5H5.5C5.22386 5 5 4.77614 5 4.5C5 4.22386 5.22386 4 5.5 4H10.5C10.7761 4 11 4.22386 11 4.5Z' fill='black' fill-opacity='0.5'/%3E%3C/svg%3E");
|
|
437
438
|
--tip-pointer: path("M8 6L2 0H14L8 6Z");
|
|
438
439
|
|
|
@@ -1824,6 +1825,16 @@ fig-input-file {
|
|
|
1824
1825
|
.fig-input-file-filename:has(> .fig-input-file-audio-waveform) {
|
|
1825
1826
|
column-gap: var(--spacer-1);
|
|
1826
1827
|
overflow: hidden;
|
|
1828
|
+
|
|
1829
|
+
&:is(:focus, :focus-within) {
|
|
1830
|
+
outline: var(--figma-focus-outline);
|
|
1831
|
+
outline-offset: var(--figma-focus-outline-offset);
|
|
1832
|
+
}
|
|
1833
|
+
}
|
|
1834
|
+
|
|
1835
|
+
.fig-input-file-audio-control,
|
|
1836
|
+
.fig-input-file-audio-waveform {
|
|
1837
|
+
display: none;
|
|
1827
1838
|
}
|
|
1828
1839
|
|
|
1829
1840
|
.fig-input-file-audio-waveform {
|
|
@@ -1837,6 +1848,22 @@ fig-input-file {
|
|
|
1837
1848
|
}
|
|
1838
1849
|
}
|
|
1839
1850
|
|
|
1851
|
+
&:is(:hover, :focus-within, [data-audio-playing])
|
|
1852
|
+
.fig-input-file-filename {
|
|
1853
|
+
> .fig-input-file-audio-icon,
|
|
1854
|
+
> .fig-input-file-audio-label {
|
|
1855
|
+
display: none;
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1858
|
+
> .fig-input-file-audio-control {
|
|
1859
|
+
display: inline-flex;
|
|
1860
|
+
}
|
|
1861
|
+
|
|
1862
|
+
> .fig-input-file-audio-waveform {
|
|
1863
|
+
display: block;
|
|
1864
|
+
}
|
|
1865
|
+
}
|
|
1866
|
+
|
|
1840
1867
|
.fig-input-file-filename[selected]:not([selected="false"])
|
|
1841
1868
|
> .fig-input-file-audio-waveform {
|
|
1842
1869
|
--fig-audio-waveform-stroke-color: var(
|
|
@@ -7237,8 +7264,10 @@ fig-color-tip {
|
|
|
7237
7264
|
height: var(--size);
|
|
7238
7265
|
aspect-ratio: 1 / 1;
|
|
7239
7266
|
flex-shrink: 0;
|
|
7240
|
-
background-color: var(--figma-color-bg);
|
|
7267
|
+
background-color: light-dark(var(--figma-color-bg), var(--bg-tooltip));
|
|
7241
7268
|
border-radius: var(--radius-medium, 0.3125rem);
|
|
7269
|
+
box-shadow: inset 0 0.5px 0 0
|
|
7270
|
+
light-dark(rgba(0, 0, 0, 0.06), rgba(255, 255, 255, 0.1));
|
|
7242
7271
|
filter: var(--fig-popover-shadow);
|
|
7243
7272
|
|
|
7244
7273
|
&[control="add"],
|