cursedbelt 5.77.0 → 5.79.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 (188) hide show
  1. package/dist/react/canvas-hud/CanvasToolbar.d.ts +1 -1
  2. package/dist/react/canvas-hud/HudControls.d.ts +8 -2
  3. package/dist/react/canvas-hud/HudControls.d.ts.map +1 -1
  4. package/dist/react/canvas-hud/HudControls.js +6 -3
  5. package/dist/react/canvas-hud/HudControls.js.map +1 -1
  6. package/dist/react/components/AppShell.d.ts +14 -0
  7. package/dist/react/components/AppShell.d.ts.map +1 -1
  8. package/dist/react/components/AppShell.js +7 -31
  9. package/dist/react/components/AppShell.js.map +1 -1
  10. package/dist/react/components/ChipFilterStrip.d.ts.map +1 -1
  11. package/dist/react/components/ChipFilterStrip.js +2 -18
  12. package/dist/react/components/ChipFilterStrip.js.map +1 -1
  13. package/dist/react/components/DataTable/TableFilterBuilder.d.ts.map +1 -1
  14. package/dist/react/components/DataTable/TableFilterBuilder.js +2 -2
  15. package/dist/react/components/DataTable/TableFilterBuilder.js.map +1 -1
  16. package/dist/react/components/KanbanBoard.d.ts +55 -0
  17. package/dist/react/components/KanbanBoard.d.ts.map +1 -0
  18. package/dist/react/components/KanbanBoard.js +89 -0
  19. package/dist/react/components/KanbanBoard.js.map +1 -0
  20. package/dist/react/components/ListToolbar.d.ts +2 -2
  21. package/dist/react/components/ListToolbar.d.ts.map +1 -1
  22. package/dist/react/components/ListToolbar.js +1 -1
  23. package/dist/react/components/ResponsiveWorkbench.d.ts +14 -1
  24. package/dist/react/components/ResponsiveWorkbench.d.ts.map +1 -1
  25. package/dist/react/components/ResponsiveWorkbench.js +33 -4
  26. package/dist/react/components/ResponsiveWorkbench.js.map +1 -1
  27. package/dist/react/components/SelectField.d.ts +18 -48
  28. package/dist/react/components/SelectField.d.ts.map +1 -1
  29. package/dist/react/components/SelectField.js +88 -11
  30. package/dist/react/components/SelectField.js.map +1 -1
  31. package/dist/react/components/SelectFieldImpl.d.ts +7 -0
  32. package/dist/react/components/SelectFieldImpl.d.ts.map +1 -0
  33. package/dist/react/components/SelectFieldImpl.js +26 -0
  34. package/dist/react/components/SelectFieldImpl.js.map +1 -0
  35. package/dist/react/components/filterChip.d.ts +8 -0
  36. package/dist/react/components/filterChip.d.ts.map +1 -0
  37. package/dist/react/components/filterChip.js +20 -0
  38. package/dist/react/components/filterChip.js.map +1 -0
  39. package/dist/react/hooks/pointerDnd.d.ts +37 -3
  40. package/dist/react/hooks/pointerDnd.d.ts.map +1 -1
  41. package/dist/react/hooks/pointerDnd.js +101 -9
  42. package/dist/react/hooks/pointerDnd.js.map +1 -1
  43. package/dist/react/hooks/pragmaticDnd.d.ts +4 -1
  44. package/dist/react/hooks/pragmaticDnd.d.ts.map +1 -1
  45. package/dist/react/hooks/pragmaticDnd.js +9 -3
  46. package/dist/react/hooks/pragmaticDnd.js.map +1 -1
  47. package/dist/react/hooks/useOutsidePress.d.ts.map +1 -1
  48. package/dist/react/hooks/useOutsidePress.js +18 -3
  49. package/dist/react/hooks/useOutsidePress.js.map +1 -1
  50. package/dist/react/hooks/usePublishedBottomChrome.d.ts +12 -0
  51. package/dist/react/hooks/usePublishedBottomChrome.d.ts.map +1 -0
  52. package/dist/react/hooks/usePublishedBottomChrome.js +31 -0
  53. package/dist/react/hooks/usePublishedBottomChrome.js.map +1 -0
  54. package/dist/react/hooks/useScrollMemory.d.ts +4 -3
  55. package/dist/react/hooks/useScrollMemory.d.ts.map +1 -1
  56. package/dist/react/hooks/useScrollMemory.js +16 -2
  57. package/dist/react/hooks/useScrollMemory.js.map +1 -1
  58. package/dist/react/index.d.ts +3 -0
  59. package/dist/react/index.d.ts.map +1 -1
  60. package/dist/react/index.js +3 -0
  61. package/dist/react/index.js.map +1 -1
  62. package/dist/react/lib/selectField.d.ts +72 -0
  63. package/dist/react/lib/selectField.d.ts.map +1 -0
  64. package/dist/react/lib/selectField.js +23 -0
  65. package/dist/react/lib/selectField.js.map +1 -0
  66. package/dist/react/media/FocusViewer.d.ts +8 -1
  67. package/dist/react/media/FocusViewer.d.ts.map +1 -1
  68. package/dist/react/media/FocusViewer.js +174 -10
  69. package/dist/react/media/FocusViewer.js.map +1 -1
  70. package/dist/react/media/VideoChapterEditor.d.ts.map +1 -1
  71. package/dist/react/media/VideoChapterEditor.js +2 -1
  72. package/dist/react/media/VideoChapterEditor.js.map +1 -1
  73. package/dist/react/media/VideoCutEditor.d.ts.map +1 -1
  74. package/dist/react/media/VideoCutEditor.js +2 -1
  75. package/dist/react/media/VideoCutEditor.js.map +1 -1
  76. package/dist/react/media/denseGallery.css +2 -0
  77. package/dist/react/media/focusViewer.css +31 -0
  78. package/dist/react/media/gifClip.d.ts +46 -0
  79. package/dist/react/media/gifClip.d.ts.map +1 -0
  80. package/dist/react/media/gifClip.js +74 -0
  81. package/dist/react/media/gifClip.js.map +1 -0
  82. package/dist/react/media/gifEncode.d.ts +46 -0
  83. package/dist/react/media/gifEncode.d.ts.map +1 -0
  84. package/dist/react/media/gifEncode.js +288 -0
  85. package/dist/react/media/gifEncode.js.map +1 -0
  86. package/dist/react/media/gifRecord.d.ts +26 -0
  87. package/dist/react/media/gifRecord.d.ts.map +1 -0
  88. package/dist/react/media/gifRecord.js +93 -0
  89. package/dist/react/media/gifRecord.js.map +1 -0
  90. package/dist/react/media-gallery/MediaGallery.d.ts.map +1 -1
  91. package/dist/react/media-gallery/MediaGallery.js +6 -7
  92. package/dist/react/media-gallery/MediaGallery.js.map +1 -1
  93. package/dist/react/media-gallery/MediaMetaEditor.d.ts.map +1 -1
  94. package/dist/react/media-gallery/MediaMetaEditor.js +2 -1
  95. package/dist/react/media-gallery/MediaMetaEditor.js.map +1 -1
  96. package/dist/react/nav/CommandBar.d.ts.map +1 -1
  97. package/dist/react/nav/CommandBar.js +2 -1
  98. package/dist/react/nav/CommandBar.js.map +1 -1
  99. package/dist/react/palette/CommandPalette.d.ts +15 -1
  100. package/dist/react/palette/CommandPalette.d.ts.map +1 -1
  101. package/dist/react/palette/CommandPalette.js +58 -8
  102. package/dist/react/palette/CommandPalette.js.map +1 -1
  103. package/dist/react/palette/Kbd.d.ts +15 -0
  104. package/dist/react/palette/Kbd.d.ts.map +1 -0
  105. package/dist/react/palette/Kbd.js +17 -0
  106. package/dist/react/palette/Kbd.js.map +1 -0
  107. package/dist/react/palette/ShortcutSheet.d.ts +30 -0
  108. package/dist/react/palette/ShortcutSheet.d.ts.map +1 -0
  109. package/dist/react/palette/ShortcutSheet.js +15 -0
  110. package/dist/react/palette/ShortcutSheet.js.map +1 -0
  111. package/dist/react/palette/commandSources.d.ts +14 -0
  112. package/dist/react/palette/commandSources.d.ts.map +1 -1
  113. package/dist/react/palette/commandSources.js +11 -1
  114. package/dist/react/palette/commandSources.js.map +1 -1
  115. package/dist/react/palette/index.d.ts +4 -2
  116. package/dist/react/palette/index.d.ts.map +1 -1
  117. package/dist/react/palette/index.js +2 -0
  118. package/dist/react/palette/index.js.map +1 -1
  119. package/dist/scripts/guardrailsEnforce.d.ts.map +1 -1
  120. package/dist/styles-areas/analytics.css +9 -9
  121. package/dist/styles-areas/canvas-hud.css +2 -2
  122. package/dist/styles-areas/data-table.css +10 -10
  123. package/dist/styles-areas/kanban.css +31 -0
  124. package/dist/styles-areas/media.css +2 -2
  125. package/dist/styles-areas/palette.css +3 -3
  126. package/dist/styles-areas/workbench.css +15 -13
  127. package/dist/styles-utilities.css +42 -0
  128. package/package.json +4 -3
  129. package/scripts/guardrails-baseline.json +2 -1
  130. package/scripts/guardrailsEnforce.spec.ts +72 -0
  131. package/scripts/guardrailsEnforce.ts +81 -7
  132. package/scripts/styleAreas.ts +5 -1
  133. package/src/react/canvas-hud/CanvasToolbar.tsx +1 -1
  134. package/src/react/canvas-hud/HudControls.spec.tsx +11 -0
  135. package/src/react/canvas-hud/HudControls.tsx +33 -9
  136. package/src/react/components/AppShell.spec.tsx +40 -0
  137. package/src/react/components/AppShell.tsx +25 -27
  138. package/src/react/components/ChipFilterStrip.tsx +2 -38
  139. package/src/react/components/DataTable/TableFilterBuilder.tsx +9 -13
  140. package/src/react/components/DataTable/tableSystem.spec.tsx +15 -7
  141. package/src/react/components/KanbanBoard.spec.tsx +89 -0
  142. package/src/react/components/KanbanBoard.tsx +270 -0
  143. package/src/react/components/ListToolbar.tsx +2 -2
  144. package/src/react/components/ResponsiveWorkbench.spec.tsx +57 -0
  145. package/src/react/components/ResponsiveWorkbench.tsx +69 -4
  146. package/src/react/components/SelectField.spec.tsx +117 -0
  147. package/src/react/components/SelectField.tsx +131 -166
  148. package/src/react/components/SelectFieldImpl.tsx +140 -0
  149. package/src/react/components/filterChip.tsx +43 -0
  150. package/src/react/hooks/pointerDnd.spec.ts +89 -3
  151. package/src/react/hooks/pointerDnd.ts +103 -8
  152. package/src/react/hooks/pragmaticDnd.ts +13 -2
  153. package/src/react/hooks/useOutsidePress.spec.tsx +20 -0
  154. package/src/react/hooks/useOutsidePress.ts +17 -2
  155. package/src/react/hooks/usePublishedBottomChrome.ts +30 -0
  156. package/src/react/hooks/useScrollMemory.spec.tsx +47 -2
  157. package/src/react/hooks/useScrollMemory.ts +20 -5
  158. package/src/react/index.ts +3 -0
  159. package/src/react/lib/floatingStyles.spec.ts +1 -1
  160. package/src/react/lib/selectField.ts +96 -0
  161. package/src/react/media/FocusViewer.tsx +322 -25
  162. package/src/react/media/VideoChapterEditor.tsx +3 -2
  163. package/src/react/media/VideoCutEditor.tsx +3 -2
  164. package/src/react/media/denseGallery.css +2 -0
  165. package/src/react/media/focusViewer.css +31 -0
  166. package/src/react/media/gifClip.ts +90 -0
  167. package/src/react/media/gifEncode.spec.ts +213 -0
  168. package/src/react/media/gifEncode.ts +298 -0
  169. package/src/react/media/gifRecord.ts +103 -0
  170. package/src/react/media-gallery/MediaGallery.spec.tsx +15 -11
  171. package/src/react/media-gallery/MediaGallery.tsx +16 -18
  172. package/src/react/media-gallery/MediaMetaEditor.tsx +2 -1
  173. package/src/react/nav/CommandBar.tsx +2 -3
  174. package/src/react/palette/CommandPalette.spec.tsx +73 -0
  175. package/src/react/palette/CommandPalette.tsx +153 -13
  176. package/src/react/palette/Kbd.tsx +46 -0
  177. package/src/react/palette/ShortcutSheet.spec.tsx +58 -0
  178. package/src/react/palette/ShortcutSheet.tsx +110 -0
  179. package/src/react/palette/commandSources.tsx +30 -1
  180. package/src/react/palette/index.ts +9 -0
  181. package/src/styles-areas/analytics.css +9 -9
  182. package/src/styles-areas/canvas-hud.css +2 -2
  183. package/src/styles-areas/data-table.css +10 -10
  184. package/src/styles-areas/kanban.css +31 -0
  185. package/src/styles-areas/media.css +2 -2
  186. package/src/styles-areas/palette.css +3 -3
  187. package/src/styles-areas/workbench.css +15 -13
  188. package/src/styles-utilities.css +42 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ResponsiveWorkbench.d.ts","sourceRoot":"","sources":["../../../src/react/components/ResponsiveWorkbench.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AASjD;;yFAEyF;AACzF,wBAAgB,sBAAsB,CAAC,UAAU,GAAE,MAA2B,GAAG,OAAO,CAEvF;AAaD,MAAM,WAAW,wBAAwB;IACvC,mFAAmF;IACnF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,qFAAqF;IACrF,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C;yEACqE;IACrE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE7B,gDAAgD;IAChD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAE/B,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EAAE,YAAY,EACtB,gBAAgB,EAChB,eAAsB,EACtB,SAAS,EAAE,aAAa,EACxB,iBAAiB,EACjB,gBAAwB,EACxB,SAAe,EACf,UAAgB,EAChB,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,UAA+B,EAC/B,gBAAgB,EAChB,SAAS,GACV,EAAE,wBAAwB,+BAmF1B"}
1
+ {"version":3,"file":"ResponsiveWorkbench.d.ts","sourceRoot":"","sources":["../../../src/react/components/ResponsiveWorkbench.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,OAAO,CAAC;AASzD;;yFAEyF;AACzF,wBAAgB,sBAAsB,CAAC,UAAU,GAAE,MAA2B,GAAG,OAAO,CAEvF;AAaD,MAAM,WAAW,wBAAwB;IACvC,mFAAmF;IACnF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,qFAAqF;IACrF,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C;yEACqE;IACrE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE7B,gDAAgD;IAChD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAE/B,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACpC,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAEpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EAAE,YAAY,EACtB,gBAAgB,EAChB,eAAsB,EACtB,SAAS,EAAE,aAAa,EACxB,iBAAiB,EACjB,gBAAwB,EACxB,SAAe,EACf,UAAgB,EAChB,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,UAA+B,EAC/B,gBAAgB,EAChB,YAAwB,EACxB,gBAAgB,EAChB,SAAS,GACV,EAAE,wBAAwB,+BAiI1B"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState } from 'react';
2
+ import { useRef, useState } from 'react';
3
3
  import { useMediaQuery } from '../hooks/useMediaQuery.js';
4
4
  import { cn } from '../lib/cn.js';
5
5
  import { Drawer } from './Drawer.js';
@@ -18,6 +18,8 @@ function useOpenState(controlled, onChange, defaultValue) {
18
18
  const setOpen = onChange ?? setUncontrolled;
19
19
  return [open, setOpen];
20
20
  }
21
+ /** Travel, in px, that turns a press on the sheets handle into a swipe up. */
22
+ const SWIPE_UP = 32;
21
23
  /**
22
24
  * The three-pane workbench (left rail / main / right rail) used by builder-style apps.
23
25
  * At/above `breakpoint` (default 1024, Tailwind `lg`) both rails render as persistent,
@@ -33,12 +35,39 @@ function useOpenState(controlled, onChange, defaultValue) {
33
35
  * This is the reusable answer to "sidebars must become drawers on mobile" — write the
34
36
  * responsive behavior once here, not per app.
35
37
  */
36
- export function ResponsiveWorkbench({ left, right, children, leftOpen: leftOpenProp, onLeftOpenChange, defaultLeftOpen = true, rightOpen: rightOpenProp, onRightOpenChange, defaultRightOpen = false, leftWidth = 280, rightWidth = 280, leftTitle, rightTitle, leftCollapsedRail, rightCollapsedRail, breakpoint = DEFAULT_BREAKPOINT, mobileUtilityBar, className, }) {
38
+ export function ResponsiveWorkbench({ left, right, children, leftOpen: leftOpenProp, onLeftOpenChange, defaultLeftOpen = true, rightOpen: rightOpenProp, onRightOpenChange, defaultRightOpen = false, leftWidth = 280, rightWidth = 280, leftTitle, rightTitle, leftCollapsedRail, rightCollapsedRail, breakpoint = DEFAULT_BREAKPOINT, mobileUtilityBar, mobilePanels = 'drawers', mobileSwipeOpens, className, }) {
37
39
  const isDesktop = useWorkbenchBreakpoint(breakpoint);
38
40
  const [leftOpen, setLeftOpen] = useOpenState(leftOpenProp, onLeftOpenChange, defaultLeftOpen);
39
41
  const [rightOpen, setRightOpen] = useOpenState(rightOpenProp, onRightOpenChange, defaultRightOpen);
42
+ const sheets = mobilePanels === 'sheets';
43
+ // The handle's swipe up. A swipe that starts on one of the caller's buttons must not ALSO click
44
+ // it (Explore opening on top of the sheet the swipe opened), so the click after a swipe is eaten.
45
+ const swipe = useRef(null);
46
+ const swiped = useRef(false);
47
+ const swipeTarget = mobileSwipeOpens ?? (right ? 'right' : 'left');
40
48
  return (_jsxs("div", { "data-cb-page-width": 'full', className: cn('relative flex min-h-0 flex-1 flex-col overflow-hidden', className), children: [_jsxs("div", { className: 'flex min-h-0 flex-1 overflow-hidden', children: [left &&
41
- (isDesktop ? (leftOpen ? (_jsx("aside", { "data-cb-workbench-rail": 'left', style: { width: leftWidth }, className: 'flex shrink-0 flex-col overflow-hidden border-r border-border bg-card', children: left })) : ((leftCollapsedRail ?? null))) : (_jsx(Drawer, { open: leftOpen, onClose: () => setLeftOpen(false), side: 'left', title: leftTitle, scrollBody: false, children: _jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: left }) }))), _jsx("div", { "data-cb-workbench-main": '', className: 'flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden', children: children }), right &&
42
- (isDesktop ? (rightOpen ? (_jsx("aside", { "data-cb-workbench-rail": 'right', style: { width: rightWidth }, className: 'flex shrink-0 flex-col overflow-hidden border-l border-border bg-card', children: right })) : ((rightCollapsedRail ?? null))) : (_jsx(Drawer, { open: rightOpen, onClose: () => setRightOpen(false), side: 'right', title: rightTitle, scrollBody: false, children: _jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: right }) })))] }), !isDesktop && mobileUtilityBar && (_jsx("div", { "data-cb-workbench-utility-bar": '', className: cn('flex shrink-0 items-center justify-between gap-2', 'border-t border-border bg-background px-3 py-2', 'pb-[max(env(safe-area-inset-bottom,0px),0.5rem)]'), style: { marginBottom: 'var(--keyboard-inset, 0px)' }, children: mobileUtilityBar }))] }));
49
+ (isDesktop ? (leftOpen ? (_jsx("aside", { "data-cb-workbench-rail": 'left', style: { width: leftWidth }, className: 'flex shrink-0 flex-col overflow-hidden border-r border-border bg-card', children: left })) : ((leftCollapsedRail ?? null))) : (_jsx(Drawer, { open: leftOpen, onClose: () => setLeftOpen(false), side: sheets ? 'bottom' : 'left', size: sheets ? 'lg' : undefined, title: leftTitle, scrollBody: false, children: _jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: left }) }))), _jsx("div", { "data-cb-workbench-main": '', className: 'flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden', children: children }), right &&
50
+ (isDesktop ? (rightOpen ? (_jsx("aside", { "data-cb-workbench-rail": 'right', style: { width: rightWidth }, className: 'flex shrink-0 flex-col overflow-hidden border-l border-border bg-card', children: right })) : ((rightCollapsedRail ?? null))) : (_jsx(Drawer, { open: rightOpen, onClose: () => setRightOpen(false), side: sheets ? 'bottom' : 'right', size: sheets ? 'lg' : undefined, title: rightTitle, scrollBody: false, children: _jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: right }) })))] }), !isDesktop && mobileUtilityBar && sheets && (_jsx("div", { className: 'pointer-events-none absolute inset-x-3 bottom-[max(env(safe-area-inset-bottom,0px),0.75rem)] flex justify-center', children: _jsxs("div", { "data-cb-workbench-sheet-handle": '', className: cn('pointer-events-auto flex w-full max-w-md touch-none flex-col items-stretch gap-1.5', 'rounded-2xl border border-border/60 bg-background/85 px-2 pt-1.5 pb-2 shadow-raised backdrop-blur-md'), onPointerDown: (e) => {
51
+ swipe.current = { id: e.pointerId, y: e.clientY };
52
+ swiped.current = false;
53
+ }, onPointerUp: (e) => {
54
+ const start = swipe.current;
55
+ swipe.current = null;
56
+ if (!start || start.id !== e.pointerId || start.y - e.clientY < SWIPE_UP)
57
+ return;
58
+ swiped.current = true;
59
+ if (swipeTarget === 'right')
60
+ setRightOpen(true);
61
+ else
62
+ setLeftOpen(true);
63
+ }, onPointerCancel: () => {
64
+ swipe.current = null;
65
+ }, onClickCapture: (e) => {
66
+ if (!swiped.current)
67
+ return;
68
+ swiped.current = false;
69
+ e.preventDefault();
70
+ e.stopPropagation();
71
+ }, children: [_jsx("span", { "aria-hidden": true, className: 'mx-auto h-1 w-9 shrink-0 rounded-full bg-border' }), mobileUtilityBar] }) })), !isDesktop && mobileUtilityBar && !sheets && (_jsx("div", { "data-cb-workbench-utility-bar": '', className: cn('flex shrink-0 items-center justify-between gap-2', 'border-t border-border bg-background px-3 py-2', 'pb-[max(env(safe-area-inset-bottom,0px),0.5rem)]'), style: { marginBottom: 'var(--keyboard-inset, 0px)' }, children: mobileUtilityBar }))] }));
43
72
  }
44
73
  //# sourceMappingURL=ResponsiveWorkbench.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResponsiveWorkbench.js","sourceRoot":"","sources":["../../../src/react/components/ResponsiveWorkbench.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;wDACwD;AACxD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;yFAEyF;AACzF,MAAM,UAAU,sBAAsB,CAAC,aAAqB,kBAAkB;IAC5E,OAAO,aAAa,CAAC,eAAe,UAAU,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CACnB,UAA+B,EAC/B,QAA+C,EAC/C,YAAqB;IAErB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,UAAU,IAAI,YAAY,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,IAAI,eAAe,CAAC;IAC5C,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzB,CAAC;AAmDD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EAAE,YAAY,EACtB,gBAAgB,EAChB,eAAe,GAAG,IAAI,EACtB,SAAS,EAAE,aAAa,EACxB,iBAAiB,EACjB,gBAAgB,GAAG,KAAK,EACxB,SAAS,GAAG,GAAG,EACf,UAAU,GAAG,GAAG,EAChB,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,GAAG,kBAAkB,EAC/B,gBAAgB,EAChB,SAAS,GACgB;IACzB,MAAM,SAAS,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,YAAY,CAAC,YAAY,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAC9F,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAEnG,OAAO,CAGL,qCAAwB,MAAM,EAAC,SAAS,EAAE,EAAE,CAAC,uDAAuD,EAAE,SAAS,CAAC,aAC9G,eAAK,SAAS,EAAC,qCAAqC,aACjD,IAAI;wBACH,CAAC,SAAS,CAAC,CAAC,CAAC,CACX,QAAQ,CAAC,CAAC,CAAC,CACT,0CACyB,MAAM,EAC7B,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAC3B,SAAS,EAAC,uEAAuE,YAEhF,IAAI,GACC,CACT,CAAC,CAAC,CAAC,CACF,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAC5B,CACF,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IACL,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,KAAK,YAEjB,cAAK,SAAS,EAAC,8BAA8B,YAAE,IAAI,GAAO,GACnD,CACV,CAAC,EAEJ,wCACyB,EAAE,EACzB,SAAS,EAAC,sDAAsD,YAE/D,QAAQ,GACL,EAEL,KAAK;wBACJ,CAAC,SAAS,CAAC,CAAC,CAAC,CACX,SAAS,CAAC,CAAC,CAAC,CACV,0CACyB,OAAO,EAC9B,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAC5B,SAAS,EAAC,uEAAuE,YAEhF,KAAK,GACA,CACT,CAAC,CAAC,CAAC,CACF,CAAC,kBAAkB,IAAI,IAAI,CAAC,CAC7B,CACF,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IACL,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,KAAK,YAEjB,cAAK,SAAS,EAAC,8BAA8B,YAAE,KAAK,GAAO,GACpD,CACV,CAAC,IACA,EAEL,CAAC,SAAS,IAAI,gBAAgB,IAAI,CACjC,+CACgC,EAAE,EAChC,SAAS,EAAE,EAAE,CACX,kDAAkD,EAClD,gDAAgD,EAChD,kDAAkD,CACnD,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,4BAA4B,EAAE,YAEpD,gBAAgB,GACb,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ResponsiveWorkbench.js","sourceRoot":"","sources":["../../../src/react/components/ResponsiveWorkbench.tsx"],"names":[],"mappings":"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"}
@@ -1,50 +1,10 @@
1
- import type { ReactNode } from 'react';
2
- import { type ControlSize } from '../lib/field.js';
3
- export interface SelectOption {
4
- value: string;
5
- label: ReactNode;
6
- description?: ReactNode;
7
- disabled?: boolean;
8
- }
9
- export interface SelectGroup {
10
- label?: string;
11
- options: SelectOption[];
12
- }
13
- export interface SelectFieldProps {
14
- value?: string;
15
- onValueChange?: (value: string) => void;
16
- options?: SelectOption[];
17
- groups?: SelectGroup[];
18
- placeholder?: string;
19
- disabled?: boolean;
20
- /** Use the full field style (16px, rounded-md, border, focus ring). Default true. */
21
- fieldStyle?: boolean;
22
- /** Trigger height on the shared control-height scale (`--control-h-*`, task
23
- * cbux-41). Default `md`. No-op when `fieldStyle={false}`. */
24
- size?: ControlSize;
25
- /** Forwarded to the trigger so a visible `<label htmlFor>` can target it. */
26
- id?: string;
27
- name?: string;
28
- required?: boolean;
29
- className?: string;
30
- 'aria-label'?: string;
31
- 'aria-labelledby'?: string;
32
- /**
33
- * What to say when there is nothing to choose — *"No lists yet"*.
34
- *
35
- * 🔴 Required in practice for any control whose options come from DATA rather than
36
- * from a constant: an empty popup is a dead end that reads as a broken control, and
37
- * the `choice-needs-empty-state` guardrail reports one. Rendered as plain text, not
38
- * as an item, so it can never be picked or keyboard-focused.
39
- */
40
- emptyLabel?: ReactNode;
41
- /** The second line — what belongs in this list, or how to get one. */
42
- emptyHint?: ReactNode;
43
- /** Set by {@link Field} for inline validation — paints the field-token invalid
44
- * border (via `aria-invalid`) and links the description/error to the trigger. */
45
- 'aria-invalid'?: boolean | 'true' | 'false';
46
- 'aria-describedby'?: string;
47
- }
1
+ import { type ComponentType } from 'react';
2
+ import { type SelectFieldImplProps, type SelectFieldProps } from '../lib/selectField.js';
3
+ export type { SelectFieldProps, SelectGroup, SelectOption } from '../lib/selectField.js';
4
+ type SelectFieldImplComponent = ComponentType<SelectFieldImplProps>;
5
+ /** Fetch the Radix implementation once per page. Exported for tests and for a consumer that wants
6
+ * to warm it explicitly. */
7
+ export declare function preloadSelectField(): Promise<SelectFieldImplComponent>;
48
8
  /**
49
9
  * Portal-based select control on Radix Select. Replaces the native `<select>`
50
10
  * wrapper. Fully styleable, keyboard-navigable, a11y-correct, and never clipped by
@@ -57,6 +17,16 @@ export interface SelectFieldProps {
57
17
  * is true (the default for form fields), giving it the same control-height token +
58
18
  * rounded-md as Input at the same `size`. Pass `fieldStyle={false}` + a `className`
59
19
  * for a bespoke trigger.
20
+ *
21
+ * ── Why this file is a trigger and not the select ───────────────────────────
22
+ * 🔴 Radix Select (with its popper, focus scope and remove-scroll) is ~29 kB gzip, and a
23
+ * static import puts it in whatever chunk renders a field. In a lazy page that is a few kB;
24
+ * in an app's ENTRY it hoisted the Radix code a dozen lazy chunks had shared: music's library
25
+ * Sort by took `index-*.js` from 203 to 232 kB gzip and was reverted (forge task 3096). So the
26
+ * Radix select is `SelectFieldImpl`, a dynamic `import()`, and this file draws the same trigger
27
+ * box — same classes, `role="combobox"`, the chosen option's label, the chevron — until it
28
+ * lands. A press, Enter, Space or an arrow that beats the fetch is not lost: the real select
29
+ * mounts open; focus held on the light trigger moves to the real one.
60
30
  */
61
- export declare function SelectField({ value, onValueChange, options, groups, placeholder, disabled, fieldStyle, size, id, name, required, className, emptyLabel, emptyHint, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, }: SelectFieldProps): import("react").JSX.Element;
31
+ export declare function SelectField(props: SelectFieldProps): import("react").JSX.Element;
62
32
  //# sourceMappingURL=SelectField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectField.d.ts","sourceRoot":"","sources":["../../../src/react/components/SelectField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAE,KAAK,WAAW,EAA0D,MAAM,iBAAiB,CAAC;AAQ3G,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;mEAC+D;IAC/D,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,6EAA6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,sEAAsE;IACtE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;sFACkF;IAClF,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,aAAa,EACb,OAAY,EACZ,MAAW,EACX,WAAuB,EACvB,QAAQ,EACR,UAAiB,EACjB,IAAW,EACX,EAAE,EACF,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,GACpC,EAAE,gBAAgB,+BAiGlB"}
1
+ {"version":3,"file":"SelectField.d.ts","sourceRoot":"","sources":["../../../src/react/components/SelectField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAA+B,MAAM,OAAO,CAAC;AAGxE,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAItB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEzF,KAAK,wBAAwB,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;AAKpE;6BAC6B;AAC7B,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAQtE;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA+FlD"}
@@ -1,10 +1,26 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import * as RSelect from '@radix-ui/react-select';
3
- import { Check, ChevronDown, ChevronUp } from 'lucide-react';
4
- import { cn } from '../lib/cn.js';
5
- import { useFloatingContainer } from '../lib/floatingContainer.js';
6
- import { choiceFieldWidth, declareFieldWidth, fieldControlClass } from '../lib/field.js';
7
- import { FLOATING_ANIMATION, FLOATING_COLLISION_PADDING, FLOATING_CONTENT_BASE, FLOATING_ITEM_BASE, } from '../lib/floatingStyles.js';
2
+ import { ChevronDown } from 'lucide-react';
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import { cn, RAW_BUTTON } from '../lib/cn.js';
5
+ import { choiceFieldWidth, declareFieldWidth } from '../lib/field.js';
6
+ import { SELECT_OPEN_KEYS, SELECT_VALUE_CLASS, selectGroupsOf, selectShowsPlaceholder, selectTriggerClass, } from '../lib/selectField.js';
7
+ let loadedImpl = null;
8
+ let pendingImpl = null;
9
+ /** Fetch the Radix implementation once per page. Exported for tests and for a consumer that wants
10
+ * to warm it explicitly. */
11
+ export function preloadSelectField() {
12
+ if (!pendingImpl) {
13
+ pendingImpl = import('./SelectFieldImpl.js').then((m) => {
14
+ loadedImpl = m.default;
15
+ return m.default;
16
+ });
17
+ }
18
+ return pendingImpl;
19
+ }
20
+ // Start the fetch when this module is evaluated, so the implementation is normally there before
21
+ // the first field mounts and no trigger is ever swapped (Tooltip.tsx has the history).
22
+ if (typeof window !== 'undefined')
23
+ void preloadSelectField();
8
24
  /**
9
25
  * Portal-based select control on Radix Select. Replaces the native `<select>`
10
26
  * wrapper. Fully styleable, keyboard-navigable, a11y-correct, and never clipped by
@@ -17,12 +33,73 @@ import { FLOATING_ANIMATION, FLOATING_COLLISION_PADDING, FLOATING_CONTENT_BASE,
17
33
  * is true (the default for form fields), giving it the same control-height token +
18
34
  * rounded-md as Input at the same `size`. Pass `fieldStyle={false}` + a `className`
19
35
  * for a bespoke trigger.
36
+ *
37
+ * ── Why this file is a trigger and not the select ───────────────────────────
38
+ * 🔴 Radix Select (with its popper, focus scope and remove-scroll) is ~29 kB gzip, and a
39
+ * static import puts it in whatever chunk renders a field. In a lazy page that is a few kB;
40
+ * in an app's ENTRY it hoisted the Radix code a dozen lazy chunks had shared: music's library
41
+ * Sort by took `index-*.js` from 203 to 232 kB gzip and was reverted (forge task 3096). So the
42
+ * Radix select is `SelectFieldImpl`, a dynamic `import()`, and this file draws the same trigger
43
+ * box — same classes, `role="combobox"`, the chosen option's label, the chevron — until it
44
+ * lands. A press, Enter, Space or an arrow that beats the fetch is not lost: the real select
45
+ * mounts open; focus held on the light trigger moves to the real one.
20
46
  */
21
- export function SelectField({ value, onValueChange, options = [], groups = [], placeholder = 'Select…', disabled, fieldStyle = true, size = 'md', id, name, required, className, emptyLabel, emptyHint, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, }) {
22
- const allGroups = groups.length > 0 ? groups : options.length > 0 ? [{ options }] : [];
23
- const empty = allGroups.every((group) => group.options.length === 0);
24
- const container = useFloatingContainer();
25
- return (_jsxs(RSelect.Root, { value: value, onValueChange: onValueChange, disabled: disabled, name: name, required: required, children: [_jsxs(RSelect.Trigger, { id: id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedBy, className: cn(fieldStyle && fieldControlClass(size), 'flex items-center justify-between gap-2 data-[placeholder]:text-muted-foreground', className), children: [_jsx("span", { className: 'block min-w-0 flex-1 truncate text-left', children: _jsx(RSelect.Value, { placeholder: placeholder }) }), _jsx(RSelect.Icon, { asChild: true, children: _jsx(ChevronDown, { className: 'size-4 shrink-0 opacity-50' }) })] }), _jsx(RSelect.Portal, { container: container, children: _jsxs(RSelect.Content, { position: 'popper', sideOffset: 4, collisionPadding: FLOATING_COLLISION_PADDING, className: cn(FLOATING_COLLISION_PADDING, FLOATING_CONTENT_BASE, FLOATING_ANIMATION, 'max-h-[var(--radix-select-content-available-height)] min-w-[var(--radix-select-trigger-width)] p-1'), children: [_jsx(RSelect.ScrollUpButton, { className: 'flex cursor-default items-center justify-center py-1', children: _jsx(ChevronUp, { className: 'size-4' }) }), _jsxs(RSelect.Viewport, { children: [empty && (_jsxs("div", { className: 'flex flex-col gap-0.5 px-2 py-2.5 text-left', children: [_jsx("span", { className: 'text-sm font-medium', children: emptyLabel ?? 'Nothing to choose from yet' }), emptyHint && _jsx("span", { className: 'text-xs text-muted-foreground', children: emptyHint })] })), allGroups.map((group, gi) => (_jsxs(RSelect.Group, { children: [group.label && (_jsx(RSelect.Label, { className: 'px-2 py-1.5 text-xs font-semibold text-muted-foreground', children: group.label })), group.options.map((opt) => (_jsxs(RSelect.Item, { value: opt.value, disabled: opt.disabled, className: cn(FLOATING_ITEM_BASE, 'pr-8'), children: [_jsx(RSelect.ItemIndicator, { className: 'absolute right-2 flex size-4 items-center justify-center', children: _jsx(Check, { className: 'size-3' }) }), _jsx(RSelect.ItemText, { children: opt.label }), opt.description && (_jsx("span", { className: 'text-xs text-muted-foreground', children: opt.description }))] }, opt.value))), gi < allGroups.length - 1 && _jsx(RSelect.Separator, { className: 'my-1 h-px bg-border' })] }, group.label ?? gi)))] }), _jsx(RSelect.ScrollDownButton, { className: 'flex cursor-default items-center justify-center py-1', children: _jsx(ChevronDown, { className: 'size-4' }) })] }) })] }));
47
+ export function SelectField(props) {
48
+ // `() => loadedImpl`: a component IS a function, and `useState(fn)` would call it.
49
+ const [Impl, setImpl] = useState(() => loadedImpl);
50
+ const openRef = useRef(false);
51
+ const triggerRef = useRef(null);
52
+ const pointerTypeRef = useRef('mouse');
53
+ useEffect(() => {
54
+ if (Impl)
55
+ return;
56
+ let alive = true;
57
+ void preloadSelectField().then((c) => {
58
+ if (alive)
59
+ setImpl(() => c);
60
+ });
61
+ return () => {
62
+ alive = false;
63
+ };
64
+ }, [Impl]);
65
+ if (Impl) {
66
+ const focused = triggerRef.current !== null && triggerRef.current === document.activeElement;
67
+ return _jsx(Impl, { ...props, initialOpen: openRef.current, initialFocus: focused });
68
+ }
69
+ const { value, placeholder = 'Select…', disabled, fieldStyle, size, className, id, required, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, } = props;
70
+ const showPlaceholder = selectShowsPlaceholder(value);
71
+ const chosen = showPlaceholder
72
+ ? undefined
73
+ : selectGroupsOf(props)
74
+ .flatMap((group) => group.options)
75
+ .find((opt) => opt.value === value);
76
+ const open = () => {
77
+ openRef.current = true;
78
+ // Already fetched by another field: swap now rather than on the effect's next tick.
79
+ if (loadedImpl)
80
+ setImpl(() => loadedImpl);
81
+ };
82
+ return (_jsxs("button", {
83
+ // guardrails-ignore no-raw-action-button: task 3096 — SelectField's light trigger until
84
+ // its Radix select loads, the same box SelectFieldImpl's trigger draws.
85
+ ref: triggerRef, type: 'button', role: 'combobox', id: id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedBy, "aria-expanded": false, "aria-required": required, "aria-autocomplete": 'none', "data-state": 'closed', disabled: disabled, "data-disabled": disabled ? '' : undefined, "data-placeholder": showPlaceholder ? '' : undefined, className: cn(RAW_BUTTON, selectTriggerClass({ fieldStyle, size, className })),
86
+ // Radix's own split: a mouse opens on press, touch and pen on the click (so a scroll that
87
+ // starts on the field is not a pick).
88
+ onPointerDown: (e) => {
89
+ pointerTypeRef.current = e.pointerType;
90
+ if (e.pointerType === 'mouse' && e.button === 0 && !e.ctrlKey) {
91
+ e.preventDefault();
92
+ open();
93
+ }
94
+ }, onClick: () => {
95
+ if (pointerTypeRef.current !== 'mouse')
96
+ open();
97
+ }, onKeyDown: (e) => {
98
+ if (SELECT_OPEN_KEYS.includes(e.key)) {
99
+ e.preventDefault();
100
+ open();
101
+ }
102
+ }, children: [_jsx("span", { className: SELECT_VALUE_CLASS, children: showPlaceholder ? placeholder : chosen?.label }), _jsx(ChevronDown, { "aria-hidden": true, className: 'size-4 shrink-0 opacity-50' })] }));
26
103
  }
27
104
  // Sized by its longest option, not stretched to the panel (FRM-3, forge task 2463).
28
105
  declareFieldWidth(SelectField, choiceFieldWidth);
@@ -1 +1 @@
1
- {"version":3,"file":"SelectField.js","sourceRoot":"","sources":["../../../src/react/components/SelectField.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectField.js","sourceRoot":"","sources":["../../../src/react/components/SelectField.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAsB,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAGlB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAM/B,IAAI,UAAU,GAAoC,IAAI,CAAC;AACvD,IAAI,WAAW,GAA6C,IAAI,CAAC;AAEjE;6BAC6B;AAC7B,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACtD,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC;YACvB,OAAO,CAAC,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,gGAAgG;AAChG,uFAAuF;AACvF,IAAI,OAAO,MAAM,KAAK,WAAW;IAAE,KAAK,kBAAkB,EAAE,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,mFAAmF;IACnF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAkC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACnC,IAAI,KAAK;gBAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,KAAK,IAAI,IAAI,UAAU,CAAC,OAAO,KAAK,QAAQ,CAAC,aAAa,CAAC;QAC7F,OAAO,KAAC,IAAI,OAAK,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,GAAI,CAAC;IAClF,CAAC;IAED,MAAM,EACJ,KAAK,EACL,WAAW,GAAG,SAAS,EACvB,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,SAAS,EACT,EAAE,EACF,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,GACpC,GAAG,KAAK,CAAC;IACV,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,eAAe;QAC5B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;aAClB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;aACjC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAE1C,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,oFAAoF;QACpF,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,OAAO,CACL;QACE,wFAAwF;QACxF,wEAAwE;QACxE,GAAG,EAAE,UAAU,EACf,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,UAAU,EACf,EAAE,EAAE,EAAE,gBACM,SAAS,qBACJ,cAAc,kBACjB,WAAW,sBACP,eAAe,mBAClB,KAAK,mBACL,QAAQ,uBACL,MAAM,gBACb,QAAQ,EACnB,QAAQ,EAAE,QAAQ,mBACH,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,sBACtB,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAClD,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,kBAAkB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9E,0FAA0F;QAC1F,sCAAsC;QACtC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;YACnB,cAAc,CAAC,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC;YACvC,IAAI,CAAC,CAAC,WAAW,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC9D,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,EACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,cAAc,CAAC,OAAO,KAAK,OAAO;gBAAE,IAAI,EAAE,CAAC;QACjD,CAAC,EACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YACf,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,aAED,eAAM,SAAS,EAAE,kBAAkB,YAChC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,GACzC,EACP,KAAC,WAAW,yBAAa,SAAS,EAAC,4BAA4B,GAAG,IAC3D,CACV,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type SelectFieldImplProps } from '../lib/selectField.js';
2
+ /**
3
+ * The Radix Select behind {@link SelectField} — loaded as its own chunk by `SelectField.tsx`, which
4
+ * says why. Not exported from the package: render `SelectField`.
5
+ */
6
+ export default function SelectFieldImpl({ value, onValueChange, options, groups, placeholder, disabled, fieldStyle, size, id, name, required, className, emptyLabel, emptyHint, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, initialOpen, initialFocus, }: SelectFieldImplProps): import("react").JSX.Element;
7
+ //# sourceMappingURL=SelectFieldImpl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectFieldImpl.d.ts","sourceRoot":"","sources":["../../../src/react/components/SelectFieldImpl.tsx"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,uBAAuB,CAAC;AAE/B;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACtC,KAAK,EACL,aAAa,EACb,OAAY,EACZ,MAAW,EACX,WAAuB,EACvB,QAAQ,EACR,UAAiB,EACjB,IAAW,EACX,EAAE,EACF,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,WAAmB,EACnB,YAAoB,GACrB,EAAE,oBAAoB,+BAgGtB"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as RSelect from '@radix-ui/react-select';
3
+ import { Check, ChevronDown, ChevronUp } from 'lucide-react';
4
+ import { useEffect, useRef } from 'react';
5
+ import { cn, RAW_BUTTON } from '../lib/cn.js';
6
+ import { useFloatingContainer } from '../lib/floatingContainer.js';
7
+ import { FLOATING_ANIMATION, FLOATING_COLLISION_PADDING, FLOATING_CONTENT_BASE, FLOATING_ITEM_BASE, } from '../lib/floatingStyles.js';
8
+ import { SELECT_VALUE_CLASS, selectGroupsOf, selectTriggerClass, } from '../lib/selectField.js';
9
+ /**
10
+ * The Radix Select behind {@link SelectField} — loaded as its own chunk by `SelectField.tsx`, which
11
+ * says why. Not exported from the package: render `SelectField`.
12
+ */
13
+ export default function SelectFieldImpl({ value, onValueChange, options = [], groups = [], placeholder = 'Select…', disabled, fieldStyle = true, size = 'md', id, name, required, className, emptyLabel, emptyHint, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, initialOpen = false, initialFocus = false, }) {
14
+ const allGroups = selectGroupsOf({ options, groups });
15
+ const empty = allGroups.every((group) => group.options.length === 0);
16
+ const container = useFloatingContainer();
17
+ const triggerRef = useRef(null);
18
+ // The light trigger this replaced had the keyboard focus: keep it here, or it drops to <body>.
19
+ // An `initialOpen` select moves focus into its list itself, and hands it back on close.
20
+ useEffect(() => {
21
+ if (initialFocus && !initialOpen)
22
+ triggerRef.current?.focus();
23
+ }, [initialFocus, initialOpen]);
24
+ return (_jsxs(RSelect.Root, { value: value, onValueChange: onValueChange, disabled: disabled, name: name, required: required, defaultOpen: initialOpen, children: [_jsxs(RSelect.Trigger, { ref: triggerRef, id: id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedBy, className: cn(RAW_BUTTON, selectTriggerClass({ fieldStyle, size, className })), children: [_jsx("span", { className: SELECT_VALUE_CLASS, children: _jsx(RSelect.Value, { placeholder: placeholder }) }), _jsx(RSelect.Icon, { asChild: true, children: _jsx(ChevronDown, { className: 'size-4 shrink-0 opacity-50' }) })] }), _jsx(RSelect.Portal, { container: container, children: _jsxs(RSelect.Content, { position: 'popper', sideOffset: 4, collisionPadding: FLOATING_COLLISION_PADDING, className: cn(FLOATING_CONTENT_BASE, FLOATING_ANIMATION, 'max-h-[var(--radix-select-content-available-height)] min-w-[var(--radix-select-trigger-width)] p-1'), children: [_jsx(RSelect.ScrollUpButton, { className: 'flex cursor-default items-center justify-center py-1', children: _jsx(ChevronUp, { className: 'size-4' }) }), _jsxs(RSelect.Viewport, { children: [empty && (_jsxs("div", { className: 'flex flex-col gap-0.5 px-2 py-2.5 text-left', children: [_jsx("span", { className: 'text-sm font-medium', children: emptyLabel ?? 'Nothing to choose from yet' }), emptyHint && _jsx("span", { className: 'text-xs text-muted-foreground', children: emptyHint })] })), allGroups.map((group, gi) => (_jsxs(RSelect.Group, { children: [group.label && (_jsx(RSelect.Label, { className: 'px-2 py-1.5 text-xs font-semibold text-muted-foreground', children: group.label })), group.options.map((opt) => (_jsxs(RSelect.Item, { value: opt.value, disabled: opt.disabled, className: cn(FLOATING_ITEM_BASE, 'pr-8'), children: [_jsx(RSelect.ItemIndicator, { className: 'absolute right-2 flex size-4 items-center justify-center', children: _jsx(Check, { className: 'size-3' }) }), _jsx(RSelect.ItemText, { children: opt.label }), opt.description && (_jsx("span", { className: 'text-xs text-muted-foreground', children: opt.description }))] }, opt.value))), gi < allGroups.length - 1 && _jsx(RSelect.Separator, { className: 'my-1 h-px bg-border' })] }, group.label ?? gi)))] }), _jsx(RSelect.ScrollDownButton, { className: 'flex cursor-default items-center justify-center py-1', children: _jsx(ChevronDown, { className: 'size-4' }) })] }) })] }));
25
+ }
26
+ //# sourceMappingURL=SelectFieldImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectFieldImpl.js","sourceRoot":"","sources":["../../../src/react/components/SelectFieldImpl.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ChipProps {
3
+ active: boolean;
4
+ onClick: () => void;
5
+ children: ReactNode;
6
+ }
7
+ export declare function Chip({ active, onClick, children }: ChipProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=filterChip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterChip.d.ts","sourceRoot":"","sources":["../../../src/react/components/filterChip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,+BA2B5D"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn, RAW_BUTTON } from '../lib/cn.js';
3
+ import { PRESS } from '../lib/press.js';
4
+ export function Chip({ active, onClick, children }) {
5
+ return (_jsx("button", {
6
+ // guardrails-ignore no-raw-action-button: presentational filter-chip toggle —
7
+ // reflects local filter state (aria-pressed), no destructive/mutating intent.
8
+ type: 'button', onClick: onClick, "aria-pressed": active, className: cn(RAW_BUTTON,
9
+ // 44 px min tap target height via py + min-h (STANDARDS §4a). px-4 keeps every
10
+ // pill's internal padding identical regardless of label length.
11
+ 'inline-flex min-h-11 shrink-0 cursor-pointer items-center rounded-full px-4 text-sm font-medium', PRESS, 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
12
+ // Soft active state — an accent tint + accent text (the standardized active
13
+ // treatment shared with nav items and the `accent` Badge tone), not a stark
14
+ // solid accent block. `text-accent-strong` (not plain `text-accent`) — the
15
+ // /15 tint only clears 4.43:1 with the base accent hue, under AA (cbux-101).
16
+ active
17
+ ? 'bg-accent/15 text-accent-strong ring-1 ring-inset ring-accent/30'
18
+ : 'bg-muted text-muted-foreground hover:bg-muted/80 hover:text-foreground'), children: children }));
19
+ }
20
+ //# sourceMappingURL=filterChip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterChip.js","sourceRoot":"","sources":["../../../src/react/components/filterChip.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAaxC,MAAM,UAAU,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAa;IAC3D,OAAO,CACL;QACE,8EAA8E;QAC9E,8EAA8E;QAC9E,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,kBACF,MAAM,EACpB,SAAS,EAAE,EAAE,CACX,UAAU;QACV,+EAA+E;QAC/E,gEAAgE;QAChE,iGAAiG,EACjG,KAAK,EACL,yEAAyE;QACzE,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,6EAA6E;QAC7E,MAAM;YACJ,CAAC,CAAC,kEAAkE;YACpE,CAAC,CAAC,wEAAwE,CAC7E,YAEA,QAAQ,GACF,CACV,CAAC;AACJ,CAAC"}
@@ -119,9 +119,15 @@ export interface WireTouchDragConfig {
119
119
  /**
120
120
  * Wire touch-drag onto one draggable element, using the shared registry + monitor bus.
121
121
  * Only `touch` pointers are handled — mouse/pen still drive pragmatic's native adapter,
122
- * so the two engines never fight over the same gesture. Sets `touch-action: none` on the
123
- * element while wired (restored on cleanup) so a long-press isn't stolen by the browser's
124
- * scroll/gesture handling — the same guard the `@dnd-kit` sensors relied on.
122
+ * so the two engines never fight over the same gesture.
123
+ *
124
+ * 🔴 The element stays PANNABLE. A finger that moves before the long press fires is a scroll,
125
+ * and the browser runs it; only once the drag is live does a non-passive `touchmove` on the
126
+ * element cancel the browser's pan, so the finger drives the drag instead — the way
127
+ * `@dnd-kit`'s TouchSensor does it. This used to set `touch-action: none` on the element, and
128
+ * on a phone a board whose columns are full of cards could not be swiped or scrolled from any
129
+ * card (forge task 3033, seen on vault-stage at 390). While a press is in flight the
130
+ * long-press `contextmenu` (Android's menu) is cancelled too.
125
131
  *
126
132
  * The `pointerdown` listener lives on the element; the `pointermove`/`up`/`cancel`/
127
133
  * `keydown` listeners are only attached on the `window` for the life of one interaction
@@ -132,5 +138,33 @@ export interface WireTouchDragConfig {
132
138
  * Returns a cleanup that cancels any in-flight drag and removes every listener.
133
139
  */
134
140
  export declare function wireTouchDragSource(config: WireTouchDragConfig): CleanupFn;
141
+ /** How near a scroller's edge (px) a touch drag must come before it scrolls, and its top speed. */
142
+ export declare const TOUCH_EDGE_PX = 48;
143
+ export declare const TOUCH_EDGE_MAX_STEP_PX = 14;
144
+ interface EdgeRect {
145
+ left: number;
146
+ right: number;
147
+ top: number;
148
+ bottom: number;
149
+ }
150
+ /**
151
+ * How far one frame scrolls a scroller whose box is `rect` while a finger drags at (x, y):
152
+ * nothing in the middle, faster the nearer the edge, full speed at or PAST it — a thumb at the
153
+ * screen's edge is often outside a scroller inset by the page's gutter (vault-stage at 390: the
154
+ * strip ends at 374, the thumb sat at 385). An axis only moves while the finger is level with the
155
+ * box on the other one. Pure, so the feel is tested without a layout.
156
+ */
157
+ export declare function touchEdgeStep(rect: EdgeRect, x: number, y: number): {
158
+ dx: number;
159
+ dy: number;
160
+ };
161
+ /**
162
+ * Scroll `container` while a TOUCH drag holds near its edge — what pragmatic's
163
+ * `autoScrollForElements` does for a mouse, which the touch bridge never reaches. Without it a
164
+ * phone board whose columns are each a screen wide could not carry a card to any other column
165
+ * (forge task 3033). A finger held still keeps scrolling (one step a frame); scroll snapping is
166
+ * suspended while it does, and the container settles back onto its snap points on the drop.
167
+ */
168
+ export declare function registerTouchEdgeScroll(container: HTMLElement): CleanupFn;
135
169
  export {};
136
170
  //# sourceMappingURL=pointerDnd.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointerDnd.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/pointerDnd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pointerDnd.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/pointerDnd.ts"],"names":[],"mappings":"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"}