@remix-run/ui 0.3.0 → 0.5.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 (434) hide show
  1. package/README.md +116 -157
  2. package/dist/accordion/index.d.ts +46 -0
  3. package/dist/accordion/index.js +142 -0
  4. package/dist/accordion/index.js.map +1 -0
  5. package/dist/accordion/primitives.d.ts +104 -0
  6. package/dist/accordion/primitives.js +312 -0
  7. package/dist/accordion/primitives.js.map +1 -0
  8. package/dist/{components/anchor/anchor.js → anchor/index.js} +1 -1
  9. package/dist/anchor/index.js.map +1 -0
  10. package/dist/animation/animate-layout-mixin.js +1 -1
  11. package/dist/animation/animate-layout-mixin.js.map +1 -1
  12. package/dist/animation/animate-mixins.js +2 -2
  13. package/dist/animation/animate-mixins.js.map +1 -1
  14. package/dist/animation/demos/color-interpolation.js +1 -1
  15. package/dist/animation/demos/color-interpolation.js.map +1 -1
  16. package/dist/animation/demos/drag-release.d.ts +1 -1
  17. package/dist/animation/demos/hold-to-confirm.d.ts +3 -3
  18. package/dist/animation/demos/material-ripple.js +1 -3
  19. package/dist/animation/demos/material-ripple.js.map +1 -1
  20. package/dist/animation/demos/reordering.js +9 -6
  21. package/dist/animation/demos/reordering.js.map +1 -1
  22. package/dist/animation/index.js +4 -4
  23. package/dist/animation/spring.js.map +1 -1
  24. package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
  25. package/dist/breadcrumbs/index.js.map +1 -0
  26. package/dist/button/index.d.ts +15 -0
  27. package/dist/button/index.js +128 -0
  28. package/dist/button/index.js.map +1 -0
  29. package/dist/checkbox/index.d.ts +14 -0
  30. package/dist/checkbox/index.js +127 -0
  31. package/dist/checkbox/index.js.map +1 -0
  32. package/dist/combobox/index.d.ts +21 -0
  33. package/dist/combobox/index.js +58 -0
  34. package/dist/combobox/index.js.map +1 -0
  35. package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +4 -8
  36. package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
  37. package/dist/combobox/primitives.js.map +1 -0
  38. package/dist/dev/refresh.d.ts +1 -0
  39. package/dist/dev/refresh.js +2 -0
  40. package/dist/dev/refresh.js.map +1 -0
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +14 -14
  43. package/dist/input/index.d.ts +13 -0
  44. package/dist/input/index.js +121 -0
  45. package/dist/input/index.js.map +1 -0
  46. package/dist/jsx-runtime.js +2 -2
  47. package/dist/listbox/flash-attribute.js.map +1 -0
  48. package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
  49. package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
  50. package/dist/listbox/index.js.map +1 -0
  51. package/dist/menu/hover-aim.js.map +1 -0
  52. package/dist/menu/index.d.ts +42 -0
  53. package/dist/menu/index.js +250 -0
  54. package/dist/menu/index.js.map +1 -0
  55. package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +4 -33
  56. package/dist/{components/menu/menu.js → menu/primitives.js} +98 -315
  57. package/dist/menu/primitives.js.map +1 -0
  58. package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +2 -4
  59. package/dist/{components/popover/popover.js → popover/index.js} +5 -48
  60. package/dist/popover/index.js.map +1 -0
  61. package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
  62. package/dist/popover/outside-click.js.map +1 -0
  63. package/dist/popover/scroll-lock.d.ts +1 -0
  64. package/dist/{utils → popover}/scroll-lock.js +0 -18
  65. package/dist/popover/scroll-lock.js.map +1 -0
  66. package/dist/radio/index.d.ts +12 -0
  67. package/dist/radio/index.js +77 -0
  68. package/dist/radio/index.js.map +1 -0
  69. package/dist/runtime/client-entry-boundary.d.ts +14 -0
  70. package/dist/runtime/client-entry-boundary.js +29 -0
  71. package/dist/runtime/client-entry-boundary.js.map +1 -0
  72. package/dist/runtime/component.d.ts +19 -4
  73. package/dist/runtime/component.js +39 -9
  74. package/dist/runtime/component.js.map +1 -1
  75. package/dist/runtime/core/attributes.js +36 -3
  76. package/dist/runtime/core/attributes.js.map +1 -1
  77. package/dist/runtime/core/children.d.ts +2 -0
  78. package/dist/runtime/core/children.js +26 -2
  79. package/dist/runtime/core/children.js.map +1 -1
  80. package/dist/runtime/core/props.js +2 -2
  81. package/dist/runtime/core/vnode.d.ts +3 -3
  82. package/dist/runtime/core/vnode.js +22 -1
  83. package/dist/runtime/core/vnode.js.map +1 -1
  84. package/dist/runtime/create-element.d.ts +2 -2
  85. package/dist/runtime/create-element.js +3 -2
  86. package/dist/runtime/create-element.js.map +1 -1
  87. package/dist/runtime/diff-dom.js +294 -219
  88. package/dist/runtime/diff-dom.js.map +1 -1
  89. package/dist/runtime/diff-props.js +3 -3
  90. package/dist/runtime/dom.d.ts +12 -0
  91. package/dist/runtime/element-function.d.ts +3 -0
  92. package/dist/runtime/element-function.js +2 -0
  93. package/dist/runtime/element-function.js.map +1 -0
  94. package/dist/runtime/form-navigation.d.ts +25 -0
  95. package/dist/runtime/form-navigation.js +132 -0
  96. package/dist/runtime/form-navigation.js.map +1 -0
  97. package/dist/runtime/frame-resolution.d.ts +5 -0
  98. package/dist/runtime/frame-resolution.js +10 -0
  99. package/dist/runtime/frame-resolution.js.map +1 -0
  100. package/dist/runtime/frame.d.ts +58 -15
  101. package/dist/runtime/frame.js +367 -114
  102. package/dist/runtime/frame.js.map +1 -1
  103. package/dist/runtime/jsx.d.ts +1 -1
  104. package/dist/runtime/jsx.js +1 -1
  105. package/dist/runtime/jsx.js.map +1 -1
  106. package/dist/runtime/key.d.ts +1 -0
  107. package/dist/runtime/key.js +2 -0
  108. package/dist/runtime/key.js.map +1 -0
  109. package/dist/runtime/mixins/attrs-mixin.js +2 -2
  110. package/dist/runtime/mixins/link-mixin.js +4 -3
  111. package/dist/runtime/mixins/link-mixin.js.map +1 -1
  112. package/dist/runtime/mixins/mixin.d.ts +15 -10
  113. package/dist/runtime/mixins/mixin.js +4 -4
  114. package/dist/runtime/mixins/mixin.js.map +1 -1
  115. package/dist/runtime/mixins/on-mixin.js +1 -1
  116. package/dist/runtime/mixins/ref-mixin.js +1 -1
  117. package/dist/runtime/navigation.d.ts +4 -1
  118. package/dist/runtime/navigation.js +157 -32
  119. package/dist/runtime/navigation.js.map +1 -1
  120. package/dist/runtime/reconcile.d.ts +11 -10
  121. package/dist/runtime/reconcile.js +557 -423
  122. package/dist/runtime/reconcile.js.map +1 -1
  123. package/dist/runtime/refresh.d.ts +28 -0
  124. package/dist/runtime/refresh.js +31 -0
  125. package/dist/runtime/refresh.js.map +1 -0
  126. package/dist/runtime/render.js +1 -1
  127. package/dist/runtime/render.js.map +1 -1
  128. package/dist/runtime/run.d.ts +3 -1
  129. package/dist/runtime/run.js +15 -7
  130. package/dist/runtime/run.js.map +1 -1
  131. package/dist/runtime/scheduler.js +8 -16
  132. package/dist/runtime/scheduler.js.map +1 -1
  133. package/dist/runtime/to-vnode.d.ts +2 -2
  134. package/dist/runtime/to-vnode.js +68 -20
  135. package/dist/runtime/to-vnode.js.map +1 -1
  136. package/dist/runtime/vdom.d.ts +4 -2
  137. package/dist/runtime/vdom.js +89 -41
  138. package/dist/runtime/vdom.js.map +1 -1
  139. package/dist/runtime/vnode.d.ts +138 -67
  140. package/dist/runtime/vnode.js +17 -12
  141. package/dist/runtime/vnode.js.map +1 -1
  142. package/dist/select/index.d.ts +19 -0
  143. package/dist/select/index.js +95 -0
  144. package/dist/select/index.js.map +1 -0
  145. package/dist/select/keydown.js.map +1 -0
  146. package/dist/{components/select/select.d.ts → select/primitives.d.ts} +5 -7
  147. package/dist/{components/select/select.js → select/primitives.js} +11 -63
  148. package/dist/select/primitives.js.map +1 -0
  149. package/dist/server/stream.js +22 -29
  150. package/dist/server/stream.js.map +1 -1
  151. package/dist/shared/focus-styles.d.ts +1 -0
  152. package/dist/shared/focus-styles.js +2 -0
  153. package/dist/shared/focus-styles.js.map +1 -0
  154. package/dist/shared/icons.d.ts +9 -0
  155. package/dist/shared/icons.js +42 -0
  156. package/dist/shared/icons.js.map +1 -0
  157. package/dist/shared/listbox-popover-styles.d.ts +6 -0
  158. package/dist/shared/listbox-popover-styles.js +137 -0
  159. package/dist/shared/listbox-popover-styles.js.map +1 -0
  160. package/dist/shared/style-values.d.ts +78 -0
  161. package/dist/shared/style-values.js +88 -0
  162. package/dist/shared/style-values.js.map +1 -0
  163. package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
  164. package/dist/shared/typeahead.js.map +1 -0
  165. package/dist/shared/wait-for-css-transition.js.map +1 -0
  166. package/dist/shared/wait.js.map +1 -0
  167. package/dist/style/css-mixin.js +3 -3
  168. package/dist/style/index.js +2 -2
  169. package/dist/style/style.js +25 -6
  170. package/dist/style/style.js.map +1 -1
  171. package/dist/style/stylesheet.d.ts +0 -1
  172. package/dist/style/stylesheet.js +13 -54
  173. package/dist/style/stylesheet.js.map +1 -1
  174. package/dist/tabs/index.d.ts +32 -0
  175. package/dist/tabs/index.js +157 -0
  176. package/dist/tabs/index.js.map +1 -0
  177. package/dist/tabs/primitives.d.ts +57 -0
  178. package/dist/tabs/primitives.js +238 -0
  179. package/dist/tabs/primitives.js.map +1 -0
  180. package/dist/test.js +1 -1
  181. package/dist/toggle/index.d.ts +9 -0
  182. package/dist/toggle/index.js +108 -0
  183. package/dist/toggle/index.js.map +1 -0
  184. package/dist/toggle/primitives.d.ts +29 -0
  185. package/dist/toggle/primitives.js +127 -0
  186. package/dist/toggle/primitives.js.map +1 -0
  187. package/package.json +81 -49
  188. package/src/{components/accordion → accordion}/README.md +50 -14
  189. package/src/accordion/index.tsx +285 -0
  190. package/src/accordion/primitives.tsx +512 -0
  191. package/src/{components/anchor → anchor}/README.md +37 -2
  192. package/src/animation/animate-mixins.ts +3 -3
  193. package/src/animation/demos/color-interpolation.tsx +1 -1
  194. package/src/animation/demos/reordering.tsx +9 -6
  195. package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
  196. package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
  197. package/src/button/README.md +44 -0
  198. package/src/button/index.ts +168 -0
  199. package/src/checkbox/README.md +59 -0
  200. package/src/checkbox/index.ts +164 -0
  201. package/src/{components/combobox → combobox}/README.md +58 -9
  202. package/src/combobox/index.tsx +112 -0
  203. package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
  204. package/src/dev/refresh.ts +1 -0
  205. package/src/index.ts +1 -1
  206. package/src/input/README.md +52 -0
  207. package/src/input/index.ts +147 -0
  208. package/src/{components/listbox → listbox}/README.md +9 -41
  209. package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
  210. package/src/{components/menu → menu}/README.md +55 -14
  211. package/src/menu/index.tsx +354 -0
  212. package/src/{components/menu/menu.tsx → menu/primitives.tsx} +99 -413
  213. package/src/{components/popover → popover}/README.md +20 -39
  214. package/src/{components/popover/popover.ts → popover/index.ts} +3 -57
  215. package/src/{utils → popover}/scroll-lock.ts +0 -28
  216. package/src/radio/README.md +53 -0
  217. package/src/radio/index.ts +101 -0
  218. package/src/runtime/client-entry-boundary.ts +54 -0
  219. package/src/runtime/component.ts +65 -16
  220. package/src/runtime/core/attributes.ts +35 -1
  221. package/src/runtime/core/children.ts +24 -2
  222. package/src/runtime/core/vnode.ts +25 -4
  223. package/src/runtime/create-element.ts +6 -5
  224. package/src/runtime/demos/readme.demo.tsx +20 -18
  225. package/src/runtime/diff-dom.ts +358 -243
  226. package/src/runtime/dom.ts +331 -214
  227. package/src/runtime/element-function.ts +1 -0
  228. package/src/runtime/event-listeners.ts +1 -1
  229. package/src/runtime/form-navigation.ts +184 -0
  230. package/src/runtime/frame-resolution.ts +13 -0
  231. package/src/runtime/frame.ts +482 -124
  232. package/src/runtime/jsx.ts +3 -5
  233. package/src/runtime/key.ts +1 -0
  234. package/src/runtime/mixins/link-mixin.ts +1 -0
  235. package/src/runtime/mixins/mixin.ts +21 -18
  236. package/src/runtime/navigation.ts +204 -30
  237. package/src/runtime/reconcile.ts +769 -760
  238. package/src/runtime/refresh.ts +46 -0
  239. package/src/runtime/run.ts +12 -2
  240. package/src/runtime/scheduler.ts +9 -29
  241. package/src/runtime/to-vnode.ts +85 -23
  242. package/src/runtime/vdom.ts +91 -69
  243. package/src/runtime/vnode.ts +192 -88
  244. package/src/{components/select → select}/README.md +29 -19
  245. package/src/select/index.tsx +159 -0
  246. package/src/{components/select/select.tsx → select/primitives.tsx} +10 -98
  247. package/src/server/stream.ts +25 -31
  248. package/src/shared/focus-styles.ts +2 -0
  249. package/src/shared/icons.tsx +62 -0
  250. package/src/shared/listbox-popover-styles.ts +146 -0
  251. package/src/shared/style-values.ts +165 -0
  252. package/src/style/style.ts +25 -6
  253. package/src/style/stylesheet.ts +32 -57
  254. package/src/tabs/README.md +141 -0
  255. package/src/tabs/index.tsx +245 -0
  256. package/src/tabs/primitives.ts +365 -0
  257. package/src/test/README.md +151 -60
  258. package/src/toggle/README.md +56 -0
  259. package/src/toggle/index.tsx +136 -0
  260. package/src/toggle/primitives.ts +192 -0
  261. package/dist/animation/demos/animation.demo.d.ts +0 -5
  262. package/dist/animation/demos/animation.demo.js +0 -92
  263. package/dist/animation/demos/animation.demo.js.map +0 -1
  264. package/dist/animation/demos/spring.demo.d.ts +0 -6
  265. package/dist/animation/demos/spring.demo.js +0 -304
  266. package/dist/animation/demos/spring.demo.js.map +0 -1
  267. package/dist/components/accordion/accordion.d.ts +0 -92
  268. package/dist/components/accordion/accordion.js +0 -335
  269. package/dist/components/accordion/accordion.js.map +0 -1
  270. package/dist/components/accordion/demos/card.demo.d.ts +0 -7
  271. package/dist/components/accordion/demos/card.demo.js +0 -59
  272. package/dist/components/accordion/demos/card.demo.js.map +0 -1
  273. package/dist/components/accordion/demos/multiple.demo.d.ts +0 -7
  274. package/dist/components/accordion/demos/multiple.demo.js +0 -20
  275. package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
  276. package/dist/components/accordion/demos/overview.demo.d.ts +0 -7
  277. package/dist/components/accordion/demos/overview.demo.js +0 -20
  278. package/dist/components/accordion/demos/overview.demo.js.map +0 -1
  279. package/dist/components/anchor/anchor.js.map +0 -1
  280. package/dist/components/breadcrumbs/basic.demo.d.ts +0 -6
  281. package/dist/components/breadcrumbs/basic.demo.js +0 -15
  282. package/dist/components/breadcrumbs/basic.demo.js.map +0 -1
  283. package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
  284. package/dist/components/breadcrumbs/separator.demo.d.ts +0 -6
  285. package/dist/components/breadcrumbs/separator.demo.js +0 -15
  286. package/dist/components/breadcrumbs/separator.demo.js.map +0 -1
  287. package/dist/components/button/button.d.ts +0 -105
  288. package/dist/components/button/button.js +0 -207
  289. package/dist/components/button/button.js.map +0 -1
  290. package/dist/components/button/demos/aliases.demo.d.ts +0 -7
  291. package/dist/components/button/demos/aliases.demo.js +0 -19
  292. package/dist/components/button/demos/aliases.demo.js.map +0 -1
  293. package/dist/components/button/demos/basic.demo.d.ts +0 -7
  294. package/dist/components/button/demos/basic.demo.js +0 -20
  295. package/dist/components/button/demos/basic.demo.js.map +0 -1
  296. package/dist/components/button/demos/states.demo.d.ts +0 -7
  297. package/dist/components/button/demos/states.demo.js +0 -30
  298. package/dist/components/button/demos/states.demo.js.map +0 -1
  299. package/dist/components/combobox/combobox.js.map +0 -1
  300. package/dist/components/combobox/overview.demo.d.ts +0 -7
  301. package/dist/components/combobox/overview.demo.js +0 -154
  302. package/dist/components/combobox/overview.demo.js.map +0 -1
  303. package/dist/components/glyph/glyph.d.ts +0 -14
  304. package/dist/components/glyph/glyph.js +0 -65
  305. package/dist/components/glyph/glyph.js.map +0 -1
  306. package/dist/components/listbox/listbox.js.map +0 -1
  307. package/dist/components/listbox/overview.demo.d.ts +0 -7
  308. package/dist/components/listbox/overview.demo.js +0 -65
  309. package/dist/components/listbox/overview.demo.js.map +0 -1
  310. package/dist/components/menu/demos/bubbling.demo.d.ts +0 -6
  311. package/dist/components/menu/demos/bubbling.demo.js +0 -16
  312. package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
  313. package/dist/components/menu/demos/context-trigger.demo.d.ts +0 -7
  314. package/dist/components/menu/demos/context-trigger.demo.js +0 -87
  315. package/dist/components/menu/demos/context-trigger.demo.js.map +0 -1
  316. package/dist/components/menu/demos/overview.demo.d.ts +0 -7
  317. package/dist/components/menu/demos/overview.demo.js +0 -33
  318. package/dist/components/menu/demos/overview.demo.js.map +0 -1
  319. package/dist/components/menu/hover-aim.js.map +0 -1
  320. package/dist/components/menu/menu.js.map +0 -1
  321. package/dist/components/popover/overview.demo.d.ts +0 -7
  322. package/dist/components/popover/overview.demo.js +0 -65
  323. package/dist/components/popover/overview.demo.js.map +0 -1
  324. package/dist/components/popover/popover.js.map +0 -1
  325. package/dist/components/select/deconstructed.demo.d.ts +0 -7
  326. package/dist/components/select/deconstructed.demo.js +0 -54
  327. package/dist/components/select/deconstructed.demo.js.map +0 -1
  328. package/dist/components/select/overview.demo.d.ts +0 -6
  329. package/dist/components/select/overview.demo.js +0 -28
  330. package/dist/components/select/overview.demo.js.map +0 -1
  331. package/dist/components/select/select.js.map +0 -1
  332. package/dist/components/separator/separator.d.ts +0 -2
  333. package/dist/components/separator/separator.js +0 -15
  334. package/dist/components/separator/separator.js.map +0 -1
  335. package/dist/components/tabs/tabs.d.ts +0 -78
  336. package/dist/components/tabs/tabs.js +0 -339
  337. package/dist/components/tabs/tabs.js.map +0 -1
  338. package/dist/interactions/keydown/keydown.js.map +0 -1
  339. package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
  340. package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
  341. package/dist/runtime/demos/basic.demo.d.ts +0 -6
  342. package/dist/runtime/demos/basic.demo.js +0 -16
  343. package/dist/runtime/demos/basic.demo.js.map +0 -1
  344. package/dist/runtime/demos/controlled-uncontrolled-values.demo.d.ts +0 -6
  345. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js +0 -77
  346. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js.map +0 -1
  347. package/dist/runtime/demos/keyed-list.demo.d.ts +0 -6
  348. package/dist/runtime/demos/keyed-list.demo.js +0 -62
  349. package/dist/runtime/demos/keyed-list.demo.js.map +0 -1
  350. package/dist/runtime/demos/readme.demo.d.ts +0 -5
  351. package/dist/runtime/demos/readme.demo.js +0 -396
  352. package/dist/runtime/demos/readme.demo.js.map +0 -1
  353. package/dist/theme/contract.d.ts +0 -61
  354. package/dist/theme/contract.js +0 -131
  355. package/dist/theme/contract.js.map +0 -1
  356. package/dist/theme/glyph-contract.d.ts +0 -11
  357. package/dist/theme/glyph-contract.js +0 -34
  358. package/dist/theme/glyph-contract.js.map +0 -1
  359. package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
  360. package/dist/theme/presets/rmx-01/glyphs.js +0 -252
  361. package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
  362. package/dist/theme/presets/rmx-01/index.d.ts +0 -4
  363. package/dist/theme/presets/rmx-01/index.js +0 -119
  364. package/dist/theme/presets/rmx-01/index.js.map +0 -1
  365. package/dist/theme/runtime.d.ts +0 -2
  366. package/dist/theme/runtime.js +0 -84
  367. package/dist/theme/runtime.js.map +0 -1
  368. package/dist/theme/theme.d.ts +0 -6
  369. package/dist/theme/theme.js +0 -5
  370. package/dist/theme/theme.js.map +0 -1
  371. package/dist/utils/flash-attribute.js.map +0 -1
  372. package/dist/utils/scroll-lock.d.ts +0 -3
  373. package/dist/utils/scroll-lock.js.map +0 -1
  374. package/dist/utils/wait-for-css-transition.js.map +0 -1
  375. package/dist/utils/wait.js.map +0 -1
  376. package/src/animation/demos/animation.demo.tsx +0 -194
  377. package/src/animation/demos/spring.demo.tsx +0 -385
  378. package/src/components/accordion/accordion.tsx +0 -565
  379. package/src/components/accordion/demos/card.demo.tsx +0 -114
  380. package/src/components/accordion/demos/multiple.demo.tsx +0 -57
  381. package/src/components/accordion/demos/overview.demo.tsx +0 -57
  382. package/src/components/breadcrumbs/basic.demo.tsx +0 -18
  383. package/src/components/breadcrumbs/separator.demo.tsx +0 -19
  384. package/src/components/button/README.md +0 -44
  385. package/src/components/button/button.tsx +0 -286
  386. package/src/components/button/demos/aliases.demo.tsx +0 -28
  387. package/src/components/button/demos/basic.demo.tsx +0 -31
  388. package/src/components/button/demos/states.demo.tsx +0 -53
  389. package/src/components/combobox/overview.demo.tsx +0 -200
  390. package/src/components/glyph/README.md +0 -72
  391. package/src/components/glyph/glyph.tsx +0 -110
  392. package/src/components/listbox/overview.demo.tsx +0 -102
  393. package/src/components/menu/demos/bubbling.demo.tsx +0 -35
  394. package/src/components/menu/demos/context-trigger.demo.tsx +0 -133
  395. package/src/components/menu/demos/overview.demo.tsx +0 -77
  396. package/src/components/popover/overview.demo.tsx +0 -144
  397. package/src/components/select/deconstructed.demo.tsx +0 -96
  398. package/src/components/select/overview.demo.tsx +0 -52
  399. package/src/components/separator/separator.ts +0 -19
  400. package/src/components/tabs/README.md +0 -105
  401. package/src/components/tabs/tabs.tsx +0 -504
  402. package/src/runtime/demos/basic.demo.tsx +0 -21
  403. package/src/runtime/demos/controlled-uncontrolled-values.demo.tsx +0 -177
  404. package/src/runtime/demos/keyed-list.demo.tsx +0 -94
  405. package/src/theme/README.md +0 -103
  406. package/src/theme/contract.ts +0 -215
  407. package/src/theme/glyph-contract.ts +0 -59
  408. package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
  409. package/src/theme/presets/rmx-01/index.ts +0 -123
  410. package/src/theme/runtime.ts +0 -119
  411. package/src/theme/theme.ts +0 -15
  412. package/src/utils/scroll-lock/README.md +0 -33
  413. /package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +0 -0
  414. /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
  415. /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
  416. /package/dist/{utils → listbox}/flash-attribute.js +0 -0
  417. /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
  418. /package/dist/{components/menu → menu}/hover-aim.js +0 -0
  419. /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
  420. /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
  421. /package/dist/{interactions/keydown → select}/keydown.js +0 -0
  422. /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
  423. /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
  424. /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
  425. /package/dist/{utils → shared}/wait.d.ts +0 -0
  426. /package/dist/{utils → shared}/wait.js +0 -0
  427. /package/src/{components/anchor/anchor.ts → anchor/index.ts} +0 -0
  428. /package/src/{utils → listbox}/flash-attribute.ts +0 -0
  429. /package/src/{components/menu → menu}/hover-aim.ts +0 -0
  430. /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
  431. /package/src/{interactions/keydown → select}/keydown.ts +0 -0
  432. /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
  433. /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
  434. /package/src/{utils → shared}/wait.ts +0 -0
@@ -1,14 +1,36 @@
1
- import { jsx } from "./jsx.js";
2
- import { Frame, createFrameHandle } from "./component.js";
3
- import { createComponentErrorEvent, getComponentError } from "./error-event.js";
4
- import { invariant } from "./invariant.js";
5
- import { createRangeRoot, createRoot } from "./vdom.js";
6
- import { diffNodes } from "./diff-dom.js";
7
- import { createStyleManager } from "../style/index.js";
8
- import { findFlushMarker } from "./stream-protocol.js";
1
+ import { jsx } from './jsx.js';
2
+ import { Frame, createFrameHandle } from './component.js';
3
+ import { createComponentErrorEvent, getComponentError } from './error-event.js';
4
+ import { invariant } from './invariant.js';
5
+ import { createRangeRoot, createRoot } from './vdom.js';
6
+ import { diffNodes } from './diff-dom.js';
7
+ import { createStyleManager } from '../style/index.js';
8
+ import { findFlushMarker } from './stream-protocol.js';
9
+ import { unwrapFrameResolution } from './frame-resolution.js';
10
+ import { disposeClientEntryBoundary, getClientEntryBoundaryOwner, setClientEntryBoundaryOwner, } from './client-entry-boundary.js';
9
11
  const bufferedFrameTemplates = new Map();
10
12
  const frameTemplateListeners = new Map();
11
13
  const DOCTYPE_PATTERN = /<!doctype(?:\s[^>]*)?>/gi;
14
+ function createLinkedAbortController(first, second) {
15
+ let controller = new AbortController();
16
+ let signals = second ? [first, second] : [first];
17
+ let abort = () => controller.abort();
18
+ for (let signal of signals) {
19
+ if (signal.aborted) {
20
+ controller.abort();
21
+ break;
22
+ }
23
+ signal.addEventListener('abort', abort, { once: true });
24
+ }
25
+ return {
26
+ controller,
27
+ disconnect() {
28
+ for (let signal of signals) {
29
+ signal.removeEventListener('abort', abort);
30
+ }
31
+ },
32
+ };
33
+ }
12
34
  function stripDoctypeMarkup(html) {
13
35
  return html.replace(DOCTYPE_PATTERN, '');
14
36
  }
@@ -24,10 +46,33 @@ function syncElementAttributes(target, source) {
24
46
  }
25
47
  }
26
48
  }
49
+ const FRAME_RUNTIME = Symbol('FrameRuntime');
50
+ export function isFrameRuntime(value) {
51
+ return isRecord(value) && Reflect.get(value, FRAME_RUNTIME) === true;
52
+ }
53
+ /**
54
+ * Reloads a frame and returns response metadata used by the navigation runtime.
55
+ *
56
+ * @param frame Frame handle to reload.
57
+ * @param options Form submission metadata and cancellation signal.
58
+ * @returns The reload signal and final response URL, when redirected.
59
+ */
60
+ export function reloadFrameForNavigation(frame, options) {
61
+ let runtime = frame.$runtime;
62
+ invariant(isFrameRuntime(runtime), 'Expected a frame runtime');
63
+ let reload = runtime.reloadForNavigation;
64
+ invariant(reload, 'Expected frame runtime to support navigation reloads');
65
+ return reload(options);
66
+ }
27
67
  export function createFrame(root, init) {
28
68
  let container = createContainer(root);
29
69
  let contentRoot;
30
70
  let reloadController;
71
+ // The style registry is document-level and shared by every frame; only the
72
+ // frame that created it (the runtime root) disposes it.
73
+ let ownsStyleManager = !init.styleManager;
74
+ let reloadAbortUnsubscribe;
75
+ let reloadKind;
31
76
  let styleManager = init.styleManager ?? createStyleManager();
32
77
  let currentMarker = init.marker;
33
78
  let displayedContentStatus = init.marker?.status ?? 'resolved';
@@ -36,37 +81,15 @@ export function createFrame(root, init) {
36
81
  let pendingTemplateUnsubscribe;
37
82
  let inheritedReloadPending = false;
38
83
  let inheritedReloadAbortUnsubscribe;
84
+ let disposed = false;
85
+ let lifecycleController = new AbortController();
39
86
  // Merge any rmx-data found in the current document once at startup.
40
87
  mergeRmxDataFromDocument(init.data, container.doc);
41
- let runtime = createFrameRuntime({ ...init, styleManager });
88
+ let runtime = createFrameRuntime({ ...init, styleManager, reloadForNavigation: reload });
42
89
  let frame = createFrameHandle({
43
90
  src: init.src,
44
91
  $runtime: runtime,
45
- reload: async () => {
46
- reloadController?.abort();
47
- let controller = new AbortController();
48
- reloadController = controller;
49
- frame.dispatchEvent(new Event('reloadStart'));
50
- startSubFrameInheritedReloads(getContentNodes(), controller.signal);
51
- try {
52
- let content = await init.resolveFrame(frame.src, controller.signal, frameName);
53
- if (reloadController !== controller || controller.signal.aborted)
54
- return controller.signal;
55
- await render(content, { signal: controller.signal });
56
- return controller.signal;
57
- }
58
- catch (error) {
59
- if (reloadController !== controller || controller.signal.aborted)
60
- return controller.signal;
61
- init.errorTarget.dispatchEvent(createComponentErrorEvent(error));
62
- throw error;
63
- }
64
- finally {
65
- if (reloadController === controller) {
66
- frame.dispatchEvent(new Event('reloadComplete'));
67
- }
68
- }
69
- },
92
+ reload: async () => (await reload()).signal,
70
93
  replace: async (content) => {
71
94
  await render(content);
72
95
  },
@@ -90,18 +113,41 @@ export function createFrame(root, init) {
90
113
  moduleLoads: init.moduleLoads,
91
114
  frameInstances: init.frameInstances,
92
115
  namedFrames: init.namedFrames,
116
+ lifecycleSignal: lifecycleController.signal,
93
117
  regionTailRef: container.regionTailRef,
94
118
  regionParent: container.regionParent,
95
119
  };
96
120
  async function render(content, options) {
97
- if (options?.signal?.aborted)
121
+ if (disposed || lifecycleController.signal.aborted || options?.signal?.aborted)
122
+ return;
123
+ let ownsData = options?.data === undefined;
124
+ let renderOptions = {
125
+ ...options,
126
+ data: options?.data ?? {},
127
+ };
128
+ try {
129
+ await renderContent(content, renderOptions);
130
+ }
131
+ finally {
132
+ if (ownsData)
133
+ clearRmxData(renderOptions.data);
134
+ }
135
+ }
136
+ async function renderContent(content, options) {
137
+ if (isRenderAborted(options.signal))
98
138
  return;
99
139
  if (content instanceof ReadableStream) {
100
- await renderFrameStream(content, container.doc, async (html, flushKind) => {
101
- if (options?.signal?.aborted)
102
- return;
103
- await render(html, { ...options, flushKind });
104
- });
140
+ let linkedAbort = createLinkedAbortController(lifecycleController.signal, options.signal);
141
+ try {
142
+ await renderFrameStream(content, container.doc, async (html, flushKind) => {
143
+ if (isRenderAborted(options.signal))
144
+ return;
145
+ await render(html, { ...options, flushKind });
146
+ }, linkedAbort.controller.signal);
147
+ }
148
+ finally {
149
+ linkedAbort.disconnect();
150
+ }
105
151
  return;
106
152
  }
107
153
  if (isRemixNodeFrameContent(content)) {
@@ -112,10 +158,10 @@ export function createFrame(root, init) {
112
158
  clearFrameContent();
113
159
  contentRoot = createFrameContentRoot();
114
160
  }
115
- if (options?.signal?.aborted)
161
+ if (isRenderAborted(options.signal))
116
162
  return;
117
163
  contentRoot.render(content);
118
- displayedContentStatus = options?.contentStatus ?? 'resolved';
164
+ displayedContentStatus = options.contentStatus ?? 'resolved';
119
165
  return;
120
166
  }
121
167
  if (contentRoot) {
@@ -136,50 +182,61 @@ export function createFrame(root, init) {
136
182
  let htmlContent = typeof content === 'string' ? stripDoctypeMarkup(content) : undefined;
137
183
  let isFullDocumentReload = container.root instanceof Document &&
138
184
  htmlContent !== undefined &&
139
- options?.flushKind === 'document';
185
+ options.flushKind === 'document';
140
186
  if (isFullDocumentReload && htmlContent !== undefined) {
141
187
  let parsed = new DOMParser().parseFromString(htmlContent, 'text/html');
142
- mergeRmxDataFromDocument(context.data, parsed);
143
- context.styleManager.replaceServerStyles(collectFrameServerStyleTags(createElementContainer(parsed)));
188
+ let responseData = options.data;
189
+ mergeRmxDataFromDocument(responseData, parsed);
190
+ let responseContext = { ...context, data: responseData };
191
+ context.styleManager.adoptServerStyles(collectFrameServerStyleTags(createElementContainer(parsed)));
144
192
  syncElementAttributes(container.doc.documentElement, parsed.documentElement);
145
193
  diffNodes([container.doc.head], [parsed.head], {
146
- ...context,
194
+ ...responseContext,
147
195
  regionParent: container.doc.documentElement,
148
196
  regionTailRef: null,
149
- signal: options?.signal,
197
+ signal: options.signal,
150
198
  });
151
199
  diffNodes([container.doc.body], [parsed.body], {
152
- ...context,
200
+ ...responseContext,
153
201
  regionParent: container.doc.documentElement,
154
202
  regionTailRef: null,
155
- signal: options?.signal,
203
+ signal: options.signal,
156
204
  });
157
205
  let bodyContainer = createElementContainer(container.doc.body);
158
- if (options?.signal?.aborted)
206
+ if (isRenderAborted(options.signal))
207
+ return;
208
+ scheduleHydrationInContainer(bodyContainer, responseContext, options.initialHydrationTracker, options.signal);
209
+ await createSubFrames(bodyContainer.childNodes, responseContext, options);
210
+ if (isRenderAborted(options.signal))
159
211
  return;
160
- scheduleHydrationInContainer(bodyContainer, context, options?.initialHydrationTracker);
161
- await createSubFrames(bodyContainer.childNodes, context, options);
162
- displayedContentStatus = options?.contentStatus ?? 'resolved';
212
+ displayedContentStatus = options.contentStatus ?? 'resolved';
163
213
  return;
164
214
  }
165
215
  let fragment = htmlContent !== undefined ? createFragmentFromString(container.doc, htmlContent) : content;
166
- context.styleManager.replaceServerStyles(collectFrameServerStyleTags(createElementContainer(fragment)));
216
+ context.styleManager.adoptServerStyles(collectFrameServerStyleTags(createElementContainer(fragment)));
167
217
  removeEmptyHeads(fragment);
168
- mergeRmxDataFromFragment(context.data, fragment);
218
+ let responseData = options.data;
219
+ mergeRmxDataFromFragment(responseData, fragment);
220
+ let responseContext = { ...context, data: responseData };
169
221
  let nextContainer = createContainer(fragment);
170
- if (options?.signal?.aborted)
222
+ if (isRenderAborted(options.signal))
171
223
  return;
172
224
  diffNodes(container.childNodes, Array.from(nextContainer.childNodes), {
173
- ...context,
225
+ ...responseContext,
174
226
  regionTailRef: container.regionTailRef,
175
227
  regionParent: container.regionParent,
176
- signal: options?.signal,
228
+ signal: options.signal,
177
229
  });
178
- if (options?.signal?.aborted)
230
+ if (isRenderAborted(options.signal))
179
231
  return;
180
- scheduleHydrationInContainer(container, context, options?.initialHydrationTracker);
181
- await createSubFrames(container.childNodes, context, options);
182
- displayedContentStatus = options?.contentStatus ?? 'resolved';
232
+ scheduleHydrationInContainer(container, responseContext, options.initialHydrationTracker, options.signal);
233
+ await createSubFrames(container.childNodes, responseContext, options);
234
+ if (isRenderAborted(options.signal))
235
+ return;
236
+ displayedContentStatus = options.contentStatus ?? 'resolved';
237
+ }
238
+ function isRenderAborted(signal) {
239
+ return disposed || lifecycleController.signal.aborted || signal?.aborted === true;
183
240
  }
184
241
  function createFrameContentRoot() {
185
242
  let virtualRoot;
@@ -217,18 +274,34 @@ export function createFrame(root, init) {
217
274
  }
218
275
  async function hydrateInitial() {
219
276
  let initialHydrationTracker = createInitialHydrationTracker();
220
- context.styleManager.replaceServerStyles(collectFrameServerStyleTags(container));
221
- await createSubFrames(container.childNodes, context);
277
+ context.styleManager.adoptServerStyles(collectFrameServerStyleTags(container));
278
+ let subFramesReady = createSubFrames(container.childNodes, context);
222
279
  scheduleHydrationInContainer(container, context, initialHydrationTracker);
223
- if (currentMarker?.status === 'pending') {
224
- await watchPendingFrameTemplate(currentMarker, initialHydrationTracker);
280
+ try {
281
+ await subFramesReady;
282
+ if (disposed || context.lifecycleSignal.aborted)
283
+ return;
284
+ if (currentMarker?.status === 'pending') {
285
+ await watchPendingFrameTemplate(currentMarker, initialHydrationTracker);
286
+ }
287
+ initialHydrationTracker.finalize();
288
+ await initialHydrationTracker.ready();
289
+ }
290
+ finally {
291
+ clearRmxData(context.data);
225
292
  }
226
- initialHydrationTracker.finalize();
227
- await initialHydrationTracker.ready();
228
293
  }
229
294
  function dispose() {
295
+ if (disposed)
296
+ return;
297
+ disposed = true;
298
+ lifecycleController.abort();
299
+ clearRmxData(context.data);
230
300
  reloadController?.abort();
231
301
  reloadController = undefined;
302
+ reloadAbortUnsubscribe?.();
303
+ reloadAbortUnsubscribe = undefined;
304
+ reloadKind = undefined;
232
305
  contentRoot?.dispose();
233
306
  contentRoot = undefined;
234
307
  clearPendingFrameTemplateWatch();
@@ -236,7 +309,9 @@ export function createFrame(root, init) {
236
309
  removeVirtualRoots(container.childNodes);
237
310
  // Dispose sub-frames recursively.
238
311
  disposeSubFrames(container.childNodes, context);
239
- context.styleManager.dispose();
312
+ if (ownsStyleManager) {
313
+ context.styleManager.dispose();
314
+ }
240
315
  if (frameName) {
241
316
  if (init.namedFrames.get(frameName) === frame) {
242
317
  init.namedFrames.delete(frameName);
@@ -250,14 +325,17 @@ export function createFrame(root, init) {
250
325
  flush: () => context.scheduler.dequeue(),
251
326
  clearPendingTemplateWatch: clearPendingFrameTemplateWatch,
252
327
  isDisplayingResolvedContent: () => displayedContentStatus === 'resolved',
328
+ beginClientFrameReloadForAncestorReload,
329
+ cancelReload,
253
330
  startInheritedReload,
254
331
  updateMarker,
255
332
  renderMarkerContent,
333
+ matchesIdentity: (src, name) => !disposed && frame.src === src && frameName === name,
256
334
  dispose,
257
335
  handle: frame,
258
336
  };
259
337
  async function updateMarker(marker, options) {
260
- if (options?.signal?.aborted)
338
+ if (disposed || context.lifecycleSignal.aborted || options?.signal?.aborted)
261
339
  return;
262
340
  let previousMarker = currentMarker;
263
341
  let isInheritedReload = previousMarker !== undefined && previousMarker.id !== marker.id;
@@ -280,7 +358,7 @@ export function createFrame(root, init) {
280
358
  }
281
359
  }
282
360
  async function renderMarkerContent(marker, content, options) {
283
- if (options?.signal?.aborted)
361
+ if (disposed || context.lifecycleSignal.aborted || options?.signal?.aborted)
284
362
  return;
285
363
  let previousMarker = currentMarker;
286
364
  let isInheritedReload = previousMarker !== undefined && previousMarker.id !== marker.id;
@@ -290,10 +368,102 @@ export function createFrame(root, init) {
290
368
  }
291
369
  clearPendingFrameTemplateWatch();
292
370
  await render(content, { ...options, contentStatus: 'resolved' });
293
- if (isInheritedReload && !options?.signal?.aborted) {
371
+ if (isInheritedReload &&
372
+ !disposed &&
373
+ !context.lifecycleSignal.aborted &&
374
+ !options?.signal?.aborted) {
294
375
  completeInheritedReload();
295
376
  }
296
377
  }
378
+ async function reload(options) {
379
+ let controller = startReload(options?.signal);
380
+ return await resolveAndRenderReload(controller, options);
381
+ }
382
+ function startReload(signal) {
383
+ let controller = replaceReloadController(signal);
384
+ reloadKind = 'direct';
385
+ frame.dispatchEvent(new Event('reloadStart'));
386
+ startSubFrameInheritedReloads(getContentNodes(), controller.signal);
387
+ return controller;
388
+ }
389
+ function beginClientFrameReloadForAncestorReload(signal) {
390
+ let inheritedReloadStarted = reuseInheritedReloadStart();
391
+ let continuingAncestorReload = reloadKind === 'ancestor';
392
+ let controller = replaceReloadController(signal);
393
+ reloadKind = 'ancestor';
394
+ if (!inheritedReloadStarted && !continuingAncestorReload) {
395
+ frame.dispatchEvent(new Event('reloadStart'));
396
+ startSubFrameInheritedReloads(getContentNodes(), controller.signal);
397
+ }
398
+ return {
399
+ controller,
400
+ complete: () => completeReload(controller),
401
+ };
402
+ }
403
+ function cancelReload() {
404
+ let controller = reloadController;
405
+ if (!controller)
406
+ return;
407
+ controller.abort();
408
+ completeReload(controller);
409
+ }
410
+ function replaceReloadController(signal) {
411
+ reloadController?.abort();
412
+ reloadAbortUnsubscribe?.();
413
+ reloadAbortUnsubscribe = undefined;
414
+ let controller = new AbortController();
415
+ reloadController = controller;
416
+ if (signal) {
417
+ if (signal.aborted) {
418
+ controller.abort();
419
+ }
420
+ else {
421
+ let abort = () => controller.abort();
422
+ signal.addEventListener('abort', abort, { once: true });
423
+ reloadAbortUnsubscribe = () => signal.removeEventListener('abort', abort);
424
+ }
425
+ }
426
+ return controller;
427
+ }
428
+ async function resolveAndRenderReload(controller, options) {
429
+ try {
430
+ let resolution = await init.resolveFrame(frame.src, {
431
+ ...options,
432
+ signal: controller.signal,
433
+ target: frameName,
434
+ });
435
+ if (reloadController !== controller || controller.signal.aborted) {
436
+ return { signal: controller.signal };
437
+ }
438
+ let { content, redirectedTo } = await unwrapFrameResolution(resolution);
439
+ if (reloadController !== controller || controller.signal.aborted) {
440
+ return { signal: controller.signal };
441
+ }
442
+ await render(content, { signal: controller.signal });
443
+ return {
444
+ signal: controller.signal,
445
+ redirectedTo: reloadController === controller && !controller.signal.aborted ? redirectedTo : undefined,
446
+ };
447
+ }
448
+ catch (error) {
449
+ if (reloadController !== controller || controller.signal.aborted) {
450
+ return { signal: controller.signal };
451
+ }
452
+ init.errorTarget.dispatchEvent(createComponentErrorEvent(error));
453
+ throw error;
454
+ }
455
+ finally {
456
+ completeReload(controller);
457
+ }
458
+ }
459
+ function completeReload(controller) {
460
+ if (reloadController !== controller || reloadKind === undefined)
461
+ return;
462
+ reloadAbortUnsubscribe?.();
463
+ reloadAbortUnsubscribe = undefined;
464
+ reloadKind = undefined;
465
+ frame.dispatchEvent(new Event('reloadComplete'));
466
+ }
297
467
  function startInheritedReload(signal) {
298
468
  if (signal?.aborted)
299
469
  return;
@@ -312,6 +482,14 @@ export function createFrame(root, init) {
312
482
  };
313
483
  }
314
484
  }
485
+ function reuseInheritedReloadStart() {
486
+ if (!inheritedReloadPending)
487
+ return false;
488
+ inheritedReloadPending = false;
489
+ inheritedReloadAbortUnsubscribe?.();
490
+ inheritedReloadAbortUnsubscribe = undefined;
491
+ return true;
492
+ }
315
493
  function completeInheritedReload() {
316
494
  if (!inheritedReloadPending)
317
495
  return;
@@ -328,7 +506,7 @@ export function createFrame(root, init) {
328
506
  if (isFrameStart(node)) {
329
507
  let end = findEndMarker(node, isFrameStart, isFrameEnd);
330
508
  context.frameInstances.get(node)?.startInheritedReload(signal);
331
- i = nodes.indexOf(end);
509
+ i = findMarkerRangeEndIndex(nodes, end, i);
332
510
  continue;
333
511
  }
334
512
  if (node.childNodes && node.childNodes.length > 0) {
@@ -344,7 +522,7 @@ export function createFrame(root, init) {
344
522
  pendingTemplateMarkerId = undefined;
345
523
  }
346
524
  async function watchPendingFrameTemplate(marker, initialHydrationTracker, signal, onResolved) {
347
- if (signal?.aborted)
525
+ if (disposed || context.lifecycleSignal.aborted || signal?.aborted)
348
526
  return;
349
527
  if (pendingTemplateMarkerId === marker.id)
350
528
  return;
@@ -354,24 +532,24 @@ export function createFrame(root, init) {
354
532
  if (early) {
355
533
  clearPendingFrameTemplateWatch();
356
534
  await render(early, { initialHydrationTracker, signal, contentStatus: 'resolved' });
357
- if (!signal?.aborted)
535
+ if (!disposed && !context.lifecycleSignal.aborted && !signal?.aborted)
358
536
  onResolved?.();
359
537
  return;
360
538
  }
361
- if (signal?.aborted) {
539
+ if (disposed || context.lifecycleSignal.aborted || signal?.aborted) {
362
540
  clearPendingFrameTemplateWatch();
363
541
  return;
364
542
  }
365
543
  let observer = setupTemplateObserver();
366
544
  pendingTemplateObserver = observer;
367
545
  let unsubscribe = subscribeFrameTemplate(marker.id, async (fragment) => {
368
- if (signal?.aborted)
546
+ if (disposed || context.lifecycleSignal.aborted || signal?.aborted)
369
547
  return;
370
548
  if (pendingTemplateMarkerId !== marker.id)
371
549
  return;
372
550
  clearPendingFrameTemplateWatch();
373
551
  await render(fragment, { signal, contentStatus: 'resolved' });
374
- if (!signal?.aborted)
552
+ if (!disposed && !context.lifecycleSignal.aborted && !signal?.aborted)
375
553
  onResolved?.();
376
554
  });
377
555
  pendingTemplateUnsubscribe = unsubscribe;
@@ -384,13 +562,14 @@ export function createFrame(root, init) {
384
562
  if (buffered) {
385
563
  clearPendingFrameTemplateWatch();
386
564
  await render(buffered, { initialHydrationTracker, signal, contentStatus: 'resolved' });
387
- if (!signal?.aborted)
565
+ if (!disposed && !context.lifecycleSignal.aborted && !signal?.aborted)
388
566
  onResolved?.();
389
567
  }
390
568
  }
391
569
  }
392
570
  export function createFrameRuntime(init) {
393
571
  return {
572
+ [FRAME_RUNTIME]: true,
394
573
  topFrame: init.topFrame,
395
574
  errorTarget: init.errorTarget,
396
575
  loadModule: init.loadModule,
@@ -398,11 +577,12 @@ export function createFrameRuntime(init) {
398
577
  pendingClientEntries: init.pendingClientEntries,
399
578
  scheduler: init.scheduler,
400
579
  styleManager: init.styleManager,
401
- data: init.data,
402
580
  moduleCache: init.moduleCache,
403
581
  moduleLoads: init.moduleLoads,
404
582
  frameInstances: init.frameInstances,
405
583
  namedFrames: init.namedFrames,
584
+ serverFrameReload: undefined,
585
+ reloadForNavigation: init.reloadForNavigation,
406
586
  };
407
587
  }
408
588
  function createInitialHydrationTracker() {
@@ -457,6 +637,10 @@ function mergeRmxDataFromFragment(into, fragment) {
457
637
  script.remove();
458
638
  }
459
639
  }
640
+ function clearRmxData(data) {
641
+ delete data.h;
642
+ delete data.f;
643
+ }
460
644
  function removeEmptyHeads(fragment) {
461
645
  let heads = Array.from(fragment.querySelectorAll('head'));
462
646
  for (let head of heads) {
@@ -478,14 +662,14 @@ function collectOwnedServerStyleTags(nodes, styles) {
478
662
  let node = nodes[i];
479
663
  if (isFrameStart(node)) {
480
664
  let end = findEndMarker(node, isFrameStart, isFrameEnd);
481
- i = nodes.indexOf(end);
665
+ i = findMarkerRangeEndIndex(nodes, end, i);
482
666
  continue;
483
667
  }
484
668
  if (node instanceof HTMLStyleElement && node.matches('style[data-rmx]')) {
485
669
  styles.push(node);
486
670
  continue;
487
671
  }
488
- if (node instanceof Element || node instanceof Document || node instanceof DocumentFragment) {
672
+ if (node.childNodes.length > 0) {
489
673
  collectOwnedServerStyleTags(Array.from(node.childNodes), styles);
490
674
  }
491
675
  }
@@ -520,7 +704,7 @@ function copyOwnRmxEntries(target, source) {
520
704
  target[key] = source[key];
521
705
  }
522
706
  }
523
- function scheduleHydrationInContainer(container, context, initialHydrationTracker) {
707
+ function scheduleHydrationInContainer(container, context, initialHydrationTracker, signal) {
524
708
  let hydrationMarkers = findHydrationMarkers(container);
525
709
  if (hydrationMarkers.length === 0)
526
710
  return;
@@ -531,44 +715,67 @@ function scheduleHydrationInContainer(container, context, initialHydrationTracke
531
715
  let entry = hydrationData[marker.id];
532
716
  if (!entry)
533
717
  continue;
534
- scheduleHydrationMarker(marker, entry, context, initialHydrationTracker);
718
+ scheduleHydrationMarker(marker, entry, context, initialHydrationTracker, signal);
535
719
  }
536
720
  }
537
- function scheduleHydrationMarker(marker, entry, context, initialHydrationTracker) {
721
+ function scheduleHydrationMarker(marker, entry, context, initialHydrationTracker, signal) {
722
+ if (signal?.aborted || context.lifecycleSignal.aborted)
723
+ return;
538
724
  let done = initialHydrationTracker?.track();
539
725
  let key = `${entry.moduleUrl}#${entry.exportName}`;
726
+ let identity = {
727
+ moduleUrl: entry.moduleUrl,
728
+ exportName: entry.exportName,
729
+ };
730
+ let props = entry.props;
731
+ let completed = false;
732
+ let complete = () => {
733
+ if (completed)
734
+ return;
735
+ completed = true;
736
+ props = undefined;
737
+ signal?.removeEventListener('abort', complete);
738
+ context.lifecycleSignal.removeEventListener('abort', complete);
739
+ done?.();
740
+ };
741
+ signal?.addEventListener('abort', complete, { once: true });
742
+ context.lifecycleSignal.addEventListener('abort', complete, { once: true });
540
743
  let hydrateWithComponent = (component) => {
744
+ if (signal?.aborted || context.lifecycleSignal.aborted)
745
+ return;
541
746
  if (!isHydrationMarkerLive(marker, context))
542
747
  return;
543
- let vElement = createElement(component, entry.props);
748
+ if (!props)
749
+ return;
750
+ let vElement = createElement(component, props);
544
751
  context.pendingClientEntries.set(marker.start, [marker.end, vElement]);
545
- hydrateRegion(vElement, marker.start, marker.end, context);
752
+ hydrateRegion(vElement, marker.start, marker.end, identity, context, signal);
546
753
  };
547
754
  let cached = context.moduleCache.get(key);
548
755
  if (cached) {
549
756
  hydrateWithComponent(cached);
550
- done?.();
757
+ complete();
551
758
  return;
552
759
  }
553
- getOrStartModuleLoad(key, entry, marker.id, context)
760
+ getOrStartModuleLoad(key, identity, marker.id, context)
554
761
  .then((component) => {
555
762
  if (component) {
556
763
  hydrateWithComponent(component);
557
764
  }
558
765
  })
559
766
  .finally(() => {
560
- done?.();
767
+ complete();
561
768
  });
562
769
  }
563
- function getOrStartModuleLoad(key, entry, markerId, context) {
770
+ function getOrStartModuleLoad(key, identity, markerId, context) {
564
771
  let inFlight = context.moduleLoads.get(key);
565
772
  if (inFlight)
566
773
  return inFlight;
567
774
  let loadPromise = (async () => {
568
775
  try {
569
- let mod = await context.loadModule(entry.moduleUrl, entry.exportName);
570
- if (typeof mod !== 'function') {
571
- throw new Error(`Export "${entry.exportName}" from "${entry.moduleUrl}" is not a function`);
776
+ let mod = await context.loadModule(identity.moduleUrl, identity.exportName);
777
+ if (!isElementFunction(mod)) {
778
+ throw new Error(`Export "${identity.exportName}" from "${identity.moduleUrl}" is not a function`);
572
779
  }
573
780
  context.moduleCache.set(key, mod);
574
781
  return mod;
@@ -586,8 +793,12 @@ function getOrStartModuleLoad(key, entry, markerId, context) {
586
793
  }
587
794
  function createElement(component, props) {
588
795
  let revivedProps = reviveSerializedValue(props);
796
+ invariant(isRecord(revivedProps), 'Expected revived component props to be an object');
589
797
  return jsx(component, revivedProps);
590
798
  }
799
+ function isElementFunction(value) {
800
+ return typeof value === 'function';
801
+ }
591
802
  function reviveSerializedValue(value) {
592
803
  if (value === null || value === undefined)
593
804
  return value;
@@ -596,6 +807,8 @@ function reviveSerializedValue(value) {
596
807
  if (Array.isArray(value)) {
597
808
  return value.map((item) => reviveSerializedValue(item));
598
809
  }
810
+ if (!isRecord(value))
811
+ return value;
599
812
  let record = value;
600
813
  if (record.$rmxFrame === true) {
601
814
  let props = reviveSerializedObject(record.props);
@@ -619,15 +832,34 @@ function reviveSerializedObject(value) {
619
832
  let revived = reviveSerializedValue(value);
620
833
  if (!revived || typeof revived !== 'object' || Array.isArray(revived))
621
834
  return {};
622
- return revived;
835
+ return isRecord(revived) ? revived : {};
836
+ }
837
+ function isRecord(value) {
838
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
623
839
  }
624
- function hydrateRegion(vElement, start, end, context) {
840
+ function hydrateRegion(vElement, start, end, identity, context, signal) {
841
+ if (signal?.aborted)
842
+ return;
625
843
  context.pendingClientEntries.delete(start);
626
844
  // The same marker can be discovered by overlapping hydration passes
627
845
  // (for example, document root + nested frame root). Reuse the existing
628
846
  // virtual root instead of redefining the marker property.
629
- if (isHydratedVirtualRootMarker(start)) {
630
- start.$rmx.render(vElement);
847
+ let owner = getClientEntryBoundaryOwner(start);
848
+ if (owner) {
849
+ if (!signal) {
850
+ owner.root.render(vElement);
851
+ return;
852
+ }
853
+ let frameRuntime = context.frame.$runtime;
854
+ invariant(isFrameRuntime(frameRuntime), 'Expected frame runtime while rendering a preserved client entry');
855
+ let previousServerFrameReload = frameRuntime.serverFrameReload;
856
+ frameRuntime.serverFrameReload = { signal };
857
+ try {
858
+ owner.root.render(vElement);
859
+ }
860
+ finally {
861
+ frameRuntime.serverFrameReload = previousServerFrameReload;
862
+ }
631
863
  return;
632
864
  }
633
865
  let root = createRangeRoot([start, end], {
@@ -640,7 +872,7 @@ function hydrateRegion(vElement, start, end, context) {
640
872
  return;
641
873
  context.errorTarget.dispatchEvent(createComponentErrorEvent(getComponentError(event)));
642
874
  });
643
- Object.defineProperty(start, '$rmx', { value: root, enumerable: false });
875
+ setClientEntryBoundaryOwner(start, identity, root);
644
876
  root.render(vElement);
645
877
  }
646
878
  async function createSubFrames(nodes, context, options) {
@@ -675,6 +907,7 @@ async function createSubFrames(nodes, context, options) {
675
907
  resolveFrame: context.resolveFrame,
676
908
  pendingClientEntries: context.pendingClientEntries,
677
909
  scheduler: context.scheduler,
910
+ styleManager: context.styleManager,
678
911
  data: context.data,
679
912
  moduleCache: context.moduleCache,
680
913
  moduleLoads: context.moduleLoads,
@@ -684,7 +917,7 @@ async function createSubFrames(nodes, context, options) {
684
917
  context.frameInstances.set(node, subFrame);
685
918
  }
686
919
  }
687
- i = nodes.indexOf(end);
920
+ i = findMarkerRangeEndIndex(nodes, end, i);
688
921
  continue;
689
922
  }
690
923
  if (node.childNodes && node.childNodes.length > 0) {
@@ -719,10 +952,9 @@ function isHydrationMarkerLive(marker, context) {
719
952
  function removeVirtualRoots(nodes) {
720
953
  for (let i = 0; i < nodes.length; i++) {
721
954
  let node = nodes[i];
722
- if (isHydratedVirtualRootMarker(node)) {
723
- node.$rmx.dispose();
955
+ if (isCommentNode(node) && isHydrationStart(node) && disposeClientEntryBoundary(node)) {
724
956
  let end = findEndMarker(node, isHydrationStart, isHydrationEnd);
725
- i = nodes.indexOf(end);
957
+ i = findMarkerRangeEndIndex(nodes, end, i);
726
958
  continue;
727
959
  }
728
960
  if (node.childNodes && node.childNodes.length > 0) {
@@ -740,7 +972,7 @@ function disposeSubFrames(nodes, context) {
740
972
  subFrame.dispose();
741
973
  context.frameInstances.delete(node);
742
974
  }
743
- i = nodes.indexOf(end);
975
+ i = findMarkerRangeEndIndex(nodes, end, i);
744
976
  continue;
745
977
  }
746
978
  if (node.childNodes && node.childNodes.length > 0) {
@@ -801,7 +1033,9 @@ export function publishFrameTemplate(id, fragment) {
801
1033
  return;
802
1034
  }
803
1035
  for (let listener of listeners) {
804
- listener(fragment.cloneNode(true));
1036
+ let clone = fragment.cloneNode(true);
1037
+ invariant(isDocumentFragmentNode(clone), 'Expected cloned frame template fragment');
1038
+ listener(clone);
805
1039
  }
806
1040
  }
807
1041
  export function consumeFrameTemplate(id) {
@@ -873,12 +1107,21 @@ function extractTemplatesFromBuffer(doc, buffer, onTemplate) {
873
1107
  remainder: tail.slice(tailStart),
874
1108
  };
875
1109
  }
876
- async function renderFrameStream(stream, doc, applyHtml) {
1110
+ async function renderFrameStream(stream, doc, applyHtml, signal) {
877
1111
  let reader = stream.getReader();
878
1112
  let decoder = new TextDecoder();
879
1113
  let buffer = '';
880
1114
  let html = '';
881
1115
  let appliedOnce = false;
1116
+ let abort = () => {
1117
+ void reader.cancel().catch(() => { });
1118
+ };
1119
+ if (signal?.aborted) {
1120
+ await reader.cancel();
1121
+ reader.releaseLock();
1122
+ return;
1123
+ }
1124
+ signal?.addEventListener('abort', abort, { once: true });
882
1125
  try {
883
1126
  while (true) {
884
1127
  let { done, value } = await reader.read();
@@ -913,6 +1156,7 @@ async function renderFrameStream(stream, doc, applyHtml) {
913
1156
  }
914
1157
  }
915
1158
  finally {
1159
+ signal?.removeEventListener('abort', abort);
916
1160
  reader.releaseLock();
917
1161
  }
918
1162
  }
@@ -973,7 +1217,7 @@ function createFragmentFromString(doc, content) {
973
1217
  }
974
1218
  function isRemixNodeFrameContent(content) {
975
1219
  return !(content instanceof ReadableStream ||
976
- content instanceof DocumentFragment ||
1220
+ isDocumentFragmentNode(content) ||
977
1221
  typeof content === 'string');
978
1222
  }
979
1223
  function findHydrationMarkers(container) {
@@ -998,10 +1242,10 @@ function walkCommentsInNodes(nodes, cb) {
998
1242
  // are discovered and hydrated by the nested frame instance only.
999
1243
  if (isFrameStart(node)) {
1000
1244
  let end = findEndMarker(node, isFrameStart, isFrameEnd);
1001
- i = nodes.indexOf(end);
1245
+ i = findMarkerRangeEndIndex(nodes, end, i);
1002
1246
  continue;
1003
1247
  }
1004
- if (node.nodeType === Node.COMMENT_NODE)
1248
+ if (isCommentNode(node))
1005
1249
  cb(node);
1006
1250
  if (node.childNodes && node.childNodes.length > 0) {
1007
1251
  walkCommentsInNodes(Array.from(node.childNodes), cb);
@@ -1014,11 +1258,8 @@ function isHydrationStart(node) {
1014
1258
  function isHydrationEnd(node) {
1015
1259
  return node.data.trim() === '/rmx:h';
1016
1260
  }
1017
- function isHydratedVirtualRootMarker(node) {
1018
- return node instanceof Comment && '$rmx' in node;
1019
- }
1020
1261
  function isFrameStart(node) {
1021
- return node instanceof Comment && node.data.trim().startsWith('rmx:f:');
1262
+ return isCommentNode(node) && node.data.trim().startsWith('rmx:f:');
1022
1263
  }
1023
1264
  function isFrameEnd(node) {
1024
1265
  return node.data.trim() === '/rmx:f';
@@ -1028,11 +1269,15 @@ function getFrameId(start) {
1028
1269
  invariant(trimmed.startsWith('rmx:f:'), 'Invalid frame start marker');
1029
1270
  return trimmed.slice('rmx:f:'.length);
1030
1271
  }
1272
+ function findMarkerRangeEndIndex(nodes, end, startIndex) {
1273
+ // The snapshot may not contain an end marker moved by a DOM update.
1274
+ return Math.max(startIndex, nodes.indexOf(end));
1275
+ }
1031
1276
  function findEndMarker(start, isStart, isEnd) {
1032
1277
  let node = start.nextSibling;
1033
1278
  let depth = 1;
1034
1279
  while (node) {
1035
- if (node.nodeType === Node.COMMENT_NODE) {
1280
+ if (isCommentNode(node)) {
1036
1281
  let comment = node;
1037
1282
  if (isStart(comment))
1038
1283
  depth++;
@@ -1046,4 +1291,12 @@ function findEndMarker(start, isStart, isEnd) {
1046
1291
  }
1047
1292
  throw new Error('End marker not found');
1048
1293
  }
1294
+ function isCommentNode(node) {
1295
+ return node?.nodeType === Node.COMMENT_NODE;
1296
+ }
1297
+ function isDocumentFragmentNode(value) {
1298
+ return (typeof value === 'object' &&
1299
+ value !== null &&
1300
+ Reflect.get(value, 'nodeType') === Node.DOCUMENT_FRAGMENT_NODE);
1301
+ }
1049
1302
  //# sourceMappingURL=frame.js.map