@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,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DialogClose, DialogContent } from '../dialog/parts.js';
3
+ /**
4
+ * A Dialog announced as an alert dialog. The difference is `role`, plus the
5
+ * convention that the only ways out are the buttons you provide — which is the
6
+ * native default, since a modal `<dialog>` has no light dismiss to disable.
7
+ *
8
+ * Escape still closes, exactly as it does in Radix's AlertDialog.
9
+ */
10
+ export function AlertDialogContent(props) {
11
+ return _jsx(DialogContent, { role: "alertdialog", ...props });
12
+ }
13
+ /** A close button that runs your handler. Both Action and Cancel dismiss. */
14
+ export function AlertDialogAction(props) {
15
+ return _jsx(DialogClose, { ...props, "data-bedrock-alert-dialog-action": "" });
16
+ }
17
+ export function AlertDialogCancel(props) {
18
+ return _jsx(DialogClose, { ...props, "data-bedrock-alert-dialog-cancel": "" });
19
+ }
20
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/alert-dialog/parts.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAA;AAIrF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,OAAO,KAAC,aAAa,IAAC,IAAI,EAAC,aAAa,KAAK,KAAK,GAAI,CAAA;AACxD,CAAC;AAID,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,OAAO,KAAC,WAAW,OAAK,KAAK,sCAAmC,EAAE,GAAG,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,OAAO,KAAC,WAAW,OAAK,KAAK,sCAAmC,EAAE,GAAG,CAAA;AACvE,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { CSSProperties } from 'react';
2
+ export type Side = 'top' | 'right' | 'bottom' | 'left';
3
+ export type Align = 'start' | 'center' | 'end';
4
+ /**
5
+ * `anchor-name` is document-scoped, so every instance needs its own. React's
6
+ * generated ids are not all valid in a dashed-ident — `«r0»` is a real format —
7
+ * so anything outside the ident grammar is replaced rather than trusted.
8
+ */
9
+ export declare function anchorName(id: string): string;
10
+ export interface PlacementOptions {
11
+ side: Side;
12
+ align: Align;
13
+ sideOffset: number;
14
+ /** Flip to the opposite side rather than overflow the viewport. */
15
+ avoidCollisions: boolean;
16
+ }
17
+ /**
18
+ * Inline styles rather than a stylesheet, because the anchor name is per
19
+ * instance and because this library does not require its CSS to be loaded.
20
+ *
21
+ * A browser without anchor positioning ignores every one of these declarations
22
+ * and the popover lands where the UA puts it — centred, usable, not beside its
23
+ * trigger. That is the documented degradation, and it needs no feature test
24
+ * because an unsupported property is simply dropped.
25
+ */
26
+ export declare function placementStyles(anchor: string, options: PlacementOptions): CSSProperties;
27
+ //# sourceMappingURL=anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../src/anchor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;AACtD,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;AAE9C;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE7C;AAwDD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,KAAK,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,eAAe,EAAE,OAAO,CAAA;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,aAAa,CAyBxF"}
package/dist/anchor.js ADDED
@@ -0,0 +1,70 @@
1
+ /**
2
+ * `anchor-name` is document-scoped, so every instance needs its own. React's
3
+ * generated ids are not all valid in a dashed-ident — `«r0»` is a real format —
4
+ * so anything outside the ident grammar is replaced rather than trusted.
5
+ */
6
+ export function anchorName(id) {
7
+ return `--bedrock-${id.replace(/[^\w-]/g, '')}`;
8
+ }
9
+ const BLOCK_SIDE = {
10
+ start: { area: 'span-inline-end', alignment: 'start' },
11
+ center: { area: 'span-all', alignment: 'anchor-center' },
12
+ end: { area: 'span-inline-start', alignment: 'end' },
13
+ };
14
+ const INLINE_SIDE = {
15
+ start: { area: 'span-block-end', alignment: 'start' },
16
+ center: { area: 'span-all', alignment: 'anchor-center' },
17
+ end: { area: 'span-block-start', alignment: 'end' },
18
+ };
19
+ const AREA = {
20
+ top: BLOCK_SIDE,
21
+ bottom: BLOCK_SIDE,
22
+ left: INLINE_SIDE,
23
+ right: INLINE_SIDE,
24
+ };
25
+ const CELL = {
26
+ top: 'block-start',
27
+ bottom: 'block-end',
28
+ left: 'inline-start',
29
+ right: 'inline-end',
30
+ };
31
+ const OFFSET_EDGE = {
32
+ top: 'marginBottom',
33
+ bottom: 'marginTop',
34
+ left: 'marginRight',
35
+ right: 'marginLeft',
36
+ };
37
+ /**
38
+ * Inline styles rather than a stylesheet, because the anchor name is per
39
+ * instance and because this library does not require its CSS to be loaded.
40
+ *
41
+ * A browser without anchor positioning ignores every one of these declarations
42
+ * and the popover lands where the UA puts it — centred, usable, not beside its
43
+ * trigger. That is the documented degradation, and it needs no feature test
44
+ * because an unsupported property is simply dropped.
45
+ */
46
+ export function placementStyles(anchor, options) {
47
+ const { side, align, sideOffset, avoidCollisions } = options;
48
+ const placement = AREA[side][align];
49
+ const alongBlock = side === 'top' || side === 'bottom';
50
+ const styles = {
51
+ positionAnchor: anchor,
52
+ positionArea: `${CELL[side]} ${placement.area}`,
53
+ // The UA stylesheet centres a popover with `inset: 0; margin: auto`, and
54
+ // auto margins beat self-alignment. Undoing both is what lets `align` mean
55
+ // anything at all — without it every popover sits in the middle of the
56
+ // viewport with the anchor styles quietly applied and ignored.
57
+ inset: 'auto',
58
+ margin: '0',
59
+ // Sized by its content, not by the region it sits in.
60
+ width: 'max-content',
61
+ maxWidth: 'max-content',
62
+ [alongBlock ? 'justifySelf' : 'alignSelf']: placement.alignment,
63
+ };
64
+ if (sideOffset !== 0)
65
+ styles[OFFSET_EDGE[side]] = `${sideOffset}px`;
66
+ if (avoidCollisions)
67
+ styles.positionTryFallbacks = 'flip-block, flip-inline, flip-start';
68
+ return styles;
69
+ }
70
+ //# sourceMappingURL=anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.js","sourceRoot":"","sources":["../src/anchor.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,aAAa,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAA;AACjD,CAAC;AAuBD,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE;IACtD,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE;IACxD,GAAG,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE;CACrD,CAAA;AAED,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE;IACrD,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE;IACxD,GAAG,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE;CACpD,CAAA;AAED,MAAM,IAAI,GAA2C;IACnD,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,WAAW;CACnB,CAAA;AAED,MAAM,IAAI,GAAyB;IACjC,GAAG,EAAE,aAAa;IAClB,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,YAAY;CACpB,CAAA;AAED,MAAM,WAAW,GAAyB;IACxC,GAAG,EAAE,cAAc;IACnB,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,YAAY;CACpB,CAAA;AAUD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,OAAyB;IACvE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,CAAA;IAE5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;IACnC,MAAM,UAAU,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,CAAA;IAEtD,MAAM,MAAM,GAA2B;QACrC,cAAc,EAAE,MAAM;QACtB,YAAY,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE;QAC/C,yEAAyE;QACzE,2EAA2E;QAC3E,uEAAuE;QACvE,+DAA+D;QAC/D,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,GAAG;QACX,sDAAsD;QACtD,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,aAAa;QACvB,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,SAAS;KAChE,CAAA;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,UAAU,IAAI,CAAA;IACnE,IAAI,eAAe;QAAE,MAAM,CAAC,oBAAoB,GAAG,qCAAqC,CAAA;IAExF,OAAO,MAAuB,CAAA;AAChC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ComponentPropsWithRef } from 'react';
2
+ import type { AsChildProps } from '../types.js';
3
+ export interface AspectRatioProps extends ComponentPropsWithRef<'div'>, AsChildProps {
4
+ /** Width divided by height. `16 / 9`, not the string. */
5
+ ratio?: number;
6
+ }
7
+ /**
8
+ * One `aspect-ratio` declaration. Radix ships a padding-bottom wrapper and an
9
+ * absolutely positioned child because the CSS property did not exist when it
10
+ * was written; it has been Baseline since 2021.
11
+ *
12
+ * The nested element and the position juggling go with it, so this is a single
13
+ * element that can be laid out normally.
14
+ */
15
+ export declare function AspectRatioRoot({ asChild, ratio, style, ...props }: AspectRatioProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/aspect-ratio/parts.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAe,MAAM,OAAO,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB,CAAC,KAAK,CAAC,EAAE,YAAY;IAClF,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,KAAS,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BAIxF"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Slot } from '../slot.js';
3
+ /**
4
+ * One `aspect-ratio` declaration. Radix ships a padding-bottom wrapper and an
5
+ * absolutely positioned child because the CSS property did not exist when it
6
+ * was written; it has been Baseline since 2021.
7
+ *
8
+ * The nested element and the position juggling go with it, so this is a single
9
+ * element that can be laid out normally.
10
+ */
11
+ export function AspectRatioRoot({ asChild, ratio = 1, style, ...props }) {
12
+ const Part = asChild ? Slot : 'div';
13
+ return _jsx(Part, { ...props, style: { aspectRatio: ratio, ...style }, "data-bedrock-aspect-ratio": "" });
14
+ }
15
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/aspect-ratio/parts.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAQ9B;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAoB;IACvF,MAAM,IAAI,GAAgB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;IAEhD,OAAO,KAAC,IAAI,OAAK,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,+BAA4B,EAAE,GAAG,CAAA;AAClG,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type ComponentPropsWithRef } from 'react';
2
+ import type { AsChildProps } from '../types.js';
3
+ export interface AvatarProps extends ComponentPropsWithRef<'span'>, AsChildProps {
4
+ }
5
+ /**
6
+ * The one primitive here that genuinely needs JavaScript: there is no CSS or
7
+ * markup that says "show this element only if that image failed to load".
8
+ * `<object>` and `<picture>` both come close and neither degrades to arbitrary
9
+ * fallback content.
10
+ */
11
+ export declare function AvatarRoot({ asChild, children, ...props }: AvatarProps): import("react").JSX.Element;
12
+ export interface AvatarImageProps extends ComponentPropsWithRef<'img'>, AsChildProps {
13
+ }
14
+ export declare function AvatarImage({ asChild, onLoad, onError, ...props }: AvatarImageProps): import("react").JSX.Element;
15
+ export interface AvatarFallbackProps extends ComponentPropsWithRef<'span'>, AsChildProps {
16
+ /**
17
+ * Wait this long before showing. Stops a flash of initials on a fast
18
+ * connection, where the image arrives in the same frame.
19
+ */
20
+ delayMs?: number;
21
+ }
22
+ export declare function AvatarFallback({ asChild, delayMs, ...props }: AvatarFallbackProps): import("react").JSX.Element | null;
23
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/avatar/parts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,qBAAqB,EAG3B,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAiB5C,MAAM,WAAW,WAAY,SAAQ,qBAAqB,CAAC,MAAM,CAAC,EAAE,YAAY;CAAG;AAEnF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,+BAYtE;AAED,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB,CAAC,KAAK,CAAC,EAAE,YAAY;CAAG;AAEvF,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BAqBnF;AAED,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB,CAAC,MAAM,CAAC,EAAE,YAAY;IACtF;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAW,EAAE,GAAG,KAAK,EAAE,EAAE,mBAAmB,sCAcrF"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo, useState, } from 'react';
3
+ import { Slot } from '../slot.js';
4
+ const AvatarContext = createContext(null);
5
+ function useAvatarContext(part) {
6
+ const context = useContext(AvatarContext);
7
+ if (!context)
8
+ throw new Error(`[bedrock] ${part} must be used inside Avatar.Root.`);
9
+ return context;
10
+ }
11
+ /**
12
+ * The one primitive here that genuinely needs JavaScript: there is no CSS or
13
+ * markup that says "show this element only if that image failed to load".
14
+ * `<object>` and `<picture>` both come close and neither degrades to arbitrary
15
+ * fallback content.
16
+ */
17
+ export function AvatarRoot({ asChild, children, ...props }) {
18
+ const [status, setStatus] = useState('idle');
19
+ const Part = asChild ? Slot : 'span';
20
+ const context = useMemo(() => ({ status, setStatus }), [status]);
21
+ return (_jsx(AvatarContext.Provider, { value: context, children: _jsx(Part, { ...props, "data-bedrock-avatar": "", children: children }) }));
22
+ }
23
+ export function AvatarImage({ asChild, onLoad, onError, ...props }) {
24
+ const { status, setStatus } = useAvatarContext('Avatar.Image');
25
+ const Part = asChild ? Slot : 'img';
26
+ return (_jsx(Part, { ...props,
27
+ // Hidden rather than unmounted while loading, so the request starts and
28
+ // the browser's own cache and priority hints still apply.
29
+ style: status === 'loaded' ? props.style : { ...props.style, display: 'none' }, onLoad: (event) => {
30
+ setStatus('loaded');
31
+ onLoad?.(event);
32
+ }, onError: (event) => {
33
+ setStatus('error');
34
+ onError?.(event);
35
+ }, "data-bedrock-avatar-image": "" }));
36
+ }
37
+ export function AvatarFallback({ asChild, delayMs = 0, ...props }) {
38
+ const { status } = useAvatarContext('Avatar.Fallback');
39
+ const [waited, setWaited] = useState(delayMs === 0);
40
+ const Part = asChild ? Slot : 'span';
41
+ useEffect(() => {
42
+ if (delayMs === 0)
43
+ return;
44
+ const timer = setTimeout(() => setWaited(true), delayMs);
45
+ return () => clearTimeout(timer);
46
+ }, [delayMs]);
47
+ if (status === 'loaded' || !waited)
48
+ return null;
49
+ return _jsx(Part, { ...props, "data-bedrock-avatar-fallback": "" });
50
+ }
51
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/avatar/parts.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /*
2
+ * Optional. Every part takes className and renders exactly one element, so
3
+ * ignoring this file entirely is a supported way to use the library.
4
+ *
5
+ * What it demonstrates: enter and exit animation with no presence wrapper, no
6
+ * forceMount, and no unmount timing in JavaScript. `allow-discrete` keeps the
7
+ * element around for the exit transition; `overlay` keeps it in the top layer
8
+ * while that happens, which is the part people get wrong and then blame
9
+ * z-index for.
10
+ */
11
+
12
+ [data-bedrock-dialog] {
13
+ --_duration: 180ms;
14
+ --_ease: cubic-bezier(0.2, 0, 0, 1);
15
+
16
+ border: none;
17
+ padding: 0;
18
+ opacity: 0;
19
+ scale: 0.96;
20
+
21
+ transition:
22
+ opacity var(--_duration) var(--_ease),
23
+ scale var(--_duration) var(--_ease),
24
+ display var(--_duration) allow-discrete,
25
+ overlay var(--_duration) allow-discrete;
26
+ }
27
+
28
+ [data-bedrock-dialog]:open {
29
+ opacity: 1;
30
+ scale: 1;
31
+ }
32
+
33
+ @starting-style {
34
+ [data-bedrock-dialog]:open {
35
+ opacity: 0;
36
+ scale: 0.96;
37
+ }
38
+ }
39
+
40
+ [data-bedrock-dialog]::backdrop {
41
+ background: rgb(0 0 0 / 0.4);
42
+ opacity: 0;
43
+ transition:
44
+ opacity var(--_duration) var(--_ease),
45
+ display var(--_duration) allow-discrete,
46
+ overlay var(--_duration) allow-discrete;
47
+ }
48
+
49
+ [data-bedrock-dialog]:open::backdrop {
50
+ opacity: 1;
51
+ }
52
+
53
+ @starting-style {
54
+ [data-bedrock-dialog]:open::backdrop {
55
+ opacity: 0;
56
+ }
57
+ }
58
+
59
+ @media (prefers-reduced-motion: reduce) {
60
+ [data-bedrock-dialog],
61
+ [data-bedrock-dialog]::backdrop {
62
+ --_duration: 1ms;
63
+ }
64
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Every non-Baseline feature test lives here, so swapping an implementation
3
+ * when a spec lands is one file rather than a search.
4
+ *
5
+ * All of them are safe to call while server-rendering.
6
+ */
7
+ /**
8
+ * `interestfor` — hover and focus intent without timers. Not standardised, and
9
+ * not in Chrome stable as of 141, which is why Tooltip and HoverCard ship the
10
+ * JavaScript path as their normal one rather than as a contingency.
11
+ */
12
+ export declare function supportsInterestInvokers(): boolean;
13
+ /** Anchor positioning. Without it, overlays land where the UA puts them. */
14
+ export declare function supportsAnchorPositioning(): boolean;
15
+ /** `popover=hint`, which layers above an open menu instead of closing it. */
16
+ export declare function supportsHintPopovers(): boolean;
17
+ /**
18
+ * The same test, as a hook, for anything that changes what is rendered.
19
+ *
20
+ * A plain call would return false on the server and true on the client's first
21
+ * render, which is a hydration mismatch. This reports the server's answer for
22
+ * the hydrating render and the real one immediately after.
23
+ */
24
+ export declare function useSupportsInterestInvokers(): boolean;
25
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,IAAI,OAAO,CAM9C;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAErD"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Every non-Baseline feature test lives here, so swapping an implementation
3
+ * when a spec lands is one file rather than a search.
4
+ *
5
+ * All of them are safe to call while server-rendering.
6
+ */
7
+ import { useSyncExternalStore } from 'react';
8
+ const hasDom = typeof window !== 'undefined';
9
+ const noopSubscribe = () => () => { };
10
+ /**
11
+ * `interestfor` — hover and focus intent without timers. Not standardised, and
12
+ * not in Chrome stable as of 141, which is why Tooltip and HoverCard ship the
13
+ * JavaScript path as their normal one rather than as a contingency.
14
+ */
15
+ export function supportsInterestInvokers() {
16
+ return hasDom && 'interestForElement' in HTMLButtonElement.prototype;
17
+ }
18
+ /** Anchor positioning. Without it, overlays land where the UA puts them. */
19
+ export function supportsAnchorPositioning() {
20
+ return hasDom && CSS.supports('anchor-name', '--a');
21
+ }
22
+ /** `popover=hint`, which layers above an open menu instead of closing it. */
23
+ export function supportsHintPopovers() {
24
+ if (!hasDom)
25
+ return false;
26
+ const element = document.createElement('div');
27
+ element.popover = 'hint';
28
+ return element.popover === 'hint';
29
+ }
30
+ /**
31
+ * The same test, as a hook, for anything that changes what is rendered.
32
+ *
33
+ * A plain call would return false on the server and true on the client's first
34
+ * render, which is a hydration mismatch. This reports the server's answer for
35
+ * the hydrating render and the real one immediately after.
36
+ */
37
+ export function useSupportsInterestInvokers() {
38
+ return useSyncExternalStore(noopSubscribe, supportsInterestInvokers, () => false);
39
+ }
40
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAE5C,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,WAAW,CAAA;AAC5C,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,CAAA;AAEpC;;;;GAIG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,MAAM,IAAI,oBAAoB,IAAI,iBAAiB,CAAC,SAAS,CAAA;AACtE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,yBAAyB;IACvC,OAAO,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;AACrD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEzB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,CAAC,OAAO,GAAG,MAAM,CAAA;IACxB,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,CAAA;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO,oBAAoB,CAAC,aAAa,EAAE,wBAAwB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;AACnF,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type ComponentPropsWithRef } from 'react';
2
+ import type { AsChildProps } from '../types.js';
3
+ export interface ControlledCheckboxProps extends Omit<ComponentPropsWithRef<'input'>, 'type' | 'defaultChecked'>, AsChildProps {
4
+ checked: boolean;
5
+ indeterminate?: boolean;
6
+ onCheckedChange?: ((checked: boolean) => void) | undefined;
7
+ }
8
+ /**
9
+ * The veto for a form control is React's own controlled input, and it works the
10
+ * way the rest of this library does: the user clicks, the DOM flips, you are
11
+ * told, and if your prop does not change React puts it back before paint.
12
+ *
13
+ * So there is no reconciliation layer here, no adapter and no listener — which
14
+ * is why this file is fifteen lines rather than ninety. `useControlledRoot`
15
+ * exists for top-layer elements, where the platform's events are the only hook.
16
+ */
17
+ export declare function CheckboxRoot({ asChild, children: _children, checked, indeterminate, onCheckedChange, onChange, ...props }: ControlledCheckboxProps): import("react").JSX.Element;
18
+ //# sourceMappingURL=controlled-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controlled-root.d.ts","sourceRoot":"","sources":["../../src/checkbox/controlled-root.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,qBAAqB,EAAoB,MAAM,OAAO,CAAA;AAEnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,MAAM,WAAW,uBACf,SAAQ,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,EAAE,YAAY;IACrF,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CAC3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EAAE,SAAS,EACnB,OAAO,EACP,aAAqB,EACrB,eAAe,EACf,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,uBAAuB,+BA0BzB"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback } from 'react';
3
+ import { Slot } from '../slot.js';
4
+ /**
5
+ * The veto for a form control is React's own controlled input, and it works the
6
+ * way the rest of this library does: the user clicks, the DOM flips, you are
7
+ * told, and if your prop does not change React puts it back before paint.
8
+ *
9
+ * So there is no reconciliation layer here, no adapter and no listener — which
10
+ * is why this file is fifteen lines rather than ninety. `useControlledRoot`
11
+ * exists for top-layer elements, where the platform's events are the only hook.
12
+ */
13
+ export function CheckboxRoot({ asChild, children: _children, checked, indeterminate = false, onCheckedChange, onChange, ...props }) {
14
+ const Part = asChild ? Slot : 'input';
15
+ const handleChange = useCallback((event) => {
16
+ onChange?.(event);
17
+ onCheckedChange?.(event.currentTarget.checked);
18
+ }, [onChange, onCheckedChange]);
19
+ return (_jsx(Part, { ...props, type: "checkbox", checked: checked,
20
+ // Deliberately not a ref effect: React writes `checked` on every render,
21
+ // and `indeterminate` has to be written alongside it or a controlled
22
+ // checkbox can show a tick and a dash at once.
23
+ ref: (node) => {
24
+ if (node)
25
+ node.indeterminate = indeterminate;
26
+ }, onChange: handleChange, "data-bedrock-checkbox": "" }));
27
+ }
28
+ //# sourceMappingURL=controlled-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controlled-root.js","sourceRoot":"","sources":["../../src/checkbox/controlled-root.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAkE,MAAM,OAAO,CAAA;AACnG,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAU9B;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EAAE,SAAS,EACnB,OAAO,EACP,aAAa,GAAG,KAAK,EACrB,eAAe,EACf,QAAQ,EACR,GAAG,KAAK,EACgB;IACxB,MAAM,IAAI,GAAgB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAA;IAElD,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,KAAoC,EAAE,EAAE;QACvC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;QACjB,eAAe,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC,EACD,CAAC,QAAQ,EAAE,eAAe,CAAC,CAC5B,CAAA;IAED,OAAO,CACL,KAAC,IAAI,OACC,KAAK,EACT,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,OAAO;QAChB,yEAAyE;QACzE,qEAAqE;QACrE,+CAA+C;QAC/C,GAAG,EAAE,CAAC,IAA6B,EAAE,EAAE;YACrC,IAAI,IAAI;gBAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAC9C,CAAC,EACD,QAAQ,EAAE,YAAY,2BACA,EAAE,GACxB,CACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type ComponentPropsWithRef } from 'react';
2
+ import type { AsChildProps } from '../types.js';
3
+ export interface CheckboxProps extends Omit<ComponentPropsWithRef<'input'>, 'type' | 'checked'>, AsChildProps {
4
+ defaultChecked?: boolean;
5
+ /**
6
+ * Property-only in the DOM — there is no `indeterminate` attribute — so this
7
+ * is the one thing here that needs an effect. Expected, not a lapse.
8
+ */
9
+ indeterminate?: boolean;
10
+ onCheckedChange?(checked: boolean): void;
11
+ }
12
+ /**
13
+ * A real `<input type="checkbox">`. The role, the `:checked` state, form
14
+ * participation, `required` validation and the space-bar behaviour are all the
15
+ * element's own.
16
+ *
17
+ * Radix renders a `<button role="checkbox">` next to a hidden input, and keeps
18
+ * the two in sync. There is nothing here to keep in sync.
19
+ */
20
+ export declare function CheckboxRoot({ asChild, children: _children, indeterminate, onCheckedChange, onChange, ref, ...props }: CheckboxProps): import("react").JSX.Element;
21
+ export interface CheckboxIndicatorProps extends ComponentPropsWithRef<'span'>, AsChildProps {
22
+ }
23
+ /**
24
+ * Renders nothing: an `<input>` cannot have children, so the tick is drawn by
25
+ * the element. Set `appearance: none` and draw it with `::before` under
26
+ * `:checked` and `:indeterminate`.
27
+ */
28
+ export declare function CheckboxIndicator({ className }: CheckboxIndicatorProps): null;
29
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/checkbox/parts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,qBAAqB,EAE3B,MAAM,OAAO,CAAA;AAGd,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,YAAY;IAC9E,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;CACzC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EAAE,SAAS,EACnB,aAAqB,EACrB,eAAe,EACf,QAAQ,EACR,GAAG,EACH,GAAG,KAAK,EACT,EAAE,aAAa,+BA2Bf;AAID,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB,CAAC,MAAM,CAAC,EAAE,YAAY;CAAG;AAE9F;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,sBAAsB,QAUtE"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, } from 'react';
3
+ import { useComposedRefs } from '../compose-refs.js';
4
+ import { Slot } from '../slot.js';
5
+ /**
6
+ * A real `<input type="checkbox">`. The role, the `:checked` state, form
7
+ * participation, `required` validation and the space-bar behaviour are all the
8
+ * element's own.
9
+ *
10
+ * Radix renders a `<button role="checkbox">` next to a hidden input, and keeps
11
+ * the two in sync. There is nothing here to keep in sync.
12
+ */
13
+ export function CheckboxRoot({ asChild, children: _children, indeterminate = false, onCheckedChange, onChange, ref, ...props }) {
14
+ const Part = asChild ? Slot : 'input';
15
+ const nodeRef = useRef(null);
16
+ useEffect(() => {
17
+ if (nodeRef.current)
18
+ nodeRef.current.indeterminate = indeterminate;
19
+ }, [indeterminate]);
20
+ const handleChange = useCallback((event) => {
21
+ onChange?.(event);
22
+ onCheckedChange?.(event.currentTarget.checked);
23
+ }, [onChange, onCheckedChange]);
24
+ return (_jsx(Part, { ...props, type: "checkbox", onChange: handleChange, ref: useComposedRefs(ref, (node) => {
25
+ nodeRef.current = node;
26
+ }), "data-bedrock-checkbox": "" }));
27
+ }
28
+ let warned = false;
29
+ /**
30
+ * Renders nothing: an `<input>` cannot have children, so the tick is drawn by
31
+ * the element. Set `appearance: none` and draw it with `::before` under
32
+ * `:checked` and `:indeterminate`.
33
+ */
34
+ export function CheckboxIndicator({ className }) {
35
+ if (process.env.NODE_ENV !== 'production' && className && !warned) {
36
+ warned = true;
37
+ console.warn('[bedrock] Checkbox.Indicator renders nothing — an <input> has no children. ' +
38
+ 'Draw the mark with ::before on Checkbox.Root under :checked / :indeterminate.');
39
+ }
40
+ return null;
41
+ }
42
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/checkbox/parts.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,MAAM,GAIP,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAc9B;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EAAE,SAAS,EACnB,aAAa,GAAG,KAAK,EACrB,eAAe,EACf,QAAQ,EACR,GAAG,EACH,GAAG,KAAK,EACM;IACd,MAAM,IAAI,GAAgB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAA;IAClD,MAAM,OAAO,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAA;IAErD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAA;IACpE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,KAAoC,EAAE,EAAE;QACvC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;QACjB,eAAe,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC,EACD,CAAC,QAAQ,EAAE,eAAe,CAAC,CAC5B,CAAA;IAED,OAAO,CACL,KAAC,IAAI,OACC,KAAK,EACT,IAAI,EAAC,UAAU,EACf,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,eAAe,CAAmB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACnD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAA;QACxB,CAAC,CAAC,2BACoB,EAAE,GACxB,CACH,CAAA;AACH,CAAC;AAED,IAAI,MAAM,GAAG,KAAK,CAAA;AAIlB;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,SAAS,EAA0B;IACrE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QAClE,MAAM,GAAG,IAAI,CAAA;QACb,OAAO,CAAC,IAAI,CACV,6EAA6E;YAC3E,+EAA+E,CAClF,CAAA;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * True on the client, false while server-rendering and for the hydrating render
3
+ * that has to match it.
4
+ *
5
+ * It is what lets closed content be absent in the browser and present in the
6
+ * HTML: a page whose JavaScript never arrives keeps working content, and a page
7
+ * whose JavaScript does arrive stops paying for closed subtrees on load.
8
+ */
9
+ export declare function useClientRender(): boolean;
10
+ //# sourceMappingURL=client-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-render.d.ts","sourceRoot":"","sources":["../src/client-render.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAMzC"}
@@ -0,0 +1,14 @@
1
+ import { useSyncExternalStore } from 'react';
2
+ const noopSubscribe = () => () => { };
3
+ /**
4
+ * True on the client, false while server-rendering and for the hydrating render
5
+ * that has to match it.
6
+ *
7
+ * It is what lets closed content be absent in the browser and present in the
8
+ * HTML: a page whose JavaScript never arrives keeps working content, and a page
9
+ * whose JavaScript does arrive stops paying for closed subtrees on load.
10
+ */
11
+ export function useClientRender() {
12
+ return useSyncExternalStore(noopSubscribe, () => true, () => false);
13
+ }
14
+ //# sourceMappingURL=client-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-render.js","sourceRoot":"","sources":["../src/client-render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAE5C,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,CAAA;AAEpC;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,oBAAoB,CACzB,aAAa,EACb,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAA;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ComponentPropsWithRef } from 'react';
2
+ import { type ControlledRootProps } from '../create-controlled-root.js';
3
+ import type { AsChildProps } from '../types.js';
4
+ export interface ControlledCollapsibleRootProps extends Omit<ComponentPropsWithRef<'details'>, 'open'>, ControlledRootProps, AsChildProps {
5
+ }
6
+ /**
7
+ * `<details>` exposes no cancelable hook — no `beforetoggle`, no `cancel` — so
8
+ * unlike Dialog this root cannot refuse before the fact. It lets the disclosure
9
+ * move, reports it, and puts it back if you decline: one frame of visible
10
+ * movement, in the refusal case only.
11
+ *
12
+ * That is the documented fallback rather than a shortcoming of this primitive,
13
+ * and it is why the veto is worth having on Dialog and Popover, where the
14
+ * platform does give a cancelable event.
15
+ */
16
+ export declare function CollapsibleRoot({ asChild, children, open, onOpenChange, ref, ...props }: ControlledCollapsibleRootProps): import("react").JSX.Element;
17
+ //# sourceMappingURL=controlled-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controlled-root.d.ts","sourceRoot":"","sources":["../../src/collapsible/controlled-root.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAe,MAAM,OAAO,CAAA;AAE/D,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAEvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAG5C,MAAM,WAAW,8BACf,SAAQ,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,mBAAmB,EAAE,YAAY;CAAG;AAE9F;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,GAAG,EACH,GAAG,KAAK,EACT,EAAE,8BAA8B,+BAehC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useComposedRefs } from '../compose-refs.js';
3
+ import { useControlledRoot } from '../create-controlled-root.js';
4
+ import { Slot } from '../slot.js';
5
+ import { CollapsibleContext, collapsibleAdapter } from './shared.js';
6
+ /**
7
+ * `<details>` exposes no cancelable hook — no `beforetoggle`, no `cancel` — so
8
+ * unlike Dialog this root cannot refuse before the fact. It lets the disclosure
9
+ * move, reports it, and puts it back if you decline: one frame of visible
10
+ * movement, in the refusal case only.
11
+ *
12
+ * That is the documented fallback rather than a shortcoming of this primitive,
13
+ * and it is why the veto is worth having on Dialog and Popover, where the
14
+ * platform does give a cancelable event.
15
+ */
16
+ export function CollapsibleRoot({ asChild, children, open, onOpenChange, ref, ...props }) {
17
+ const context = useControlledRoot({ open, onOpenChange }, collapsibleAdapter);
18
+ const Part = asChild ? Slot : 'details';
19
+ return (_jsx(CollapsibleContext.Provider, { value: context, children: _jsx(Part, { ...props, ref: useComposedRefs(ref, context.registerContent), "data-bedrock-collapsible": "", children: children }) }));
20
+ }
21
+ //# sourceMappingURL=controlled-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controlled-root.js","sourceRoot":"","sources":["../../src/collapsible/controlled-root.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAA4B,MAAM,2BAA2B,CAAA;AACvF,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAE9B,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAKjE;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,GAAG,EACH,GAAG,KAAK,EACuB;IAC/B,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,kBAAkB,CAAC,CAAA;IAC7E,MAAM,IAAI,GAAgB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IAEpD,OAAO,CACL,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,YACzC,KAAC,IAAI,OACC,KAAK,EACT,GAAG,EAAE,eAAe,CAAc,GAAG,EAAE,OAAO,CAAC,eAAe,CAAC,8BACtC,EAAE,YAE1B,QAAQ,GACJ,GACqB,CAC/B,CAAA;AACH,CAAC"}