@apostel/bedrock 0.1.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 (285) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -0
  3. package/dist/accessible-icon/parts.d.ts +16 -0
  4. package/dist/accessible-icon/parts.d.ts.map +1 -0
  5. package/dist/accessible-icon/parts.js +24 -0
  6. package/dist/accessible-icon/parts.js.map +1 -0
  7. package/dist/accordion/controlled-root.d.ts +19 -0
  8. package/dist/accordion/controlled-root.d.ts.map +1 -0
  9. package/dist/accordion/controlled-root.js +53 -0
  10. package/dist/accordion/controlled-root.js.map +1 -0
  11. package/dist/accordion/parts.d.ts +35 -0
  12. package/dist/accordion/parts.d.ts.map +1 -0
  13. package/dist/accordion/parts.js +52 -0
  14. package/dist/accordion/parts.js.map +1 -0
  15. package/dist/accordion/root.d.ts +24 -0
  16. package/dist/accordion/root.d.ts.map +1 -0
  17. package/dist/accordion/root.js +45 -0
  18. package/dist/accordion/root.js.map +1 -0
  19. package/dist/accordion/shared.d.ts +23 -0
  20. package/dist/accordion/shared.d.ts.map +1 -0
  21. package/dist/accordion/shared.js +16 -0
  22. package/dist/accordion/shared.js.map +1 -0
  23. package/dist/alert-dialog/parts.d.ts +16 -0
  24. package/dist/alert-dialog/parts.d.ts.map +1 -0
  25. package/dist/alert-dialog/parts.js +20 -0
  26. package/dist/alert-dialog/parts.js.map +1 -0
  27. package/dist/anchor.d.ts +27 -0
  28. package/dist/anchor.d.ts.map +1 -0
  29. package/dist/anchor.js +70 -0
  30. package/dist/anchor.js.map +1 -0
  31. package/dist/aspect-ratio/parts.d.ts +16 -0
  32. package/dist/aspect-ratio/parts.d.ts.map +1 -0
  33. package/dist/aspect-ratio/parts.js +15 -0
  34. package/dist/aspect-ratio/parts.js.map +1 -0
  35. package/dist/avatar/parts.d.ts +23 -0
  36. package/dist/avatar/parts.d.ts.map +1 -0
  37. package/dist/avatar/parts.js +51 -0
  38. package/dist/avatar/parts.js.map +1 -0
  39. package/dist/bedrock.css +64 -0
  40. package/dist/capabilities.d.ts +25 -0
  41. package/dist/capabilities.d.ts.map +1 -0
  42. package/dist/capabilities.js +40 -0
  43. package/dist/capabilities.js.map +1 -0
  44. package/dist/checkbox/controlled-root.d.ts +18 -0
  45. package/dist/checkbox/controlled-root.d.ts.map +1 -0
  46. package/dist/checkbox/controlled-root.js +28 -0
  47. package/dist/checkbox/controlled-root.js.map +1 -0
  48. package/dist/checkbox/parts.d.ts +29 -0
  49. package/dist/checkbox/parts.d.ts.map +1 -0
  50. package/dist/checkbox/parts.js +42 -0
  51. package/dist/checkbox/parts.js.map +1 -0
  52. package/dist/client-render.d.ts +10 -0
  53. package/dist/client-render.d.ts.map +1 -0
  54. package/dist/client-render.js +14 -0
  55. package/dist/client-render.js.map +1 -0
  56. package/dist/collapsible/controlled-root.d.ts +17 -0
  57. package/dist/collapsible/controlled-root.d.ts.map +1 -0
  58. package/dist/collapsible/controlled-root.js +21 -0
  59. package/dist/collapsible/controlled-root.js.map +1 -0
  60. package/dist/collapsible/parts.d.ts +14 -0
  61. package/dist/collapsible/parts.d.ts.map +1 -0
  62. package/dist/collapsible/parts.js +24 -0
  63. package/dist/collapsible/parts.js.map +1 -0
  64. package/dist/collapsible/root.d.ts +16 -0
  65. package/dist/collapsible/root.d.ts.map +1 -0
  66. package/dist/collapsible/root.js +28 -0
  67. package/dist/collapsible/root.js.map +1 -0
  68. package/dist/collapsible/shared.d.ts +11 -0
  69. package/dist/collapsible/shared.d.ts.map +1 -0
  70. package/dist/collapsible/shared.js +26 -0
  71. package/dist/collapsible/shared.js.map +1 -0
  72. package/dist/compose-refs.d.ts +29 -0
  73. package/dist/compose-refs.d.ts.map +1 -0
  74. package/dist/compose-refs.js +67 -0
  75. package/dist/compose-refs.js.map +1 -0
  76. package/dist/context-menu/root.d.ts +17 -0
  77. package/dist/context-menu/root.d.ts.map +1 -0
  78. package/dist/context-menu/root.js +50 -0
  79. package/dist/context-menu/root.js.map +1 -0
  80. package/dist/controlled.d.ts +120 -0
  81. package/dist/controlled.d.ts.map +1 -0
  82. package/dist/controlled.js +91 -0
  83. package/dist/controlled.js.map +1 -0
  84. package/dist/create-controlled-root.d.ts +29 -0
  85. package/dist/create-controlled-root.d.ts.map +1 -0
  86. package/dist/create-controlled-root.js +92 -0
  87. package/dist/create-controlled-root.js.map +1 -0
  88. package/dist/dialog/controlled-root.d.ts +15 -0
  89. package/dist/dialog/controlled-root.d.ts.map +1 -0
  90. package/dist/dialog/controlled-root.js +21 -0
  91. package/dist/dialog/controlled-root.js.map +1 -0
  92. package/dist/dialog/parts.d.ts +18 -0
  93. package/dist/dialog/parts.d.ts.map +1 -0
  94. package/dist/dialog/parts.js +80 -0
  95. package/dist/dialog/parts.js.map +1 -0
  96. package/dist/dialog/root.d.ts +22 -0
  97. package/dist/dialog/root.d.ts.map +1 -0
  98. package/dist/dialog/root.js +39 -0
  99. package/dist/dialog/root.js.map +1 -0
  100. package/dist/dialog/shared.d.ts +32 -0
  101. package/dist/dialog/shared.d.ts.map +1 -0
  102. package/dist/dialog/shared.js +53 -0
  103. package/dist/dialog/shared.js.map +1 -0
  104. package/dist/dropdown-menu/controlled-root.d.ts +7 -0
  105. package/dist/dropdown-menu/controlled-root.d.ts.map +1 -0
  106. package/dist/dropdown-menu/controlled-root.js +13 -0
  107. package/dist/dropdown-menu/controlled-root.js.map +1 -0
  108. package/dist/dropdown-menu/root.d.ts +13 -0
  109. package/dist/dropdown-menu/root.d.ts.map +1 -0
  110. package/dist/dropdown-menu/root.js +22 -0
  111. package/dist/dropdown-menu/root.js.map +1 -0
  112. package/dist/hover-card/controlled-root.d.ts +9 -0
  113. package/dist/hover-card/controlled-root.d.ts.map +1 -0
  114. package/dist/hover-card/controlled-root.js +15 -0
  115. package/dist/hover-card/controlled-root.js.map +1 -0
  116. package/dist/hover-card/root.d.ts +13 -0
  117. package/dist/hover-card/root.d.ts.map +1 -0
  118. package/dist/hover-card/root.js +19 -0
  119. package/dist/hover-card/root.js.map +1 -0
  120. package/dist/index.d.ts +274 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +211 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/interest.d.ts +30 -0
  125. package/dist/interest.d.ts.map +1 -0
  126. package/dist/interest.js +94 -0
  127. package/dist/interest.js.map +1 -0
  128. package/dist/label/parts.d.ts +14 -0
  129. package/dist/label/parts.d.ts.map +1 -0
  130. package/dist/label/parts.js +21 -0
  131. package/dist/label/parts.js.map +1 -0
  132. package/dist/menu/parts.d.ts +64 -0
  133. package/dist/menu/parts.d.ts.map +1 -0
  134. package/dist/menu/parts.js +131 -0
  135. package/dist/menu/parts.js.map +1 -0
  136. package/dist/menu/shared.d.ts +7 -0
  137. package/dist/menu/shared.d.ts.map +1 -0
  138. package/dist/menu/shared.js +9 -0
  139. package/dist/menu/shared.js.map +1 -0
  140. package/dist/menubar/parts.d.ts +20 -0
  141. package/dist/menubar/parts.d.ts.map +1 -0
  142. package/dist/menubar/parts.js +34 -0
  143. package/dist/menubar/parts.js.map +1 -0
  144. package/dist/navigation-menu/parts.d.ts +28 -0
  145. package/dist/navigation-menu/parts.d.ts.map +1 -0
  146. package/dist/navigation-menu/parts.js +46 -0
  147. package/dist/navigation-menu/parts.js.map +1 -0
  148. package/dist/open-state.d.ts +23 -0
  149. package/dist/open-state.d.ts.map +1 -0
  150. package/dist/open-state.js +106 -0
  151. package/dist/open-state.js.map +1 -0
  152. package/dist/popover/controlled-root.d.ts +14 -0
  153. package/dist/popover/controlled-root.d.ts.map +1 -0
  154. package/dist/popover/controlled-root.js +17 -0
  155. package/dist/popover/controlled-root.js.map +1 -0
  156. package/dist/popover/parts.d.ts +27 -0
  157. package/dist/popover/parts.d.ts.map +1 -0
  158. package/dist/popover/parts.js +39 -0
  159. package/dist/popover/parts.js.map +1 -0
  160. package/dist/popover/root.d.ts +24 -0
  161. package/dist/popover/root.d.ts.map +1 -0
  162. package/dist/popover/root.js +24 -0
  163. package/dist/popover/root.js.map +1 -0
  164. package/dist/popover/shared.d.ts +22 -0
  165. package/dist/popover/shared.d.ts.map +1 -0
  166. package/dist/popover/shared.js +25 -0
  167. package/dist/popover/shared.js.map +1 -0
  168. package/dist/progress/parts.d.ts +25 -0
  169. package/dist/progress/parts.d.ts.map +1 -0
  170. package/dist/progress/parts.js +32 -0
  171. package/dist/progress/parts.js.map +1 -0
  172. package/dist/radio-group/controlled-root.d.ts +19 -0
  173. package/dist/radio-group/controlled-root.d.ts.map +1 -0
  174. package/dist/radio-group/controlled-root.js +29 -0
  175. package/dist/radio-group/controlled-root.js.map +1 -0
  176. package/dist/radio-group/parts.d.ts +36 -0
  177. package/dist/radio-group/parts.d.ts.map +1 -0
  178. package/dist/radio-group/parts.js +62 -0
  179. package/dist/radio-group/parts.js.map +1 -0
  180. package/dist/roving.d.ts +26 -0
  181. package/dist/roving.d.ts.map +1 -0
  182. package/dist/roving.js +124 -0
  183. package/dist/roving.js.map +1 -0
  184. package/dist/scroll-area/parts.d.ts +29 -0
  185. package/dist/scroll-area/parts.d.ts.map +1 -0
  186. package/dist/scroll-area/parts.js +44 -0
  187. package/dist/scroll-area/parts.js.map +1 -0
  188. package/dist/select/parts.d.ts +57 -0
  189. package/dist/select/parts.d.ts.map +1 -0
  190. package/dist/select/parts.js +76 -0
  191. package/dist/select/parts.js.map +1 -0
  192. package/dist/separator/parts.d.ts +14 -0
  193. package/dist/separator/parts.d.ts.map +1 -0
  194. package/dist/separator/parts.js +15 -0
  195. package/dist/separator/parts.js.map +1 -0
  196. package/dist/slider/parts.d.ts +32 -0
  197. package/dist/slider/parts.d.ts.map +1 -0
  198. package/dist/slider/parts.js +52 -0
  199. package/dist/slider/parts.js.map +1 -0
  200. package/dist/slot.d.ts +3 -0
  201. package/dist/slot.d.ts.map +1 -0
  202. package/dist/slot.js +49 -0
  203. package/dist/slot.js.map +1 -0
  204. package/dist/switch/parts.d.ts +21 -0
  205. package/dist/switch/parts.d.ts.map +1 -0
  206. package/dist/switch/parts.js +31 -0
  207. package/dist/switch/parts.js.map +1 -0
  208. package/dist/tabs/controlled-root.d.ts +11 -0
  209. package/dist/tabs/controlled-root.d.ts.map +1 -0
  210. package/dist/tabs/controlled-root.js +15 -0
  211. package/dist/tabs/controlled-root.js.map +1 -0
  212. package/dist/tabs/parts.d.ts +20 -0
  213. package/dist/tabs/parts.d.ts.map +1 -0
  214. package/dist/tabs/parts.js +42 -0
  215. package/dist/tabs/parts.js.map +1 -0
  216. package/dist/tabs/root.d.ts +15 -0
  217. package/dist/tabs/root.d.ts.map +1 -0
  218. package/dist/tabs/root.js +26 -0
  219. package/dist/tabs/root.js.map +1 -0
  220. package/dist/tabs/shared.d.ts +12 -0
  221. package/dist/tabs/shared.d.ts.map +1 -0
  222. package/dist/tabs/shared.js +11 -0
  223. package/dist/tabs/shared.js.map +1 -0
  224. package/dist/toast/parts.d.ts +40 -0
  225. package/dist/toast/parts.d.ts.map +1 -0
  226. package/dist/toast/parts.js +102 -0
  227. package/dist/toast/parts.js.map +1 -0
  228. package/dist/toggle/controlled-root.d.ts +9 -0
  229. package/dist/toggle/controlled-root.d.ts.map +1 -0
  230. package/dist/toggle/controlled-root.js +14 -0
  231. package/dist/toggle/controlled-root.js.map +1 -0
  232. package/dist/toggle/parts.d.ts +20 -0
  233. package/dist/toggle/parts.d.ts.map +1 -0
  234. package/dist/toggle/parts.js +29 -0
  235. package/dist/toggle/parts.js.map +1 -0
  236. package/dist/toggle-group/parts.d.ts +28 -0
  237. package/dist/toggle-group/parts.d.ts.map +1 -0
  238. package/dist/toggle-group/parts.js +57 -0
  239. package/dist/toggle-group/parts.js.map +1 -0
  240. package/dist/toolbar/parts.d.ts +22 -0
  241. package/dist/toolbar/parts.d.ts.map +1 -0
  242. package/dist/toolbar/parts.js +27 -0
  243. package/dist/toolbar/parts.js.map +1 -0
  244. package/dist/tooltip/controlled-root.d.ts +9 -0
  245. package/dist/tooltip/controlled-root.d.ts.map +1 -0
  246. package/dist/tooltip/controlled-root.js +15 -0
  247. package/dist/tooltip/controlled-root.js.map +1 -0
  248. package/dist/tooltip/parts.d.ts +23 -0
  249. package/dist/tooltip/parts.d.ts.map +1 -0
  250. package/dist/tooltip/parts.js +28 -0
  251. package/dist/tooltip/parts.js.map +1 -0
  252. package/dist/tooltip/root.d.ts +13 -0
  253. package/dist/tooltip/root.d.ts.map +1 -0
  254. package/dist/tooltip/root.js +17 -0
  255. package/dist/tooltip/root.js.map +1 -0
  256. package/dist/tooltip/shared.d.ts +13 -0
  257. package/dist/tooltip/shared.d.ts.map +1 -0
  258. package/dist/tooltip/shared.js +9 -0
  259. package/dist/tooltip/shared.js.map +1 -0
  260. package/dist/tooltip/use-controlled-interest-root.d.ts +19 -0
  261. package/dist/tooltip/use-controlled-interest-root.d.ts.map +1 -0
  262. package/dist/tooltip/use-controlled-interest-root.js +31 -0
  263. package/dist/tooltip/use-controlled-interest-root.js.map +1 -0
  264. package/dist/tooltip/use-interest-root.d.ts +16 -0
  265. package/dist/tooltip/use-interest-root.d.ts.map +1 -0
  266. package/dist/tooltip/use-interest-root.js +39 -0
  267. package/dist/tooltip/use-interest-root.js.map +1 -0
  268. package/dist/types.d.ts +55 -0
  269. package/dist/types.d.ts.map +1 -0
  270. package/dist/types.js +2 -0
  271. package/dist/types.js.map +1 -0
  272. package/dist/validate-element.d.ts +12 -0
  273. package/dist/validate-element.d.ts.map +1 -0
  274. package/dist/validate-element.js +21 -0
  275. package/dist/validate-element.js.map +1 -0
  276. package/dist/validate-trigger.d.ts +14 -0
  277. package/dist/validate-trigger.d.ts.map +1 -0
  278. package/dist/validate-trigger.js +59 -0
  279. package/dist/validate-trigger.js.map +1 -0
  280. package/dist/visually-hidden/parts.d.ts +12 -0
  281. package/dist/visually-hidden/parts.d.ts.map +1 -0
  282. package/dist/visually-hidden/parts.js +25 -0
  283. package/dist/visually-hidden/parts.js.map +1 -0
  284. package/package.json +81 -0
  285. package/skills/migrate-to-bedrock/SKILL.md +188 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/tooltip/root.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CACnC;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,aAAmB,EACnB,UAAgB,EAChB,YAAY,GACb,EAAE,gBAAgB,+BAalB"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { TooltipContext } from './shared.js';
3
+ import { useInterestRoot } from './use-interest-root.js';
4
+ export function TooltipRoot({ children, delayDuration = 700, closeDelay = 150, onOpenChange, }) {
5
+ const context = useInterestRoot({
6
+ showDelay: delayDuration,
7
+ hideDelay: closeDelay,
8
+ // A tooltip is a label, not somewhere to move the pointer.
9
+ hoverableContent: false,
10
+ // `hint` layers above an open menu rather than closing it.
11
+ kind: 'hint',
12
+ role: 'tooltip',
13
+ onOpenChange,
14
+ });
15
+ return _jsx(TooltipContext.Provider, { value: context, children: children });
16
+ }
17
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/tooltip/root.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAarD,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,EACR,aAAa,GAAG,GAAG,EACnB,UAAU,GAAG,GAAG,EAChB,YAAY,GACK;IACjB,MAAM,OAAO,GAAG,eAAe,CAAC;QAC9B,SAAS,EAAE,aAAa;QACxB,SAAS,EAAE,UAAU;QACrB,2DAA2D;QAC3D,gBAAgB,EAAE,KAAK;QACvB,2DAA2D;QAC3D,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,SAAS;QACf,YAAY;KACb,CAAC,CAAA;IAEF,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,YAAG,QAAQ,GAA2B,CAAA;AACtF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { RootContextValue } from '../types.js';
2
+ export interface TooltipContextValue extends RootContextValue {
3
+ anchor: string;
4
+ /** Set when the platform can do intent itself; drives the attribute path. */
5
+ native: boolean;
6
+ registerTrigger(node: HTMLElement | null): void;
7
+ /** Tooltips are labels; hover cards are regions with content. */
8
+ role: 'tooltip' | undefined;
9
+ kind: 'hint' | 'auto';
10
+ }
11
+ export declare const TooltipContext: import("react").Context<TooltipContextValue | null>;
12
+ export declare function useTooltipContext(part: string): TooltipContextValue;
13
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tooltip/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,MAAM,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,MAAM,EAAE,OAAO,CAAA;IACf,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAA;IAC/C,iEAAiE;IACjE,IAAI,EAAE,SAAS,GAAG,SAAS,CAAA;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CACtB;AAED,eAAO,MAAM,cAAc,qDAAkD,CAAA;AAE7E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAKnE"}
@@ -0,0 +1,9 @@
1
+ import { createContext, useContext } from 'react';
2
+ export const TooltipContext = createContext(null);
3
+ export function useTooltipContext(part) {
4
+ const context = useContext(TooltipContext);
5
+ if (!context)
6
+ throw new Error(`[bedrock] ${part} must be used inside a Tooltip or HoverCard root.`);
7
+ return context;
8
+ }
9
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tooltip/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAajD,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAA;AAE7E,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAA;IAC1C,IAAI,CAAC,OAAO;QACV,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,mDAAmD,CAAC,CAAA;IACvF,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type ControlledRootProps } from '../create-controlled-root.js';
2
+ import type { TooltipContextValue } from './shared.js';
3
+ export interface ControlledInterestOptions extends ControlledRootProps {
4
+ showDelay: number;
5
+ hideDelay: number;
6
+ hoverableContent: boolean;
7
+ kind: 'hint' | 'auto';
8
+ role: 'tooltip' | undefined;
9
+ }
10
+ /**
11
+ * Controlled Tooltip and HoverCard. Only ever imported from `/controlled`, so
12
+ * the reconciliation layer stays out of the default bundle — the graph lint
13
+ * checks that rather than trusting it.
14
+ *
15
+ * The intent layer is unchanged: hover still decides *when* to ask, and `open`
16
+ * still decides whether it happens.
17
+ */
18
+ export declare function useControlledInterestRoot(options: ControlledInterestOptions): TooltipContextValue;
19
+ //# sourceMappingURL=use-controlled-interest-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-controlled-interest-root.d.ts","sourceRoot":"","sources":["../../src/tooltip/use-controlled-interest-root.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAGvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,OAAO,CAAA;IACzB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,IAAI,EAAE,SAAS,GAAG,SAAS,CAAA;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,yBAAyB,GAAG,mBAAmB,CAwBjG"}
@@ -0,0 +1,31 @@
1
+ import { useCallback, useMemo } from 'react';
2
+ import { anchorName } from '../anchor.js';
3
+ import { useSupportsInterestInvokers } from '../capabilities.js';
4
+ import { useControlledRoot } from '../create-controlled-root.js';
5
+ import { useInterest } from '../interest.js';
6
+ import { popoverAdapter } from '../popover/shared.js';
7
+ /**
8
+ * Controlled Tooltip and HoverCard. Only ever imported from `/controlled`, so
9
+ * the reconciliation layer stays out of the default bundle — the graph lint
10
+ * checks that rather than trusting it.
11
+ *
12
+ * The intent layer is unchanged: hover still decides *when* to ask, and `open`
13
+ * still decides whether it happens.
14
+ */
15
+ export function useControlledInterestRoot(options) {
16
+ const { open, onOpenChange, showDelay, hideDelay, hoverableContent, kind, role } = options;
17
+ const context = useControlledRoot({ open, onOpenChange }, popoverAdapter);
18
+ const anchor = useMemo(() => anchorName(context.id), [context.id]);
19
+ const native = useSupportsInterestInvokers();
20
+ const { registerTrigger, registerInterestContent } = useInterest({
21
+ showDelay,
22
+ hideDelay,
23
+ hoverableContent,
24
+ });
25
+ const registerContent = useCallback((node) => {
26
+ context.registerContent(node);
27
+ registerInterestContent(node);
28
+ }, [context, registerInterestContent]);
29
+ return useMemo(() => ({ ...context, anchor, native, kind, role, registerContent, registerTrigger }), [context, anchor, native, kind, role, registerContent, registerTrigger]);
30
+ }
31
+ //# sourceMappingURL=use-controlled-interest-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-controlled-interest-root.js","sourceRoot":"","sources":["../../src/tooltip/use-controlled-interest-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAA4B,MAAM,2BAA2B,CAAA;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAWlD;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAkC;IAC1E,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAC1F,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,cAAc,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;IAClE,MAAM,MAAM,GAAG,2BAA2B,EAAE,CAAA;IAE5C,MAAM,EAAE,eAAe,EAAE,uBAAuB,EAAE,GAAG,WAAW,CAAC;QAC/D,SAAS;QACT,SAAS;QACT,gBAAgB;KACjB,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,IAAwB,EAAE,EAAE;QAC3B,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAC7B,uBAAuB,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC,EACD,CAAC,OAAO,EAAE,uBAAuB,CAAC,CACnC,CAAA;IAED,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC,EACpF,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,CACxE,CAAA;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { TooltipContextValue } from './shared.js';
2
+ export interface InterestRootOptions {
3
+ showDelay: number;
4
+ hideDelay: number;
5
+ hoverableContent: boolean;
6
+ kind: 'hint' | 'auto';
7
+ role: 'tooltip' | undefined;
8
+ onOpenChange?: ((open: boolean) => void) | undefined;
9
+ }
10
+ /**
11
+ * Everything Tooltip and HoverCard share, which is almost all of it: the two
12
+ * differ in their delays, in whether the content is hoverable, and in whether
13
+ * the thing is a label or a region. Not enough to justify two implementations.
14
+ */
15
+ export declare function useInterestRoot(options: InterestRootOptions): TooltipContextValue;
16
+ //# sourceMappingURL=use-interest-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-interest-root.d.ts","sourceRoot":"","sources":["../../src/tooltip/use-interest-root.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,OAAO,CAAA;IACzB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,IAAI,EAAE,SAAS,GAAG,SAAS,CAAA;IAC3B,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CACrD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,mBAAmB,CAsCjF"}
@@ -0,0 +1,39 @@
1
+ import { useCallback, useId, useMemo, useRef } from 'react';
2
+ import { anchorName } from '../anchor.js';
3
+ import { useSupportsInterestInvokers } from '../capabilities.js';
4
+ import { useInterest } from '../interest.js';
5
+ import { useOpenState } from '../open-state.js';
6
+ /**
7
+ * Everything Tooltip and HoverCard share, which is almost all of it: the two
8
+ * differ in their delays, in whether the content is hoverable, and in whether
9
+ * the thing is a label or a region. Not enough to justify two implementations.
10
+ */
11
+ export function useInterestRoot(options) {
12
+ const id = useId();
13
+ const anchor = useMemo(() => anchorName(id), [id]);
14
+ const native = useSupportsInterestInvokers();
15
+ const changeRef = useRef(options.onOpenChange);
16
+ changeRef.current = options.onOpenChange;
17
+ const report = useCallback((next) => changeRef.current?.(next), []);
18
+ const { open, observe } = useOpenState(report);
19
+ const { registerTrigger, registerInterestContent } = useInterest({
20
+ showDelay: options.showDelay,
21
+ hideDelay: options.hideDelay,
22
+ hoverableContent: options.hoverableContent,
23
+ });
24
+ const registerContent = useCallback((node) => {
25
+ observe(node);
26
+ registerInterestContent(node);
27
+ }, [observe, registerInterestContent]);
28
+ return useMemo(() => ({
29
+ id,
30
+ open,
31
+ anchor,
32
+ native,
33
+ kind: options.kind,
34
+ role: options.role,
35
+ registerContent,
36
+ registerTrigger,
37
+ }), [id, open, anchor, native, options.kind, options.role, registerContent, registerTrigger]);
38
+ }
39
+ //# sourceMappingURL=use-interest-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-interest-root.js","sourceRoot":"","sources":["../../src/tooltip/use-interest-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAY5C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAA4B;IAC1D,MAAM,EAAE,GAAG,KAAK,EAAE,CAAA;IAClB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,2BAA2B,EAAE,CAAA;IAE5C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC9C,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC,YAAY,CAAA;IAExC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC5E,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAE9C,MAAM,EAAE,eAAe,EAAE,uBAAuB,EAAE,GAAG,WAAW,CAAC;QAC/D,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,IAAwB,EAAE,EAAE;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAA;QACb,uBAAuB,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC,EACD,CAAC,OAAO,EAAE,uBAAuB,CAAC,CACnC,CAAA;IAED,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,EAAE;QACF,IAAI;QACJ,MAAM;QACN,MAAM;QACN,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,eAAe;QACf,eAAe;KAChB,CAAC,EACF,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,CACzF,CAAA;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { ReactElement, ReactNode } from 'react';
2
+ export type AnyProps = Record<string, unknown>;
3
+ export interface SlotProps extends AnyProps {
4
+ children: ReactElement;
5
+ }
6
+ export interface AsChildProps {
7
+ /** Merge props onto the single child element instead of rendering our own. */
8
+ asChild?: boolean;
9
+ children?: ReactNode;
10
+ }
11
+ /**
12
+ * Which invoker mechanism a part relies on, which decides the tags it accepts.
13
+ *
14
+ * - `command` — `commandfor` / `command`, buttons only
15
+ * - `interest` — `interestfor`, buttons and anchors
16
+ */
17
+ export type InvokerKind = 'command' | 'interest';
18
+ /**
19
+ * Everything the controlled entry point needs to know about a primitive in
20
+ * order to reconcile it. One adapter per DOM shape, not per component.
21
+ */
22
+ export interface OpenStateAdapter {
23
+ /** Read current open state straight off the node. */
24
+ isOpen(node: HTMLElement): boolean;
25
+ open(node: HTMLElement): void;
26
+ close(node: HTMLElement): void;
27
+ /**
28
+ * Optional cancelable close event, e.g. `<dialog>`'s `cancel`, which fires
29
+ * for Esc and for `command="request-close"`. Gives us a close veto on
30
+ * elements whose `beforetoggle` isn't cancelable.
31
+ */
32
+ closeVetoEvent?: string;
33
+ }
34
+ export interface RootContextValue {
35
+ /** Shared id, used for `commandfor` / `interestfor` / `popovertarget`. */
36
+ id: string;
37
+ /**
38
+ * What the DOM is doing, not what a prop claims. Content parts render their
39
+ * children only while this is true — plus however long an exit animation
40
+ * runs — so closing tears the subtree down and reopening starts it fresh.
41
+ * That is what makes a form inside a dialog reset itself without the consumer
42
+ * wiring anything to `onOpenChange`.
43
+ *
44
+ * Both roots publish it and neither derives it from React state, so parts
45
+ * still cannot tell which root they are under.
46
+ */
47
+ open: boolean;
48
+ /**
49
+ * Content parts call this with their DOM node on mount and `null` on unmount.
50
+ * The plain root uses it for at most a `toggle` listener; the controlled root
51
+ * uses it to wire the veto. Children never branch on which root they're under.
52
+ */
53
+ registerContent(node: HTMLElement | null): void;
54
+ }
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEpD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE9C,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,QAAQ,EAAE,YAAY,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,CAAA;AAEhD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAA;IAClC,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAC7B,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAC9B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAA;IACV;;;;;;;;;OASG;IACH,IAAI,EAAE,OAAO,CAAA;IACb;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAA;CAChD"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The `asChild` counterpart to `validateTrigger`, for parts where the element
3
+ * itself is load-bearing rather than the invoker attribute on it.
4
+ *
5
+ * A `Dialog.Content` that is not a `<dialog>` does not fail loudly — it renders
6
+ * a div that never enters the top layer, never traps focus and never opens,
7
+ * while `showModal()` throws somewhere the consumer will not connect to their
8
+ * markup. Same policy as the trigger rule: throw in development, log in
9
+ * production, repair nothing.
10
+ */
11
+ export declare function validateElement(node: HTMLElement | null, tag: string, part: string): void;
12
+ //# sourceMappingURL=validate-element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-element.d.ts","sourceRoot":"","sources":["../src/validate-element.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAUzF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The `asChild` counterpart to `validateTrigger`, for parts where the element
3
+ * itself is load-bearing rather than the invoker attribute on it.
4
+ *
5
+ * A `Dialog.Content` that is not a `<dialog>` does not fail loudly — it renders
6
+ * a div that never enters the top layer, never traps focus and never opens,
7
+ * while `showModal()` throws somewhere the consumer will not connect to their
8
+ * markup. Same policy as the trigger rule: throw in development, log in
9
+ * production, repair nothing.
10
+ */
11
+ export function validateElement(node, tag, part) {
12
+ if (!node || node.tagName === tag)
13
+ return;
14
+ const message = `[bedrock] ${part} rendered <${node.tagName.toLowerCase()}>, but it must be a ` +
15
+ `<${tag.toLowerCase()}>. Everything it does — the top layer, the focus trap, the ` +
16
+ `backdrop, showModal() — belongs to that element.`;
17
+ if (process.env.NODE_ENV !== 'production')
18
+ throw new Error(message);
19
+ console.error(message);
20
+ }
21
+ //# sourceMappingURL=validate-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-element.js","sourceRoot":"","sources":["../src/validate-element.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,IAAwB,EAAE,GAAW,EAAE,IAAY;IACjF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;QAAE,OAAM;IAEzC,MAAM,OAAO,GACX,aAAa,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,sBAAsB;QAC/E,IAAI,GAAG,CAAC,WAAW,EAAE,6DAA6D;QAClF,kDAAkD,CAAA;IAEpD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;IACnE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AACxB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { InvokerKind } from './types.js';
2
+ /**
3
+ * Called from the trigger's ref callback, so it sees what the child actually
4
+ * rendered rather than what `asChild` was handed. `<MyButton>` may well render
5
+ * a `<button>`; only the DOM knows.
6
+ *
7
+ * Deliberately has no repair path. A click-handler fallback would ship the
8
+ * imperative trigger machinery this library exists to remove, to every
9
+ * consumer, permanently — and a fallback that works is a fallback nobody
10
+ * removes. Development throws so it can't be shipped by accident. Production
11
+ * logs, so a trigger behind a rarely-rendered branch isn't a silent mystery.
12
+ */
13
+ export declare function validateTrigger(node: HTMLElement | null, kind: InvokerKind, part: string): void;
14
+ //# sourceMappingURL=validate-trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-trigger.d.ts","sourceRoot":"","sources":["../src/validate-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAmB1C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA4C/F"}
@@ -0,0 +1,59 @@
1
+ const ALLOWED = {
2
+ // `commandfor` / `command` are defined on <button> and nowhere else.
3
+ command: ['BUTTON'],
4
+ // `interestfor` additionally works on <a>, which is what makes link previews
5
+ // and hover cards possible without a wrapper element.
6
+ interest: ['BUTTON', 'A'],
7
+ };
8
+ const ATTRIBUTE = {
9
+ command: 'commandfor',
10
+ interest: 'interestfor',
11
+ };
12
+ function list(tags) {
13
+ return tags.map((tag) => `<${tag.toLowerCase()}>`).join(' or ');
14
+ }
15
+ /**
16
+ * Called from the trigger's ref callback, so it sees what the child actually
17
+ * rendered rather than what `asChild` was handed. `<MyButton>` may well render
18
+ * a `<button>`; only the DOM knows.
19
+ *
20
+ * Deliberately has no repair path. A click-handler fallback would ship the
21
+ * imperative trigger machinery this library exists to remove, to every
22
+ * consumer, permanently — and a fallback that works is a fallback nobody
23
+ * removes. Development throws so it can't be shipped by accident. Production
24
+ * logs, so a trigger behind a rarely-rendered branch isn't a silent mystery.
25
+ */
26
+ export function validateTrigger(node, kind, part) {
27
+ if (!node)
28
+ return;
29
+ const allowed = ALLOWED[kind];
30
+ if (!allowed.includes(node.tagName)) {
31
+ if (process.env.NODE_ENV !== 'production') {
32
+ throw new Error(`[bedrock] ${part} rendered <${node.tagName.toLowerCase()}>, but ` +
33
+ `${ATTRIBUTE[kind]} only works on ${list(allowed)}.\n\n` +
34
+ `Without it the trigger has no keyboard activation and no implicit ` +
35
+ `aria-expanded.\n\n` +
36
+ `Fix: render ${list(allowed)}, or drop asChild, or take the props ` +
37
+ `yourself with the use${part.replace('.', '')} hook and handle ` +
38
+ `accessibility on your side.`);
39
+ }
40
+ console.error(`[bedrock] ${part} must render ${list(allowed)}; got ` +
41
+ `<${node.tagName.toLowerCase()}>. Trigger is not keyboard accessible.`);
42
+ return;
43
+ }
44
+ // A button inside a form defaults to type="submit", and submitting a form and
45
+ // invoking a popover are conflicting behaviours, so the invocation is ignored.
46
+ // Far more common in the wild than the wrong-tag case.
47
+ if (node.tagName === 'BUTTON' &&
48
+ node.type !== 'button' &&
49
+ node.closest('form')) {
50
+ if (process.env.NODE_ENV !== 'production') {
51
+ throw new Error(`[bedrock] ${part} is a submit button inside a <form>. Submitting and ` +
52
+ `invoking are conflicting behaviours, so the browser ignores ` +
53
+ `${ATTRIBUTE[kind]}.\n\nFix: add type="button" to the child.`);
54
+ }
55
+ console.error(`[bedrock] ${part} is a submit button inside a <form>; ` +
56
+ `${ATTRIBUTE[kind]} will be ignored. Add type="button".`);
57
+ }
58
+ }
59
+ //# sourceMappingURL=validate-trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-trigger.js","sourceRoot":"","sources":["../src/validate-trigger.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAA2C;IACtD,qEAAqE;IACrE,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,6EAA6E;IAC7E,sDAAsD;IACtD,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC;CAC1B,CAAA;AAED,MAAM,SAAS,GAAgC;IAC7C,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,aAAa;CACxB,CAAA;AAED,SAAS,IAAI,CAAC,IAAuB;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACjE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,IAAwB,EAAE,IAAiB,EAAE,IAAY;IACvF,IAAI,CAAC,IAAI;QAAE,OAAM;IAEjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS;gBAChE,GAAG,SAAS,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,OAAO;gBACxD,oEAAoE;gBACpE,oBAAoB;gBACpB,eAAe,IAAI,CAAC,OAAO,CAAC,uCAAuC;gBACnE,wBAAwB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB;gBAChE,6BAA6B,CAChC,CAAA;QACH,CAAC;QACD,OAAO,CAAC,KAAK,CACX,aAAa,IAAI,gBAAgB,IAAI,CAAC,OAAO,CAAC,QAAQ;YACpD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,wCAAwC,CACzE,CAAA;QACD,OAAM;IACR,CAAC;IAED,8EAA8E;IAC9E,+EAA+E;IAC/E,uDAAuD;IACvD,IACE,IAAI,CAAC,OAAO,KAAK,QAAQ;QACxB,IAA0B,CAAC,IAAI,KAAK,QAAQ;QAC7C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EACpB,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,sDAAsD;gBACrE,8DAA8D;gBAC9D,GAAG,SAAS,CAAC,IAAI,CAAC,2CAA2C,CAChE,CAAA;QACH,CAAC;QACD,OAAO,CAAC,KAAK,CACX,aAAa,IAAI,uCAAuC;YACtD,GAAG,SAAS,CAAC,IAAI,CAAC,sCAAsC,CAC3D,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ComponentPropsWithRef, CSSProperties } from 'react';
2
+ import type { AsChildProps } from '../types.js';
3
+ /**
4
+ * The clip-rect recipe, inline, so it works without the stylesheet. Every line
5
+ * is load-bearing: `display: none` or `visibility: hidden` would remove it from
6
+ * the accessibility tree, which is the opposite of the point.
7
+ */
8
+ export declare const VISUALLY_HIDDEN: CSSProperties;
9
+ export interface VisuallyHiddenProps extends ComponentPropsWithRef<'span'>, AsChildProps {
10
+ }
11
+ export declare function VisuallyHiddenRoot({ asChild, style, ...props }: VisuallyHiddenProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/visually-hidden/parts.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAe,MAAM,OAAO,CAAA;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,aAY7B,CAAA;AAED,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB,CAAC,MAAM,CAAC,EAAE,YAAY;CAAG;AAE3F,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,mBAAmB,+BAMnF"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Slot } from '../slot.js';
3
+ /**
4
+ * The clip-rect recipe, inline, so it works without the stylesheet. Every line
5
+ * is load-bearing: `display: none` or `visibility: hidden` would remove it from
6
+ * the accessibility tree, which is the opposite of the point.
7
+ */
8
+ export const VISUALLY_HIDDEN = {
9
+ position: 'absolute',
10
+ border: 0,
11
+ width: 1,
12
+ height: 1,
13
+ padding: 0,
14
+ margin: -1,
15
+ overflow: 'hidden',
16
+ clip: 'rect(0, 0, 0, 0)',
17
+ clipPath: 'inset(50%)',
18
+ whiteSpace: 'nowrap',
19
+ wordWrap: 'normal',
20
+ };
21
+ export function VisuallyHiddenRoot({ asChild, style, ...props }) {
22
+ const Part = asChild ? Slot : 'span';
23
+ return (_jsx(Part, { ...props, style: { ...VISUALLY_HIDDEN, ...style }, "data-bedrock-visually-hidden": "" }));
24
+ }
25
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/visually-hidden/parts.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAG9B;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkB;IAC5C,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,kBAAkB;IACxB,QAAQ,EAAE,YAAY;IACtB,UAAU,EAAE,QAAQ;IACpB,QAAQ,EAAE,QAAQ;CACnB,CAAA;AAID,MAAM,UAAU,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,EAAuB;IAClF,MAAM,IAAI,GAAgB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;IAEjD,OAAO,CACL,KAAC,IAAI,OAAK,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,eAAe,EAAE,GAAG,KAAK,EAAE,kCAA+B,EAAE,GAAG,CAC7F,CAAA;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@apostel/bedrock",
3
+ "version": "0.1.0",
4
+ "description": "Headless React primitives built on native platform features",
5
+ "keywords": [
6
+ "accessibility",
7
+ "anchor-positioning",
8
+ "dialog",
9
+ "headless",
10
+ "invoker-commands",
11
+ "popover",
12
+ "primitives",
13
+ "radix",
14
+ "react"
15
+ ],
16
+ "homepage": "https://github.com/Sam-Apostel/bedrock-ui#readme",
17
+ "bugs": "https://github.com/Sam-Apostel/bedrock-ui/issues",
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/Sam-Apostel/bedrock-ui.git"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "skills"
26
+ ],
27
+ "type": "module",
28
+ "sideEffects": false,
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ },
34
+ "./controlled": {
35
+ "types": "./dist/controlled.d.ts",
36
+ "default": "./dist/controlled.js"
37
+ },
38
+ "./bedrock.css": "./dist/bedrock.css"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public",
42
+ "provenance": true
43
+ },
44
+ "scripts": {
45
+ "build": "tsc -p tsconfig.build.json && node scripts/postbuild.mjs",
46
+ "typecheck": "tsc --noEmit -p tsconfig.json",
47
+ "lint": "oxlint",
48
+ "lint:graph": "depcruise src --config .dependency-cruiser.cjs",
49
+ "format": "oxfmt",
50
+ "format:check": "oxfmt --check",
51
+ "registry:build": "node scripts/build-registry.mjs",
52
+ "test": "playwright test",
53
+ "test:install": "playwright install chromium",
54
+ "verify": "npm run format:check && npm run lint && npm run typecheck && npm run lint:graph && npm run build && npm run test",
55
+ "prepublishOnly": "npm run verify",
56
+ "docs:build": "node scripts/build-docs.mjs",
57
+ "changeset": "changeset",
58
+ "version": "changeset version",
59
+ "release": "changeset publish"
60
+ },
61
+ "devDependencies": {
62
+ "@axe-core/playwright": "^4.12.1",
63
+ "@changesets/cli": "^3.0.1",
64
+ "@playwright/test": "^1.62.1",
65
+ "@types/react": "^19.0.0",
66
+ "@vitejs/plugin-react": "^6.0.5",
67
+ "dependency-cruiser": "^16.0.0",
68
+ "marked": "^15.0.12",
69
+ "oxfmt": "^0.61.0",
70
+ "oxlint": "^1.76.0",
71
+ "typescript": "^5.6.0",
72
+ "vite": "^8.2.0"
73
+ },
74
+ "peerDependencies": {
75
+ "react": ">=19",
76
+ "react-dom": ">=19"
77
+ },
78
+ "engines": {
79
+ "node": ">=20"
80
+ }
81
+ }