@flipdish/ui-library 0.21.0 → 0.22.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.
- package/dist/components/__internal__/statusIcon/statusIcon.types.d.ts +12 -0
- package/dist/components/__internal__/statusIcon/statusIcon.types.d.ts.map +1 -0
- package/dist/components/__internal__/statusIcon/statusIcon.utils.cjs +21 -0
- package/dist/components/__internal__/statusIcon/statusIcon.utils.cjs.map +1 -0
- package/dist/components/__internal__/statusIcon/statusIcon.utils.d.ts +5 -0
- package/dist/components/__internal__/statusIcon/statusIcon.utils.d.ts.map +1 -0
- package/dist/components/__internal__/statusIcon/statusIcon.utils.js +19 -0
- package/dist/components/__internal__/statusIcon/statusIcon.utils.js.map +1 -0
- package/dist/components/atoms/BackgroundPattern/components/grid-check.cjs +14 -7
- package/dist/components/atoms/BackgroundPattern/components/grid-check.cjs.map +1 -1
- package/dist/components/atoms/BackgroundPattern/components/grid-check.d.ts.map +1 -1
- package/dist/components/atoms/BackgroundPattern/components/grid-check.js +14 -7
- package/dist/components/atoms/BackgroundPattern/components/grid-check.js.map +1 -1
- package/dist/components/atoms/BackgroundPattern/index.d.ts.map +1 -1
- package/dist/components/molecules/Alert/index.cjs +3 -11
- package/dist/components/molecules/Alert/index.cjs.map +1 -1
- package/dist/components/molecules/Alert/index.d.ts +3 -2
- package/dist/components/molecules/Alert/index.d.ts.map +1 -1
- package/dist/components/molecules/Alert/index.js +3 -11
- package/dist/components/molecules/Alert/index.js.map +1 -1
- package/dist/components/molecules/Notification/index.cjs +3 -10
- package/dist/components/molecules/Notification/index.cjs.map +1 -1
- package/dist/components/molecules/Notification/index.d.ts +2 -1
- package/dist/components/molecules/Notification/index.d.ts.map +1 -1
- package/dist/components/molecules/Notification/index.js +3 -10
- package/dist/components/molecules/Notification/index.js.map +1 -1
- package/dist/components/molecules/Pagination/index.cjs +4 -4
- package/dist/components/molecules/Pagination/index.cjs.map +1 -1
- package/dist/components/molecules/Pagination/index.js +5 -5
- package/dist/components/molecules/Pagination/index.js.map +1 -1
- package/dist/components/organisms/Calendar/calendar.utils.cjs +41 -0
- package/dist/components/organisms/Calendar/calendar.utils.cjs.map +1 -1
- package/dist/components/organisms/Calendar/calendar.utils.d.ts +20 -0
- package/dist/components/organisms/Calendar/calendar.utils.d.ts.map +1 -1
- package/dist/components/organisms/Calendar/calendar.utils.js +37 -1
- package/dist/components/organisms/Calendar/calendar.utils.js.map +1 -1
- package/dist/components/organisms/Calendar/components/calendar-day-view.cjs +86 -0
- package/dist/components/organisms/Calendar/components/calendar-day-view.cjs.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-day-view.d.ts +20 -0
- package/dist/components/organisms/Calendar/components/calendar-day-view.d.ts.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-day-view.js +84 -0
- package/dist/components/organisms/Calendar/components/calendar-day-view.js.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.cjs +21 -0
- package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.cjs.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.d.ts +16 -0
- package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.d.ts.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.js +19 -0
- package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.js.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-month-view.cjs +265 -0
- package/dist/components/organisms/Calendar/components/calendar-month-view.cjs.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-month-view.d.ts +18 -0
- package/dist/components/organisms/Calendar/components/calendar-month-view.d.ts.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-month-view.js +263 -0
- package/dist/components/organisms/Calendar/components/calendar-month-view.js.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-positioned-event.cjs +41 -0
- package/dist/components/organisms/Calendar/components/calendar-positioned-event.cjs.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-positioned-event.d.ts +15 -0
- package/dist/components/organisms/Calendar/components/calendar-positioned-event.d.ts.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-positioned-event.js +39 -0
- package/dist/components/organisms/Calendar/components/calendar-positioned-event.js.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view-day.cjs +23 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view-day.cjs.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view-day.d.ts +15 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view-day.d.ts.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view-day.js +21 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view-day.js.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view.cjs +77 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view.cjs.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view.d.ts +20 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view.d.ts.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view.js +75 -0
- package/dist/components/organisms/Calendar/components/calendar-week-view.js.map +1 -0
- package/dist/components/organisms/Calendar/index.cjs +4 -504
- package/dist/components/organisms/Calendar/index.cjs.map +1 -1
- package/dist/components/organisms/Calendar/index.d.ts +1 -1
- package/dist/components/organisms/Calendar/index.d.ts.map +1 -1
- package/dist/components/organisms/Calendar/index.js +6 -506
- package/dist/components/organisms/Calendar/index.js.map +1 -1
- package/dist/components/organisms/Charts/components/activity-gauge.cjs +4 -0
- package/dist/components/organisms/Charts/components/activity-gauge.cjs.map +1 -1
- package/dist/components/organisms/Charts/components/activity-gauge.d.ts +4 -0
- package/dist/components/organisms/Charts/components/activity-gauge.d.ts.map +1 -1
- package/dist/components/organisms/Charts/components/activity-gauge.js +4 -0
- package/dist/components/organisms/Charts/components/activity-gauge.js.map +1 -1
- package/dist/components/organisms/Charts/components/bar-chart.cjs +1 -1
- package/dist/components/organisms/Charts/components/bar-chart.cjs.map +1 -1
- package/dist/components/organisms/Charts/components/bar-chart.d.ts +1 -2
- package/dist/components/organisms/Charts/components/bar-chart.d.ts.map +1 -1
- package/dist/components/organisms/Charts/components/bar-chart.js +2 -2
- package/dist/components/organisms/Charts/components/bar-chart.js.map +1 -1
- package/dist/components/organisms/Charts/components/charts-base.cjs +1 -2
- package/dist/components/organisms/Charts/components/charts-base.cjs.map +1 -1
- package/dist/components/organisms/Charts/components/charts-base.d.ts +13 -2
- package/dist/components/organisms/Charts/components/charts-base.d.ts.map +1 -1
- package/dist/components/organisms/Charts/components/charts-base.js +1 -2
- package/dist/components/organisms/Charts/components/charts-base.js.map +1 -1
- package/dist/components/organisms/Charts/components/line-chart.cjs +1 -1
- package/dist/components/organisms/Charts/components/line-chart.cjs.map +1 -1
- package/dist/components/organisms/Charts/components/line-chart.d.ts +1 -2
- package/dist/components/organisms/Charts/components/line-chart.d.ts.map +1 -1
- package/dist/components/organisms/Charts/components/line-chart.js +2 -2
- package/dist/components/organisms/Charts/components/line-chart.js.map +1 -1
- package/dist/components/organisms/Charts/components/pie-chart.cjs +5 -0
- package/dist/components/organisms/Charts/components/pie-chart.cjs.map +1 -1
- package/dist/components/organisms/Charts/components/pie-chart.d.ts +6 -2
- package/dist/components/organisms/Charts/components/pie-chart.d.ts.map +1 -1
- package/dist/components/organisms/Charts/components/pie-chart.js +5 -0
- package/dist/components/organisms/Charts/components/pie-chart.js.map +1 -1
- package/dist/components/organisms/Charts/components/radar-chart.cjs +3 -4
- package/dist/components/organisms/Charts/components/radar-chart.cjs.map +1 -1
- package/dist/components/organisms/Charts/components/radar-chart.d.ts.map +1 -1
- package/dist/components/organisms/Charts/components/radar-chart.js +3 -4
- package/dist/components/organisms/Charts/components/radar-chart.js.map +1 -1
- package/dist/components/organisms/DatePicker/components/range-calendar.cjs +1 -1
- package/dist/components/organisms/DatePicker/components/range-calendar.cjs.map +1 -1
- package/dist/components/organisms/DatePicker/components/range-calendar.js +2 -2
- package/dist/components/organisms/DatePicker/components/range-calendar.js.map +1 -1
- package/dist/components/organisms/GradientPicker/components/gradient-area.cjs +157 -0
- package/dist/components/organisms/GradientPicker/components/gradient-area.cjs.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-area.d.ts +17 -0
- package/dist/components/organisms/GradientPicker/components/gradient-area.d.ts.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-area.js +155 -0
- package/dist/components/organisms/GradientPicker/components/gradient-area.js.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.cjs +17 -0
- package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.cjs.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.d.ts +3 -0
- package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.d.ts.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.js +15 -0
- package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.js.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-slider.cjs +71 -0
- package/dist/components/organisms/GradientPicker/components/gradient-slider.cjs.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-slider.d.ts +7 -0
- package/dist/components/organisms/GradientPicker/components/gradient-slider.d.ts.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-slider.js +69 -0
- package/dist/components/organisms/GradientPicker/components/gradient-slider.js.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-list.cjs +18 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-list.cjs.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-list.d.ts +4 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-list.d.ts.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-list.js +16 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-list.js.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-row.cjs +49 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-row.cjs.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-row.d.ts +6 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-row.d.ts.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-row.js +47 -0
- package/dist/components/organisms/GradientPicker/components/gradient-stop-row.js.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-type-select.cjs +28 -0
- package/dist/components/organisms/GradientPicker/components/gradient-type-select.cjs.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-type-select.d.ts +3 -0
- package/dist/components/organisms/GradientPicker/components/gradient-type-select.d.ts.map +1 -0
- package/dist/components/organisms/GradientPicker/components/gradient-type-select.js +26 -0
- package/dist/components/organisms/GradientPicker/components/gradient-type-select.js.map +1 -0
- package/dist/components/organisms/GradientPicker/components/position-input.cjs +43 -0
- package/dist/components/organisms/GradientPicker/components/position-input.cjs.map +1 -0
- package/dist/components/organisms/GradientPicker/components/position-input.d.ts +6 -0
- package/dist/components/organisms/GradientPicker/components/position-input.d.ts.map +1 -0
- package/dist/components/organisms/GradientPicker/components/position-input.js +41 -0
- package/dist/components/organisms/GradientPicker/components/position-input.js.map +1 -0
- package/dist/components/organisms/GradientPicker/index.cjs +11 -327
- package/dist/components/organisms/GradientPicker/index.cjs.map +1 -1
- package/dist/components/organisms/GradientPicker/index.d.ts +7 -8
- package/dist/components/organisms/GradientPicker/index.d.ts.map +1 -1
- package/dist/components/organisms/GradientPicker/index.js +7 -323
- package/dist/components/organisms/GradientPicker/index.js.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-account-card.cjs +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-account-card.cjs.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-account-card.js +2 -2
- package/dist/components/organisms/HeaderNavigation/components/nav-account-card.js.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-button.cjs +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-button.cjs.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-button.d.ts.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-button.js +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-button.js.map +1 -1
- package/dist/components/organisms/SidebarNavigation/components/nav-account-card.cjs +1 -1
- package/dist/components/organisms/SidebarNavigation/components/nav-account-card.cjs.map +1 -1
- package/dist/components/organisms/SidebarNavigation/components/nav-account-card.js +2 -2
- package/dist/components/organisms/SidebarNavigation/components/nav-account-card.js.map +1 -1
- package/dist/components/organisms/SidebarNavigation/index.cjs +1 -1
- package/dist/components/organisms/SidebarNavigation/index.cjs.map +1 -1
- package/dist/components/organisms/SidebarNavigation/index.js +2 -2
- package/dist/components/organisms/SidebarNavigation/index.js.map +1 -1
- package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.cjs +169 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.cjs.map +1 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.d.ts +34 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.d.ts.map +1 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.js +167 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.js.map +1 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.cjs +75 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.cjs.map +1 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.d.ts +16 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.d.ts.map +1 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.js +73 -0
- package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.js.map +1 -0
- package/dist/components/organisms/VideoPlayer/index.cjs +9 -182
- package/dist/components/organisms/VideoPlayer/index.cjs.map +1 -1
- package/dist/components/organisms/VideoPlayer/index.d.ts.map +1 -1
- package/dist/components/organisms/VideoPlayer/index.js +10 -183
- package/dist/components/organisms/VideoPlayer/index.js.map +1 -1
- package/dist/hooks/useBreakpoints/index.cjs +4 -1
- package/dist/hooks/useBreakpoints/index.cjs.map +1 -1
- package/dist/hooks/useBreakpoints/index.d.ts +2 -0
- package/dist/hooks/useBreakpoints/index.d.ts.map +1 -1
- package/dist/hooks/useBreakpoints/index.js +4 -2
- package/dist/hooks/useBreakpoints/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { cx } from '@flipdish/ui-library/utilities/cx';
|
|
3
|
+
import { useTestIdPrefix, joinTestId } from '@flipdish/ui-library/utilities/testIdUtils';
|
|
4
|
+
import { useRef, useCallback } from 'react';
|
|
5
|
+
import { pointerPt, projectOntoLine, clampPt, dist, extendLineToEdges, clamp, lerp, toGradientCSSFromLine } from '../gradientPicker.utils.js';
|
|
6
|
+
import { useGradientColorPicker } from '../providers/gradient-picker-context.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Interactive 2D gradient area with draggable stop thumbs.
|
|
10
|
+
*
|
|
11
|
+
* The gradient is defined by an explicit 2D line (`state.gradientLine`) extended to
|
|
12
|
+
* the area edges. Stop positions (0–100%) map to points along this line via `lerp`.
|
|
13
|
+
*
|
|
14
|
+
* Endpoint drag — moves the thumb freely in 2D. The line through both endpoints
|
|
15
|
+
* is extended to the area edges via `extendLineToEdges`, and both endpoint positions
|
|
16
|
+
* are re-projected onto it. The other endpoint's 2D position is snapshotted on
|
|
17
|
+
* pointerdown so it never drifts. Inner stop positions stay unchanged.
|
|
18
|
+
*
|
|
19
|
+
* Inner stop drag — slides the stop along the current gradient line by projecting
|
|
20
|
+
* the pointer onto it.
|
|
21
|
+
*/
|
|
22
|
+
const GradientArea = () => {
|
|
23
|
+
const { state, actions } = useGradientColorPicker();
|
|
24
|
+
const { gradientStops: stops, gradientType: type, gradientLine: line } = state;
|
|
25
|
+
const areaRef = useRef(null);
|
|
26
|
+
const prefix = useTestIdPrefix();
|
|
27
|
+
const areaTestId = prefix ? joinTestId(prefix, 'area') : undefined;
|
|
28
|
+
const sorted = [...stops].sort((a, b) => a.position - b.position);
|
|
29
|
+
const firstStop = sorted[0];
|
|
30
|
+
const lastStop = sorted[sorted.length - 1];
|
|
31
|
+
/** Map a stop's position (0–100%) to a 2D point on the gradient line. */
|
|
32
|
+
const stopPt = (position) => lerp(line.start, line.end, position / 100);
|
|
33
|
+
const startPt = stopPt(firstStop?.position ?? 0);
|
|
34
|
+
const endPt = stopPt(lastStop?.position ?? 100);
|
|
35
|
+
/** Drag state stored in a ref to avoid re-renders during pointer moves. */
|
|
36
|
+
const dragRef = useRef(null);
|
|
37
|
+
/** Start dragging an endpoint (first or last sorted stop). */
|
|
38
|
+
const handleEndpointDown = useCallback((e, which) => {
|
|
39
|
+
if (!areaRef.current)
|
|
40
|
+
return;
|
|
41
|
+
e.preventDefault();
|
|
42
|
+
e.stopPropagation();
|
|
43
|
+
const el = e.target;
|
|
44
|
+
el.setPointerCapture(e.pointerId);
|
|
45
|
+
el.focus();
|
|
46
|
+
const draggedStop = which === 'start' ? firstStop : lastStop;
|
|
47
|
+
const fixedStop = which === 'start' ? lastStop : firstStop;
|
|
48
|
+
if (draggedStop)
|
|
49
|
+
actions.selectStop(draggedStop.id);
|
|
50
|
+
const raw = pointerPt(e, areaRef.current);
|
|
51
|
+
const thumbPt = stopPt(draggedStop?.position ?? (which === 'start' ? 0 : 100));
|
|
52
|
+
const fixedPt = stopPt(fixedStop?.position ?? (which === 'start' ? 100 : 0));
|
|
53
|
+
const boundaryPos = which === 'start' ? (sorted[1]?.position ?? 100) : (sorted[sorted.length - 2]?.position ?? 0);
|
|
54
|
+
dragRef.current = {
|
|
55
|
+
kind: 'endpoint',
|
|
56
|
+
which,
|
|
57
|
+
offset: { x: raw.x - thumbPt.x, y: raw.y - thumbPt.y },
|
|
58
|
+
draggedStopId: draggedStop?.id ?? '',
|
|
59
|
+
fixedStopId: fixedStop?.id ?? '',
|
|
60
|
+
fixedPt,
|
|
61
|
+
boundaryPos,
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: stopPt is not a dependency of the callback
|
|
65
|
+
[actions, firstStop, lastStop, sorted, stopPt]);
|
|
66
|
+
/** Start dragging an inner (non-endpoint) stop along the gradient line. */
|
|
67
|
+
const handleInnerDown = useCallback((e, stopId) => {
|
|
68
|
+
if (!areaRef.current)
|
|
69
|
+
return;
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
e.stopPropagation();
|
|
72
|
+
const el = e.target;
|
|
73
|
+
el.setPointerCapture(e.pointerId);
|
|
74
|
+
el.focus();
|
|
75
|
+
actions.selectStop(stopId);
|
|
76
|
+
const raw = pointerPt(e, areaRef.current);
|
|
77
|
+
const t = projectOntoLine(raw, line.start, line.end);
|
|
78
|
+
const rawPos = clamp(t * 100, 0, 100);
|
|
79
|
+
const stop = stops.find((s) => s.id === stopId);
|
|
80
|
+
dragRef.current = { kind: 'inner', stopId, offset: rawPos - (stop?.position ?? 50) };
|
|
81
|
+
}, [actions, stops, line]);
|
|
82
|
+
/** Handle pointer move for both endpoint and inner stop drags. */
|
|
83
|
+
const handlePointerMove = useCallback((e) => {
|
|
84
|
+
if (!areaRef.current || !dragRef.current)
|
|
85
|
+
return;
|
|
86
|
+
const raw = pointerPt(e, areaRef.current);
|
|
87
|
+
const drag = dragRef.current;
|
|
88
|
+
if (drag.kind === 'endpoint') {
|
|
89
|
+
let pt = clampPt({ x: raw.x - drag.offset.x, y: raw.y - drag.offset.y });
|
|
90
|
+
// Keep a minimum distance between endpoints to prevent a zero-length line
|
|
91
|
+
if (dist(pt, drag.fixedPt) < 5) {
|
|
92
|
+
const dx = pt.x - drag.fixedPt.x;
|
|
93
|
+
const dy = pt.y - drag.fixedPt.y;
|
|
94
|
+
const d = dist(pt, drag.fixedPt) || 1;
|
|
95
|
+
pt = { x: drag.fixedPt.x + (dx / d) * 5, y: drag.fixedPt.y + (dy / d) * 5 };
|
|
96
|
+
}
|
|
97
|
+
// Edge-extended line through dragged + fixed points — both lie on it, so projection is lossless.
|
|
98
|
+
const dirStart = drag.which === 'start' ? pt : drag.fixedPt;
|
|
99
|
+
const dirEnd = drag.which === 'start' ? drag.fixedPt : pt;
|
|
100
|
+
const edgeLine = extendLineToEdges(dirStart, dirEnd);
|
|
101
|
+
let draggedPos = clamp(projectOntoLine(pt, edgeLine.start, edgeLine.end) * 100, 0, 100);
|
|
102
|
+
const fixedPos = clamp(projectOntoLine(drag.fixedPt, edgeLine.start, edgeLine.end) * 100, 0, 100);
|
|
103
|
+
// Prevent the endpoint from crossing past the nearest inner stop
|
|
104
|
+
if (drag.which === 'start' && draggedPos > drag.boundaryPos) {
|
|
105
|
+
draggedPos = drag.boundaryPos;
|
|
106
|
+
pt = lerp(edgeLine.start, edgeLine.end, draggedPos / 100);
|
|
107
|
+
}
|
|
108
|
+
else if (drag.which === 'end' && draggedPos < drag.boundaryPos) {
|
|
109
|
+
draggedPos = drag.boundaryPos;
|
|
110
|
+
pt = lerp(edgeLine.start, edgeLine.end, draggedPos / 100);
|
|
111
|
+
}
|
|
112
|
+
actions.setLineEndpoint(edgeLine, [
|
|
113
|
+
{ id: drag.draggedStopId, position: draggedPos },
|
|
114
|
+
{ id: drag.fixedStopId, position: fixedPos },
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Project the pointer onto the gradient line and update the stop's position
|
|
119
|
+
const t = projectOntoLine(raw, line.start, line.end);
|
|
120
|
+
const pos = Math.round(clamp(t * 100 - drag.offset, 0, 100));
|
|
121
|
+
actions.moveStop(drag.stopId, pos);
|
|
122
|
+
}
|
|
123
|
+
}, [actions, line]);
|
|
124
|
+
const handlePointerUp = useCallback(() => {
|
|
125
|
+
dragRef.current = null;
|
|
126
|
+
}, []);
|
|
127
|
+
/** CSS gradient background remapped to align with the (possibly off-center) gradient line. */
|
|
128
|
+
const bgCSS = toGradientCSSFromLine(stops, type, line.start, line.end);
|
|
129
|
+
return (
|
|
130
|
+
// biome-ignore lint/a11y/useSemanticElements: this is a div that is not interactive
|
|
131
|
+
jsxs("div", { ref: areaRef, role: "group", "aria-label": "Gradient direction and stops", "data-testid": areaTestId, className: "relative aspect-square w-full rounded-lg", onPointerMove: handlePointerMove, onPointerUp: handlePointerUp, onPointerCancel: handlePointerUp, children: [jsx("div", { className: "absolute inset-0 overflow-hidden rounded-lg ring-[0.5px] ring-alpha-black/10 ring-inset", style: { background: bgCSS } }), jsx("svg", { className: "pointer-events-none absolute inset-0 size-full overflow-visible", "aria-hidden": true, children: jsx("line", { x1: `${startPt.x}%`, y1: `${startPt.y}%`, x2: `${endPt.x}%`, y2: `${endPt.y}%`, stroke: "rgba(255,255,255,0.5)", strokeWidth: "2", strokeDasharray: "3 5", strokeLinecap: "round" }) }), sorted.map((stop) => {
|
|
132
|
+
const isFirst = stop.id === firstStop?.id;
|
|
133
|
+
const isLast = stop.id === lastStop?.id && !isFirst;
|
|
134
|
+
const isEndpoint = isFirst || isLast;
|
|
135
|
+
const pt = stopPt(stop.position);
|
|
136
|
+
const which = isFirst ? 'start' : 'end';
|
|
137
|
+
return (jsx("button", { type: "button", tabIndex: 0, onPointerDown: isEndpoint ? (e) => handleEndpointDown(e, which) : (e) => handleInnerDown(e, stop.id), onFocus: () => actions.selectStop(stop.id), onKeyDown: (e) => {
|
|
138
|
+
if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {
|
|
139
|
+
e.preventDefault();
|
|
140
|
+
actions.moveStop(stop.id, Math.min(100, stop.position + 1));
|
|
141
|
+
}
|
|
142
|
+
else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
actions.moveStop(stop.id, Math.max(0, stop.position - 1));
|
|
145
|
+
}
|
|
146
|
+
else if ((e.key === 'Delete' || e.key === 'Backspace') && stops.length > 2) {
|
|
147
|
+
e.preventDefault();
|
|
148
|
+
actions.removeStop(stop.id);
|
|
149
|
+
}
|
|
150
|
+
}, className: cx('absolute z-10 -translate-x-1/2 -translate-y-1/2 cursor-grab rounded-full border-[3px] border-white shadow-md outline-0 outline-focus-ring focus-visible:outline-2 focus-visible:outline-offset-2 active:cursor-grabbing', isEndpoint ? 'size-5' : 'size-4'), style: { left: `${pt.x}%`, top: `${pt.y}%`, background: stop.color }, "data-testid": prefix ? joinTestId(prefix, `stop-${stop.id}-thumb`) : undefined, "aria-label": `Gradient stop at ${Math.round(stop.position)}%`, role: "slider", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(stop.position) }, stop.id));
|
|
151
|
+
})] }));
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export { GradientArea };
|
|
155
|
+
//# sourceMappingURL=gradient-area.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-area.js","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-area.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var uiIcons = require('@flipdish/ui-icons');
|
|
5
|
+
var UtilityButton = require('@flipdish/ui-library/components/atoms/UtilityButton');
|
|
6
|
+
var testIdUtils = require('@flipdish/ui-library/utilities/testIdUtils');
|
|
7
|
+
var gradientPickerContext = require('../providers/gradient-picker-context.cjs');
|
|
8
|
+
|
|
9
|
+
/** Button to reverse the gradient by mirroring all stop colors. */
|
|
10
|
+
const GradientReverseButton = () => {
|
|
11
|
+
const { actions } = gradientPickerContext.useGradientColorPicker();
|
|
12
|
+
const prefix = testIdUtils.useTestIdPrefix();
|
|
13
|
+
return (jsxRuntime.jsx(UtilityButton.ButtonUtility, { icon: uiIcons.SwitchHorizontal01, size: "sm", color: "tertiary", tooltip: "Reverse gradient", "data-testid": prefix ? testIdUtils.joinTestId(prefix, 'reverse') : undefined, onClick: () => actions.reverseGradient() }));
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
exports.GradientReverseButton = GradientReverseButton;
|
|
17
|
+
//# sourceMappingURL=gradient-reverse-button.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-reverse-button.cjs","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-reverse-button.tsx"],"sourcesContent":[null],"names":["useGradientColorPicker","useTestIdPrefix","_jsx","ButtonUtility","SwitchHorizontal01","joinTestId"],"mappings":";;;;;;;;AAOA;AACO,MAAM,qBAAqB,GAAG,MAAK;AACxC,IAAA,MAAM,EAAE,OAAO,EAAE,GAAGA,4CAAsB,EAAE;AAC5C,IAAA,MAAM,MAAM,GAAGC,2BAAe,EAAE;IAChC,QACEC,eAACC,2BAAa,EAAA,EACZ,IAAI,EAAEC,0BAAkB,EACxB,IAAI,EAAC,IAAI,EACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAC,kBAAkB,EAAA,aAAA,EACb,MAAM,GAAGC,sBAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAC/D,OAAO,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,EAAA,CACxC;AAEN;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-reverse-button.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-reverse-button.tsx"],"names":[],"mappings":"AAOA,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,mCAajC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { SwitchHorizontal01 } from '@flipdish/ui-icons';
|
|
3
|
+
import { ButtonUtility } from '@flipdish/ui-library/components/atoms/UtilityButton';
|
|
4
|
+
import { useTestIdPrefix, joinTestId } from '@flipdish/ui-library/utilities/testIdUtils';
|
|
5
|
+
import { useGradientColorPicker } from '../providers/gradient-picker-context.js';
|
|
6
|
+
|
|
7
|
+
/** Button to reverse the gradient by mirroring all stop colors. */
|
|
8
|
+
const GradientReverseButton = () => {
|
|
9
|
+
const { actions } = useGradientColorPicker();
|
|
10
|
+
const prefix = useTestIdPrefix();
|
|
11
|
+
return (jsx(ButtonUtility, { icon: SwitchHorizontal01, size: "sm", color: "tertiary", tooltip: "Reverse gradient", "data-testid": prefix ? joinTestId(prefix, 'reverse') : undefined, onClick: () => actions.reverseGradient() }));
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { GradientReverseButton };
|
|
15
|
+
//# sourceMappingURL=gradient-reverse-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-reverse-button.js","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-reverse-button.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;;;AAOA;AACO,MAAM,qBAAqB,GAAG,MAAK;AACxC,IAAA,MAAM,EAAE,OAAO,EAAE,GAAG,sBAAsB,EAAE;AAC5C,IAAA,MAAM,MAAM,GAAG,eAAe,EAAE;IAChC,QACEA,IAAC,aAAa,EAAA,EACZ,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAC,IAAI,EACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAC,kBAAkB,EAAA,aAAA,EACb,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAC/D,OAAO,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,EAAA,CACxC;AAEN;;;;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var testIdUtils = require('@flipdish/ui-library/utilities/testIdUtils');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
var gradientPicker_utils = require('../gradientPicker.utils.cjs');
|
|
7
|
+
var gradientPickerContext = require('../providers/gradient-picker-context.cjs');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Horizontal gradient slider. Stops are draggable thumbs along the track.
|
|
11
|
+
* Clicking an empty area of the track adds a new stop with an interpolated color.
|
|
12
|
+
*/
|
|
13
|
+
const GradientSlider = () => {
|
|
14
|
+
const { state, actions } = gradientPickerContext.useGradientColorPicker();
|
|
15
|
+
const trackRef = React.useRef(null);
|
|
16
|
+
const dragStopRef = React.useRef(null);
|
|
17
|
+
const sliderOffsetRef = React.useRef(0);
|
|
18
|
+
const prefix = testIdUtils.useTestIdPrefix();
|
|
19
|
+
const sliderTestId = prefix ? testIdUtils.joinTestId(prefix, 'slider') : undefined;
|
|
20
|
+
/** Convert a pointer event's X to a percentage (0–100) along the track. */
|
|
21
|
+
const getRawPos = React.useCallback((e) => {
|
|
22
|
+
if (!trackRef.current)
|
|
23
|
+
return 0;
|
|
24
|
+
const rect = trackRef.current.getBoundingClientRect();
|
|
25
|
+
return ((e.clientX - rect.left) / rect.width) * 100;
|
|
26
|
+
}, []);
|
|
27
|
+
const handlePointerMove = React.useCallback((e) => {
|
|
28
|
+
if (!dragStopRef.current)
|
|
29
|
+
return;
|
|
30
|
+
const pos = Math.round(Math.max(0, Math.min(100, getRawPos(e) - sliderOffsetRef.current)));
|
|
31
|
+
actions.moveStop(dragStopRef.current, pos);
|
|
32
|
+
}, [actions, getRawPos]);
|
|
33
|
+
const handlePointerUp = React.useCallback(() => {
|
|
34
|
+
dragStopRef.current = null;
|
|
35
|
+
sliderOffsetRef.current = 0;
|
|
36
|
+
}, []);
|
|
37
|
+
const handlePointerDown = React.useCallback((e) => {
|
|
38
|
+
if (e.target === trackRef.current) {
|
|
39
|
+
const pos = Math.round(Math.max(0, Math.min(100, getRawPos(e))));
|
|
40
|
+
actions.addStopAt(pos);
|
|
41
|
+
}
|
|
42
|
+
}, [actions, getRawPos]);
|
|
43
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: getRawPos is not a dependency of the callback
|
|
44
|
+
const handleInnerDown = React.useCallback((e, stop) => {
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
const el = e.target;
|
|
47
|
+
el.setPointerCapture(e.pointerId);
|
|
48
|
+
el.focus();
|
|
49
|
+
actions.selectStop(stop.id);
|
|
50
|
+
dragStopRef.current = stop.id;
|
|
51
|
+
sliderOffsetRef.current = getRawPos(e) - stop.position;
|
|
52
|
+
}, [actions]);
|
|
53
|
+
const handleInnerKeyDown = React.useCallback((e, stop) => {
|
|
54
|
+
if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {
|
|
55
|
+
e.preventDefault();
|
|
56
|
+
actions.moveStop(stop.id, Math.min(100, stop.position + 1));
|
|
57
|
+
}
|
|
58
|
+
else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
actions.moveStop(stop.id, Math.max(0, stop.position - 1));
|
|
61
|
+
}
|
|
62
|
+
else if ((e.key === 'Delete' || e.key === 'Backspace') && state.gradientStops.length > 2) {
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
actions.removeStop(stop.id);
|
|
65
|
+
}
|
|
66
|
+
}, [actions, state.gradientStops.length]);
|
|
67
|
+
return (jsxRuntime.jsx("div", { ref: trackRef, "data-testid": sliderTestId, className: "relative h-3 w-full cursor-pointer rounded-full ring-[0.5px] ring-alpha-black/10 ring-inset", style: { background: gradientPicker_utils.toGradientCSS(state.gradientStops, 'linear', 90) }, onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerUp, onPointerCancel: handlePointerUp, children: state.gradientStops.map((stop) => (jsxRuntime.jsx("button", { type: "button", tabIndex: 0, onPointerDown: (e) => handleInnerDown(e, stop), onFocus: () => actions.selectStop(stop.id), onKeyDown: (e) => handleInnerKeyDown(e, stop), className: "absolute top-1/2 size-5 -translate-x-1/2 -translate-y-1/2 cursor-grab rounded-full border-[3px] border-white shadow-md outline-0 outline-focus-ring focus-visible:outline-2 focus-visible:outline-offset-2 active:cursor-grabbing", style: { left: `${stop.position}%`, background: stop.color }, "data-testid": prefix ? testIdUtils.joinTestId(prefix, `stop-${stop.id}-thumb`) : undefined, role: "slider", "aria-label": `Gradient stop at ${Math.round(stop.position)}%`, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(stop.position) }, stop.id))) }));
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
exports.GradientSlider = GradientSlider;
|
|
71
|
+
//# sourceMappingURL=gradient-slider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-slider.cjs","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-slider.tsx"],"sourcesContent":[null],"names":["useGradientColorPicker","useRef","useTestIdPrefix","joinTestId","useCallback","_jsx","toGradientCSS"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Horizontal gradient slider. Stops are draggable thumbs along the track.
|
|
4
|
+
* Clicking an empty area of the track adds a new stop with an interpolated color.
|
|
5
|
+
*/
|
|
6
|
+
export declare const GradientSlider: () => React.JSX.Element;
|
|
7
|
+
//# sourceMappingURL=gradient-slider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-slider.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-slider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B;;;GAGG;AACH,eAAO,MAAM,cAAc,yBAoG1B,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useTestIdPrefix, joinTestId } from '@flipdish/ui-library/utilities/testIdUtils';
|
|
3
|
+
import { useRef, useCallback } from 'react';
|
|
4
|
+
import { toGradientCSS } from '../gradientPicker.utils.js';
|
|
5
|
+
import { useGradientColorPicker } from '../providers/gradient-picker-context.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Horizontal gradient slider. Stops are draggable thumbs along the track.
|
|
9
|
+
* Clicking an empty area of the track adds a new stop with an interpolated color.
|
|
10
|
+
*/
|
|
11
|
+
const GradientSlider = () => {
|
|
12
|
+
const { state, actions } = useGradientColorPicker();
|
|
13
|
+
const trackRef = useRef(null);
|
|
14
|
+
const dragStopRef = useRef(null);
|
|
15
|
+
const sliderOffsetRef = useRef(0);
|
|
16
|
+
const prefix = useTestIdPrefix();
|
|
17
|
+
const sliderTestId = prefix ? joinTestId(prefix, 'slider') : undefined;
|
|
18
|
+
/** Convert a pointer event's X to a percentage (0–100) along the track. */
|
|
19
|
+
const getRawPos = useCallback((e) => {
|
|
20
|
+
if (!trackRef.current)
|
|
21
|
+
return 0;
|
|
22
|
+
const rect = trackRef.current.getBoundingClientRect();
|
|
23
|
+
return ((e.clientX - rect.left) / rect.width) * 100;
|
|
24
|
+
}, []);
|
|
25
|
+
const handlePointerMove = useCallback((e) => {
|
|
26
|
+
if (!dragStopRef.current)
|
|
27
|
+
return;
|
|
28
|
+
const pos = Math.round(Math.max(0, Math.min(100, getRawPos(e) - sliderOffsetRef.current)));
|
|
29
|
+
actions.moveStop(dragStopRef.current, pos);
|
|
30
|
+
}, [actions, getRawPos]);
|
|
31
|
+
const handlePointerUp = useCallback(() => {
|
|
32
|
+
dragStopRef.current = null;
|
|
33
|
+
sliderOffsetRef.current = 0;
|
|
34
|
+
}, []);
|
|
35
|
+
const handlePointerDown = useCallback((e) => {
|
|
36
|
+
if (e.target === trackRef.current) {
|
|
37
|
+
const pos = Math.round(Math.max(0, Math.min(100, getRawPos(e))));
|
|
38
|
+
actions.addStopAt(pos);
|
|
39
|
+
}
|
|
40
|
+
}, [actions, getRawPos]);
|
|
41
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: getRawPos is not a dependency of the callback
|
|
42
|
+
const handleInnerDown = useCallback((e, stop) => {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
const el = e.target;
|
|
45
|
+
el.setPointerCapture(e.pointerId);
|
|
46
|
+
el.focus();
|
|
47
|
+
actions.selectStop(stop.id);
|
|
48
|
+
dragStopRef.current = stop.id;
|
|
49
|
+
sliderOffsetRef.current = getRawPos(e) - stop.position;
|
|
50
|
+
}, [actions]);
|
|
51
|
+
const handleInnerKeyDown = useCallback((e, stop) => {
|
|
52
|
+
if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
actions.moveStop(stop.id, Math.min(100, stop.position + 1));
|
|
55
|
+
}
|
|
56
|
+
else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
actions.moveStop(stop.id, Math.max(0, stop.position - 1));
|
|
59
|
+
}
|
|
60
|
+
else if ((e.key === 'Delete' || e.key === 'Backspace') && state.gradientStops.length > 2) {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
actions.removeStop(stop.id);
|
|
63
|
+
}
|
|
64
|
+
}, [actions, state.gradientStops.length]);
|
|
65
|
+
return (jsx("div", { ref: trackRef, "data-testid": sliderTestId, className: "relative h-3 w-full cursor-pointer rounded-full ring-[0.5px] ring-alpha-black/10 ring-inset", style: { background: toGradientCSS(state.gradientStops, 'linear', 90) }, onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerUp, onPointerCancel: handlePointerUp, children: state.gradientStops.map((stop) => (jsx("button", { type: "button", tabIndex: 0, onPointerDown: (e) => handleInnerDown(e, stop), onFocus: () => actions.selectStop(stop.id), onKeyDown: (e) => handleInnerKeyDown(e, stop), className: "absolute top-1/2 size-5 -translate-x-1/2 -translate-y-1/2 cursor-grab rounded-full border-[3px] border-white shadow-md outline-0 outline-focus-ring focus-visible:outline-2 focus-visible:outline-offset-2 active:cursor-grabbing", style: { left: `${stop.position}%`, background: stop.color }, "data-testid": prefix ? joinTestId(prefix, `stop-${stop.id}-thumb`) : undefined, role: "slider", "aria-label": `Gradient stop at ${Math.round(stop.position)}%`, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(stop.position) }, stop.id))) }));
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export { GradientSlider };
|
|
69
|
+
//# sourceMappingURL=gradient-slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-slider.js","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-slider.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var uiIcons = require('@flipdish/ui-icons');
|
|
5
|
+
var Button = require('@flipdish/ui-library/components/atoms/Button');
|
|
6
|
+
var testIdUtils = require('@flipdish/ui-library/utilities/testIdUtils');
|
|
7
|
+
var gradientPickerContext = require('../providers/gradient-picker-context.cjs');
|
|
8
|
+
var gradientStopRow = require('./gradient-stop-row.cjs');
|
|
9
|
+
|
|
10
|
+
/** Editable list of gradient stops with add/remove controls. */
|
|
11
|
+
const GradientStopList = () => {
|
|
12
|
+
const { state, actions } = gradientPickerContext.useGradientColorPicker();
|
|
13
|
+
const prefix = testIdUtils.useTestIdPrefix();
|
|
14
|
+
return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", "data-testid": prefix ? testIdUtils.joinTestId(prefix, 'stop-list') : undefined, children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [jsxRuntime.jsx("p", { className: "flex-1 text-sm font-semibold text-secondary", children: "Stops" }), jsxRuntime.jsx(Button.Button, { size: "xs", color: "link-gray", iconLeading: uiIcons.Plus, onClick: () => actions.addStop(), children: "Add" })] }), jsxRuntime.jsx("div", { className: "flex flex-col gap-3", children: state.gradientStops.map((stop) => (jsxRuntime.jsx(gradientStopRow.GradientStopRow, { stopId: stop.id }, stop.id))) })] }));
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
exports.GradientStopList = GradientStopList;
|
|
18
|
+
//# sourceMappingURL=gradient-stop-list.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-stop-list.cjs","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-stop-list.tsx"],"sourcesContent":[null],"names":["useGradientColorPicker","useTestIdPrefix","_jsxs","joinTestId","_jsx","Button","Plus","GradientStopRow"],"mappings":";;;;;;;;;AASA;AACO,MAAM,gBAAgB,GAAG,MAAK;IACnC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAGA,4CAAsB,EAAE;AACnD,IAAA,MAAM,MAAM,GAAGC,2BAAe,EAAE;IAEhC,QACEC,yBAAK,SAAS,EAAC,qBAAqB,EAAA,aAAA,EAAc,MAAM,GAAGC,sBAAU,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,EAAA,QAAA,EAAA,CACpGD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,aACtCE,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,6CAA6C,EAAA,QAAA,EAAA,OAAA,EAAA,CAAU,EACpEA,cAAA,CAACC,aAAM,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,WAAW,EAAC,WAAW,EAAEC,YAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,oBAE9E,CAAA,EAAA,CACL,EACNF,wBAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EACjC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAA0C,MAClEA,cAAA,CAACG,+BAAe,EAAA,EAAe,MAAM,EAAE,IAAI,CAAC,EAAY,EAAA,EAAlC,IAAI,CAAC,EAAE,CAA+B,CAC7D,CAAC,EAAA,CACE,CAAA,EAAA,CACF;AAEV;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-stop-list.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-stop-list.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,yBAmB5B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Plus } from '@flipdish/ui-icons';
|
|
3
|
+
import { Button } from '@flipdish/ui-library/components/atoms/Button';
|
|
4
|
+
import { useTestIdPrefix, joinTestId } from '@flipdish/ui-library/utilities/testIdUtils';
|
|
5
|
+
import { useGradientColorPicker } from '../providers/gradient-picker-context.js';
|
|
6
|
+
import { GradientStopRow } from './gradient-stop-row.js';
|
|
7
|
+
|
|
8
|
+
/** Editable list of gradient stops with add/remove controls. */
|
|
9
|
+
const GradientStopList = () => {
|
|
10
|
+
const { state, actions } = useGradientColorPicker();
|
|
11
|
+
const prefix = useTestIdPrefix();
|
|
12
|
+
return (jsxs("div", { className: "flex flex-col gap-3", "data-testid": prefix ? joinTestId(prefix, 'stop-list') : undefined, children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("p", { className: "flex-1 text-sm font-semibold text-secondary", children: "Stops" }), jsx(Button, { size: "xs", color: "link-gray", iconLeading: Plus, onClick: () => actions.addStop(), children: "Add" })] }), jsx("div", { className: "flex flex-col gap-3", children: state.gradientStops.map((stop) => (jsx(GradientStopRow, { stopId: stop.id }, stop.id))) })] }));
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { GradientStopList };
|
|
16
|
+
//# sourceMappingURL=gradient-stop-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-stop-list.js","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-stop-list.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":";;;;;;;AASA;AACO,MAAM,gBAAgB,GAAG,MAAK;IACnC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,sBAAsB,EAAE;AACnD,IAAA,MAAM,MAAM,GAAG,eAAe,EAAE;IAEhC,QACEA,cAAK,SAAS,EAAC,qBAAqB,EAAA,aAAA,EAAc,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,EAAA,QAAA,EAAA,CACpGA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,aACtCC,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,6CAA6C,EAAA,QAAA,EAAA,OAAA,EAAA,CAAU,EACpEA,GAAA,CAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,WAAW,EAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,oBAE9E,CAAA,EAAA,CACL,EACNA,aAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EACjC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAA0C,MAClEA,GAAA,CAAC,eAAe,EAAA,EAAe,MAAM,EAAE,IAAI,CAAC,EAAY,EAAA,EAAlC,IAAI,CAAC,EAAE,CAA+B,CAC7D,CAAC,EAAA,CACE,CAAA,EAAA,CACF;AAEV;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var uiIcons = require('@flipdish/ui-icons');
|
|
5
|
+
var UtilityButton = require('@flipdish/ui-library/components/atoms/UtilityButton');
|
|
6
|
+
var testIdUtils = require('@flipdish/ui-library/utilities/testIdUtils');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var reactAriaComponents = require('react-aria-components');
|
|
9
|
+
var colorPicker_utils = require('../../ColorPicker/colorPicker.utils.cjs');
|
|
10
|
+
var inputCell = require('../../ColorPicker/components/input-cell.cjs');
|
|
11
|
+
var gradientPickerContext = require('../providers/gradient-picker-context.cjs');
|
|
12
|
+
var positionInput = require('./position-input.cjs');
|
|
13
|
+
|
|
14
|
+
/** Row for a single gradient stop: position input, color field, alpha field, and remove button. */
|
|
15
|
+
const GradientStopRow = ({ stopId }) => {
|
|
16
|
+
const { state, actions } = gradientPickerContext.useGradientColorPicker();
|
|
17
|
+
const stop = state.gradientStops.find((s) => s.id === stopId);
|
|
18
|
+
const prefix = testIdUtils.useTestIdPrefix();
|
|
19
|
+
// Memoize on `stop`: a fresh `Color` reference each provider re-render resets the AriaColorFields' in-progress draft, making typed edits impossible; the reducer only reallocates the stop that changed, so `stop` identity tracks color/alpha exactly (see gradient-picker-context.tsx).
|
|
20
|
+
const colorValue = React.useMemo(() => {
|
|
21
|
+
if (!stop)
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
return reactAriaComponents.parseColor(stop.color).withChannelValue('alpha', stop.alpha / 100);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}, [stop]);
|
|
30
|
+
if (!stop)
|
|
31
|
+
return null;
|
|
32
|
+
const canRemove = state.gradientStops.length > 2;
|
|
33
|
+
return (
|
|
34
|
+
// biome-ignore lint/a11y/noStaticElementInteractions: this is a div that is not interactive
|
|
35
|
+
// biome-ignore lint/a11y/useKeyWithClickEvents: this is a click event
|
|
36
|
+
jsxRuntime.jsxs("div", { className: "flex items-center gap-3", "data-testid": prefix ? testIdUtils.joinTestId(prefix, `stop-${stopId}`) : undefined, onClick: () => actions.selectStop(stopId), children: [jsxRuntime.jsx(positionInput.PositionInput, { value: stop.position, onChange: (pos) => actions.moveStop(stopId, pos) }), jsxRuntime.jsxs("div", { className: "flex flex-1 items-center gap-1", children: [jsxRuntime.jsxs("div", { className: "flex flex-1 shadow-xs", children: [jsxRuntime.jsx(inputCell.InputCell, { position: "first", className: "flex-1", children: jsxRuntime.jsxs(reactAriaComponents.ColorField, { "aria-label": "Stop color", value: colorValue, onChange: (c) => {
|
|
37
|
+
if (c)
|
|
38
|
+
actions.setStopColorAndAlpha(stopId, c.toString('hex'), Math.round(c.getChannelValue('alpha') * 100));
|
|
39
|
+
}, className: "flex flex-1 items-center gap-2 px-2.5 py-2", children: [jsxRuntime.jsx(reactAriaComponents.ColorSwatch, { color: colorValue || undefined, className: "size-4 shrink-0 rounded-full ring-1 ring-alpha-black/10 ring-inset", style: ({ defaultStyle }) => defaultStyle }), jsxRuntime.jsx(reactAriaComponents.Input, { onFocus: colorPicker_utils.selectAllOnFocus, className: "w-full min-w-0 bg-transparent text-sm text-primary outline-hidden" })] }) }), jsxRuntime.jsx(inputCell.InputCell, { position: "last", className: "w-14 shrink-0", children: jsxRuntime.jsx(reactAriaComponents.ColorField, { "aria-label": "Stop alpha", channel: "alpha", value: colorValue, onChange: (c) => {
|
|
40
|
+
if (c)
|
|
41
|
+
actions.setStopAlpha(stopId, Math.round(c.getChannelValue('alpha') * 100));
|
|
42
|
+
}, className: "flex w-full items-center", children: jsxRuntime.jsx(reactAriaComponents.Input, { onFocus: colorPicker_utils.selectAllOnFocus, className: "w-full min-w-0 bg-transparent px-2.5 py-2 text-sm text-primary outline-hidden" }) }) })] }), jsxRuntime.jsx(UtilityButton.ButtonUtility, { icon: uiIcons.Minus, size: "xs", color: "tertiary", isDisabled: !canRemove, tooltip: "Remove stop", onClick: (e) => {
|
|
43
|
+
e.stopPropagation();
|
|
44
|
+
actions.removeStop(stopId);
|
|
45
|
+
} })] })] }));
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
exports.GradientStopRow = GradientStopRow;
|
|
49
|
+
//# sourceMappingURL=gradient-stop-row.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-stop-row.cjs","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-stop-row.tsx"],"sourcesContent":[null],"names":["useGradientColorPicker","useTestIdPrefix","useMemo","parseColor","_jsxs","joinTestId","_jsx","PositionInput","InputCell","AriaColorField","AriaColorSwatch","AriaInput","selectAllOnFocus","ButtonUtility","Minus"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
/** Row for a single gradient stop: position input, color field, alpha field, and remove button. */
|
|
3
|
+
export declare const GradientStopRow: ({ stopId }: {
|
|
4
|
+
stopId: string;
|
|
5
|
+
}) => React.JSX.Element | null;
|
|
6
|
+
//# sourceMappingURL=gradient-stop-row.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-stop-row.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-stop-row.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,mGAAmG;AACnG,eAAO,MAAM,eAAe,GAAI,YAAY;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,6BA6E7D,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Minus } from '@flipdish/ui-icons';
|
|
3
|
+
import { ButtonUtility } from '@flipdish/ui-library/components/atoms/UtilityButton';
|
|
4
|
+
import { useTestIdPrefix, joinTestId } from '@flipdish/ui-library/utilities/testIdUtils';
|
|
5
|
+
import { useMemo } from 'react';
|
|
6
|
+
import { parseColor, ColorField, ColorSwatch, Input } from 'react-aria-components';
|
|
7
|
+
import { selectAllOnFocus } from '../../ColorPicker/colorPicker.utils.js';
|
|
8
|
+
import { InputCell } from '../../ColorPicker/components/input-cell.js';
|
|
9
|
+
import { useGradientColorPicker } from '../providers/gradient-picker-context.js';
|
|
10
|
+
import { PositionInput } from './position-input.js';
|
|
11
|
+
|
|
12
|
+
/** Row for a single gradient stop: position input, color field, alpha field, and remove button. */
|
|
13
|
+
const GradientStopRow = ({ stopId }) => {
|
|
14
|
+
const { state, actions } = useGradientColorPicker();
|
|
15
|
+
const stop = state.gradientStops.find((s) => s.id === stopId);
|
|
16
|
+
const prefix = useTestIdPrefix();
|
|
17
|
+
// Memoize on `stop`: a fresh `Color` reference each provider re-render resets the AriaColorFields' in-progress draft, making typed edits impossible; the reducer only reallocates the stop that changed, so `stop` identity tracks color/alpha exactly (see gradient-picker-context.tsx).
|
|
18
|
+
const colorValue = useMemo(() => {
|
|
19
|
+
if (!stop)
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
return parseColor(stop.color).withChannelValue('alpha', stop.alpha / 100);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}, [stop]);
|
|
28
|
+
if (!stop)
|
|
29
|
+
return null;
|
|
30
|
+
const canRemove = state.gradientStops.length > 2;
|
|
31
|
+
return (
|
|
32
|
+
// biome-ignore lint/a11y/noStaticElementInteractions: this is a div that is not interactive
|
|
33
|
+
// biome-ignore lint/a11y/useKeyWithClickEvents: this is a click event
|
|
34
|
+
jsxs("div", { className: "flex items-center gap-3", "data-testid": prefix ? joinTestId(prefix, `stop-${stopId}`) : undefined, onClick: () => actions.selectStop(stopId), children: [jsx(PositionInput, { value: stop.position, onChange: (pos) => actions.moveStop(stopId, pos) }), jsxs("div", { className: "flex flex-1 items-center gap-1", children: [jsxs("div", { className: "flex flex-1 shadow-xs", children: [jsx(InputCell, { position: "first", className: "flex-1", children: jsxs(ColorField, { "aria-label": "Stop color", value: colorValue, onChange: (c) => {
|
|
35
|
+
if (c)
|
|
36
|
+
actions.setStopColorAndAlpha(stopId, c.toString('hex'), Math.round(c.getChannelValue('alpha') * 100));
|
|
37
|
+
}, className: "flex flex-1 items-center gap-2 px-2.5 py-2", children: [jsx(ColorSwatch, { color: colorValue || undefined, className: "size-4 shrink-0 rounded-full ring-1 ring-alpha-black/10 ring-inset", style: ({ defaultStyle }) => defaultStyle }), jsx(Input, { onFocus: selectAllOnFocus, className: "w-full min-w-0 bg-transparent text-sm text-primary outline-hidden" })] }) }), jsx(InputCell, { position: "last", className: "w-14 shrink-0", children: jsx(ColorField, { "aria-label": "Stop alpha", channel: "alpha", value: colorValue, onChange: (c) => {
|
|
38
|
+
if (c)
|
|
39
|
+
actions.setStopAlpha(stopId, Math.round(c.getChannelValue('alpha') * 100));
|
|
40
|
+
}, className: "flex w-full items-center", children: jsx(Input, { onFocus: selectAllOnFocus, className: "w-full min-w-0 bg-transparent px-2.5 py-2 text-sm text-primary outline-hidden" }) }) })] }), jsx(ButtonUtility, { icon: Minus, size: "xs", color: "tertiary", isDisabled: !canRemove, tooltip: "Remove stop", onClick: (e) => {
|
|
41
|
+
e.stopPropagation();
|
|
42
|
+
actions.removeStop(stopId);
|
|
43
|
+
} })] })] }));
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export { GradientStopRow };
|
|
47
|
+
//# sourceMappingURL=gradient-stop-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-stop-row.js","sources":["../../../../../src/components/organisms/GradientPicker/components/gradient-stop-row.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx","AriaColorField","AriaColorSwatch","AriaInput"],"mappings":"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"}
|