sygnal 5.4.0 → 6.0.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 (316) hide show
  1. package/CHANGELOG.md +646 -0
  2. package/README.md +24 -9
  3. package/dist/astro/client.cjs.js +16 -9
  4. package/dist/astro/client.cjs.js.map +1 -1
  5. package/dist/astro/client.mjs +16 -9
  6. package/dist/astro/client.mjs.map +1 -1
  7. package/dist/astro/index.cjs.js +362 -91
  8. package/dist/astro/index.cjs.js.map +1 -1
  9. package/dist/astro/index.mjs +362 -92
  10. package/dist/astro/index.mjs.map +1 -1
  11. package/dist/astro/server.cjs.js +3396 -165
  12. package/dist/astro/server.cjs.js.map +1 -1
  13. package/dist/astro/server.mjs +3396 -165
  14. package/dist/astro/server.mjs.map +1 -1
  15. package/dist/devtools.cjs.js +1431 -0
  16. package/dist/devtools.cjs.js.map +1 -0
  17. package/dist/devtools.esm.js +1419 -0
  18. package/dist/devtools.esm.js.map +1 -0
  19. package/dist/diagnostics.cjs.js +3032 -296
  20. package/dist/diagnostics.cjs.js.map +1 -1
  21. package/dist/diagnostics.esm.js +3032 -296
  22. package/dist/diagnostics.esm.js.map +1 -1
  23. package/dist/element.cjs.js +230 -0
  24. package/dist/element.cjs.js.map +1 -0
  25. package/dist/element.esm.js +228 -0
  26. package/dist/element.esm.js.map +1 -0
  27. package/dist/guide/accessibility.md +257 -0
  28. package/dist/guide/adapters.md +221 -0
  29. package/dist/guide/behaviors.md +312 -0
  30. package/dist/guide/browser-sources.md +203 -0
  31. package/dist/guide/drag-and-drop.md +342 -0
  32. package/dist/guide/element-commands.md +306 -0
  33. package/dist/guide/error-boundaries.md +169 -0
  34. package/dist/guide/forms-reference.md +381 -0
  35. package/dist/guide/forms.md +250 -0
  36. package/dist/guide/http.md +299 -0
  37. package/dist/guide/inputs.md +173 -0
  38. package/dist/guide/persistence.md +245 -0
  39. package/dist/guide/recipes/carousel.md +155 -0
  40. package/dist/guide/recipes/charts.md +177 -0
  41. package/dist/guide/recipes/code-editor.md +135 -0
  42. package/dist/guide/recipes/data-grid.md +155 -0
  43. package/dist/guide/recipes/data-table.md +196 -0
  44. package/dist/guide/recipes/i18n.md +222 -0
  45. package/dist/guide/recipes/icons.md +115 -0
  46. package/dist/guide/recipes/overview.md +33 -0
  47. package/dist/guide/recipes/rich-text.md +154 -0
  48. package/dist/guide/resources.md +471 -0
  49. package/dist/guide/ssr.md +255 -0
  50. package/dist/guide/timers.md +178 -0
  51. package/dist/guide/ui/accordion.md +93 -0
  52. package/dist/guide/ui/combobox.md +144 -0
  53. package/dist/guide/ui/dialog.md +124 -0
  54. package/dist/guide/ui/disclosure.md +60 -0
  55. package/dist/guide/ui/menu.md +125 -0
  56. package/dist/guide/ui/overview.md +166 -0
  57. package/dist/guide/ui/popover.md +101 -0
  58. package/dist/guide/ui/select.md +114 -0
  59. package/dist/guide/ui/tabs.md +161 -0
  60. package/dist/guide/ui/toaster.md +152 -0
  61. package/dist/guide/ui/tooltip.md +103 -0
  62. package/dist/guide/undo.md +178 -0
  63. package/dist/guide/virtual-collections.md +183 -0
  64. package/dist/guide/web-components.md +179 -0
  65. package/dist/guide/widgets.md +217 -0
  66. package/dist/index.cjs.js +13178 -5769
  67. package/dist/index.cjs.js.map +1 -1
  68. package/dist/index.d.ts +2908 -276
  69. package/dist/index.esm.js +13149 -5779
  70. package/dist/index.esm.js.map +1 -1
  71. package/dist/jsx-dev-runtime.cjs.js +26 -334
  72. package/dist/jsx-dev-runtime.cjs.js.map +1 -1
  73. package/dist/jsx-dev-runtime.esm.js +19 -327
  74. package/dist/jsx-dev-runtime.esm.js.map +1 -1
  75. package/dist/jsx-runtime.cjs.js +26 -334
  76. package/dist/jsx-runtime.cjs.js.map +1 -1
  77. package/dist/jsx-runtime.esm.js +19 -327
  78. package/dist/jsx-runtime.esm.js.map +1 -1
  79. package/dist/jsx.cjs.js +10 -314
  80. package/dist/jsx.cjs.js.map +1 -1
  81. package/dist/jsx.esm.js +8 -315
  82. package/dist/jsx.esm.js.map +1 -1
  83. package/dist/react.cjs.js +117 -0
  84. package/dist/react.cjs.js.map +1 -0
  85. package/dist/react.esm.js +115 -0
  86. package/dist/react.esm.js.map +1 -0
  87. package/dist/shims/globalthis.cjs +20 -0
  88. package/dist/sygnal.min.js +1 -1
  89. package/dist/sygnal.min.js.map +1 -1
  90. package/dist/ui-combobox.cjs.js +169 -0
  91. package/dist/ui-combobox.cjs.js.map +1 -0
  92. package/dist/ui-combobox.esm.js +148 -0
  93. package/dist/ui-combobox.esm.js.map +1 -0
  94. package/dist/ui-menu.cjs.js +87 -0
  95. package/dist/ui-menu.cjs.js.map +1 -0
  96. package/dist/ui-menu.esm.js +66 -0
  97. package/dist/ui-menu.esm.js.map +1 -0
  98. package/dist/ui-select.cjs.js +104 -0
  99. package/dist/ui-select.cjs.js.map +1 -0
  100. package/dist/ui-select.esm.js +83 -0
  101. package/dist/ui-select.esm.js.map +1 -0
  102. package/dist/ui.cjs.js +738 -0
  103. package/dist/ui.cjs.js.map +1 -0
  104. package/dist/ui.esm.js +727 -0
  105. package/dist/ui.esm.js.map +1 -0
  106. package/dist/vike/ClientOnly.cjs.js +4 -14
  107. package/dist/vike/ClientOnly.cjs.js.map +1 -1
  108. package/dist/vike/ClientOnly.mjs +4 -14
  109. package/dist/vike/ClientOnly.mjs.map +1 -1
  110. package/dist/vike/{+config.js → config/+config.js} +9 -1
  111. package/dist/vike/config/+config.js.map +1 -0
  112. package/dist/vike/config/package.json +6 -0
  113. package/dist/vike/onRenderClient.cjs.js +165 -95
  114. package/dist/vike/onRenderClient.cjs.js.map +1 -1
  115. package/dist/vike/onRenderClient.mjs +165 -95
  116. package/dist/vike/onRenderClient.mjs.map +1 -1
  117. package/dist/vike/onRenderHtml.cjs.js +59 -24
  118. package/dist/vike/onRenderHtml.cjs.js.map +1 -1
  119. package/dist/vike/onRenderHtml.mjs +60 -25
  120. package/dist/vike/onRenderHtml.mjs.map +1 -1
  121. package/dist/vite/plugin.cjs.js +323 -88
  122. package/dist/vite/plugin.cjs.js.map +1 -1
  123. package/dist/vite/plugin.mjs +323 -89
  124. package/dist/vite/plugin.mjs.map +1 -1
  125. package/dist/zag.cjs.js +408 -0
  126. package/dist/zag.cjs.js.map +1 -0
  127. package/dist/zag.esm.js +405 -0
  128. package/dist/zag.esm.js.map +1 -0
  129. package/llms.txt +166 -103
  130. package/package.json +98 -14
  131. package/src/astro/client.ts +27 -16
  132. package/src/astro/index.d.ts +24 -0
  133. package/src/astro/index.ts +69 -3
  134. package/src/astro/server.ts +8 -2
  135. package/src/collection.ts +6 -93
  136. package/src/core/actions.ts +134 -0
  137. package/src/core/cell.ts +202 -0
  138. package/src/core/debug.ts +23 -0
  139. package/src/core/define.ts +242 -0
  140. package/src/core/hooks.ts +314 -0
  141. package/src/core/hosts/collection.ts +325 -0
  142. package/src/core/hosts/switchable.ts +146 -0
  143. package/src/core/instance.ts +592 -0
  144. package/src/core/markers/clientonly.ts +13 -0
  145. package/src/core/markers/lazy.ts +40 -0
  146. package/src/core/markers/portal.ts +96 -0
  147. package/src/core/markers/suspense.ts +41 -0
  148. package/src/core/markers/transition.ts +70 -0
  149. package/src/core/registry.ts +25 -0
  150. package/src/core/runtime.ts +573 -0
  151. package/src/core/statics.ts +104 -0
  152. package/src/core/teardown.ts +60 -0
  153. package/src/core/view.ts +37 -0
  154. package/src/cycle/dom/DocumentDOMSource.ts +13 -8
  155. package/src/cycle/dom/ElementFinder.ts +7 -9
  156. package/src/cycle/dom/EventDelegator.ts +174 -223
  157. package/src/cycle/dom/IsolateModule.ts +65 -35
  158. package/src/cycle/dom/MainDOMSource.ts +9 -2
  159. package/src/cycle/dom/PriorityQueue.ts +4 -2
  160. package/src/cycle/dom/SymbolTree.ts +18 -47
  161. package/src/cycle/dom/classNameModule.ts +9 -7
  162. package/src/cycle/dom/controlledInputModule.ts +23 -6
  163. package/src/cycle/dom/enrichEventStream.ts +25 -47
  164. package/src/cycle/dom/fragment.ts +7 -0
  165. package/src/cycle/dom/isolate.ts +30 -27
  166. package/src/cycle/dom/makeDOMDriver.ts +115 -56
  167. package/src/cycle/dom/mockDOMSource.ts +21 -1
  168. package/src/cycle/dom/modules.ts +16 -3
  169. package/src/cycle/dom/propsModule.ts +65 -0
  170. package/src/cycle/dom/selectModule.ts +22 -17
  171. package/src/cycle/dom/snabbdom.ts +1 -6
  172. package/src/cycle/dom/thunk.ts +3 -0
  173. package/src/cycle/dom/utils.ts +98 -0
  174. package/src/cycle/dom/viewTransition.ts +43 -0
  175. package/src/cycle/state/StateSource.ts +19 -3
  176. package/src/cycle/state/objIsEqual.ts +50 -0
  177. package/src/cycle/state/types.ts +0 -10
  178. package/src/defineComponent.ts +34 -0
  179. package/src/devtools.d.ts +151 -0
  180. package/src/devtools.ts +34 -0
  181. package/src/element.d.ts +59 -0
  182. package/src/element.ts +235 -0
  183. package/src/extra/backoff.ts +9 -0
  184. package/src/extra/behaviors.ts +169 -0
  185. package/src/extra/browserSignals.ts +23 -0
  186. package/src/extra/browserSources.ts +326 -0
  187. package/src/extra/command.ts +3 -3
  188. package/src/extra/controls.ts +47 -0
  189. package/src/extra/copyAsTest.ts +286 -0
  190. package/src/extra/devtools.ts +101 -31
  191. package/src/extra/devtoolsActions.ts +379 -0
  192. package/src/extra/devtoolsHook.ts +9 -0
  193. package/src/extra/devtoolsNext.ts +83 -0
  194. package/src/extra/diagnostics/checks/actionLog.ts +108 -0
  195. package/src/extra/diagnostics/checks/behaviors.ts +49 -0
  196. package/src/extra/diagnostics/checks/browserSources.ts +96 -0
  197. package/src/extra/diagnostics/checks/collections.ts +1 -1
  198. package/src/extra/diagnostics/checks/controls.ts +148 -0
  199. package/src/extra/diagnostics/checks/dataset.ts +57 -0
  200. package/src/extra/diagnostics/checks/dom.ts +20 -11
  201. package/src/extra/diagnostics/checks/elementCommands.ts +175 -0
  202. package/src/extra/diagnostics/checks/events.ts +17 -2
  203. package/src/extra/diagnostics/checks/fetch.ts +135 -0
  204. package/src/extra/diagnostics/checks/forms.ts +163 -0
  205. package/src/extra/diagnostics/checks/index.ts +97 -4
  206. package/src/extra/diagnostics/checks/inspect.ts +140 -32
  207. package/src/extra/diagnostics/checks/next.ts +417 -0
  208. package/src/extra/diagnostics/checks/persist.ts +54 -0
  209. package/src/extra/diagnostics/checks/props.ts +10 -5
  210. package/src/extra/diagnostics/checks/public.d.ts +98 -7
  211. package/src/extra/diagnostics/checks/replies.ts +128 -0
  212. package/src/extra/diagnostics/checks/router.ts +100 -0
  213. package/src/extra/diagnostics/checks/rxjsHints.ts +1 -1
  214. package/src/extra/diagnostics/checks/shared.ts +86 -2
  215. package/src/extra/diagnostics/checks/shorthand.ts +115 -0
  216. package/src/extra/diagnostics/checks/sortable.ts +129 -0
  217. package/src/extra/diagnostics/checks/state.ts +100 -7
  218. package/src/extra/diagnostics/checks/statics.ts +48 -0
  219. package/src/extra/diagnostics/checks/strict.ts +10 -67
  220. package/src/extra/diagnostics/checks/timers.ts +80 -0
  221. package/src/extra/diagnostics/checks/viewTransitions.ts +47 -0
  222. package/src/extra/diagnostics/checks/virtual.ts +73 -0
  223. package/src/extra/diagnostics/checks/widgets.ts +109 -0
  224. package/src/extra/diagnostics/checks/wiring.ts +66 -10
  225. package/src/extra/diagnostics/codes.ts +268 -23
  226. package/src/extra/diagnostics/index.ts +34 -9
  227. package/src/extra/diagnostics/legacy.ts +17 -0
  228. package/src/extra/driverFactories.ts +83 -19
  229. package/src/extra/elementCommands.ts +53 -0
  230. package/src/extra/fetchDriver.ts +519 -0
  231. package/src/extra/focusWithin.ts +27 -0
  232. package/src/extra/form.ts +268 -0
  233. package/src/extra/formHelpers.ts +139 -0
  234. package/src/extra/head.ts +106 -0
  235. package/src/extra/hmr.ts +2 -3
  236. package/src/extra/owned.ts +24 -0
  237. package/src/extra/pager.ts +50 -0
  238. package/src/extra/persist.ts +133 -0
  239. package/src/extra/pwa.ts +1 -1
  240. package/src/extra/queryCache.ts +107 -0
  241. package/src/extra/reducers.ts +1 -1
  242. package/src/extra/reduxDevtools.ts +92 -0
  243. package/src/extra/replies.ts +54 -0
  244. package/src/extra/router.ts +323 -0
  245. package/src/extra/run.ts +90 -217
  246. package/src/extra/selection.ts +76 -0
  247. package/src/extra/socketDriver.ts +265 -0
  248. package/src/extra/sortable.ts +377 -0
  249. package/src/extra/ssr.ts +427 -160
  250. package/src/extra/standardSchema.ts +27 -0
  251. package/src/extra/testing.ts +2433 -175
  252. package/src/extra/timers.ts +95 -0
  253. package/src/extra/undo.ts +261 -0
  254. package/src/extra/viewTransitions.ts +38 -0
  255. package/src/extra/virtual.ts +513 -0
  256. package/src/extra/widget.ts +201 -0
  257. package/src/index.d.ts +2631 -117
  258. package/src/index.ts +25 -4
  259. package/src/jsx-runtime.ts +15 -1
  260. package/src/jsx.ts +2 -1
  261. package/src/lazy.ts +50 -7
  262. package/src/portal.ts +3 -1
  263. package/src/pragma/index.ts +256 -133
  264. package/src/react-peers.d.ts +5 -0
  265. package/src/react.d.ts +43 -0
  266. package/src/react.ts +110 -0
  267. package/src/shared.ts +48 -0
  268. package/src/slot.ts +1 -1
  269. package/src/suspense.ts +3 -1
  270. package/src/switchable.ts +6 -121
  271. package/src/transition.ts +3 -1
  272. package/src/ui/accordion.ts +64 -0
  273. package/src/ui/dialog.ts +129 -0
  274. package/src/ui/disclosure.ts +35 -0
  275. package/src/ui/popover.ts +45 -0
  276. package/src/ui/shared.ts +94 -0
  277. package/src/ui/tabs.ts +82 -0
  278. package/src/ui/toaster.ts +198 -0
  279. package/src/ui/tooltip.ts +70 -0
  280. package/src/ui/zag/combobox.ts +115 -0
  281. package/src/ui/zag/menu.ts +40 -0
  282. package/src/ui/zag/select.ts +54 -0
  283. package/src/ui/zag/shared.ts +43 -0
  284. package/src/ui-combobox.d.ts +20 -0
  285. package/src/ui-combobox.ts +6 -0
  286. package/src/ui-menu.d.ts +30 -0
  287. package/src/ui-menu.ts +6 -0
  288. package/src/ui-select.d.ts +17 -0
  289. package/src/ui-select.ts +6 -0
  290. package/src/ui-zag-types.d.ts +42 -0
  291. package/src/ui.d.ts +208 -0
  292. package/src/ui.ts +15 -0
  293. package/src/vike/+config.ts +9 -1
  294. package/src/vike/ClientOnly.ts +1 -1
  295. package/src/vike/onRenderClient.ts +144 -96
  296. package/src/vike/onRenderHtml.ts +69 -26
  297. package/src/vike/types.ts +7 -1
  298. package/src/vite/globalthis-shim.ts +18 -0
  299. package/src/vite/globalthis.ts +56 -0
  300. package/src/vite/plugin.d.ts +22 -3
  301. package/src/vite/plugin.ts +222 -24
  302. package/src/zag.d.ts +64 -0
  303. package/src/zag.ts +238 -0
  304. package/dist/vike/+config.cjs.js +0 -66
  305. package/dist/vike/+config.cjs.js.map +0 -1
  306. package/dist/vike/+config.js.map +0 -1
  307. package/src/component.ts +0 -2301
  308. package/src/cycle/isolate/index.ts +0 -196
  309. package/src/cycle/run/index.ts +0 -151
  310. package/src/cycle/run/internals.ts +0 -143
  311. package/src/cycle/state/Collection.ts +0 -184
  312. package/src/cycle/state/index.ts +0 -5
  313. package/src/cycle/state/pickCombine.ts +0 -201
  314. package/src/cycle/state/pickMerge.ts +0 -122
  315. package/src/cycle/state/withState.ts +0 -47
  316. package/src/pragma/fn.ts +0 -55
package/src/index.ts CHANGED
@@ -1,15 +1,26 @@
1
1
  'use strict'
2
2
 
3
3
  // export sygnal core functions
4
- export { default as component, ABORT } from "./component"
5
- export { default as collection, Collection } from "./collection"
6
- export { default as switchable, Switchable } from "./switchable"
4
+ export { ABORT } from "./shared"
5
+ export { defineComponent } from "./defineComponent"
6
+ export { Collection } from "./collection"
7
+ export { VirtualCollection } from "./extra/virtual"
8
+ export { Switchable } from "./switchable"
7
9
  export { Portal, default as portal } from "./portal"
8
10
  export { Transition } from "./transition"
9
11
  export { Suspense } from "./suspense"
10
12
  export { Slot } from "./slot"
11
13
  export { lazy } from "./lazy"
12
14
  export { driverFromAsync } from "./extra/driverFactories"
15
+ export { makeFetchDriver } from "./extra/fetchDriver"
16
+ export { queryCache } from "./extra/queryCache"
17
+ export { makeSocketDriver } from "./extra/socketDriver"
18
+ export { makeRouter, makeRouterDriver } from "./extra/router"
19
+ export { makeViewTransitionDOMDriver } from "./extra/viewTransitions"
20
+ export { makeHeadDriver, renderHead } from "./extra/head"
21
+ export { makeTimerDriver } from "./extra/timers"
22
+ export { makeBrowserDriver, makeBrowserDriverWith, intersectionSource, resizeSource, mediaSource, storageSource, visibilitySource, onlineSource, geolocationSource, clipboardSource } from "./extra/browserSources"
23
+ export { focusWithin } from "./extra/focusWithin"
13
24
  export { default as processForm } from "./extra/processForm"
14
25
  export { default as processDrag } from "./extra/processDrag"
15
26
  export { makeDragDriver } from "./extra/dragDriver"
@@ -20,12 +31,22 @@ export { default as classes } from './extra/classes'
20
31
  export { createElement } from './pragma/index'
21
32
  export { createCommand } from './extra/command'
22
33
  export { createRef, createRef$ } from './extra/ref'
34
+ export { controls } from './extra/controls'
35
+ export { defineWidget } from './extra/widget'
36
+ export { defineBehavior } from './extra/behaviors'
37
+ export { pager } from './extra/pager'
38
+ export { form } from './extra/form'
39
+ export { checkForm, formErrors, setField, getField, hasField, fieldName, fieldNames, replyErrors, focusInvalid } from './extra/formHelpers'
40
+ export { selection, isSelected } from './extra/selection'
41
+ export { sortable } from './extra/sortable'
42
+ export { undoable, undo } from './extra/undo'
43
+ export { persist } from './extra/persist'
23
44
  export { renderComponent } from './extra/testing'
24
45
  export { set, toggle, emit, event } from './extra/reducers'
25
46
  export { makeServiceWorkerDriver, onlineStatus$, createInstallPrompt } from './extra/pwa'
26
47
  export { renderToString } from './extra/ssr'
27
48
  export { default as xs } from './extra/xstreamCompat'
28
- export { getDevTools } from './extra/devtools'
49
+ export { getDevTools } from './extra/devtoolsHook'
29
50
  export { getDiagnostics, clearDiagnostics, onDiagnostic } from './extra/diagnostics/index'
30
51
 
31
52
  // export dom helper functions (h, makeDOMDriver, etc.)
@@ -1,8 +1,22 @@
1
+ // P46-Q (D188): the pragma is the core's. The build makes './pragma/index' the external 'sygnal'
2
+ // (the core entry) and keeps snabbdom external, so an app ships one copy of each; the element
3
+ // fast path is the core createElement's `.a` (the children as one array)
1
4
  import { createElement } from './pragma/index'
2
- export { Fragment } from './cycle/dom/snabbdom'
5
+ export { Fragment } from './cycle/dom/fragment'
6
+
7
+ // G-351: a 'sygnal' without `.a` (an older core next to this runtime): createElement itself
8
+ const createTag = (createElement as any).a || ((t: any, p: any, c: any[], k: any) => {
9
+ const { children, ...rest } = p
10
+ if (k !== undefined) rest.key = k
11
+ return createElement(t, rest, ...c)
12
+ })
3
13
 
4
14
  export function jsx(type: any, props: any, key?: any): any {
5
15
  if (props == null) return createElement(type, null)
16
+ if (typeof type == 'string') {
17
+ const c = props.children
18
+ return createTag(type, props, c === undefined ? [] : Array.isArray(c) ? c : [c], key)
19
+ }
6
20
  const { children, ...rest } = props
7
21
  if (key !== undefined) rest.key = key
8
22
  if (children === undefined) return createElement(type, rest)
package/src/jsx.ts CHANGED
@@ -1,2 +1,3 @@
1
+ // P46-Q (D188): the core's pragma ('./pragma/index' is the external 'sygnal' in this build)
1
2
  export { createElement as jsx } from './pragma/index'
2
- export { Fragment } from "snabbdom"
3
+ export { Fragment } from './cycle/dom/fragment'
package/src/lazy.ts CHANGED
@@ -1,6 +1,45 @@
1
- export function lazy(loadFn: () => Promise<any>): any {
1
+ // the core's resolver for lazy components, registered on import (D157)
2
+ import './core/markers/lazy';
3
+
4
+ /**
5
+ * PLAN-5 B-4 (D103): `when` defers the import: 'visible' starts it when a placeholder enters the
6
+ * viewport (IntersectionObserver, `rootMargin`; at once without one), 'idle' when the browser is
7
+ * idle after a placeholder is on the page (requestIdleCallback with a 2 s timeout; setTimeout
8
+ * without it). Until then the placeholder is data-sygnal-lazy="deferred" (not "loading": a Suspense
9
+ * boundary doesn't wait for it, G-385) plus `data-sygnal-when`, in its own place, so it can scroll
10
+ * into view; once the import starts the owners render again (markers/lazy.ts) and it is the
11
+ * loading one. `placeholderHeight` gives the
12
+ * placeholders a min-height (empty ones stacked together would all be visible at once).
13
+ * SSR and renderComponent's mock DOM run no hooks: the placeholder stays until `load()`
14
+ * (preloading, e.g. on hover). All instances share one import.
15
+ */
16
+ export interface LazyOptions {
17
+ when?: 'visible' | 'idle';
18
+ /** 'visible': the IntersectionObserver's rootMargin ('200px' starts the import a little earlier) */
19
+ rootMargin?: string;
20
+ /** the placeholder's min-height (a number: px), e.g. the component's expected height */
21
+ placeholderHeight?: number | string;
22
+ }
23
+
24
+ const WHEN = 'data-sygnal-when';
25
+
26
+ export function lazy(loadFn: () => Promise<any>, options?: LazyOptions): any {
2
27
  let cachedComponent: any = null;
3
28
  let loadError: any = null;
29
+ const g: any = globalThis, when = options?.when, ph = options?.placeholderHeight;
30
+ // the deferred import's trigger (once), its observer, the placeholder's hooks
31
+ let go: any, io: any;
32
+ const start = () => { io?.disconnect(); go?.(); go = 0; };
33
+ const arm = (v: any) => {
34
+ if (!go) return;
35
+ if (when == 'idle') {
36
+ const f = () => start();
37
+ g.requestIdleCallback ? g.requestIdleCallback(f, {timeout: 2000}) : setTimeout(f, 1);
38
+ } else if (!g.IntersectionObserver) start();
39
+ else (io ||= new g.IntersectionObserver((es: any[]) => es.some(e => e.isIntersecting) && start(), {rootMargin: options?.rootMargin})).observe(v.elm);
40
+ };
41
+ const hook = when && {insert: arm, update: (_: any, v: any) => when != 'idle' && arm(v), destroy: (v: any) => io?.unobserve(v.elm)};
42
+ const style = ph != null && {minHeight: typeof ph == 'number' ? ph + 'px' : ph};
4
43
 
5
44
  // View function that delegates to the loaded component
6
45
  function LazyWrapper(viewArgs: any) {
@@ -12,22 +51,22 @@ export function lazy(loadFn: () => Promise<any>): any {
12
51
  }
13
52
  if (!cachedComponent) {
14
53
  return {
15
- sel: 'div', data: { attrs: { 'data-sygnal-lazy': 'loading' } },
54
+ sel: 'div', data: { attrs: { 'data-sygnal-lazy': go ? 'deferred' : 'loading', ...go && { [WHEN]: when } }, ...go && { hook }, ...style && { style } },
16
55
  children: [], text: undefined, elm: undefined, key: undefined,
17
56
  };
18
57
  }
19
58
  return cachedComponent(viewArgs);
20
59
  }
21
60
 
22
- // Start loading eagerly and copy static properties when done
23
- const loadPromise = loadFn()
61
+ // Start loading eagerly (with `when`, once triggered) and copy static properties when done
62
+ const started = when && new Promise(r => go = r);
63
+ const loadPromise = (started ? started.then(loadFn) : loadFn())
24
64
  .then((mod: any) => {
25
65
  cachedComponent = mod.default || mod;
26
66
  (LazyWrapper as any).__sygnalLazyLoadedComponent = cachedComponent;
27
67
  // Copy static properties so the component works on next render
28
- const statics = ['model', 'intent', 'hmrActions', 'context', 'peers', 'components',
29
- 'initialState', 'calculated', 'storeCalculatedInState', 'DOMSourceName',
30
- 'stateSourceName', 'onError', 'debug', 'componentName'];
68
+ const statics = ['model', 'intent', 'context', 'initialState', 'calculated', 'isolatedState',
69
+ 'onError', 'debug', 'componentName', 'connections', 'resources', 'route', 'head', 'uses', 'timers', 'persist', 'viewTransitions', 'browser'];
31
70
  for (const key of statics) {
32
71
  if (cachedComponent[key] !== undefined && (LazyWrapper as any)[key] === undefined) {
33
72
  (LazyWrapper as any)[key] = cachedComponent[key];
@@ -44,7 +83,11 @@ export function lazy(loadFn: () => Promise<any>): any {
44
83
  (LazyWrapper as any).__sygnalLazyLoaded = () => cachedComponent !== null;
45
84
  (LazyWrapper as any).__sygnalLazyLoadedComponent = null;
46
85
  (LazyWrapper as any).__sygnalLazyPromise = loadPromise;
86
+ // a deferred import's start (G-385: Suspense waits for its placeholder from then on)
87
+ (LazyWrapper as any).__sygnalLazyStarted = started;
47
88
  (LazyWrapper as any).__sygnalLazyReRenderScheduled = false;
89
+ // start the import now (a deferred one too); resolves once it has loaded (or failed)
90
+ (LazyWrapper as any).load = () => (start(), loadPromise);
48
91
 
49
92
  return LazyWrapper;
50
93
  }
package/src/portal.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  import {h} from './cycle/dom/snabbdom';
2
+ // the core's handler for this marker, registered on import (D157)
3
+ import './core/markers/portal';
2
4
 
3
5
  const Portal = (props: any) => {
4
6
  const {children, ...sanitizedProps} = props;
5
7
  return h('portal', {props: sanitizedProps}, children);
6
8
  };
7
- (Portal as any).label = 'portal';
9
+ (Portal as any).componentName = 'portal';
8
10
  (Portal as any).preventInstantiation = true;
9
11
 
10
12
  export {Portal};