cursedbelt 5.32.0 → 5.34.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 (195) hide show
  1. package/dist/react/Toast.d.ts +1 -1
  2. package/dist/react/Toast.d.ts.map +1 -1
  3. package/dist/react/Toast.js +19 -4
  4. package/dist/react/Toast.js.map +1 -1
  5. package/dist/react/components/Button.d.ts +16 -1
  6. package/dist/react/components/Button.d.ts.map +1 -1
  7. package/dist/react/components/Button.js +34 -5
  8. package/dist/react/components/Button.js.map +1 -1
  9. package/dist/react/components/ChoiceGroup.d.ts +20 -1
  10. package/dist/react/components/ChoiceGroup.d.ts.map +1 -1
  11. package/dist/react/components/ChoiceGroup.js +15 -2
  12. package/dist/react/components/ChoiceGroup.js.map +1 -1
  13. package/dist/react/components/CopyButton.d.ts +10 -1
  14. package/dist/react/components/CopyButton.d.ts.map +1 -1
  15. package/dist/react/components/CopyButton.js +2 -2
  16. package/dist/react/components/CopyButton.js.map +1 -1
  17. package/dist/react/components/DataTable/DataTable.d.ts +27 -2
  18. package/dist/react/components/DataTable/DataTable.d.ts.map +1 -1
  19. package/dist/react/components/DataTable/DataTable.js +168 -44
  20. package/dist/react/components/DataTable/DataTable.js.map +1 -1
  21. package/dist/react/components/DataTable/RowActions.d.ts +4 -1
  22. package/dist/react/components/DataTable/RowActions.d.ts.map +1 -1
  23. package/dist/react/components/DataTable/RowActions.js +2 -2
  24. package/dist/react/components/DataTable/RowActions.js.map +1 -1
  25. package/dist/react/components/DataTable/columnPriority.d.ts +30 -0
  26. package/dist/react/components/DataTable/columnPriority.d.ts.map +1 -0
  27. package/dist/react/components/DataTable/columnPriority.js +45 -0
  28. package/dist/react/components/DataTable/columnPriority.js.map +1 -0
  29. package/dist/react/components/DataTable/types.d.ts +14 -0
  30. package/dist/react/components/DataTable/types.d.ts.map +1 -1
  31. package/dist/react/components/DataTable/types.js.map +1 -1
  32. package/dist/react/components/EmptyState.d.ts.map +1 -1
  33. package/dist/react/components/EmptyState.js +2 -2
  34. package/dist/react/components/EmptyState.js.map +1 -1
  35. package/dist/react/components/ErrorCard.d.ts +13 -1
  36. package/dist/react/components/ErrorCard.d.ts.map +1 -1
  37. package/dist/react/components/ErrorCard.js +3 -2
  38. package/dist/react/components/ErrorCard.js.map +1 -1
  39. package/dist/react/components/Field.d.ts +37 -12
  40. package/dist/react/components/Field.d.ts.map +1 -1
  41. package/dist/react/components/Field.js +19 -8
  42. package/dist/react/components/Field.js.map +1 -1
  43. package/dist/react/components/Menu.d.ts +58 -0
  44. package/dist/react/components/Menu.d.ts.map +1 -0
  45. package/dist/react/components/Menu.js +86 -0
  46. package/dist/react/components/Menu.js.map +1 -0
  47. package/dist/react/components/Modal.d.ts +1 -0
  48. package/dist/react/components/Modal.d.ts.map +1 -1
  49. package/dist/react/components/Modal.js +3 -2
  50. package/dist/react/components/Modal.js.map +1 -1
  51. package/dist/react/components/SaveIndicator.d.ts +36 -0
  52. package/dist/react/components/SaveIndicator.d.ts.map +1 -0
  53. package/dist/react/components/SaveIndicator.js +48 -0
  54. package/dist/react/components/SaveIndicator.js.map +1 -0
  55. package/dist/react/components/SelectionBar.d.ts +26 -0
  56. package/dist/react/components/SelectionBar.d.ts.map +1 -0
  57. package/dist/react/components/SelectionBar.js +21 -0
  58. package/dist/react/components/SelectionBar.js.map +1 -0
  59. package/dist/react/components/Switch.d.ts +16 -2
  60. package/dist/react/components/Switch.d.ts.map +1 -1
  61. package/dist/react/components/Switch.js +10 -3
  62. package/dist/react/components/Switch.js.map +1 -1
  63. package/dist/react/components/Tooltip.d.ts +1 -1
  64. package/dist/react/components/Tooltip.d.ts.map +1 -1
  65. package/dist/react/components/Tooltip.js +14 -1
  66. package/dist/react/components/Tooltip.js.map +1 -1
  67. package/dist/react/components/TooltipImpl.d.ts.map +1 -1
  68. package/dist/react/components/TooltipImpl.js +37 -7
  69. package/dist/react/components/TooltipImpl.js.map +1 -1
  70. package/dist/react/components/UnstyledButton.d.ts +37 -0
  71. package/dist/react/components/UnstyledButton.d.ts.map +1 -0
  72. package/dist/react/components/UnstyledButton.js +46 -0
  73. package/dist/react/components/UnstyledButton.js.map +1 -0
  74. package/dist/react/components/auth/SignInCard.d.ts +15 -1
  75. package/dist/react/components/auth/SignInCard.d.ts.map +1 -1
  76. package/dist/react/components/auth/SignInCard.js +6 -2
  77. package/dist/react/components/auth/SignInCard.js.map +1 -1
  78. package/dist/react/components/dialog.d.ts.map +1 -1
  79. package/dist/react/components/dialog.js +35 -3
  80. package/dist/react/components/dialog.js.map +1 -1
  81. package/dist/react/hooks/useCopyToClipboard.d.ts +10 -2
  82. package/dist/react/hooks/useCopyToClipboard.d.ts.map +1 -1
  83. package/dist/react/hooks/useCopyToClipboard.js +13 -4
  84. package/dist/react/hooks/useCopyToClipboard.js.map +1 -1
  85. package/dist/react/icons.d.ts +12 -1
  86. package/dist/react/icons.d.ts.map +1 -1
  87. package/dist/react/icons.js +12 -22
  88. package/dist/react/icons.js.map +1 -1
  89. package/dist/react/index.d.ts +8 -4
  90. package/dist/react/index.d.ts.map +1 -1
  91. package/dist/react/index.js +7 -3
  92. package/dist/react/index.js.map +1 -1
  93. package/dist/react/lib/hoverIntent.d.ts +21 -0
  94. package/dist/react/lib/hoverIntent.d.ts.map +1 -1
  95. package/dist/react/lib/hoverIntent.js +24 -0
  96. package/dist/react/lib/hoverIntent.js.map +1 -1
  97. package/dist/react/lib/openDialogs.d.ts +5 -0
  98. package/dist/react/lib/openDialogs.d.ts.map +1 -0
  99. package/dist/react/lib/openDialogs.js +45 -0
  100. package/dist/react/lib/openDialogs.js.map +1 -0
  101. package/dist/styles-areas/analytics.css +16 -16
  102. package/dist/styles-areas/calendar.css +7 -7
  103. package/dist/styles-areas/chat.css +9 -10
  104. package/dist/styles-areas/core.css +69 -62
  105. package/dist/styles-areas/data-table.css +16 -16
  106. package/dist/styles-areas/disk-usage.css +7 -7
  107. package/dist/styles-areas/emoji.css +3 -3
  108. package/dist/styles-areas/fields.css +10 -10
  109. package/dist/styles-areas/filter-rail.css +7 -8
  110. package/dist/styles-areas/layout-engine.css +5 -6
  111. package/dist/styles-areas/master-detail.css +6 -7
  112. package/dist/styles-areas/media-gallery.css +2 -2
  113. package/dist/styles-areas/media.css +2 -2
  114. package/dist/styles-areas/nav.css +17 -18
  115. package/dist/styles-areas/notifications.css +5 -5
  116. package/dist/styles-areas/overlays.css +5 -5
  117. package/dist/styles-areas/sharing.css +2 -2
  118. package/dist/styles-areas/stats.css +4 -4
  119. package/dist/styles-areas/wizard.css +3 -3
  120. package/dist/styles-areas/workbench.css +18 -19
  121. package/dist/styles-utilities.css +72 -0
  122. package/dist/testing/tooltip.d.ts.map +1 -1
  123. package/dist/testing/tooltip.js +8 -18
  124. package/dist/testing/tooltip.js.map +1 -1
  125. package/package.json +81 -3
  126. package/scripts/guardrails-baseline.json +1 -1
  127. package/scripts/styleAreas.ts +4 -0
  128. package/src/react/Toast.spec.tsx +17 -1
  129. package/src/react/Toast.tsx +20 -3
  130. package/src/react/components/Button.spec.tsx +49 -1
  131. package/src/react/components/Button.tsx +63 -6
  132. package/src/react/components/ChoiceGroup.spec.tsx +32 -0
  133. package/src/react/components/ChoiceGroup.tsx +78 -23
  134. package/src/react/components/CopyButton.spec.tsx +35 -0
  135. package/src/react/components/CopyButton.tsx +11 -2
  136. package/src/react/components/DataTable/DataTable.spec.tsx +16 -0
  137. package/src/react/components/DataTable/DataTable.tsx +266 -37
  138. package/src/react/components/DataTable/RowActions.tsx +5 -2
  139. package/src/react/components/DataTable/columnPriority.spec.ts +97 -0
  140. package/src/react/components/DataTable/columnPriority.ts +54 -0
  141. package/src/react/components/DataTable/types.ts +14 -0
  142. package/src/react/components/DataTable/virtualize.spec.tsx +47 -2
  143. package/src/react/components/EmptyState.spec.tsx +7 -0
  144. package/src/react/components/EmptyState.tsx +3 -0
  145. package/src/react/components/ErrorCard.spec.tsx +32 -0
  146. package/src/react/components/ErrorCard.tsx +17 -1
  147. package/src/react/components/Field.spec.tsx +61 -0
  148. package/src/react/components/Field.tsx +84 -27
  149. package/src/react/components/Menu.spec.tsx +90 -0
  150. package/src/react/components/Menu.tsx +204 -0
  151. package/src/react/components/Modal.spec.tsx +84 -0
  152. package/src/react/components/Modal.tsx +4 -1
  153. package/src/react/components/SaveIndicator.spec.tsx +35 -0
  154. package/src/react/components/SaveIndicator.tsx +85 -0
  155. package/src/react/components/SelectionBar.spec.tsx +32 -0
  156. package/src/react/components/SelectionBar.tsx +49 -0
  157. package/src/react/components/Switch.spec.tsx +25 -0
  158. package/src/react/components/Switch.tsx +49 -4
  159. package/src/react/components/Tooltip.spec.tsx +183 -2
  160. package/src/react/components/Tooltip.tsx +14 -2
  161. package/src/react/components/TooltipImpl.tsx +42 -8
  162. package/src/react/components/UnstyledButton.spec.tsx +61 -0
  163. package/src/react/components/UnstyledButton.tsx +83 -0
  164. package/src/react/components/auth/SignInCard.spec.tsx +34 -0
  165. package/src/react/components/auth/SignInCard.tsx +36 -3
  166. package/src/react/components/dialog.tsx +49 -9
  167. package/src/react/hooks/useCopyToClipboard.ts +17 -4
  168. package/src/react/icons.spec.ts +32 -1
  169. package/src/react/icons.tsx +59 -0
  170. package/src/react/index.ts +23 -2
  171. package/src/react/lib/hoverIntent.ts +28 -0
  172. package/src/react/lib/openDialogs.ts +48 -0
  173. package/src/styles-areas/analytics.css +16 -16
  174. package/src/styles-areas/calendar.css +7 -7
  175. package/src/styles-areas/chat.css +9 -10
  176. package/src/styles-areas/core.css +69 -62
  177. package/src/styles-areas/data-table.css +16 -16
  178. package/src/styles-areas/disk-usage.css +7 -7
  179. package/src/styles-areas/emoji.css +3 -3
  180. package/src/styles-areas/fields.css +10 -10
  181. package/src/styles-areas/filter-rail.css +7 -8
  182. package/src/styles-areas/layout-engine.css +5 -6
  183. package/src/styles-areas/master-detail.css +6 -7
  184. package/src/styles-areas/media-gallery.css +2 -2
  185. package/src/styles-areas/media.css +2 -2
  186. package/src/styles-areas/nav.css +17 -18
  187. package/src/styles-areas/notifications.css +5 -5
  188. package/src/styles-areas/overlays.css +5 -5
  189. package/src/styles-areas/sharing.css +2 -2
  190. package/src/styles-areas/stats.css +4 -4
  191. package/src/styles-areas/wizard.css +3 -3
  192. package/src/styles-areas/workbench.css +18 -19
  193. package/src/styles-utilities.css +72 -0
  194. package/src/testing/tooltip.spec.ts +19 -0
  195. package/src/testing/tooltip.ts +17 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/react/components/Field.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxF,OAAO,EACL,sBAAsB,EAEtB,KAAK,UAAU,EAEhB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC;;uFAEuF;AACvF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,IAAI,GAAG,SAAS,CAAC;IACjC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sEAAsE;IACtE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,OAAO,EAAE,gBAAgB,KAAK,SAAS,CAAC,CAAC;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;CAClD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,iBAAyB,EACzB,KAAK,EACL,mBAA4B,GAC7B,EAAE,UAAU,+BAsHZ"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/react/components/Field.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,YAAY,EAAE,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAG/F,OAAO,EACL,sBAAsB,EAEtB,KAAK,UAAU,EAEhB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC;;uFAEuF;AACvF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,cAAc,EAAE,IAAI,GAAG,SAAS,CAAC;IACjC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,UAAU,cAAc;IACtB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sEAAsE;IACtE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;CAClD;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GACrC,CACI;IACE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;;;OAKG;IACH,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,OAAO,EAAE,gBAAgB,KAAK,SAAS,CAAC,CAAC;CACrE,GACD;IACE;;;;;;;;;;OAUG;IACH,KAAK,EAAE,IAAI,CAAC;IACZ,4CAA4C;IAC5C,QAAQ,EAAE,SAAS,CAAC;CACrB,CACJ,CAAC;AAEJ;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,iBAAyB,EACzB,KAAK,EACL,mBAA4B,EAC5B,KAAa,GACd,EAAE,UAAU,+BAgJZ"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { AlertCircle } from 'lucide-react';
3
- import { cloneElement, isValidElement } from 'react';
3
+ import { cloneElement, isValidElement, useId } from 'react';
4
4
  import { get, useFormContext } from 'react-hook-form';
5
5
  import { cn } from '../lib/cn.js';
6
6
  import { DESCRIPTION_FOLD_CHARS, FIELD_WIDTH_CLASS, naturalFieldWidth, } from '../lib/field.js';
@@ -24,11 +24,13 @@ export { DESCRIPTION_FOLD_CHARS };
24
24
  * Usable outside a `FormProvider` (label + control render; no error) so option-form
25
25
  * snippets can reuse it, but the error wiring needs a form context.
26
26
  */
27
- export function Field({ name, label, hint, description, required, children, className, reserveErrorSpace = false, width, descriptionOnNarrow = 'auto', }) {
27
+ export function Field({ name, label, hint, description, required, children, className, reserveErrorSpace = false, width, descriptionOnNarrow = 'auto', group = false, }) {
28
28
  const form = useFormContext();
29
29
  const errors = form?.formState.errors;
30
- const error = (errors ? get(errors, name)?.message : undefined);
31
- const id = `cb-f-${name}`;
30
+ const error = (errors && name ? get(errors, name)?.message : undefined);
31
+ const autoId = useId();
32
+ const id = name ? `cb-f-${name}` : `cb-f${autoId.replace(/[^A-Za-z0-9_-]/g, '')}`;
33
+ const labelId = `${id}-label`;
32
34
  const descId = description != null ? `${id}-desc` : undefined;
33
35
  const errId = error ? `${id}-err` : undefined;
34
36
  const describedBy = [descId, errId].filter(Boolean).join(' ') || undefined;
@@ -39,7 +41,7 @@ export function Field({ name, label, hint, description, required, children, clas
39
41
  'aria-describedby': describedBy,
40
42
  };
41
43
  const resolvedWidth = width ??
42
- (typeof children !== 'function' && isValidElement(children)
44
+ (!group && typeof children !== 'function' && isValidElement(children)
43
45
  ? naturalFieldWidth(children.type, (children.props ?? {}))
44
46
  : 'full');
45
47
  const widthClass = FIELD_WIDTH_CLASS[resolvedWidth];
@@ -50,13 +52,22 @@ export function Field({ name, label, hint, description, required, children, clas
50
52
  description.length > DESCRIPTION_FOLD_CHARS));
51
53
  const control = typeof children === 'function'
52
54
  ? children(aria)
53
- : isValidElement(children)
55
+ : !group && isValidElement(children)
54
56
  ? cloneElement(children, {
55
57
  id,
56
58
  'aria-invalid': aria['aria-invalid'],
57
- 'aria-describedby': describedBy,
59
+ // A control that already points at a note of its own keeps it, beside ours.
60
+ 'aria-describedby': [children.props['aria-describedby'], describedBy].filter(Boolean).join(' ') ||
61
+ undefined,
58
62
  })
59
63
  : children;
60
- return (_jsxs("div", { className: cn('flex flex-col gap-1.5', className), "data-cb-field-width": resolvedWidth, children: [label != null || hint != null || folds ? (_jsxs("div", { className: 'flex items-center gap-1', children: [label != null ? (_jsxs("label", { htmlFor: id, className: 'text-sm font-medium text-foreground', children: [label, required ? (_jsxs("span", { className: 'text-field-error', "aria-hidden": true, children: [' ', "*"] })) : null] })) : null, hint != null && !folds ? (_jsx(InfoHint, { title: typeof label === 'string' ? label : undefined, children: hint })) : null, folds ? (_jsxs(_Fragment, { children: [hint != null ? (_jsx("span", { className: 'inline-flex max-sm:hidden', children: _jsx(InfoHint, { title: typeof label === 'string' ? label : undefined, children: hint }) })) : null, _jsx("span", { className: 'inline-flex sm:hidden', children: _jsxs(InfoHint, { title: typeof label === 'string' ? label : undefined, children: [hint != null ? _jsx("p", { className: 'mb-1', children: hint }) : null, description] }) })] })) : null] })) : null, description != null ? (_jsx("p", { id: descId, className: cn('text-xs font-normal leading-snug text-muted-foreground', folds && 'max-sm:hidden'), children: description })) : null, widthClass ? (_jsx("div", { className: cn('w-full', widthClass), "data-cb-field-control": '', children: control })) : (control), error ? (_jsxs("p", { id: errId, role: 'alert', className: 'flex items-center gap-1.5 text-sm text-field-error', children: [_jsx(AlertCircle, { className: 'size-4 shrink-0', "aria-hidden": true }), error] })) : reserveErrorSpace ? (_jsx("p", { "aria-hidden": true, className: 'min-h-[1lh] text-sm', "data-cc-field-error-reserved": '' })) : null] }));
64
+ const asterisk = required ? (_jsxs("span", { className: 'text-field-error', "aria-hidden": true, children: [' ', "*"] })) : null;
65
+ return (_jsxs("div", { className: cn('flex flex-col gap-1.5', className), "data-cb-field": '', "data-cb-field-width": resolvedWidth, ...(group
66
+ ? {
67
+ role: 'group',
68
+ 'aria-labelledby': label != null ? labelId : undefined,
69
+ 'aria-describedby': describedBy,
70
+ }
71
+ : {}), children: [label != null || hint != null || folds ? (_jsxs("div", { className: 'flex items-center gap-1', children: [label != null ? (group ? (_jsxs("span", { id: labelId, className: 'text-sm font-medium text-foreground', "data-cb-field-label": '', children: [label, asterisk] })) : (_jsxs("label", { htmlFor: id, className: 'text-sm font-medium text-foreground', "data-cb-field-label": '', children: [label, asterisk] }))) : null, hint != null && !folds ? (_jsx(InfoHint, { title: typeof label === 'string' ? label : undefined, children: hint })) : null, folds ? (_jsxs(_Fragment, { children: [hint != null ? (_jsx("span", { className: 'inline-flex max-sm:hidden', children: _jsx(InfoHint, { title: typeof label === 'string' ? label : undefined, children: hint }) })) : null, _jsx("span", { className: 'inline-flex sm:hidden', children: _jsxs(InfoHint, { title: typeof label === 'string' ? label : undefined, children: [hint != null ? _jsx("p", { className: 'mb-1', children: hint }) : null, description] }) })] })) : null] })) : null, description != null ? (_jsx("p", { id: descId, "data-cb-field-description": '', className: cn('text-xs font-normal leading-snug text-muted-foreground', folds && 'max-sm:hidden'), children: description })) : null, widthClass ? (_jsx("div", { className: cn('w-full', widthClass), "data-cb-field-control": '', children: control })) : (control), error ? (_jsxs("p", { id: errId, role: 'alert', className: 'flex items-center gap-1.5 text-sm text-field-error', children: [_jsx(AlertCircle, { className: 'size-4 shrink-0', "aria-hidden": true }), error] })) : reserveErrorSpace ? (_jsx("p", { "aria-hidden": true, className: 'min-h-[1lh] text-sm', "data-cc-field-error-reserved": '' })) : null] }));
61
72
  }
62
73
  //# sourceMappingURL=Field.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../../src/react/components/Field.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../../src/react/components/Field.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface MenuProps {
3
+ children: ReactNode;
4
+ /** Names the menu for a screen reader when nothing else does. */
5
+ 'aria-label'?: string;
6
+ className?: string;
7
+ }
8
+ /**
9
+ * The list. Arrow keys, Home and End move between items (refused ones included — a refused
10
+ * item is reachable on purpose); every other key is left to bubble.
11
+ */
12
+ export declare function Menu({ children, className, ...rest }: MenuProps): import("react").JSX.Element;
13
+ export interface MenuItemProps {
14
+ onSelect?: () => void;
15
+ /** Drawn right-aligned and muted — `⌘D`, `Del`. */
16
+ shortcut?: string;
17
+ /** Destroys something: drawn in the destructive colour. */
18
+ danger?: boolean;
19
+ /** Momentarily inert. Use {@link MenuItemProps.unavailableReason} for "cannot work here". */
20
+ disabled?: boolean;
21
+ /**
22
+ * One of a set of choices, and whether this is the one in force.
23
+ *
24
+ * Present at all makes the item a `menuitemradio` rather than a command, so a screen reader
25
+ * says "checked" and the tick is not the only thing carrying it. A menu of choices that
26
+ * shows none of them as current is one you have to open, read, and then still guess at.
27
+ */
28
+ selected?: boolean;
29
+ /**
30
+ * Why this item cannot work HERE, and supplying it refuses the press — as {@link Button}'s
31
+ * does: `aria-disabled`, still focusable and hoverable so the reason is reachable by
32
+ * keyboard, turned away on click and Enter/Space. The reason is the hint.
33
+ */
34
+ unavailableReason?: string;
35
+ /**
36
+ * The item's own words, in full, as a hint — for a label that truncates. A menu item that
37
+ * names a file is as long as the file's name, and for a destructive item the truncated
38
+ * half is the half that says what would go.
39
+ */
40
+ title?: string;
41
+ /**
42
+ * A second, muted line under the label, for items that make DIFFERENT things ("Markdown
43
+ * note" / "Rich text note"). It is the item's description, never part of its name.
44
+ */
45
+ hint?: string;
46
+ className?: string;
47
+ children: ReactNode;
48
+ }
49
+ export declare function MenuItem({ onSelect, shortcut, danger, disabled, selected, unavailableReason, title, hint, className, children, }: MenuItemProps): import("react").JSX.Element;
50
+ /** A small uppercase heading over a group of items. */
51
+ export declare function MenuLabel({ children, className }: {
52
+ children: ReactNode;
53
+ className?: string;
54
+ }): import("react").JSX.Element;
55
+ export declare function MenuSeparator({ className }: {
56
+ className?: string;
57
+ }): import("react").JSX.Element;
58
+ //# sourceMappingURL=Menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../src/react/components/Menu.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AA6BlE,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,+BA6B/D;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,GACT,EAAE,aAAa,+BAkEf;AAED,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAS7F;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAGlE"}
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Check } from 'lucide-react';
3
+ import { useId } from 'react';
4
+ import { cn } from '../lib/cn.js';
5
+ import { TAP_TARGET_HEIGHT } from '../lib/tapTarget.js';
6
+ import { Tooltip } from './Tooltip.js';
7
+ /*
8
+ A menu that goes wherever its panel goes.
9
+
10
+ `DropdownMenu` is Radix's, and Radix anchors a menu to its trigger. A context menu at the
11
+ cursor, a menu over a grid cell, a `+` that opens under a row of the sidebar: those are
12
+ anchored at a POINT, which the belt's `Popover` already does (`anchor={{ x, y, trigger }}`).
13
+ So this is only the menu — the list, its items and its keys — and the panel is whichever
14
+ `Popover` (or sheet, or card) the caller puts it in:
15
+
16
+ <Popover anchor={at} onOpenChange={(open) => !open && setAt(null)}>
17
+ <Menu>
18
+ <MenuItem onSelect={rename}>Rename</MenuItem>
19
+ <MenuSeparator />
20
+ <MenuItem danger onSelect={remove}>Delete</MenuItem>
21
+ </Menu>
22
+ </Popover>
23
+
24
+ Came from desk's `Menu`/`MenuItem`/`MenuLabel`/`MenuSeparator` (forge task 2415), with what
25
+ desk had learned: refused items that stay reachable, radio choices that say which is in
26
+ force, a hint line that describes rather than names, and a shortcut column.
27
+ */
28
+ const ITEMS = '[role="menuitem"],[role="menuitemradio"]';
29
+ /**
30
+ * The list. Arrow keys, Home and End move between items (refused ones included — a refused
31
+ * item is reachable on purpose); every other key is left to bubble.
32
+ */
33
+ export function Menu({ children, className, ...rest }) {
34
+ const onKeyDown = (event) => {
35
+ const items = [...event.currentTarget.querySelectorAll(ITEMS)].filter((item) => !item.disabled);
36
+ if (items.length === 0)
37
+ return;
38
+ const at = items.indexOf(document.activeElement);
39
+ let next;
40
+ if (event.key === 'ArrowDown')
41
+ next = at < 0 ? 0 : (at + 1) % items.length;
42
+ else if (event.key === 'ArrowUp')
43
+ next = at < 0 ? items.length - 1 : (at - 1 + items.length) % items.length;
44
+ else if (event.key === 'Home')
45
+ next = 0;
46
+ else if (event.key === 'End')
47
+ next = items.length - 1;
48
+ else
49
+ return;
50
+ event.preventDefault();
51
+ event.stopPropagation();
52
+ items[next]?.focus();
53
+ };
54
+ return (_jsx("div", { role: 'menu', tabIndex: -1, "data-cb-menu": '', "aria-label": rest['aria-label'], onKeyDown: onKeyDown, className: cn('flex flex-col gap-px outline-none', className), children: children }));
55
+ }
56
+ export function MenuItem({ onSelect, shortcut, danger, disabled, selected, unavailableReason, title, hint, className, children, }) {
57
+ const hintId = useId();
58
+ const reason = unavailableReason?.trim() || undefined;
59
+ const refused = reason !== undefined && !disabled;
60
+ const choice = selected !== undefined;
61
+ return (_jsx(Tooltip, { content: reason ?? title, side: 'right', multiline: true, children: _jsxs("button", {
62
+ // guardrails-ignore no-raw-action-button: task 2415 — this IS the menu item primitive.
63
+ type: 'button', role: choice ? 'menuitemradio' : 'menuitem', "aria-checked": choice ? selected : undefined, "aria-describedby": hint ? hintId : undefined, disabled: refused ? undefined : disabled, "aria-disabled": refused ? true : undefined, "data-cb-menu-item": '', "data-danger": danger ? '' : undefined, className: cn('flex w-full cursor-pointer items-center gap-2 whitespace-nowrap rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm text-foreground outline-none', TAP_TARGET_HEIGHT, 'hover:bg-muted focus-visible:bg-muted focus-visible:ring-2 focus-visible:ring-accent', danger && 'text-destructive hover:bg-destructive/10 focus-visible:bg-destructive/10',
64
+ // Both spellings, together: a refused item is aria-disabled, not disabled, and without
65
+ // the second half it lights up under the pointer exactly like a live one.
66
+ 'disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent', 'aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:hover:bg-transparent', hint && 'items-start py-2', className), onClick: (event) => {
67
+ if (refused) {
68
+ event.preventDefault();
69
+ event.stopPropagation();
70
+ return;
71
+ }
72
+ onSelect?.();
73
+ }, onKeyDown: (event) => {
74
+ if (refused && (event.key === 'Enter' || event.key === ' '))
75
+ event.preventDefault();
76
+ }, children: [choice && (_jsx("span", { className: 'flex w-4 shrink-0 justify-center text-accent', "aria-hidden": true, children: selected ? _jsx(Check, { className: 'size-3.5' }) : null })), _jsxs("span", { className: 'flex min-w-0 flex-1 flex-col gap-0.5', children: [_jsx("span", { className: 'truncate', children: children }), hint && (_jsx("span", { id: hintId, "aria-hidden": true, "data-cb-menu-hint": '', className: 'whitespace-normal text-xs leading-snug text-muted-foreground', children: hint }))] }), shortcut && (_jsx("span", { "data-cb-menu-shortcut": '', className: 'ml-auto pl-4 font-mono text-xs text-muted-foreground', children: shortcut }))] }) }));
77
+ }
78
+ /** A small uppercase heading over a group of items. */
79
+ export function MenuLabel({ children, className }) {
80
+ return (_jsx("div", { "data-cb-menu-label": '', className: cn('px-2 pt-2 pb-1 font-bold text-muted-foreground text-xs uppercase tracking-wider', className), children: children }));
81
+ }
82
+ export function MenuSeparator({ className }) {
83
+ // biome-ignore lint/a11y/useSemanticElements: an <hr> inside role=menu is not a menu separator to AT; role=separator is.
84
+ return _jsx("div", { role: 'separator', className: cn('my-1 h-px bg-border', className) });
85
+ }
86
+ //# sourceMappingURL=Menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../src/react/components/Menu.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
+ export { useDialogOpen } from '../lib/openDialogs.js';
2
3
  export type ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
3
4
  export interface ModalProps {
4
5
  open: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/react/components/Modal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAkC3D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gFAAgF;IAChF,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,IAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAiB,EACjB,aAAoB,EACpB,KAAK,EACL,UAAiB,EACjB,SAAS,GACV,EAAE,UAAU,+BA+IZ"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/react/components/Modal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAkC3D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gFAAgF;IAChF,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,IAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAiB,EACjB,aAAoB,EACpB,KAAK,EACL,UAAiB,EACjB,SAAS,GACV,EAAE,UAAU,+BAgJZ"}
@@ -8,6 +8,7 @@ import { FooterSlot } from './ActionBar.js';
8
8
  import { Dialog, DialogContent, DialogTitle, focusPanelOnOpen } from './dialog.js';
9
9
  import { IconButton } from './IconButton.js';
10
10
  import { ScrollArea } from './ScrollArea.js';
11
+ export { useDialogOpen } from '../lib/openDialogs.js';
11
12
  // ONE sizing scale replaces the ad-hoc `max-w-xl`/`max-w-2xl`/`max-h-[80vh]` classNames
12
13
  // scattered across the apps' modals. `full` is a near-fullscreen sheet with a 1rem margin
13
14
  // on every side; `cn`'s twMerge dedupes its `max-h` against the base below (last wins).
@@ -60,7 +61,7 @@ export function Modal({ open, onClose, size = 'md', title, subtitle, children, f
60
61
  return (_jsx(Dialog, { open: open, onOpenChange: (v) => {
61
62
  if (!v)
62
63
  guardedClose();
63
- }, children: _jsxs(DialogContent, { className: cn(
64
+ }, children: _jsxs(DialogContent, { "data-cb-modal": '', className: cn(
64
65
  // A bottom sheet on a phone, a centred card from `sm` up (see SHEET / CARD). The
65
66
  // card keeps a 1rem margin on each side at every size, then caps at the size's
66
67
  // max-width.
@@ -93,6 +94,6 @@ export function Modal({ open, onClose, size = 'md', title, subtitle, children, f
93
94
  cancelDiscard();
94
95
  else
95
96
  guardedClose();
96
- }, children: [_jsxs("div", { ref: swipeRef, "data-cb-modal-handle": '', className: 'relative flex flex-none items-center justify-between gap-3 border-b border-border px-5 py-4 max-sm:touch-none max-sm:pt-6', children: [_jsx("span", { "aria-hidden": true, className: 'pointer-events-none absolute top-2 left-1/2 h-1 w-9 -translate-x-1/2 rounded-full bg-border sm:hidden' }), title ? (_jsxs("div", { className: 'min-w-0 flex-1', children: [_jsx(DialogTitle, { className: 'wrap-break-word text-base font-semibold', children: title }), subtitle ? (_jsx("p", { className: 'mt-1 text-caption leading-relaxed text-muted-foreground', children: subtitle })) : null] })) : (_jsx(DialogTitle, { className: 'sr-only', children: "Dialog" })), _jsx(IconButton, { label: 'Close', onClick: guardedClose, children: _jsx(X, {}) })] }), aside ? (_jsxs("div", { "data-cb-modal-split": '', className: 'flex min-h-0 flex-1 flex-col md:flex-row md:divide-x md:divide-border', children: [_jsx("div", { "data-cb-modal-aside": '', className: cn('flex min-h-0 flex-col md:flex-none', asideWidth === 'md' ? 'md:w-2/5' : 'md:w-1/3'), children: _jsx(ScrollArea, { className: 'px-5 py-4', children: aside }) }), _jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: scrollBody ? (_jsx(ScrollArea, { className: 'px-5 py-4', children: children })) : (_jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: children })) })] })) : scrollBody ? (_jsx(ScrollArea, { className: 'px-5 py-4', children: children })) : (_jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: children })), problem ? (_jsx("div", { className: 'flex-none px-5 pt-3 empty:hidden', children: problem })) : null, _jsx(FooterSlot, { footer: footer }), discardOverlay] }) }));
97
+ }, children: [_jsxs("div", { ref: swipeRef, "data-cb-modal-handle": '', className: 'relative flex flex-none items-center justify-between gap-3 border-b border-border px-5 py-4 max-sm:touch-none max-sm:pt-6', children: [_jsx("span", { "aria-hidden": true, className: 'pointer-events-none absolute top-2 left-1/2 h-1 w-9 -translate-x-1/2 rounded-full bg-border sm:hidden' }), title ? (_jsxs("div", { className: 'min-w-0 flex-1', children: [_jsx(DialogTitle, { className: 'wrap-break-word text-base font-semibold', children: title }), subtitle ? (_jsx("p", { "data-cb-modal-subtitle": '', className: 'mt-1 text-caption leading-relaxed text-muted-foreground', children: subtitle })) : null] })) : (_jsx(DialogTitle, { className: 'sr-only', children: "Dialog" })), _jsx(IconButton, { label: 'Close', onClick: guardedClose, children: _jsx(X, {}) })] }), aside ? (_jsxs("div", { "data-cb-modal-split": '', className: 'flex min-h-0 flex-1 flex-col md:flex-row md:divide-x md:divide-border', children: [_jsx("div", { "data-cb-modal-aside": '', className: cn('flex min-h-0 flex-col md:flex-none', asideWidth === 'md' ? 'md:w-2/5' : 'md:w-1/3'), children: _jsx(ScrollArea, { className: 'px-5 py-4', children: aside }) }), _jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: scrollBody ? (_jsx(ScrollArea, { className: 'px-5 py-4', children: children })) : (_jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: children })) })] })) : scrollBody ? (_jsx(ScrollArea, { className: 'px-5 py-4', children: children })) : (_jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: children })), problem ? (_jsx("div", { className: 'flex-none px-5 pt-3 empty:hidden', children: problem })) : null, _jsx(FooterSlot, { footer: footer }), discardOverlay] }) }));
97
98
  }
98
99
  //# sourceMappingURL=Modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../src/react/components/Modal.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../src/react/components/Modal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /** Where an editor's writes stand. */
2
+ export type SaveState = 'idle' | 'pending' | 'saving' | 'saved' | 'conflict' | 'error';
3
+ export interface SaveIndicatorProps {
4
+ state: SaveState;
5
+ /** Writes waiting to reach the server — shown with `pending` and `saving`. */
6
+ queued?: number;
7
+ /** The failure in words; replaces the hint while set. */
8
+ error?: string | null;
9
+ /**
10
+ * Writes that have REACHED the server, published as `data-saves`.
11
+ *
12
+ * Nobody looks at it: it is for a test, which cannot infer "did my gesture save?" from
13
+ * `data-state` — an indicator that is `idle` because the gesture has not enqueued anything
14
+ * yet is indistinguishable from one that is idle because everything is written.
15
+ */
16
+ saves?: number;
17
+ className?: string;
18
+ }
19
+ /** The words for each state; `queued` fills in the count. */
20
+ export declare function saveIndicatorLabel(state: SaveState, queued?: number): string;
21
+ /**
22
+ * The status-bar save state: a dot, and words only when somebody has to act.
23
+ *
24
+ * At rest (`idle`, `saved`) the dot says it on its own and the label is spoken, not drawn —
25
+ * the owner: *"the green circle with a tooltip is fine so it doesn't have to take up space
26
+ * with the word there"*. `Saving…`, `3 unsaved`, `Changed elsewhere` and `Save failed` are
27
+ * each a state somebody has to act on, and a coloured dot is not a sentence, so those are
28
+ * drawn. 🔴 The resting label is `sr-only`, never deleted: whether work is written is
29
+ * exactly what a screen reader user cannot infer from a colour.
30
+ *
31
+ * `data-cb-save-indicator`, `data-state` and `data-saves` are stable test hooks.
32
+ *
33
+ * Came from desk's `SaveIndicator` (forge task 2415).
34
+ */
35
+ export declare function SaveIndicator({ state, queued, error, saves, className }: SaveIndicatorProps): import("react").JSX.Element;
36
+ //# sourceMappingURL=SaveIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SaveIndicator.d.ts","sourceRoot":"","sources":["../../../src/react/components/SaveIndicator.tsx"],"names":[],"mappings":"AAGA,sCAAsC;AACtC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAEvF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,SAAI,GAAG,MAAM,CAevE;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,MAAU,EAAE,KAAY,EAAE,KAAS,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BAoB1G"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../lib/cn.js';
3
+ import { Tooltip } from './Tooltip.js';
4
+ /** The words for each state; `queued` fills in the count. */
5
+ export function saveIndicatorLabel(state, queued = 0) {
6
+ switch (state) {
7
+ case 'saving':
8
+ return `Saving${queued > 0 ? ` ${queued}` : ''}…`;
9
+ case 'pending':
10
+ return `${queued} unsaved`;
11
+ case 'saved':
12
+ return 'Saved';
13
+ case 'conflict':
14
+ return 'Changed elsewhere';
15
+ case 'error':
16
+ return 'Save failed';
17
+ default:
18
+ return 'Up to date';
19
+ }
20
+ }
21
+ const DOT = {
22
+ idle: 'bg-muted-foreground/60',
23
+ pending: 'bg-muted-foreground/60',
24
+ saving: 'bg-warning animate-pulse',
25
+ saved: 'bg-success',
26
+ conflict: 'bg-warning',
27
+ error: 'bg-destructive',
28
+ };
29
+ /**
30
+ * The status-bar save state: a dot, and words only when somebody has to act.
31
+ *
32
+ * At rest (`idle`, `saved`) the dot says it on its own and the label is spoken, not drawn —
33
+ * the owner: *"the green circle with a tooltip is fine so it doesn't have to take up space
34
+ * with the word there"*. `Saving…`, `3 unsaved`, `Changed elsewhere` and `Save failed` are
35
+ * each a state somebody has to act on, and a coloured dot is not a sentence, so those are
36
+ * drawn. 🔴 The resting label is `sr-only`, never deleted: whether work is written is
37
+ * exactly what a screen reader user cannot infer from a colour.
38
+ *
39
+ * `data-cb-save-indicator`, `data-state` and `data-saves` are stable test hooks.
40
+ *
41
+ * Came from desk's `SaveIndicator` (forge task 2415).
42
+ */
43
+ export function SaveIndicator({ state, queued = 0, error = null, saves = 0, className }) {
44
+ const label = saveIndicatorLabel(state, queued);
45
+ const resting = state === 'idle' || state === 'saved';
46
+ return (_jsx(Tooltip, { content: error ?? label, multiline: true, children: _jsxs("span", { "data-cb-save-indicator": '', "data-state": state, "data-saves": saves, className: cn('inline-flex items-center gap-1.5 whitespace-nowrap text-xs text-muted-foreground', state === 'error' && 'font-semibold text-destructive', className), children: [_jsx("span", { "aria-hidden": true, className: cn('size-1.5 shrink-0 rounded-full', DOT[state]) }), resting ? _jsx("span", { className: 'sr-only', children: label }) : label] }) }));
47
+ }
48
+ //# sourceMappingURL=SaveIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SaveIndicator.js","sourceRoot":"","sources":["../../../src/react/components/SaveIndicator.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsBvC,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,KAAgB,EAAE,MAAM,GAAG,CAAC;IAC7D,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QACpD,KAAK,SAAS;YACZ,OAAO,GAAG,MAAM,UAAU,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,mBAAmB,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,YAAY,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,GAAG,GAA8B;IACrC,IAAI,EAAE,wBAAwB;IAC9B,OAAO,EAAE,wBAAwB;IACjC,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,YAAY;IACtB,KAAK,EAAE,gBAAgB;CACxB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,EAAsB;IACzG,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC;IACtD,OAAO,CACL,KAAC,OAAO,IAAC,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,SAAS,kBACzC,0CACyB,EAAE,gBACb,KAAK,gBACL,KAAK,EACjB,SAAS,EAAE,EAAE,CACX,kFAAkF,EAClF,KAAK,KAAK,OAAO,IAAI,gCAAgC,EACrD,SAAS,CACV,aAED,oCAAkB,SAAS,EAAE,EAAE,CAAC,gCAAgC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAI,EAChF,OAAO,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,SAAS,YAAE,KAAK,GAAQ,CAAC,CAAC,CAAC,KAAK,IACtD,GACC,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface SelectionBarProps {
3
+ /** How many things are ticked. At 0 the bar is not rendered at all. */
4
+ count: number;
5
+ /** The singular noun ("item", "file"); an `s` is added for any count but one. Default `'item'`. */
6
+ noun?: string;
7
+ /** Overrides the plural when an `s` is wrong ("entries"). */
8
+ plural?: string;
9
+ /** The actions on the selection — the destructive one last, so it sits far right. */
10
+ children?: ReactNode;
11
+ className?: string;
12
+ }
13
+ /**
14
+ * The bar that appears when something is ticked.
15
+ *
16
+ * DESIGN.md §2: the count on the left, the actions on the right with the destructive one
17
+ * far right, one line. It is ABSENT rather than disabled when nothing is selected — a
18
+ * permanent bar saying "0 selected" is a row of the screen spent on nothing.
19
+ *
20
+ * A `group` named by its own count, so a screen reader arriving on an action hears what it
21
+ * acts on. `data-cb-selection-bar` is the stable test hook.
22
+ *
23
+ * Came from desk's `SelectionBar` (forge task 2415).
24
+ */
25
+ export declare function SelectionBar({ count, noun, plural, children, className }: SelectionBarProps): import("react").JSX.Element | null;
26
+ //# sourceMappingURL=SelectionBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionBar.d.ts","sourceRoot":"","sources":["../../../src/react/components/SelectionBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,mGAAmG;IACnG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,IAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,sCAqBpG"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../lib/cn.js';
3
+ /**
4
+ * The bar that appears when something is ticked.
5
+ *
6
+ * DESIGN.md §2: the count on the left, the actions on the right with the destructive one
7
+ * far right, one line. It is ABSENT rather than disabled when nothing is selected — a
8
+ * permanent bar saying "0 selected" is a row of the screen spent on nothing.
9
+ *
10
+ * A `group` named by its own count, so a screen reader arriving on an action hears what it
11
+ * acts on. `data-cb-selection-bar` is the stable test hook.
12
+ *
13
+ * Came from desk's `SelectionBar` (forge task 2415).
14
+ */
15
+ export function SelectionBar({ count, noun = 'item', plural, children, className }) {
16
+ if (count <= 0)
17
+ return null;
18
+ const words = `${count.toLocaleString()} ${count === 1 ? noun : (plural ?? `${noun}s`)} selected`;
19
+ return (_jsxs("div", { role: 'group', "aria-label": words, "data-cb-selection-bar": '', className: cn('mb-3 flex min-h-[var(--control-h-md)] flex-wrap items-center gap-2 rounded-md border border-accent bg-accent/10 px-3 py-2', className), children: [_jsx("span", { "data-cb-selection-count": '', className: 'text-sm font-semibold tabular-nums', children: words }), _jsx("span", { className: 'flex-1', "aria-hidden": true }), children] }));
20
+ }
21
+ //# sourceMappingURL=SelectionBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionBar.js","sourceRoot":"","sources":["../../../src/react/components/SelectionBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAclC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAqB;IACnG,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC;IAClG,OAAO,CAEL,eACE,IAAI,EAAC,OAAO,gBACA,KAAK,2BACK,EAAE,EACxB,SAAS,EAAE,EAAE,CACX,2HAA2H,EAC3H,SAAS,CACV,aAED,0CAA8B,EAAE,EAAC,SAAS,EAAC,oCAAoC,YAC5E,KAAK,GACD,EACP,eAAM,SAAS,EAAC,QAAQ,wBAAe,EACtC,QAAQ,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -1,6 +1,20 @@
1
1
  import * as RadixSwitch from '@radix-ui/react-switch';
2
- import type { ComponentPropsWithoutRef } from 'react';
2
+ import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
3
3
  export interface SwitchProps extends ComponentPropsWithoutRef<typeof RadixSwitch.Root> {
4
+ /**
5
+ * The setting's name, drawn at the START of a full-width row with the track at its
6
+ * end — the settings-row layout (iOS Settings, Linear's preferences). The whole row
7
+ * is the `<label>`, so pressing the words flips the switch. A node, so a caption can
8
+ * carry an ⓘ or a second line of hint.
9
+ */
10
+ label?: ReactNode;
11
+ /** Typography for the caption; `cn` is tailwind-merge, so it replaces the default. */
12
+ labelClassName?: string;
13
+ /**
14
+ * Say "On" / "Off" beside the track. A track with a dot at one end is not
15
+ * self-evident to everybody, and a word next to it costs nothing.
16
+ */
17
+ showState?: boolean;
4
18
  }
5
19
  /**
6
20
  * On/off toggle vendored from shadcn (Radix `Switch`). The filled track turns the
@@ -8,5 +22,5 @@ export interface SwitchProps extends ComponentPropsWithoutRef<typeof RadixSwitch
8
22
  * focus. Use `checked` + `onCheckedChange` (RHF wires this via `<Controller>` — not
9
23
  * `register()`, since the callback is a boolean, not a native change event).
10
24
  */
11
- export declare function Switch({ className, ...props }: SwitchProps): import("react").JSX.Element;
25
+ export declare function Switch({ className, label, labelClassName, showState, id: idProp, ...props }: SwitchProps): import("react").JSX.Element;
12
26
  //# sourceMappingURL=Switch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/react/components/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAGtD,MAAM,WAAW,WAAY,SAAQ,wBAAwB,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC;CAAG;AAEzF;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,+BA8B1D"}
1
+ {"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/react/components/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAI7E,MAAM,WAAW,WAAY,SAAQ,wBAAwB,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC;IACpF;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,+BA2DxG"}
@@ -1,14 +1,18 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as RadixSwitch from '@radix-ui/react-switch';
3
+ import { useId } from 'react';
3
4
  import { cn } from '../lib/cn.js';
5
+ import { TAP_TARGET } from '../lib/tapTarget.js';
4
6
  /**
5
7
  * On/off toggle vendored from shadcn (Radix `Switch`). The filled track turns the
6
8
  * solid accent when checked; a visible `--ring` focus ring appears on keyboard
7
9
  * focus. Use `checked` + `onCheckedChange` (RHF wires this via `<Controller>` — not
8
10
  * `register()`, since the callback is a boolean, not a native change event).
9
11
  */
10
- export function Switch({ className, ...props }) {
11
- return (_jsx(RadixSwitch.Root, { className: cn('peer relative inline-flex h-6 w-10 shrink-0 cursor-pointer items-center rounded-full border border-transparent p-0.5 transition-colors', 'data-[state=checked]:bg-accent-solid data-[state=unchecked]:bg-muted', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background', 'disabled:cursor-not-allowed disabled:opacity-50',
12
+ export function Switch({ className, label, labelClassName, showState, id: idProp, ...props }) {
13
+ const reactId = useId();
14
+ const id = idProp ?? reactId;
15
+ const root = (_jsx(RadixSwitch.Root, { id: label == null && showState !== true ? idProp : id, className: cn('peer relative inline-flex h-6 w-10 shrink-0 cursor-pointer items-center rounded-full border border-transparent p-0.5 transition-colors', 'data-[state=checked]:bg-accent-solid data-[state=unchecked]:bg-muted', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background', 'disabled:cursor-not-allowed disabled:opacity-50',
12
16
  // The visual track stays a compact 40×24 on fine-pointer (mouse) surfaces —
13
17
  // a 44px track would look oversized next to text labels there. On coarse
14
18
  // (touch) pointers the track itself grows to a real ≥44px box instead of an
@@ -18,5 +22,8 @@ export function Switch({ className, ...props }) {
18
22
  // kept failing orch-host's task-sources mobile scan (owner teardown,
19
23
  // 2026-07-17 — the "cc"/"co"/etc. processing toggles all measured 40×24).
20
24
  'pointer-coarse:h-11 pointer-coarse:w-[4.5rem]', className), ...props, children: _jsx(RadixSwitch.Thumb, { className: cn('pointer-events-none block size-5 rounded-full bg-white shadow transition-transform', 'data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0', 'pointer-coarse:size-9 pointer-coarse:data-[state=checked]:translate-x-8') }) }));
25
+ if (label == null && showState !== true)
26
+ return root;
27
+ return (_jsxs("label", { htmlFor: id, "data-cb-tap-target": '', className: cn('flex w-full cursor-pointer items-center justify-between gap-3 py-1.5', props.disabled && 'cursor-not-allowed', TAP_TARGET), children: [label == null ? null : (_jsx("span", { className: cn('min-w-0 text-sm text-foreground', labelClassName), children: label })), _jsxs("span", { className: 'flex shrink-0 items-center gap-2', children: [showState ? (_jsx("span", { className: 'w-7 text-xs text-muted-foreground', children: props.checked ? 'On' : 'Off' })) : null, root] })] }));
21
28
  }
22
29
  //# sourceMappingURL=Switch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.js","sourceRoot":"","sources":["../../../src/react/components/Switch.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAIlC;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAe;IACzD,OAAO,CACL,KAAC,WAAW,CAAC,IAAI,IACf,SAAS,EAAE,EAAE,CACX,wIAAwI,EACxI,sEAAsE,EACtE,0IAA0I,EAC1I,iDAAiD;QACjD,4EAA4E;QAC5E,yEAAyE;QACzE,4EAA4E;QAC5E,8EAA8E;QAC9E,0EAA0E;QAC1E,4EAA4E;QAC5E,qEAAqE;QACrE,0EAA0E;QAC1E,+CAA+C,EAC/C,SAAS,CACV,KACG,KAAK,YAET,KAAC,WAAW,CAAC,KAAK,IAChB,SAAS,EAAE,EAAE,CACX,oFAAoF,EACpF,yEAAyE,EACzE,yEAAyE,CAC1E,GACD,GACe,CACpB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Switch.js","sourceRoot":"","sources":["../../../src/react/components/Switch.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAiD,KAAK,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAmBjD;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,EAAe;IACvG,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACxB,MAAM,EAAE,GAAG,MAAM,IAAI,OAAO,CAAC;IAC7B,MAAM,IAAI,GAAG,CACX,KAAC,WAAW,CAAC,IAAI,IACf,EAAE,EAAE,KAAK,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EACrD,SAAS,EAAE,EAAE,CACX,wIAAwI,EACxI,sEAAsE,EACtE,0IAA0I,EAC1I,iDAAiD;QACjD,4EAA4E;QAC5E,yEAAyE;QACzE,4EAA4E;QAC5E,8EAA8E;QAC9E,0EAA0E;QAC1E,4EAA4E;QAC5E,qEAAqE;QACrE,0EAA0E;QAC1E,+CAA+C,EAC/C,SAAS,CACV,KACG,KAAK,YAET,KAAC,WAAW,CAAC,KAAK,IAChB,SAAS,EAAE,EAAE,CACX,oFAAoF,EACpF,yEAAyE,EACzE,yEAAyE,CAC1E,GACD,GACe,CACpB,CAAC;IACF,IAAI,KAAK,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,CAGL,iBACE,OAAO,EAAE,EAAE,wBACQ,EAAE,EACrB,SAAS,EAAE,EAAE,CACX,sEAAsE,EACtE,KAAK,CAAC,QAAQ,IAAI,oBAAoB,EACtC,UAAU,CACX,aAEA,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACtB,eAAM,SAAS,EAAE,EAAE,CAAC,iCAAiC,EAAE,cAAc,CAAC,YAAG,KAAK,GAAQ,CACvF,EACD,gBAAM,SAAS,EAAC,kCAAkC,aAC/C,SAAS,CAAC,CAAC,CAAC,CACX,eAAM,SAAS,EAAC,mCAAmC,YAChD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GACxB,CACR,CAAC,CAAC,CAAC,IAAI,EACP,IAAI,IACA,IACD,CACT,CAAC;AACJ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { type ComponentType, type ReactNode } from 'react';
2
+ export { TooltipDelay } from '../lib/hoverIntent.js';
2
3
  export type TooltipPlacement = 'top' | 'right' | 'bottom' | 'left';
3
4
  /** Touch-device behavior (hover doesn't exist there). No effect on hover devices.
4
5
  * `icon` = a tappable ⓘ disclosure beside the trigger; `tap` = tap the trigger to
@@ -78,5 +79,4 @@ export declare function preloadTooltip(): Promise<TooltipImplComponent>;
78
79
  * rather than on the next twitch of the mouse.
79
80
  */
80
81
  export declare function Tooltip(props: TooltipProps): import("react").JSX.Element;
81
- export {};
82
82
  //# sourceMappingURL=Tooltip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/react/components/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAGlB,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACnE;;2CAE2C;AAC3C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD;qEACqE;AACrE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC;IACnB,sEAAsE;IACtE,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B;;;+EAG2E;IAC3E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,oBAAoB,GAAG,aAAa,CAAC,YAAY,GAAG;IAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAoHtF;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAQ9D;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BA4E1C"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/react/components/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAGlB,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACnE;;2CAE2C;AAC3C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD;qEACqE;AACrE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC;IACnB,sEAAsE;IACtE,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B;;;+EAG2E;IAC3E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,oBAAoB,GAAG,aAAa,CAAC,YAAY,GAAG;IAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAoHtF;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAQ9D;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BAsF1C"}