@flipdish/ui-library 0.21.0 → 0.23.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 (244) hide show
  1. package/dist/components/__internal__/statusIcon/statusIcon.types.d.ts +12 -0
  2. package/dist/components/__internal__/statusIcon/statusIcon.types.d.ts.map +1 -0
  3. package/dist/components/__internal__/statusIcon/statusIcon.utils.cjs +21 -0
  4. package/dist/components/__internal__/statusIcon/statusIcon.utils.cjs.map +1 -0
  5. package/dist/components/__internal__/statusIcon/statusIcon.utils.d.ts +5 -0
  6. package/dist/components/__internal__/statusIcon/statusIcon.utils.d.ts.map +1 -0
  7. package/dist/components/__internal__/statusIcon/statusIcon.utils.js +19 -0
  8. package/dist/components/__internal__/statusIcon/statusIcon.utils.js.map +1 -0
  9. package/dist/components/atoms/BackgroundPattern/components/grid-check.cjs +14 -7
  10. package/dist/components/atoms/BackgroundPattern/components/grid-check.cjs.map +1 -1
  11. package/dist/components/atoms/BackgroundPattern/components/grid-check.d.ts.map +1 -1
  12. package/dist/components/atoms/BackgroundPattern/components/grid-check.js +14 -7
  13. package/dist/components/atoms/BackgroundPattern/components/grid-check.js.map +1 -1
  14. package/dist/components/atoms/BackgroundPattern/index.d.ts.map +1 -1
  15. package/dist/components/atoms/Badge/index.cjs +16 -3
  16. package/dist/components/atoms/Badge/index.cjs.map +1 -1
  17. package/dist/components/atoms/Badge/index.d.ts +13 -24
  18. package/dist/components/atoms/Badge/index.d.ts.map +1 -1
  19. package/dist/components/atoms/Badge/index.js +16 -3
  20. package/dist/components/atoms/Badge/index.js.map +1 -1
  21. package/dist/components/atoms/Dot/Dot.styles.cjs +51 -0
  22. package/dist/components/atoms/Dot/Dot.styles.cjs.map +1 -0
  23. package/dist/components/atoms/Dot/Dot.styles.d.ts +109 -0
  24. package/dist/components/atoms/Dot/Dot.styles.d.ts.map +1 -0
  25. package/dist/components/atoms/Dot/Dot.styles.js +49 -0
  26. package/dist/components/atoms/Dot/Dot.styles.js.map +1 -0
  27. package/dist/components/atoms/Dot/index.cjs +5 -14
  28. package/dist/components/atoms/Dot/index.cjs.map +1 -1
  29. package/dist/components/atoms/Dot/index.d.ts +11 -3
  30. package/dist/components/atoms/Dot/index.d.ts.map +1 -1
  31. package/dist/components/atoms/Dot/index.js +5 -14
  32. package/dist/components/atoms/Dot/index.js.map +1 -1
  33. package/dist/components/molecules/Alert/index.cjs +3 -11
  34. package/dist/components/molecules/Alert/index.cjs.map +1 -1
  35. package/dist/components/molecules/Alert/index.d.ts +3 -2
  36. package/dist/components/molecules/Alert/index.d.ts.map +1 -1
  37. package/dist/components/molecules/Alert/index.js +3 -11
  38. package/dist/components/molecules/Alert/index.js.map +1 -1
  39. package/dist/components/molecules/Carousel/index.cjs +1 -1
  40. package/dist/components/molecules/Carousel/index.cjs.map +1 -1
  41. package/dist/components/molecules/Carousel/index.js +1 -1
  42. package/dist/components/molecules/Carousel/index.js.map +1 -1
  43. package/dist/components/molecules/Notification/index.cjs +3 -10
  44. package/dist/components/molecules/Notification/index.cjs.map +1 -1
  45. package/dist/components/molecules/Notification/index.d.ts +2 -1
  46. package/dist/components/molecules/Notification/index.d.ts.map +1 -1
  47. package/dist/components/molecules/Notification/index.js +3 -10
  48. package/dist/components/molecules/Notification/index.js.map +1 -1
  49. package/dist/components/molecules/Pagination/index.cjs +4 -4
  50. package/dist/components/molecules/Pagination/index.cjs.map +1 -1
  51. package/dist/components/molecules/Pagination/index.js +5 -5
  52. package/dist/components/molecules/Pagination/index.js.map +1 -1
  53. package/dist/components/molecules/Tags/index.cjs +1 -1
  54. package/dist/components/molecules/Tags/index.cjs.map +1 -1
  55. package/dist/components/molecules/Tags/index.js +1 -1
  56. package/dist/components/molecules/Tags/index.js.map +1 -1
  57. package/dist/components/organisms/ActivityFeed/index.cjs +1 -1
  58. package/dist/components/organisms/ActivityFeed/index.cjs.map +1 -1
  59. package/dist/components/organisms/ActivityFeed/index.js +1 -1
  60. package/dist/components/organisms/ActivityFeed/index.js.map +1 -1
  61. package/dist/components/organisms/Calendar/calendar.utils.cjs +41 -0
  62. package/dist/components/organisms/Calendar/calendar.utils.cjs.map +1 -1
  63. package/dist/components/organisms/Calendar/calendar.utils.d.ts +20 -0
  64. package/dist/components/organisms/Calendar/calendar.utils.d.ts.map +1 -1
  65. package/dist/components/organisms/Calendar/calendar.utils.js +37 -1
  66. package/dist/components/organisms/Calendar/calendar.utils.js.map +1 -1
  67. package/dist/components/organisms/Calendar/components/calendar-day-view.cjs +86 -0
  68. package/dist/components/organisms/Calendar/components/calendar-day-view.cjs.map +1 -0
  69. package/dist/components/organisms/Calendar/components/calendar-day-view.d.ts +20 -0
  70. package/dist/components/organisms/Calendar/components/calendar-day-view.d.ts.map +1 -0
  71. package/dist/components/organisms/Calendar/components/calendar-day-view.js +84 -0
  72. package/dist/components/organisms/Calendar/components/calendar-day-view.js.map +1 -0
  73. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.cjs +21 -0
  74. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.cjs.map +1 -0
  75. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.d.ts +16 -0
  76. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.d.ts.map +1 -0
  77. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.js +19 -0
  78. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.js.map +1 -0
  79. package/dist/components/organisms/Calendar/components/calendar-month-view.cjs +265 -0
  80. package/dist/components/organisms/Calendar/components/calendar-month-view.cjs.map +1 -0
  81. package/dist/components/organisms/Calendar/components/calendar-month-view.d.ts +18 -0
  82. package/dist/components/organisms/Calendar/components/calendar-month-view.d.ts.map +1 -0
  83. package/dist/components/organisms/Calendar/components/calendar-month-view.js +263 -0
  84. package/dist/components/organisms/Calendar/components/calendar-month-view.js.map +1 -0
  85. package/dist/components/organisms/Calendar/components/calendar-positioned-event.cjs +41 -0
  86. package/dist/components/organisms/Calendar/components/calendar-positioned-event.cjs.map +1 -0
  87. package/dist/components/organisms/Calendar/components/calendar-positioned-event.d.ts +15 -0
  88. package/dist/components/organisms/Calendar/components/calendar-positioned-event.d.ts.map +1 -0
  89. package/dist/components/organisms/Calendar/components/calendar-positioned-event.js +39 -0
  90. package/dist/components/organisms/Calendar/components/calendar-positioned-event.js.map +1 -0
  91. package/dist/components/organisms/Calendar/components/calendar-week-view-day.cjs +23 -0
  92. package/dist/components/organisms/Calendar/components/calendar-week-view-day.cjs.map +1 -0
  93. package/dist/components/organisms/Calendar/components/calendar-week-view-day.d.ts +15 -0
  94. package/dist/components/organisms/Calendar/components/calendar-week-view-day.d.ts.map +1 -0
  95. package/dist/components/organisms/Calendar/components/calendar-week-view-day.js +21 -0
  96. package/dist/components/organisms/Calendar/components/calendar-week-view-day.js.map +1 -0
  97. package/dist/components/organisms/Calendar/components/calendar-week-view.cjs +77 -0
  98. package/dist/components/organisms/Calendar/components/calendar-week-view.cjs.map +1 -0
  99. package/dist/components/organisms/Calendar/components/calendar-week-view.d.ts +20 -0
  100. package/dist/components/organisms/Calendar/components/calendar-week-view.d.ts.map +1 -0
  101. package/dist/components/organisms/Calendar/components/calendar-week-view.js +75 -0
  102. package/dist/components/organisms/Calendar/components/calendar-week-view.js.map +1 -0
  103. package/dist/components/organisms/Calendar/index.cjs +4 -504
  104. package/dist/components/organisms/Calendar/index.cjs.map +1 -1
  105. package/dist/components/organisms/Calendar/index.d.ts +1 -1
  106. package/dist/components/organisms/Calendar/index.d.ts.map +1 -1
  107. package/dist/components/organisms/Calendar/index.js +6 -506
  108. package/dist/components/organisms/Calendar/index.js.map +1 -1
  109. package/dist/components/organisms/Charts/components/activity-gauge.cjs +4 -0
  110. package/dist/components/organisms/Charts/components/activity-gauge.cjs.map +1 -1
  111. package/dist/components/organisms/Charts/components/activity-gauge.d.ts +4 -0
  112. package/dist/components/organisms/Charts/components/activity-gauge.d.ts.map +1 -1
  113. package/dist/components/organisms/Charts/components/activity-gauge.js +4 -0
  114. package/dist/components/organisms/Charts/components/activity-gauge.js.map +1 -1
  115. package/dist/components/organisms/Charts/components/bar-chart.cjs +1 -1
  116. package/dist/components/organisms/Charts/components/bar-chart.cjs.map +1 -1
  117. package/dist/components/organisms/Charts/components/bar-chart.d.ts +1 -2
  118. package/dist/components/organisms/Charts/components/bar-chart.d.ts.map +1 -1
  119. package/dist/components/organisms/Charts/components/bar-chart.js +2 -2
  120. package/dist/components/organisms/Charts/components/bar-chart.js.map +1 -1
  121. package/dist/components/organisms/Charts/components/charts-base.cjs +1 -2
  122. package/dist/components/organisms/Charts/components/charts-base.cjs.map +1 -1
  123. package/dist/components/organisms/Charts/components/charts-base.d.ts +13 -2
  124. package/dist/components/organisms/Charts/components/charts-base.d.ts.map +1 -1
  125. package/dist/components/organisms/Charts/components/charts-base.js +1 -2
  126. package/dist/components/organisms/Charts/components/charts-base.js.map +1 -1
  127. package/dist/components/organisms/Charts/components/line-chart.cjs +1 -1
  128. package/dist/components/organisms/Charts/components/line-chart.cjs.map +1 -1
  129. package/dist/components/organisms/Charts/components/line-chart.d.ts +1 -2
  130. package/dist/components/organisms/Charts/components/line-chart.d.ts.map +1 -1
  131. package/dist/components/organisms/Charts/components/line-chart.js +2 -2
  132. package/dist/components/organisms/Charts/components/line-chart.js.map +1 -1
  133. package/dist/components/organisms/Charts/components/pie-chart.cjs +5 -0
  134. package/dist/components/organisms/Charts/components/pie-chart.cjs.map +1 -1
  135. package/dist/components/organisms/Charts/components/pie-chart.d.ts +6 -2
  136. package/dist/components/organisms/Charts/components/pie-chart.d.ts.map +1 -1
  137. package/dist/components/organisms/Charts/components/pie-chart.js +5 -0
  138. package/dist/components/organisms/Charts/components/pie-chart.js.map +1 -1
  139. package/dist/components/organisms/Charts/components/radar-chart.cjs +3 -4
  140. package/dist/components/organisms/Charts/components/radar-chart.cjs.map +1 -1
  141. package/dist/components/organisms/Charts/components/radar-chart.d.ts.map +1 -1
  142. package/dist/components/organisms/Charts/components/radar-chart.js +3 -4
  143. package/dist/components/organisms/Charts/components/radar-chart.js.map +1 -1
  144. package/dist/components/organisms/DatePicker/components/range-calendar.cjs +1 -1
  145. package/dist/components/organisms/DatePicker/components/range-calendar.cjs.map +1 -1
  146. package/dist/components/organisms/DatePicker/components/range-calendar.js +2 -2
  147. package/dist/components/organisms/DatePicker/components/range-calendar.js.map +1 -1
  148. package/dist/components/organisms/GradientPicker/components/gradient-area.cjs +157 -0
  149. package/dist/components/organisms/GradientPicker/components/gradient-area.cjs.map +1 -0
  150. package/dist/components/organisms/GradientPicker/components/gradient-area.d.ts +17 -0
  151. package/dist/components/organisms/GradientPicker/components/gradient-area.d.ts.map +1 -0
  152. package/dist/components/organisms/GradientPicker/components/gradient-area.js +155 -0
  153. package/dist/components/organisms/GradientPicker/components/gradient-area.js.map +1 -0
  154. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.cjs +17 -0
  155. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.cjs.map +1 -0
  156. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.d.ts +3 -0
  157. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.d.ts.map +1 -0
  158. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.js +15 -0
  159. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.js.map +1 -0
  160. package/dist/components/organisms/GradientPicker/components/gradient-slider.cjs +71 -0
  161. package/dist/components/organisms/GradientPicker/components/gradient-slider.cjs.map +1 -0
  162. package/dist/components/organisms/GradientPicker/components/gradient-slider.d.ts +7 -0
  163. package/dist/components/organisms/GradientPicker/components/gradient-slider.d.ts.map +1 -0
  164. package/dist/components/organisms/GradientPicker/components/gradient-slider.js +69 -0
  165. package/dist/components/organisms/GradientPicker/components/gradient-slider.js.map +1 -0
  166. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.cjs +18 -0
  167. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.cjs.map +1 -0
  168. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.d.ts +4 -0
  169. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.d.ts.map +1 -0
  170. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.js +16 -0
  171. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.js.map +1 -0
  172. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.cjs +49 -0
  173. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.cjs.map +1 -0
  174. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.d.ts +6 -0
  175. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.d.ts.map +1 -0
  176. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.js +47 -0
  177. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.js.map +1 -0
  178. package/dist/components/organisms/GradientPicker/components/gradient-type-select.cjs +28 -0
  179. package/dist/components/organisms/GradientPicker/components/gradient-type-select.cjs.map +1 -0
  180. package/dist/components/organisms/GradientPicker/components/gradient-type-select.d.ts +3 -0
  181. package/dist/components/organisms/GradientPicker/components/gradient-type-select.d.ts.map +1 -0
  182. package/dist/components/organisms/GradientPicker/components/gradient-type-select.js +26 -0
  183. package/dist/components/organisms/GradientPicker/components/gradient-type-select.js.map +1 -0
  184. package/dist/components/organisms/GradientPicker/components/position-input.cjs +43 -0
  185. package/dist/components/organisms/GradientPicker/components/position-input.cjs.map +1 -0
  186. package/dist/components/organisms/GradientPicker/components/position-input.d.ts +6 -0
  187. package/dist/components/organisms/GradientPicker/components/position-input.d.ts.map +1 -0
  188. package/dist/components/organisms/GradientPicker/components/position-input.js +41 -0
  189. package/dist/components/organisms/GradientPicker/components/position-input.js.map +1 -0
  190. package/dist/components/organisms/GradientPicker/index.cjs +11 -327
  191. package/dist/components/organisms/GradientPicker/index.cjs.map +1 -1
  192. package/dist/components/organisms/GradientPicker/index.d.ts +7 -8
  193. package/dist/components/organisms/GradientPicker/index.d.ts.map +1 -1
  194. package/dist/components/organisms/GradientPicker/index.js +7 -323
  195. package/dist/components/organisms/GradientPicker/index.js.map +1 -1
  196. package/dist/components/organisms/HeaderNavigation/components/nav-account-card.cjs +1 -1
  197. package/dist/components/organisms/HeaderNavigation/components/nav-account-card.cjs.map +1 -1
  198. package/dist/components/organisms/HeaderNavigation/components/nav-account-card.js +2 -2
  199. package/dist/components/organisms/HeaderNavigation/components/nav-account-card.js.map +1 -1
  200. package/dist/components/organisms/HeaderNavigation/components/nav-button.cjs +1 -1
  201. package/dist/components/organisms/HeaderNavigation/components/nav-button.cjs.map +1 -1
  202. package/dist/components/organisms/HeaderNavigation/components/nav-button.d.ts.map +1 -1
  203. package/dist/components/organisms/HeaderNavigation/components/nav-button.js +1 -1
  204. package/dist/components/organisms/HeaderNavigation/components/nav-button.js.map +1 -1
  205. package/dist/components/organisms/SidebarNavigation/components/nav-account-card.cjs +1 -1
  206. package/dist/components/organisms/SidebarNavigation/components/nav-account-card.cjs.map +1 -1
  207. package/dist/components/organisms/SidebarNavigation/components/nav-account-card.js +2 -2
  208. package/dist/components/organisms/SidebarNavigation/components/nav-account-card.js.map +1 -1
  209. package/dist/components/organisms/SidebarNavigation/index.cjs +1 -1
  210. package/dist/components/organisms/SidebarNavigation/index.cjs.map +1 -1
  211. package/dist/components/organisms/SidebarNavigation/index.js +2 -2
  212. package/dist/components/organisms/SidebarNavigation/index.js.map +1 -1
  213. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.cjs +169 -0
  214. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.cjs.map +1 -0
  215. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.d.ts +34 -0
  216. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.d.ts.map +1 -0
  217. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.js +167 -0
  218. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.js.map +1 -0
  219. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.cjs +75 -0
  220. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.cjs.map +1 -0
  221. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.d.ts +16 -0
  222. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.d.ts.map +1 -0
  223. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.js +73 -0
  224. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.js.map +1 -0
  225. package/dist/components/organisms/VideoPlayer/index.cjs +9 -182
  226. package/dist/components/organisms/VideoPlayer/index.cjs.map +1 -1
  227. package/dist/components/organisms/VideoPlayer/index.d.ts.map +1 -1
  228. package/dist/components/organisms/VideoPlayer/index.js +10 -183
  229. package/dist/components/organisms/VideoPlayer/index.js.map +1 -1
  230. package/dist/hooks/useBreakpoints/index.cjs +4 -1
  231. package/dist/hooks/useBreakpoints/index.cjs.map +1 -1
  232. package/dist/hooks/useBreakpoints/index.d.ts +2 -0
  233. package/dist/hooks/useBreakpoints/index.d.ts.map +1 -1
  234. package/dist/hooks/useBreakpoints/index.js +4 -2
  235. package/dist/hooks/useBreakpoints/index.js.map +1 -1
  236. package/dist/native/components/atoms/Dot/Dot.styles.d.ts +109 -0
  237. package/dist/native/components/atoms/Dot/Dot.styles.d.ts.map +1 -0
  238. package/dist/native/components/atoms/Dot/Dot.styles.js +49 -0
  239. package/dist/native/components/atoms/Dot/Dot.styles.js.map +1 -0
  240. package/dist/native/components/atoms/Dot/index.d.ts +24 -8
  241. package/dist/native/components/atoms/Dot/index.d.ts.map +1 -0
  242. package/dist/native/components/atoms/Dot/index.js +25 -0
  243. package/dist/native/components/atoms/Dot/index.js.map +1 -0
  244. 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,3 @@
1
+ /** Button to reverse the gradient by mirroring all stop colors. */
2
+ export declare const GradientReverseButton: () => import("react").JSX.Element;
3
+ //# sourceMappingURL=gradient-reverse-button.d.ts.map
@@ -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,4 @@
1
+ import type React from 'react';
2
+ /** Editable list of gradient stops with add/remove controls. */
3
+ export declare const GradientStopList: () => React.JSX.Element;
4
+ //# sourceMappingURL=gradient-stop-list.d.ts.map
@@ -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":";;;;;;;;;;;AAcA;MACa,eAAe,GAAG,CAAC,EAAE,MAAM,EAAsB,KAAI;IAChE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,sBAAsB,EAAE;AACnD,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAiB,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC;AAC7E,IAAA,MAAM,MAAM,GAAG,eAAe,EAAE;;AAGhC,IAAA,MAAM,UAAU,GAAG,OAAO,CAAe,MAAK;AAC5C,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;AACtB,QAAA,IAAI;AACF,YAAA,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QAC3E;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;AACF,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAEV,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;IAEtB,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;IAEhD;;;IAGEA,IAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,yBAAyB,EAAA,aAAA,EACtB,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAC,GAAG,SAAS,EACtE,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAA,QAAA,EAAA,CAEzCC,GAAA,CAAC,aAAa,EAAA,EAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAA,CAAI,EAEzFD,cAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAA,CAC7CA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,aACpCC,GAAA,CAAC,SAAS,IAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAA,QAAA,EAC5CD,KAACE,UAAc,EAAA,EAAA,YAAA,EACF,YAAY,EACvB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,KAAI;AACd,wCAAA,IAAI,CAAC;4CAAE,OAAO,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAC9G,oCAAA,CAAC,EACD,SAAS,EAAC,4CAA4C,aAEtDD,GAAA,CAACE,WAAe,EAAA,EACd,KAAK,EAAE,UAAU,IAAI,SAAS,EAC9B,SAAS,EAAC,oEAAoE,EAC9E,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,YAAY,GACzC,EACFF,GAAA,CAACG,KAAS,EAAA,EAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAC,mEAAmE,EAAA,CAAG,CAAA,EAAA,CACvG,GACP,EACZH,GAAA,CAAC,SAAS,EAAA,EAAC,QAAQ,EAAC,MAAM,EAAC,SAAS,EAAC,eAAe,EAAA,QAAA,EAClDA,GAAA,CAACC,UAAc,kBACF,YAAY,EACvB,OAAO,EAAC,OAAO,EACf,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,KAAI;AACd,wCAAA,IAAI,CAAC;AAAE,4CAAA,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;oCACnF,CAAC,EACD,SAAS,EAAC,0BAA0B,YAEpCD,GAAA,CAACG,KAAS,EAAA,EAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAC,+EAA+E,EAAA,CAAG,EAAA,CACnH,GACP,CAAA,EAAA,CACR,EAENH,GAAA,CAAC,aAAa,EAAA,EACZ,IAAI,EAAE,KAAK,EACX,IAAI,EAAC,IAAI,EACT,KAAK,EAAC,UAAU,EAChB,UAAU,EAAE,CAAC,SAAS,EACtB,OAAO,EAAC,aAAa,EACrB,OAAO,EAAE,CAAC,CAAmB,KAAI;4BAC/B,CAAC,CAAC,eAAe,EAAE;AACnB,4BAAA,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;AAC5B,wBAAA,CAAC,EAAA,CACD,CAAA,EAAA,CACE,CAAA,EAAA,CACF;AAEV;;;;"}