@youcan/celeste 0.17.2 → 0.19.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 (66) hide show
  1. package/ai/README.md +1 -1
  2. package/ai/component-registry.json +206 -3
  3. package/ai/icons.json +2 -2
  4. package/ai/tokens.json +2 -2
  5. package/dist/celeste.css +740 -380
  6. package/dist/cjs/chunks/ComboboxItem.cjs +6 -0
  7. package/dist/cjs/chunks/alpha-slider.cjs +1 -1
  8. package/dist/cjs/chunks/color-area.cjs +1 -1
  9. package/dist/cjs/chunks/color-picker.cjs +20 -25
  10. package/dist/cjs/chunks/color-swatch.cjs +4 -3
  11. package/dist/cjs/chunks/combobox-item.cjs +63 -7
  12. package/dist/cjs/chunks/combobox-list.cjs +1 -1
  13. package/dist/cjs/chunks/combobox-trigger.cjs +1 -1
  14. package/dist/cjs/chunks/combobox.cjs +2 -2
  15. package/dist/cjs/chunks/components.cjs +7 -5
  16. package/dist/cjs/chunks/gradient-picker.cjs +635 -0
  17. package/dist/cjs/chunks/text-input-affix.cjs +1 -1
  18. package/dist/cjs/chunks/text-input-button.cjs +1 -1
  19. package/dist/cjs/chunks/text-input.cjs +2 -1
  20. package/dist/cjs/chunks/textarea.cjs +1 -1
  21. package/dist/{es/chunks/use-color-model.js → cjs/chunks/tinycolor.cjs} +6 -23
  22. package/dist/cjs/gradient-picker.cjs +2 -0
  23. package/dist/cjs/gradient.cjs +71 -0
  24. package/dist/cjs/index.cjs +10 -5
  25. package/dist/cjs/use-color-model.cjs +27 -3
  26. package/dist/components/color-picker/gradient-picker.d.ts +51 -0
  27. package/dist/components/color-picker/index.d.ts +2 -0
  28. package/dist/es/chunks/ComboboxItem.js +1 -1
  29. package/dist/es/chunks/alpha-slider.js +1 -1
  30. package/dist/es/chunks/color-area.js +1 -1
  31. package/dist/es/chunks/color-picker.js +12 -17
  32. package/dist/es/chunks/color-swatch.js +2 -1
  33. package/dist/es/chunks/combobox-item.js +65 -9
  34. package/dist/es/chunks/combobox-list.js +1 -1
  35. package/dist/es/chunks/combobox-trigger.js +1 -1
  36. package/dist/es/chunks/combobox.js +2 -2
  37. package/dist/es/chunks/components.js +7 -5
  38. package/dist/es/chunks/gradient-picker.js +629 -0
  39. package/dist/es/chunks/text-input-affix.js +1 -1
  40. package/dist/es/chunks/text-input-button.js +1 -1
  41. package/dist/es/chunks/text-input.js +2 -1
  42. package/dist/es/chunks/textarea.js +1 -1
  43. package/dist/{cjs/chunks/use-color-model.cjs → es/chunks/tinycolor.js} +1 -40
  44. package/dist/es/gradient-picker.js +2 -0
  45. package/dist/es/gradient.js +69 -0
  46. package/dist/es/index.js +8 -6
  47. package/dist/es/use-color-model.js +25 -1
  48. package/dist/utils/gradient.d.ts +13 -0
  49. package/dist/utils/index.d.ts +1 -0
  50. package/package.json +3 -3
  51. package/src/components/color-picker/color-picker.vue +8 -9
  52. package/src/components/color-picker/composable/use-color-model.ts +5 -0
  53. package/src/components/color-picker/gradient-picker.vue +944 -0
  54. package/src/components/color-picker/index.ts +3 -0
  55. package/src/components/color-picker/stories/gradient-picker.stories.ts +37 -0
  56. package/src/components/combobox/combobox-item.vue +15 -7
  57. package/src/components/combobox/combobox-list.vue +2 -2
  58. package/src/components/combobox/combobox-trigger.vue +38 -0
  59. package/src/components/combobox/combobox.vue +2 -0
  60. package/src/components/text-input/stories/text-input.stories.ts +53 -3
  61. package/src/components/text-input/text-input-affix.vue +7 -3
  62. package/src/components/text-input/text-input-button.vue +6 -2
  63. package/src/components/text-input/text-input.vue +45 -34
  64. package/src/components/textarea/textarea.vue +1 -1
  65. package/src/utils/gradient.ts +90 -0
  66. package/src/utils/index.ts +1 -0
@@ -0,0 +1,635 @@
1
+ const require__plugin_vue_export_helper = require("./_plugin-vue_export-helper.cjs");
2
+ const require_popover_content = require("./popover-content.cjs");
3
+ const require_popover_trigger = require("./popover-trigger.cjs");
4
+ require("./button.cjs");
5
+ const require_compact_button = require("./compact-button.cjs");
6
+ require("./fancy-button.cjs");
7
+ require("./link-button.cjs");
8
+ require("./social-button.cjs");
9
+ const require_tinycolor = require("./tinycolor.cjs");
10
+ const require_popover = require("./popover.cjs");
11
+ require("./text-input-affix.cjs");
12
+ require("./text-input-button.cjs");
13
+ const require_text_input = require("./text-input.cjs");
14
+ const require_gradient = require("../gradient.cjs");
15
+ const require_tooltip = require("./tooltip.cjs");
16
+ let vue = require("vue");
17
+ //#region src/components/color-picker/gradient-picker.vue?vue&type=script&setup=true&lang.ts
18
+ var _hoisted_1 = {
19
+ type: "button",
20
+ class: "celeste-gradient-trigger"
21
+ };
22
+ var _hoisted_2 = ["data-empty"];
23
+ var _hoisted_3 = { class: "celeste-gradient-summary" };
24
+ var _hoisted_4 = { class: "celeste-gradient-picker" };
25
+ var _hoisted_5 = {
26
+ key: 0,
27
+ class: "celeste-gradient-section"
28
+ };
29
+ var _hoisted_6 = { class: "celeste-gradient-hint" };
30
+ var _hoisted_7 = { class: "celeste-gradient-presets" };
31
+ var _hoisted_8 = ["title", "aria-label"];
32
+ var _hoisted_9 = ["aria-label", "onClick"];
33
+ var _hoisted_10 = { class: "celeste-gradient-section" };
34
+ var _hoisted_11 = ["data-linear"];
35
+ var _hoisted_12 = {
36
+ key: 0,
37
+ class: "celeste-gradient-ring"
38
+ };
39
+ var _hoisted_13 = { class: "celeste-gradient-row" };
40
+ var _hoisted_14 = [
41
+ "data-type",
42
+ "data-active",
43
+ "aria-label",
44
+ "onClick"
45
+ ];
46
+ var _hoisted_15 = [
47
+ "data-active",
48
+ "data-removing",
49
+ "aria-label",
50
+ "onPointerdown",
51
+ "onKeydown"
52
+ ];
53
+ var _hoisted_16 = { class: "celeste-gradient-row" };
54
+ var _hoisted_17 = { class: "celeste-gradient-eyebrow" };
55
+ var _hoisted_18 = { class: "celeste-gradient-row" };
56
+ var _hoisted_19 = { class: "celeste-gradient-label" };
57
+ var _hoisted_20 = { class: "celeste-gradient-row" };
58
+ var _hoisted_21 = { class: "celeste-gradient-current" };
59
+ var _hoisted_22 = { class: "celeste-gradient-color" };
60
+ var _hoisted_23 = [
61
+ "aria-label",
62
+ "aria-valuenow",
63
+ "aria-valuetext"
64
+ ];
65
+ var _hoisted_24 = ["aria-label", "aria-valuenow"];
66
+ var _hoisted_25 = ["aria-label", "aria-valuenow"];
67
+ var _hoisted_26 = { class: "celeste-gradient-section celeste-gradient-used" };
68
+ var _hoisted_27 = { class: "celeste-gradient-label" };
69
+ var _hoisted_28 = { class: "celeste-gradient-swatches" };
70
+ var _hoisted_29 = [
71
+ "title",
72
+ "aria-label",
73
+ "onClick"
74
+ ];
75
+ var _hoisted_30 = { class: "celeste-gradient-footer" };
76
+ var gradient_picker_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.defineComponent)({
77
+ __name: "gradient-picker",
78
+ props: {
79
+ modelValue: { default: "" },
80
+ placeholder: { default: "No gradient chosen" },
81
+ emptyHint: { default: "Select a gradient to begin editing" },
82
+ noneLabel: { default: "None" },
83
+ linearLabel: { default: "Linear gradient" },
84
+ radialLabel: { default: "Radial gradient" },
85
+ angleLabel: { default: "Angle" },
86
+ colorStopLabel: { default: "Color stop" },
87
+ addStopLabel: { default: "Add stop" },
88
+ removeStopLabel: { default: "Remove stop" },
89
+ positionLabel: { default: "Position" },
90
+ opacityLabel: { default: "Opacity" },
91
+ hueLabel: { default: "Hue" },
92
+ areaLabel: { default: "Saturation and brightness" },
93
+ eyedropperLabel: { default: "Pick color" },
94
+ usedLabel: { default: "Currently used" },
95
+ removeLabel: { default: "Remove gradient" },
96
+ presets: { default: () => [
97
+ "linear-gradient(135deg, #e1116f 0%, #7d52f4 100%)",
98
+ "linear-gradient(180deg, #f7f1e8 0%, #e3cfb4 100%)",
99
+ "linear-gradient(160deg, #1f3d2b 0%, #4f7a5a 100%)",
100
+ "linear-gradient(180deg, #3d3d3d 0%, #171717 100%)",
101
+ "radial-gradient(#ffffff 0%, #dbe4ee 100%)",
102
+ "linear-gradient(135deg, #e8a07a 0%, #b5532f 100%)",
103
+ "linear-gradient(200deg, #0b3c5d 0%, #1e7f8c 100%)",
104
+ "radial-gradient(#fff1f5 0%, #f7b5c9 100%)",
105
+ "linear-gradient(120deg, #d6d29a 0%, #7a7a3a 100%)",
106
+ "linear-gradient(180deg, #1b1f3b 0%, #4b3f8f 100%)",
107
+ "linear-gradient(90deg, #ffd86b 0%, #f08a24 100%)"
108
+ ] },
109
+ swatches: { default: () => [
110
+ "#ffffff",
111
+ "#171717",
112
+ "#f5f5f5",
113
+ "#222530",
114
+ "#000000",
115
+ "#335cff",
116
+ "#e1116f"
117
+ ] }
118
+ },
119
+ emits: ["update:modelValue"],
120
+ setup(__props, { emit: __emit }) {
121
+ const props = __props;
122
+ const emit = __emit;
123
+ const open = (0, vue.ref)(false);
124
+ const state = (0, vue.ref)(null);
125
+ const selected = (0, vue.ref)();
126
+ const removing = (0, vue.ref)();
127
+ const drafts = (0, vue.reactive)({});
128
+ const preview = (0, vue.ref)();
129
+ const bar = (0, vue.ref)();
130
+ const area = (0, vue.ref)();
131
+ const hue = (0, vue.ref)();
132
+ const alpha = (0, vue.ref)();
133
+ let uid = 0;
134
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
135
+ const numeric = (raw) => raw.trim() !== "" && !Number.isNaN(Number(raw));
136
+ function hsva(color) {
137
+ const parsed = require_tinycolor.tinycolor(color);
138
+ const { h, s, v } = parsed.toHsv();
139
+ return {
140
+ h,
141
+ s: s * 100,
142
+ v: v * 100,
143
+ a: parsed.getAlpha()
144
+ };
145
+ }
146
+ function colorOf(stop) {
147
+ const color = require_tinycolor.tinycolor({
148
+ h: stop.h,
149
+ s: stop.s / 100,
150
+ v: stop.v / 100,
151
+ a: stop.a
152
+ });
153
+ return stop.a >= 1 ? color.toHexString() : color.toRgbString();
154
+ }
155
+ function toCss(value, linear = false) {
156
+ return require_gradient.stringifyGradient({
157
+ type: linear ? "linear" : value.type,
158
+ angle: linear ? 90 : value.angle,
159
+ shape: value.shape,
160
+ stops: value.stops.map((stop) => ({
161
+ color: colorOf(stop),
162
+ position: stop.position
163
+ }))
164
+ });
165
+ }
166
+ function load(value) {
167
+ const gradient = require_gradient.parseGradient(value);
168
+ state.value = gradient && {
169
+ type: gradient.type,
170
+ angle: gradient.angle,
171
+ shape: gradient.shape,
172
+ stops: gradient.stops.map((stop) => ({
173
+ id: ++uid,
174
+ ...hsva(stop.color),
175
+ position: stop.position
176
+ }))
177
+ };
178
+ selected.value = state.value?.stops[0].id;
179
+ }
180
+ const css = (0, vue.computed)(() => state.value ? toCss(state.value) : "");
181
+ (0, vue.watch)(() => props.modelValue, (value) => value !== css.value && load(value), { immediate: true });
182
+ const track = (0, vue.computed)(() => state.value ? toCss(state.value, true) : "");
183
+ const current = (0, vue.computed)(() => state.value?.stops.find((stop) => stop.id === selected.value));
184
+ const solid = (0, vue.computed)(() => current.value && colorOf({
185
+ ...current.value,
186
+ a: 1
187
+ }));
188
+ function save() {
189
+ css.value !== props.modelValue && emit("update:modelValue", css.value);
190
+ }
191
+ function patch(changes, keepDrafts = false) {
192
+ Object.assign(current.value, changes);
193
+ keepDrafts || Object.keys(drafts).forEach((key) => delete drafts[key]);
194
+ save();
195
+ }
196
+ function field(key, value, commit) {
197
+ return {
198
+ value: drafts[key] ?? String(value),
199
+ input: (raw) => {
200
+ drafts[key] = String(raw ?? "");
201
+ commit(drafts[key].trim());
202
+ }
203
+ };
204
+ }
205
+ const fields = (0, vue.computed)(() => current.value && {
206
+ hex: field("hex", solid.value.toUpperCase(), (raw) => /^#?[0-9a-f]{6}$/i.test(raw) && patch({
207
+ ...hsva(raw.replace(/^#?/, "#")),
208
+ a: current.value.a
209
+ }, true)),
210
+ alpha: field("alpha", Math.round(current.value.a * 100), (raw) => numeric(raw) && patch({ a: clamp(Number(raw), 0, 100) / 100 }, true)),
211
+ position: field("position", current.value.position, (raw) => numeric(raw) && patch({ position: clamp(Math.round(Number(raw)), 0, 100) }, true)),
212
+ angle: field("angle", state.value.angle, (raw) => {
213
+ if (numeric(raw)) {
214
+ state.value.angle = (Math.round(Number(raw)) % 360 + 360) % 360;
215
+ save();
216
+ }
217
+ })
218
+ });
219
+ function drag(event, move, up) {
220
+ event.preventDefault();
221
+ move(event);
222
+ const stop = () => {
223
+ window.removeEventListener("pointermove", move);
224
+ window.removeEventListener("pointerup", stop);
225
+ up?.();
226
+ };
227
+ window.addEventListener("pointermove", move);
228
+ window.addEventListener("pointerup", stop);
229
+ }
230
+ function keys(event, apply) {
231
+ const step = event.shiftKey ? 10 : 1;
232
+ const delta = {
233
+ ArrowLeft: [-step, 0],
234
+ ArrowRight: [step, 0],
235
+ ArrowUp: [0, -step],
236
+ ArrowDown: [0, step]
237
+ }[event.key];
238
+ if (delta) {
239
+ event.preventDefault();
240
+ apply(...delta);
241
+ }
242
+ }
243
+ function onHandleKey(event, id) {
244
+ selected.value = id;
245
+ if (["Delete", "Backspace"].includes(event.key) && state.value.stops.length > 2) {
246
+ event.preventDefault();
247
+ removeStop();
248
+ }
249
+ keys(event, (dx, dy) => patch({ position: clamp(current.value.position + dx - dy, 0, 100) }));
250
+ }
251
+ function relative(element, event, inset = 0) {
252
+ const rect = element.getBoundingClientRect();
253
+ return {
254
+ x: clamp((event.clientX - rect.left - inset) / (rect.width - 2 * inset), 0, 1),
255
+ y: clamp((event.clientY - rect.top - inset) / (rect.height - 2 * inset), 0, 1),
256
+ dy: event.clientY - rect.top - rect.height / 2
257
+ };
258
+ }
259
+ function colorAt(position) {
260
+ const stops = [...state.value.stops].sort((a, b) => a.position - b.position);
261
+ const after = stops.find((stop) => stop.position >= position) ?? stops.at(-1);
262
+ const before = stops.findLast((stop) => stop.position <= position) ?? stops[0];
263
+ const ratio = after.position === before.position ? 0 : (position - before.position) / (after.position - before.position);
264
+ return {
265
+ ...hsva(require_tinycolor.tinycolor.mix(colorOf({
266
+ ...before,
267
+ a: 1
268
+ }), colorOf({
269
+ ...after,
270
+ a: 1
271
+ }), ratio * 100).toHexString()),
272
+ a: before.a + (after.a - before.a) * ratio
273
+ };
274
+ }
275
+ function addAt(position) {
276
+ const id = ++uid;
277
+ state.value.stops.push({
278
+ id,
279
+ ...colorAt(position),
280
+ position
281
+ });
282
+ selected.value = id;
283
+ save();
284
+ return id;
285
+ }
286
+ function dragStop(event, id) {
287
+ selected.value = id;
288
+ Object.keys(drafts).forEach((key) => delete drafts[key]);
289
+ drag(event, (moved) => {
290
+ const { x, dy } = relative(bar.value, moved, 10);
291
+ current.value.position = Math.round(x * 100);
292
+ removing.value = state.value.stops.length > 2 && Math.abs(dy) > 40 ? id : void 0;
293
+ save();
294
+ }, () => removing.value === id && removeStop());
295
+ }
296
+ function onBar(event) {
297
+ event.target === event.currentTarget && dragStop(event, addAt(Math.round(relative(bar.value, event, 10).x * 100)));
298
+ }
299
+ function onPreview(event) {
300
+ state.value.type === "linear" && drag(event, (moved) => {
301
+ const rect = preview.value.getBoundingClientRect();
302
+ const degrees = Math.atan2(moved.clientX - rect.left - rect.width / 2, rect.top + rect.height / 2 - moved.clientY) * 180 / Math.PI + 360;
303
+ state.value.angle = Math.round(moved.shiftKey ? Math.round(degrees / 15) * 15 : degrees) % 360;
304
+ delete drafts.angle;
305
+ save();
306
+ });
307
+ }
308
+ function onArea(event) {
309
+ drag(event, (moved) => {
310
+ const { x, y } = relative(area.value, moved);
311
+ patch({
312
+ s: x * 100,
313
+ v: (1 - y) * 100
314
+ });
315
+ });
316
+ }
317
+ function onHue(event) {
318
+ drag(event, (moved) => patch({ h: Math.min(relative(hue.value, moved, 12).y * 360, 359) }));
319
+ }
320
+ function onAlpha(event) {
321
+ drag(event, (moved) => patch({ a: Math.round((1 - relative(alpha.value, moved, 12).y) * 100) / 100 }));
322
+ }
323
+ function addStop() {
324
+ const stops = [...state.value.stops].sort((a, b) => a.position - b.position);
325
+ const index = stops.indexOf(current.value);
326
+ const next = stops[index + 1] ?? stops[index - 1];
327
+ addAt(Math.round((current.value.position + next.position) / 2));
328
+ }
329
+ function removeStop() {
330
+ state.value.stops = state.value.stops.filter((stop) => stop.id !== selected.value);
331
+ selected.value = state.value.stops[0].id;
332
+ removing.value = void 0;
333
+ save();
334
+ }
335
+ function setType(type) {
336
+ state.value.type = type;
337
+ save();
338
+ }
339
+ function pick(value) {
340
+ load(value);
341
+ save();
342
+ }
343
+ async function sip() {
344
+ const result = await new window.EyeDropper().open().catch(() => void 0);
345
+ result && patch({
346
+ ...hsva(result.sRGBHex),
347
+ a: current.value.a
348
+ });
349
+ }
350
+ const fill = (color) => `linear-gradient(${color}, ${color}), repeating-conic-gradient(#e5e5e5 0 25%, #fff 0 50%) 0 0 / 8px 8px`;
351
+ const along = (fraction) => `calc(12px + (100% - 24px) * ${fraction})`;
352
+ const canSip = "EyeDropper" in window;
353
+ return (_ctx, _cache) => {
354
+ return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(require_popover.popover_default), {
355
+ open: open.value,
356
+ "onUpdate:open": _cache[6] || (_cache[6] = ($event) => open.value = $event)
357
+ }, {
358
+ default: (0, vue.withCtx)(() => [(0, vue.createVNode)((0, vue.unref)(require_popover_trigger.popover_trigger_default), { "as-child": "" }, {
359
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("button", _hoisted_1, [
360
+ (0, vue.createElementVNode)("span", {
361
+ class: "celeste-gradient-swatch",
362
+ "data-empty": !state.value,
363
+ style: (0, vue.normalizeStyle)(state.value ? { background: css.value } : void 0)
364
+ }, null, 12, _hoisted_2),
365
+ (0, vue.createElementVNode)("span", _hoisted_3, (0, vue.toDisplayString)(state.value ? state.value.type === "linear" ? __props.linearLabel : __props.radialLabel : __props.placeholder), 1),
366
+ _cache[7] || (_cache[7] = (0, vue.createElementVNode)("i", { class: "i-celeste-expand-up-down-line" }, null, -1))
367
+ ])]),
368
+ _: 1
369
+ }), (0, vue.createVNode)((0, vue.unref)(require_popover_content.popover_content_default), {
370
+ dismissible: false,
371
+ "show-tail": false,
372
+ align: "start",
373
+ onOpenAutoFocus: _cache[5] || (_cache[5] = (0, vue.withModifiers)(() => {}, ["prevent"]))
374
+ }, {
375
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_4, [!state.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_5, [(0, vue.createElementVNode)("span", _hoisted_6, (0, vue.toDisplayString)(__props.emptyHint), 1), (0, vue.createElementVNode)("div", _hoisted_7, [(0, vue.createElementVNode)("button", {
376
+ type: "button",
377
+ class: "celeste-gradient-preset",
378
+ "data-empty": "true",
379
+ title: __props.noneLabel,
380
+ "aria-label": __props.noneLabel,
381
+ onClick: _cache[0] || (_cache[0] = ($event) => open.value = false)
382
+ }, null, 8, _hoisted_8), ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(__props.presets, (preset) => {
383
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
384
+ key: preset,
385
+ type: "button",
386
+ class: "celeste-gradient-preset",
387
+ style: (0, vue.normalizeStyle)({ background: preset }),
388
+ "aria-label": preset,
389
+ onClick: ($event) => pick(preset)
390
+ }, null, 12, _hoisted_9);
391
+ }), 128))])])) : current.value && fields.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [
392
+ (0, vue.createElementVNode)("div", _hoisted_10, [
393
+ (0, vue.createElementVNode)("div", {
394
+ ref_key: "preview",
395
+ ref: preview,
396
+ class: "celeste-gradient-preview",
397
+ "data-linear": state.value.type === "linear",
398
+ onPointerdown: onPreview
399
+ }, [(0, vue.createElementVNode)("span", {
400
+ class: "celeste-gradient-fill",
401
+ style: (0, vue.normalizeStyle)({ background: css.value })
402
+ }, null, 4), state.value.type === "linear" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_12, [(0, vue.createElementVNode)("span", { style: (0, vue.normalizeStyle)({ rotate: `${state.value.angle}deg` }) }, null, 4)])) : (0, vue.createCommentVNode)("", true)], 40, _hoisted_11),
403
+ (0, vue.createElementVNode)("div", _hoisted_13, [((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(["linear", "radial"], (type) => {
404
+ return (0, vue.createVNode)((0, vue.unref)(require_tooltip.tooltip_default), {
405
+ key: type,
406
+ title: type === "linear" ? __props.linearLabel : __props.radialLabel,
407
+ size: "xs",
408
+ variant: "dark"
409
+ }, {
410
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("button", {
411
+ type: "button",
412
+ class: "celeste-gradient-type",
413
+ "data-type": type,
414
+ "data-active": state.value.type === type,
415
+ "aria-label": type === "linear" ? __props.linearLabel : __props.radialLabel,
416
+ onClick: ($event) => setType(type)
417
+ }, [..._cache[8] || (_cache[8] = [(0, vue.createElementVNode)("span", null, null, -1)])], 8, _hoisted_14)]),
418
+ _: 2
419
+ }, 1032, ["title"]);
420
+ }), 64)), state.value.type === "linear" ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(require_text_input.text_input_default), {
421
+ key: 0,
422
+ "model-value": fields.value.angle.value,
423
+ inputmode: "numeric",
424
+ size: "xs",
425
+ "aria-label": __props.angleLabel,
426
+ class: "celeste-gradient-number",
427
+ "onUpdate:modelValue": fields.value.angle.input
428
+ }, {
429
+ trailingNode: (0, vue.withCtx)(() => [..._cache[9] || (_cache[9] = [(0, vue.createTextVNode)(" ° ", -1)])]),
430
+ _: 1
431
+ }, 8, [
432
+ "model-value",
433
+ "aria-label",
434
+ "onUpdate:modelValue"
435
+ ])) : (0, vue.createCommentVNode)("", true)]),
436
+ (0, vue.createElementVNode)("div", {
437
+ ref_key: "bar",
438
+ ref: bar,
439
+ class: "celeste-gradient-bar",
440
+ onPointerdown: onBar
441
+ }, [(0, vue.createElementVNode)("span", {
442
+ class: "celeste-gradient-fill",
443
+ style: (0, vue.normalizeStyle)({ background: track.value })
444
+ }, null, 4), ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(state.value.stops, (stop) => {
445
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
446
+ key: stop.id,
447
+ type: "button",
448
+ class: "celeste-gradient-handle",
449
+ style: (0, vue.normalizeStyle)({
450
+ left: `calc(10px + (100% - 20px) * ${stop.position / 100})`,
451
+ background: fill(colorOf(stop))
452
+ }),
453
+ "data-active": stop.id === selected.value,
454
+ "data-removing": stop.id === removing.value,
455
+ "aria-label": `${colorOf(stop)} ${stop.position}%`,
456
+ onPointerdown: (0, vue.withModifiers)(($event) => dragStop($event, stop.id), ["stop"]),
457
+ onKeydown: ($event) => onHandleKey($event, stop.id)
458
+ }, null, 44, _hoisted_15);
459
+ }), 128))], 544),
460
+ (0, vue.createElementVNode)("div", _hoisted_16, [
461
+ (0, vue.createElementVNode)("span", _hoisted_17, (0, vue.toDisplayString)(__props.colorStopLabel), 1),
462
+ (0, vue.createVNode)((0, vue.unref)(require_compact_button.compact_button_default), {
463
+ icon: "i-celeste-add-line",
464
+ variant: "ghost",
465
+ size: "md",
466
+ "aria-label": __props.addStopLabel,
467
+ onClick: addStop
468
+ }, null, 8, ["aria-label"]),
469
+ (0, vue.createVNode)((0, vue.unref)(require_compact_button.compact_button_default), {
470
+ icon: "i-celeste-subtract-line",
471
+ variant: "ghost",
472
+ size: "md",
473
+ "aria-label": __props.removeStopLabel,
474
+ disabled: state.value.stops.length <= 2,
475
+ onClick: removeStop
476
+ }, null, 8, ["aria-label", "disabled"])
477
+ ]),
478
+ (0, vue.createElementVNode)("div", _hoisted_18, [(0, vue.createElementVNode)("span", _hoisted_19, (0, vue.toDisplayString)(__props.positionLabel), 1), (0, vue.createVNode)((0, vue.unref)(require_text_input.text_input_default), {
479
+ "model-value": fields.value.position.value,
480
+ inputmode: "numeric",
481
+ size: "xs",
482
+ "aria-label": __props.positionLabel,
483
+ class: "celeste-gradient-number",
484
+ "onUpdate:modelValue": fields.value.position.input
485
+ }, {
486
+ trailingNode: (0, vue.withCtx)(() => [..._cache[10] || (_cache[10] = [(0, vue.createTextVNode)(" % ", -1)])]),
487
+ _: 1
488
+ }, 8, [
489
+ "model-value",
490
+ "aria-label",
491
+ "onUpdate:modelValue"
492
+ ])]),
493
+ (0, vue.createElementVNode)("div", _hoisted_20, [
494
+ (0, vue.createElementVNode)("span", _hoisted_21, [(0, vue.createElementVNode)("span", {
495
+ class: "celeste-gradient-fill",
496
+ style: (0, vue.normalizeStyle)({ background: colorOf(current.value) })
497
+ }, null, 4)]),
498
+ (0, vue.createVNode)((0, vue.unref)(require_text_input.text_input_default), {
499
+ "model-value": fields.value.hex.value,
500
+ size: "xs",
501
+ class: "celeste-gradient-hex",
502
+ "onUpdate:modelValue": fields.value.hex.input
503
+ }, (0, vue.createSlots)({ _: 2 }, [canSip ? {
504
+ name: "trailingNode",
505
+ fn: (0, vue.withCtx)(() => [(0, vue.createVNode)((0, vue.unref)(require_compact_button.compact_button_default), {
506
+ icon: "i-celeste-sip-line",
507
+ variant: "ghost",
508
+ size: "md",
509
+ "aria-label": __props.eyedropperLabel,
510
+ onClick: sip
511
+ }, null, 8, ["aria-label"])]),
512
+ key: "0"
513
+ } : void 0]), 1032, ["model-value", "onUpdate:modelValue"]),
514
+ (0, vue.createVNode)((0, vue.unref)(require_text_input.text_input_default), {
515
+ "model-value": fields.value.alpha.value,
516
+ inputmode: "numeric",
517
+ size: "xs",
518
+ "aria-label": __props.opacityLabel,
519
+ class: "celeste-gradient-number",
520
+ "onUpdate:modelValue": fields.value.alpha.input
521
+ }, {
522
+ trailingNode: (0, vue.withCtx)(() => [..._cache[11] || (_cache[11] = [(0, vue.createTextVNode)(" % ", -1)])]),
523
+ _: 1
524
+ }, 8, [
525
+ "model-value",
526
+ "aria-label",
527
+ "onUpdate:modelValue"
528
+ ])
529
+ ]),
530
+ (0, vue.createElementVNode)("div", _hoisted_22, [
531
+ (0, vue.createElementVNode)("div", {
532
+ ref_key: "area",
533
+ ref: area,
534
+ class: "celeste-gradient-area",
535
+ style: (0, vue.normalizeStyle)({ backgroundColor: `hsl(${current.value.h}, 100%, 50%)` }),
536
+ role: "slider",
537
+ tabindex: "0",
538
+ "aria-label": __props.areaLabel,
539
+ "aria-valuenow": Math.round(current.value.s),
540
+ "aria-valuetext": `${Math.round(current.value.s)}%, ${Math.round(current.value.v)}%`,
541
+ onPointerdown: onArea,
542
+ onKeydown: _cache[1] || (_cache[1] = ($event) => keys($event, (dx, dy) => patch({
543
+ s: clamp(current.value.s + dx, 0, 100),
544
+ v: clamp(current.value.v - dy, 0, 100)
545
+ })))
546
+ }, [(0, vue.createElementVNode)("span", {
547
+ class: "celeste-gradient-knob",
548
+ style: (0, vue.normalizeStyle)({
549
+ left: `${current.value.s}%`,
550
+ top: `${100 - current.value.v}%`,
551
+ background: fill(colorOf(current.value))
552
+ })
553
+ }, null, 4)], 44, _hoisted_23),
554
+ (0, vue.createElementVNode)("div", {
555
+ ref_key: "hue",
556
+ ref: hue,
557
+ class: "celeste-gradient-slider",
558
+ "data-hue": "true",
559
+ role: "slider",
560
+ tabindex: "0",
561
+ "aria-orientation": "vertical",
562
+ "aria-valuemin": "0",
563
+ "aria-valuemax": "359",
564
+ "aria-label": __props.hueLabel,
565
+ "aria-valuenow": Math.round(current.value.h),
566
+ onPointerdown: onHue,
567
+ onKeydown: _cache[2] || (_cache[2] = ($event) => keys($event, (dx, dy) => patch({ h: clamp(current.value.h + dx + dy, 0, 359) })))
568
+ }, [(0, vue.createElementVNode)("span", {
569
+ class: "celeste-gradient-knob",
570
+ style: (0, vue.normalizeStyle)({
571
+ top: along(current.value.h / 360),
572
+ background: fill(colorOf(current.value))
573
+ })
574
+ }, null, 4)], 40, _hoisted_24),
575
+ (0, vue.createElementVNode)("div", {
576
+ ref_key: "alpha",
577
+ ref: alpha,
578
+ class: "celeste-gradient-slider",
579
+ role: "slider",
580
+ tabindex: "0",
581
+ "aria-orientation": "vertical",
582
+ "aria-valuemin": "0",
583
+ "aria-valuemax": "100",
584
+ "aria-label": __props.opacityLabel,
585
+ "aria-valuenow": Math.round(current.value.a * 100),
586
+ onPointerdown: onAlpha,
587
+ onKeydown: _cache[3] || (_cache[3] = ($event) => keys($event, (dx, dy) => patch({ a: clamp(Math.round(current.value.a * 100 + dx - dy), 0, 100) / 100 })))
588
+ }, [(0, vue.createElementVNode)("span", {
589
+ class: "celeste-gradient-fill",
590
+ style: (0, vue.normalizeStyle)({ background: `linear-gradient(${solid.value}, transparent)` })
591
+ }, null, 4), (0, vue.createElementVNode)("span", {
592
+ class: "celeste-gradient-knob",
593
+ style: (0, vue.normalizeStyle)({
594
+ top: along(1 - current.value.a),
595
+ background: fill(colorOf(current.value))
596
+ })
597
+ }, null, 4)], 40, _hoisted_25)
598
+ ])
599
+ ]),
600
+ (0, vue.createElementVNode)("div", _hoisted_26, [(0, vue.createElementVNode)("span", _hoisted_27, (0, vue.toDisplayString)(__props.usedLabel), 1), (0, vue.createElementVNode)("div", _hoisted_28, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(__props.swatches, (swatch) => {
601
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
602
+ key: swatch,
603
+ type: "button",
604
+ style: (0, vue.normalizeStyle)({ background: swatch }),
605
+ title: swatch,
606
+ "aria-label": swatch,
607
+ onClick: ($event) => patch({
608
+ ...hsva(swatch),
609
+ a: current.value.a
610
+ })
611
+ }, null, 12, _hoisted_29);
612
+ }), 128))])]),
613
+ (0, vue.createElementVNode)("div", _hoisted_30, [(0, vue.createElementVNode)("button", {
614
+ type: "button",
615
+ class: "celeste-gradient-remove",
616
+ onClick: _cache[4] || (_cache[4] = ($event) => pick(""))
617
+ }, [_cache[12] || (_cache[12] = (0, vue.createElementVNode)("i", { class: "i-celeste-delete-bin-line" }, null, -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(__props.removeLabel), 1)])])
618
+ ], 64)) : (0, vue.createCommentVNode)("", true)])]),
619
+ _: 1
620
+ })]),
621
+ _: 1
622
+ }, 8, ["open"]);
623
+ };
624
+ }
625
+ });
626
+ //#endregion
627
+ //#region src/components/color-picker/gradient-picker.vue
628
+ var gradient_picker_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(gradient_picker_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3f165d2c"]]);
629
+ //#endregion
630
+ Object.defineProperty(exports, "gradient_picker_default", {
631
+ enumerable: true,
632
+ get: function() {
633
+ return gradient_picker_default;
634
+ }
635
+ });
@@ -26,7 +26,7 @@ var text_input_affix_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
26
26
  });
27
27
  //#endregion
28
28
  //#region src/components/text-input/text-input-affix.vue
29
- var text_input_affix_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(text_input_affix_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a6d421c4"]]);
29
+ var text_input_affix_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(text_input_affix_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b03a423e"]]);
30
30
  //#endregion
31
31
  Object.defineProperty(exports, "text_input_affix_default", {
32
32
  enumerable: true,
@@ -40,7 +40,7 @@ var text_input_button_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
40
40
  });
41
41
  //#endregion
42
42
  //#region src/components/text-input/text-input-button.vue
43
- var text_input_button_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(text_input_button_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-8b3cdb5f"]]);
43
+ var text_input_button_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(text_input_button_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d9fba798"]]);
44
44
  //#endregion
45
45
  Object.defineProperty(exports, "text_input_button_default", {
46
46
  enumerable: true,
@@ -94,6 +94,7 @@ var text_input_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, v
94
94
  }, {
95
95
  default: (0, vue.withCtx)(() => [showClearButton.value ? ((0, vue.openBlock)(), (0, vue.createBlock)(require_text_input_button.text_input_button_default, {
96
96
  key: 0,
97
+ inline: "",
97
98
  type: "button",
98
99
  "aria-label": "Clear search",
99
100
  onClick: clearInput
@@ -109,7 +110,7 @@ var text_input_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, v
109
110
  });
110
111
  //#endregion
111
112
  //#region src/components/text-input/text-input.vue
112
- var text_input_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(text_input_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d61fa3e2"]]);
113
+ var text_input_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(text_input_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-2139c861"]]);
113
114
  //#endregion
114
115
  Object.defineProperty(exports, "text_input_default", {
115
116
  enumerable: true,
@@ -56,7 +56,7 @@ var textarea_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue
56
56
  });
57
57
  //#endregion
58
58
  //#region src/components/textarea/textarea.vue
59
- var textarea_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(textarea_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-20f36cd5"]]);
59
+ var textarea_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(textarea_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0f93b4b8"]]);
60
60
  //#endregion
61
61
  Object.defineProperty(exports, "textarea_default", {
62
62
  enumerable: true,