@g9tm/lynxcontrols 0.0.0-stage → 1.4.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 (545) hide show
  1. package/README.md +22 -2
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/base/base.css +16 -0
  4. package/dist/base/base.css.map +1 -0
  5. package/dist/base/control.d.ts +44 -0
  6. package/dist/base/control.d.ts.map +1 -0
  7. package/dist/base/control.jsx +24 -0
  8. package/dist/base/control.jsx.map +1 -0
  9. package/dist/base/corner-badge.d.ts +35 -0
  10. package/dist/base/corner-badge.d.ts.map +1 -0
  11. package/dist/base/corner-badge.jsx +45 -0
  12. package/dist/base/corner-badge.jsx.map +1 -0
  13. package/dist/base/disposer.d.ts +28 -0
  14. package/dist/base/disposer.d.ts.map +1 -0
  15. package/dist/base/disposer.jsx +61 -0
  16. package/dist/base/disposer.jsx.map +1 -0
  17. package/dist/base/index.d.ts +10 -0
  18. package/dist/base/index.d.ts.map +1 -0
  19. package/dist/base/index.jsx +9 -0
  20. package/dist/base/press.d.ts +38 -0
  21. package/dist/base/press.d.ts.map +1 -0
  22. package/dist/base/press.jsx +73 -0
  23. package/dist/base/press.jsx.map +1 -0
  24. package/dist/base/pressable.d.ts +25 -0
  25. package/dist/base/pressable.d.ts.map +1 -0
  26. package/dist/base/pressable.jsx +38 -0
  27. package/dist/base/pressable.jsx.map +1 -0
  28. package/dist/base/selection-item.d.ts +29 -0
  29. package/dist/base/selection-item.d.ts.map +1 -0
  30. package/dist/base/selection-item.jsx +6 -0
  31. package/dist/base/selection-item.jsx.map +1 -0
  32. package/dist/base/timers.d.ts +7 -0
  33. package/dist/base/timers.d.ts.map +1 -0
  34. package/dist/base/timers.jsx +10 -0
  35. package/dist/base/timers.jsx.map +1 -0
  36. package/dist/base/use-controllable-state.d.ts +30 -0
  37. package/dist/base/use-controllable-state.d.ts.map +1 -0
  38. package/dist/base/use-controllable-state.jsx +49 -0
  39. package/dist/base/use-controllable-state.jsx.map +1 -0
  40. package/dist/base/use-stable-callback.d.ts +8 -0
  41. package/dist/base/use-stable-callback.d.ts.map +1 -0
  42. package/dist/base/use-stable-callback.jsx +12 -0
  43. package/dist/base/use-stable-callback.jsx.map +1 -0
  44. package/dist/button/button.css +162 -0
  45. package/dist/button/button.css.map +1 -0
  46. package/dist/button/button.d.ts +52 -0
  47. package/dist/button/button.d.ts.map +1 -0
  48. package/dist/button/button.jsx +87 -0
  49. package/dist/button/button.jsx.map +1 -0
  50. package/dist/button/header-action-button.d.ts +34 -0
  51. package/dist/button/header-action-button.d.ts.map +1 -0
  52. package/dist/button/header-action-button.jsx +51 -0
  53. package/dist/button/header-action-button.jsx.map +1 -0
  54. package/dist/button/icon-button.d.ts +46 -0
  55. package/dist/button/icon-button.d.ts.map +1 -0
  56. package/dist/button/icon-button.jsx +69 -0
  57. package/dist/button/icon-button.jsx.map +1 -0
  58. package/dist/button/index.d.ts +9 -0
  59. package/dist/button/index.d.ts.map +1 -0
  60. package/dist/button/index.jsx +8 -0
  61. package/dist/button/nav-card.d.ts +58 -0
  62. package/dist/button/nav-card.d.ts.map +1 -0
  63. package/dist/button/nav-card.jsx +95 -0
  64. package/dist/button/nav-card.jsx.map +1 -0
  65. package/dist/button/safe-tap.d.ts +27 -0
  66. package/dist/button/safe-tap.d.ts.map +1 -0
  67. package/dist/button/safe-tap.jsx +46 -0
  68. package/dist/button/safe-tap.jsx.map +1 -0
  69. package/dist/button/safe.d.ts +84 -0
  70. package/dist/button/safe.d.ts.map +1 -0
  71. package/dist/button/safe.jsx +116 -0
  72. package/dist/button/safe.jsx.map +1 -0
  73. package/dist/button/vertical-icon-text-button.d.ts +18 -0
  74. package/dist/button/vertical-icon-text-button.d.ts.map +1 -0
  75. package/dist/button/vertical-icon-text-button.jsx +21 -0
  76. package/dist/button/vertical-icon-text-button.jsx.map +1 -0
  77. package/dist/button/visuals.d.ts +53 -0
  78. package/dist/button/visuals.d.ts.map +1 -0
  79. package/dist/button/visuals.jsx +92 -0
  80. package/dist/button/visuals.jsx.map +1 -0
  81. package/dist/cascade/cascade-panel.d.ts +80 -0
  82. package/dist/cascade/cascade-panel.d.ts.map +1 -0
  83. package/dist/cascade/cascade-panel.jsx +179 -0
  84. package/dist/cascade/cascade-panel.jsx.map +1 -0
  85. package/dist/cascade/cascade.css +70 -0
  86. package/dist/cascade/cascade.css.map +1 -0
  87. package/dist/cascade/index.d.ts +3 -0
  88. package/dist/cascade/index.d.ts.map +1 -0
  89. package/dist/cascade/index.jsx +2 -0
  90. package/dist/cascade/model.d.ts +68 -0
  91. package/dist/cascade/model.d.ts.map +1 -0
  92. package/dist/cascade/model.jsx +161 -0
  93. package/dist/cascade/model.jsx.map +1 -0
  94. package/dist/deferred/deferred-content.d.ts +82 -0
  95. package/dist/deferred/deferred-content.d.ts.map +1 -0
  96. package/dist/deferred/deferred-content.jsx +263 -0
  97. package/dist/deferred/deferred-content.jsx.map +1 -0
  98. package/dist/deferred/deferred.css +62 -0
  99. package/dist/deferred/deferred.css.map +1 -0
  100. package/dist/deferred/index.d.ts +3 -0
  101. package/dist/deferred/index.d.ts.map +1 -0
  102. package/dist/deferred/index.jsx +2 -0
  103. package/dist/deferred/readiness-signal.d.ts +16 -0
  104. package/dist/deferred/readiness-signal.d.ts.map +1 -0
  105. package/dist/deferred/readiness-signal.jsx +29 -0
  106. package/dist/deferred/readiness-signal.jsx.map +1 -0
  107. package/dist/display/activity-indicator.d.ts +21 -0
  108. package/dist/display/activity-indicator.d.ts.map +1 -0
  109. package/dist/display/activity-indicator.jsx +22 -0
  110. package/dist/display/activity-indicator.jsx.map +1 -0
  111. package/dist/display/culture-date-time-label.d.ts +64 -0
  112. package/dist/display/culture-date-time-label.d.ts.map +1 -0
  113. package/dist/display/culture-date-time-label.jsx +71 -0
  114. package/dist/display/culture-date-time-label.jsx.map +1 -0
  115. package/dist/display/display.css +217 -0
  116. package/dist/display/display.css.map +1 -0
  117. package/dist/display/index.d.ts +7 -0
  118. package/dist/display/index.d.ts.map +1 -0
  119. package/dist/display/index.jsx +6 -0
  120. package/dist/display/progress-bar.d.ts +38 -0
  121. package/dist/display/progress-bar.d.ts.map +1 -0
  122. package/dist/display/progress-bar.jsx +57 -0
  123. package/dist/display/progress-bar.jsx.map +1 -0
  124. package/dist/display/separator.d.ts +30 -0
  125. package/dist/display/separator.d.ts.map +1 -0
  126. package/dist/display/separator.jsx +55 -0
  127. package/dist/display/separator.jsx.map +1 -0
  128. package/dist/display/shimmer.d.ts +41 -0
  129. package/dist/display/shimmer.d.ts.map +1 -0
  130. package/dist/display/shimmer.jsx +41 -0
  131. package/dist/display/shimmer.jsx.map +1 -0
  132. package/dist/display/title-with-line.d.ts +13 -0
  133. package/dist/display/title-with-line.d.ts.map +1 -0
  134. package/dist/display/title-with-line.jsx +21 -0
  135. package/dist/display/title-with-line.jsx.map +1 -0
  136. package/dist/edge-panel/edge-panel.css +132 -0
  137. package/dist/edge-panel/edge-panel.css.map +1 -0
  138. package/dist/edge-panel/edge-panel.d.ts +87 -0
  139. package/dist/edge-panel/edge-panel.d.ts.map +1 -0
  140. package/dist/edge-panel/edge-panel.jsx +326 -0
  141. package/dist/edge-panel/edge-panel.jsx.map +1 -0
  142. package/dist/edge-panel/helper.d.ts +27 -0
  143. package/dist/edge-panel/helper.d.ts.map +1 -0
  144. package/dist/edge-panel/helper.jsx +118 -0
  145. package/dist/edge-panel/helper.jsx.map +1 -0
  146. package/dist/edge-panel/index.d.ts +4 -0
  147. package/dist/edge-panel/index.d.ts.map +1 -0
  148. package/dist/edge-panel/index.jsx +3 -0
  149. package/dist/edge-panel/types.d.ts +155 -0
  150. package/dist/edge-panel/types.d.ts.map +1 -0
  151. package/dist/edge-panel/types.jsx +139 -0
  152. package/dist/edge-panel/types.jsx.map +1 -0
  153. package/dist/expander/expander.css +54 -0
  154. package/dist/expander/expander.css.map +1 -0
  155. package/dist/expander/expander.d.ts +46 -0
  156. package/dist/expander/expander.d.ts.map +1 -0
  157. package/dist/expander/expander.jsx +110 -0
  158. package/dist/expander/expander.jsx.map +1 -0
  159. package/dist/expander/index.d.ts +2 -0
  160. package/dist/expander/index.d.ts.map +1 -0
  161. package/dist/expander/index.jsx +1 -0
  162. package/dist/fields/dictation.d.ts +43 -0
  163. package/dist/fields/dictation.d.ts.map +1 -0
  164. package/dist/fields/dictation.jsx +124 -0
  165. package/dist/fields/dictation.jsx.map +1 -0
  166. package/dist/fields/editor.d.ts +26 -0
  167. package/dist/fields/editor.d.ts.map +1 -0
  168. package/dist/fields/editor.jsx +46 -0
  169. package/dist/fields/editor.jsx.map +1 -0
  170. package/dist/fields/fields.css +156 -0
  171. package/dist/fields/fields.css.map +1 -0
  172. package/dist/fields/index.d.ts +12 -0
  173. package/dist/fields/index.d.ts.map +1 -0
  174. package/dist/fields/index.jsx +11 -0
  175. package/dist/fields/input-policy.d.ts +48 -0
  176. package/dist/fields/input-policy.d.ts.map +1 -0
  177. package/dist/fields/input-policy.jsx +215 -0
  178. package/dist/fields/input-policy.jsx.map +1 -0
  179. package/dist/fields/outlined-field.d.ts +146 -0
  180. package/dist/fields/outlined-field.d.ts.map +1 -0
  181. package/dist/fields/outlined-field.jsx +196 -0
  182. package/dist/fields/outlined-field.jsx.map +1 -0
  183. package/dist/fields/pin-entry.d.ts +63 -0
  184. package/dist/fields/pin-entry.d.ts.map +1 -0
  185. package/dist/fields/pin-entry.jsx +293 -0
  186. package/dist/fields/pin-entry.jsx.map +1 -0
  187. package/dist/fields/search-entry.d.ts +35 -0
  188. package/dist/fields/search-entry.d.ts.map +1 -0
  189. package/dist/fields/search-entry.jsx +118 -0
  190. package/dist/fields/search-entry.jsx.map +1 -0
  191. package/dist/fields/slot-layout.d.ts +33 -0
  192. package/dist/fields/slot-layout.d.ts.map +1 -0
  193. package/dist/fields/slot-layout.jsx +33 -0
  194. package/dist/fields/slot-layout.jsx.map +1 -0
  195. package/dist/fields/text-entry.d.ts +62 -0
  196. package/dist/fields/text-entry.d.ts.map +1 -0
  197. package/dist/fields/text-entry.jsx +72 -0
  198. package/dist/fields/text-entry.jsx.map +1 -0
  199. package/dist/fields/use-dictation.d.ts +34 -0
  200. package/dist/fields/use-dictation.d.ts.map +1 -0
  201. package/dist/fields/use-dictation.jsx +80 -0
  202. package/dist/fields/use-dictation.jsx.map +1 -0
  203. package/dist/fields/use-text-input.d.ts +150 -0
  204. package/dist/fields/use-text-input.d.ts.map +1 -0
  205. package/dist/fields/use-text-input.jsx +237 -0
  206. package/dist/fields/use-text-input.jsx.map +1 -0
  207. package/dist/fields/validator.d.ts +14 -0
  208. package/dist/fields/validator.d.ts.map +1 -0
  209. package/dist/fields/validator.jsx +20 -0
  210. package/dist/fields/validator.jsx.map +1 -0
  211. package/dist/host/back.d.ts +42 -0
  212. package/dist/host/back.d.ts.map +1 -0
  213. package/dist/host/back.jsx +47 -0
  214. package/dist/host/back.jsx.map +1 -0
  215. package/dist/host/hooks.d.ts +85 -0
  216. package/dist/host/hooks.d.ts.map +1 -0
  217. package/dist/host/hooks.jsx +163 -0
  218. package/dist/host/hooks.jsx.map +1 -0
  219. package/dist/host/host.css +81 -0
  220. package/dist/host/host.css.map +1 -0
  221. package/dist/host/host.d.ts +70 -0
  222. package/dist/host/host.d.ts.map +1 -0
  223. package/dist/host/host.jsx +229 -0
  224. package/dist/host/host.jsx.map +1 -0
  225. package/dist/host/index.d.ts +9 -0
  226. package/dist/host/index.d.ts.map +1 -0
  227. package/dist/host/index.jsx +8 -0
  228. package/dist/host/keyboard.d.ts +24 -0
  229. package/dist/host/keyboard.d.ts.map +1 -0
  230. package/dist/host/keyboard.jsx +28 -0
  231. package/dist/host/keyboard.jsx.map +1 -0
  232. package/dist/host/layers.d.ts +69 -0
  233. package/dist/host/layers.d.ts.map +1 -0
  234. package/dist/host/layers.jsx +111 -0
  235. package/dist/host/layers.jsx.map +1 -0
  236. package/dist/host/page-loading-overlay.d.ts +17 -0
  237. package/dist/host/page-loading-overlay.d.ts.map +1 -0
  238. package/dist/host/page-loading-overlay.jsx +16 -0
  239. package/dist/host/page-loading-overlay.jsx.map +1 -0
  240. package/dist/host/readiness.d.ts +57 -0
  241. package/dist/host/readiness.d.ts.map +1 -0
  242. package/dist/host/readiness.jsx +138 -0
  243. package/dist/host/readiness.jsx.map +1 -0
  244. package/dist/host/registry.d.ts +106 -0
  245. package/dist/host/registry.d.ts.map +1 -0
  246. package/dist/host/registry.jsx +93 -0
  247. package/dist/host/registry.jsx.map +1 -0
  248. package/dist/icon/icon.css +39 -0
  249. package/dist/icon/icon.css.map +1 -0
  250. package/dist/icon/icon.d.ts +57 -0
  251. package/dist/icon/icon.d.ts.map +1 -0
  252. package/dist/icon/icon.jsx +115 -0
  253. package/dist/icon/icon.jsx.map +1 -0
  254. package/dist/icon/index.d.ts +4 -0
  255. package/dist/icon/index.d.ts.map +1 -0
  256. package/dist/icon/index.jsx +3 -0
  257. package/dist/icon/slot.d.ts +45 -0
  258. package/dist/icon/slot.d.ts.map +1 -0
  259. package/dist/icon/slot.jsx +61 -0
  260. package/dist/icon/slot.jsx.map +1 -0
  261. package/dist/icon/swatch.d.ts +29 -0
  262. package/dist/icon/swatch.d.ts.map +1 -0
  263. package/dist/icon/swatch.jsx +25 -0
  264. package/dist/icon/swatch.jsx.map +1 -0
  265. package/dist/index.d.ts +23 -0
  266. package/dist/index.d.ts.map +1 -0
  267. package/dist/index.jsx +1 -0
  268. package/dist/pickers/combo-box.d.ts +42 -0
  269. package/dist/pickers/combo-box.d.ts.map +1 -0
  270. package/dist/pickers/combo-box.jsx +129 -0
  271. package/dist/pickers/combo-box.jsx.map +1 -0
  272. package/dist/pickers/date-time-picker.d.ts +63 -0
  273. package/dist/pickers/date-time-picker.d.ts.map +1 -0
  274. package/dist/pickers/date-time-picker.jsx +141 -0
  275. package/dist/pickers/date-time-picker.jsx.map +1 -0
  276. package/dist/pickers/date-time.d.ts +82 -0
  277. package/dist/pickers/date-time.d.ts.map +1 -0
  278. package/dist/pickers/date-time.jsx +130 -0
  279. package/dist/pickers/date-time.jsx.map +1 -0
  280. package/dist/pickers/index.d.ts +10 -0
  281. package/dist/pickers/index.d.ts.map +1 -0
  282. package/dist/pickers/index.jsx +9 -0
  283. package/dist/pickers/picker-sheet.d.ts +21 -0
  284. package/dist/pickers/picker-sheet.d.ts.map +1 -0
  285. package/dist/pickers/picker-sheet.jsx +61 -0
  286. package/dist/pickers/picker-sheet.jsx.map +1 -0
  287. package/dist/pickers/picker.d.ts +32 -0
  288. package/dist/pickers/picker.d.ts.map +1 -0
  289. package/dist/pickers/picker.jsx +72 -0
  290. package/dist/pickers/picker.jsx.map +1 -0
  291. package/dist/pickers/pickers.css +219 -0
  292. package/dist/pickers/pickers.css.map +1 -0
  293. package/dist/pickers/timespan-picker.d.ts +36 -0
  294. package/dist/pickers/timespan-picker.d.ts.map +1 -0
  295. package/dist/pickers/timespan-picker.jsx +99 -0
  296. package/dist/pickers/timespan-picker.jsx.map +1 -0
  297. package/dist/pickers/timespan.d.ts +38 -0
  298. package/dist/pickers/timespan.d.ts.map +1 -0
  299. package/dist/pickers/timespan.jsx +49 -0
  300. package/dist/pickers/timespan.jsx.map +1 -0
  301. package/dist/pickers/trigger.d.ts +34 -0
  302. package/dist/pickers/trigger.d.ts.map +1 -0
  303. package/dist/pickers/trigger.jsx +77 -0
  304. package/dist/pickers/trigger.jsx.map +1 -0
  305. package/dist/pickers/wheel-column.d.ts +32 -0
  306. package/dist/pickers/wheel-column.d.ts.map +1 -0
  307. package/dist/pickers/wheel-column.jsx +99 -0
  308. package/dist/pickers/wheel-column.jsx.map +1 -0
  309. package/dist/plus-button/index.d.ts +3 -0
  310. package/dist/plus-button/index.d.ts.map +1 -0
  311. package/dist/plus-button/index.jsx +2 -0
  312. package/dist/plus-button/model.d.ts +65 -0
  313. package/dist/plus-button/model.d.ts.map +1 -0
  314. package/dist/plus-button/model.jsx +86 -0
  315. package/dist/plus-button/model.jsx.map +1 -0
  316. package/dist/plus-button/plus-button.css +67 -0
  317. package/dist/plus-button/plus-button.css.map +1 -0
  318. package/dist/plus-button/plus-button.d.ts +38 -0
  319. package/dist/plus-button/plus-button.d.ts.map +1 -0
  320. package/dist/plus-button/plus-button.jsx +155 -0
  321. package/dist/plus-button/plus-button.jsx.map +1 -0
  322. package/dist/popup/frame.d.ts +101 -0
  323. package/dist/popup/frame.d.ts.map +1 -0
  324. package/dist/popup/frame.jsx +244 -0
  325. package/dist/popup/frame.jsx.map +1 -0
  326. package/dist/popup/index.d.ts +8 -0
  327. package/dist/popup/index.d.ts.map +1 -0
  328. package/dist/popup/index.jsx +7 -0
  329. package/dist/popup/input-form.d.ts +35 -0
  330. package/dist/popup/input-form.d.ts.map +1 -0
  331. package/dist/popup/input-form.jsx +160 -0
  332. package/dist/popup/input-form.jsx.map +1 -0
  333. package/dist/popup/input.d.ts +175 -0
  334. package/dist/popup/input.d.ts.map +1 -0
  335. package/dist/popup/input.jsx +176 -0
  336. package/dist/popup/input.jsx.map +1 -0
  337. package/dist/popup/popup-view.d.ts +25 -0
  338. package/dist/popup/popup-view.d.ts.map +1 -0
  339. package/dist/popup/popup-view.jsx +67 -0
  340. package/dist/popup/popup-view.jsx.map +1 -0
  341. package/dist/popup/popup.css +203 -0
  342. package/dist/popup/popup.css.map +1 -0
  343. package/dist/popup/queue.d.ts +90 -0
  344. package/dist/popup/queue.d.ts.map +1 -0
  345. package/dist/popup/queue.jsx +309 -0
  346. package/dist/popup/queue.jsx.map +1 -0
  347. package/dist/popup/service.d.ts +60 -0
  348. package/dist/popup/service.d.ts.map +1 -0
  349. package/dist/popup/service.jsx +342 -0
  350. package/dist/popup/service.jsx.map +1 -0
  351. package/dist/popup/types.d.ts +211 -0
  352. package/dist/popup/types.d.ts.map +1 -0
  353. package/dist/popup/types.jsx +218 -0
  354. package/dist/popup/types.jsx.map +1 -0
  355. package/dist/provider/contexts.d.ts +41 -0
  356. package/dist/provider/contexts.d.ts.map +1 -0
  357. package/dist/provider/contexts.jsx +11 -0
  358. package/dist/provider/contexts.jsx.map +1 -0
  359. package/dist/provider/global-events.d.ts +8 -0
  360. package/dist/provider/global-events.d.ts.map +1 -0
  361. package/dist/provider/global-events.jsx +17 -0
  362. package/dist/provider/global-events.jsx.map +1 -0
  363. package/dist/provider/hooks.d.ts +49 -0
  364. package/dist/provider/hooks.d.ts.map +1 -0
  365. package/dist/provider/hooks.jsx +72 -0
  366. package/dist/provider/hooks.jsx.map +1 -0
  367. package/dist/provider/index.d.ts +5 -0
  368. package/dist/provider/index.d.ts.map +1 -0
  369. package/dist/provider/index.jsx +3 -0
  370. package/dist/provider/provider.css +18 -0
  371. package/dist/provider/provider.css.map +1 -0
  372. package/dist/provider/provider.d.ts +51 -0
  373. package/dist/provider/provider.d.ts.map +1 -0
  374. package/dist/provider/provider.jsx +290 -0
  375. package/dist/provider/provider.jsx.map +1 -0
  376. package/dist/provider/settings.d.ts +99 -0
  377. package/dist/provider/settings.d.ts.map +1 -0
  378. package/dist/provider/settings.jsx +45 -0
  379. package/dist/provider/settings.jsx.map +1 -0
  380. package/dist/provider/theme-css.d.ts +12 -0
  381. package/dist/provider/theme-css.d.ts.map +1 -0
  382. package/dist/provider/theme-css.jsx +19 -0
  383. package/dist/provider/theme-css.jsx.map +1 -0
  384. package/dist/provider/theme-root.d.ts +10 -0
  385. package/dist/provider/theme-root.d.ts.map +1 -0
  386. package/dist/provider/theme-root.jsx +24 -0
  387. package/dist/provider/theme-root.jsx.map +1 -0
  388. package/dist/provider/theme.css +473 -0
  389. package/dist/provider/theme.css.map +1 -0
  390. package/dist/range-slider/index.d.ts +3 -0
  391. package/dist/range-slider/index.d.ts.map +1 -0
  392. package/dist/range-slider/index.jsx +2 -0
  393. package/dist/range-slider/math.d.ts +23 -0
  394. package/dist/range-slider/math.d.ts.map +1 -0
  395. package/dist/range-slider/math.jsx +71 -0
  396. package/dist/range-slider/math.jsx.map +1 -0
  397. package/dist/range-slider/range-slider.css +90 -0
  398. package/dist/range-slider/range-slider.css.map +1 -0
  399. package/dist/range-slider/range-slider.d.ts +52 -0
  400. package/dist/range-slider/range-slider.d.ts.map +1 -0
  401. package/dist/range-slider/range-slider.jsx +159 -0
  402. package/dist/range-slider/range-slider.jsx.map +1 -0
  403. package/dist/selection/index.d.ts +5 -0
  404. package/dist/selection/index.d.ts.map +1 -0
  405. package/dist/selection/index.jsx +3 -0
  406. package/dist/selection/model.d.ts +53 -0
  407. package/dist/selection/model.d.ts.map +1 -0
  408. package/dist/selection/model.jsx +69 -0
  409. package/dist/selection/model.jsx.map +1 -0
  410. package/dist/selection/selection-sheet.d.ts +80 -0
  411. package/dist/selection/selection-sheet.d.ts.map +1 -0
  412. package/dist/selection/selection-sheet.jsx +362 -0
  413. package/dist/selection/selection-sheet.jsx.map +1 -0
  414. package/dist/selection/selection.css +75 -0
  415. package/dist/selection/selection.css.map +1 -0
  416. package/dist/selection/use-selection-model.d.ts +9 -0
  417. package/dist/selection/use-selection-model.d.ts.map +1 -0
  418. package/dist/selection/use-selection-model.jsx +22 -0
  419. package/dist/selection/use-selection-model.jsx.map +1 -0
  420. package/dist/sheet/frame.d.ts +45 -0
  421. package/dist/sheet/frame.d.ts.map +1 -0
  422. package/dist/sheet/frame.jsx +205 -0
  423. package/dist/sheet/frame.jsx.map +1 -0
  424. package/dist/sheet/header.d.ts +35 -0
  425. package/dist/sheet/header.d.ts.map +1 -0
  426. package/dist/sheet/header.jsx +145 -0
  427. package/dist/sheet/header.jsx.map +1 -0
  428. package/dist/sheet/height-memo.d.ts +47 -0
  429. package/dist/sheet/height-memo.d.ts.map +1 -0
  430. package/dist/sheet/height-memo.jsx +100 -0
  431. package/dist/sheet/height-memo.jsx.map +1 -0
  432. package/dist/sheet/index.d.ts +11 -0
  433. package/dist/sheet/index.d.ts.map +1 -0
  434. package/dist/sheet/index.jsx +10 -0
  435. package/dist/sheet/loadable.d.ts +35 -0
  436. package/dist/sheet/loadable.d.ts.map +1 -0
  437. package/dist/sheet/loadable.jsx +65 -0
  438. package/dist/sheet/loadable.jsx.map +1 -0
  439. package/dist/sheet/options.d.ts +220 -0
  440. package/dist/sheet/options.d.ts.map +1 -0
  441. package/dist/sheet/options.jsx +91 -0
  442. package/dist/sheet/options.jsx.map +1 -0
  443. package/dist/sheet/processing.d.ts +22 -0
  444. package/dist/sheet/processing.d.ts.map +1 -0
  445. package/dist/sheet/processing.jsx +66 -0
  446. package/dist/sheet/processing.jsx.map +1 -0
  447. package/dist/sheet/service.d.ts +55 -0
  448. package/dist/sheet/service.d.ts.map +1 -0
  449. package/dist/sheet/service.jsx +143 -0
  450. package/dist/sheet/service.jsx.map +1 -0
  451. package/dist/sheet/sheet.css +195 -0
  452. package/dist/sheet/sheet.css.map +1 -0
  453. package/dist/sheet/sheet.d.ts +19 -0
  454. package/dist/sheet/sheet.d.ts.map +1 -0
  455. package/dist/sheet/sheet.jsx +40 -0
  456. package/dist/sheet/sheet.jsx.map +1 -0
  457. package/dist/sheet/sizing.d.ts +69 -0
  458. package/dist/sheet/sizing.d.ts.map +1 -0
  459. package/dist/sheet/sizing.jsx +146 -0
  460. package/dist/sheet/sizing.jsx.map +1 -0
  461. package/dist/sheet/stack.d.ts +161 -0
  462. package/dist/sheet/stack.d.ts.map +1 -0
  463. package/dist/sheet/stack.jsx +378 -0
  464. package/dist/sheet/stack.jsx.map +1 -0
  465. package/dist/swipe/index.d.ts +3 -0
  466. package/dist/swipe/index.d.ts.map +1 -0
  467. package/dist/swipe/index.jsx +2 -0
  468. package/dist/swipe/model.d.ts +72 -0
  469. package/dist/swipe/model.d.ts.map +1 -0
  470. package/dist/swipe/model.jsx +66 -0
  471. package/dist/swipe/model.jsx.map +1 -0
  472. package/dist/swipe/swipe-view.d.ts +40 -0
  473. package/dist/swipe/swipe-view.d.ts.map +1 -0
  474. package/dist/swipe/swipe-view.jsx +163 -0
  475. package/dist/swipe/swipe-view.jsx.map +1 -0
  476. package/dist/swipe/swipe.css +34 -0
  477. package/dist/swipe/swipe.css.map +1 -0
  478. package/dist/tab-bar/index.d.ts +4 -0
  479. package/dist/tab-bar/index.d.ts.map +1 -0
  480. package/dist/tab-bar/index.jsx +3 -0
  481. package/dist/tab-bar/metrics.d.ts +230 -0
  482. package/dist/tab-bar/metrics.d.ts.map +1 -0
  483. package/dist/tab-bar/metrics.jsx +221 -0
  484. package/dist/tab-bar/metrics.jsx.map +1 -0
  485. package/dist/tab-bar/model.d.ts +170 -0
  486. package/dist/tab-bar/model.d.ts.map +1 -0
  487. package/dist/tab-bar/model.jsx +349 -0
  488. package/dist/tab-bar/model.jsx.map +1 -0
  489. package/dist/tab-bar/tab-bar.css +173 -0
  490. package/dist/tab-bar/tab-bar.css.map +1 -0
  491. package/dist/tab-bar/tab-bar.d.ts +56 -0
  492. package/dist/tab-bar/tab-bar.d.ts.map +1 -0
  493. package/dist/tab-bar/tab-bar.jsx +343 -0
  494. package/dist/tab-bar/tab-bar.jsx.map +1 -0
  495. package/dist/tabs/index.d.ts +3 -0
  496. package/dist/tabs/index.d.ts.map +1 -0
  497. package/dist/tabs/index.jsx +2 -0
  498. package/dist/tabs/model.d.ts +83 -0
  499. package/dist/tabs/model.d.ts.map +1 -0
  500. package/dist/tabs/model.jsx +113 -0
  501. package/dist/tabs/model.jsx.map +1 -0
  502. package/dist/tabs/tab-view.d.ts +47 -0
  503. package/dist/tabs/tab-view.d.ts.map +1 -0
  504. package/dist/tabs/tab-view.jsx +227 -0
  505. package/dist/tabs/tab-view.jsx.map +1 -0
  506. package/dist/tabs/tabs.css +182 -0
  507. package/dist/tabs/tabs.css.map +1 -0
  508. package/dist/toast/index.d.ts +3 -0
  509. package/dist/toast/index.d.ts.map +1 -0
  510. package/dist/toast/index.jsx +2 -0
  511. package/dist/toast/service.d.ts +48 -0
  512. package/dist/toast/service.d.ts.map +1 -0
  513. package/dist/toast/service.jsx +201 -0
  514. package/dist/toast/service.jsx.map +1 -0
  515. package/dist/toast/store.d.ts +174 -0
  516. package/dist/toast/store.d.ts.map +1 -0
  517. package/dist/toast/store.jsx +353 -0
  518. package/dist/toast/store.jsx.map +1 -0
  519. package/dist/toast/toast.css +152 -0
  520. package/dist/toast/toast.css.map +1 -0
  521. package/dist/toggle/checkbox-math.d.ts +52 -0
  522. package/dist/toggle/checkbox-math.d.ts.map +1 -0
  523. package/dist/toggle/checkbox-math.jsx +111 -0
  524. package/dist/toggle/checkbox-math.jsx.map +1 -0
  525. package/dist/toggle/checkbox.d.ts +56 -0
  526. package/dist/toggle/checkbox.d.ts.map +1 -0
  527. package/dist/toggle/checkbox.jsx +152 -0
  528. package/dist/toggle/checkbox.jsx.map +1 -0
  529. package/dist/toggle/chip-group.d.ts +50 -0
  530. package/dist/toggle/chip-group.d.ts.map +1 -0
  531. package/dist/toggle/chip-group.jsx +107 -0
  532. package/dist/toggle/chip-group.jsx.map +1 -0
  533. package/dist/toggle/index.d.ts +5 -0
  534. package/dist/toggle/index.d.ts.map +1 -0
  535. package/dist/toggle/index.jsx +4 -0
  536. package/dist/toggle/switch.d.ts +52 -0
  537. package/dist/toggle/switch.d.ts.map +1 -0
  538. package/dist/toggle/switch.jsx +192 -0
  539. package/dist/toggle/switch.jsx.map +1 -0
  540. package/dist/toggle/toggle.css +189 -0
  541. package/dist/toggle/toggle.css.map +1 -0
  542. package/package.json +155 -4
  543. package/rspeedy/index.d.ts +21 -0
  544. package/rspeedy/index.mjs +75 -0
  545. package/rspeedy/index.test.mjs +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,EACd,qBAAqB,GACtB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,YAAY,EACZ,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,OAAO,GACR,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { createBackStack } from "./back.jsx";
2
+ export { useG9Activation, useG9Back, useG9HideKeyboard, useG9Host, useG9HostInsets, useG9HostReady, useG9LayerItem, useG9PanSoftInputMode } from "./hooks.jsx";
3
+ export { G9Host } from "./host.jsx";
4
+ export { acquirePanSoftInputMode, g9KeyboardTargetProps, isKeyboardTarget } from "./keyboard.jsx";
5
+ export { G9Layer, createLayerStore, g9LayerOrder, layerRank } from "./layers.jsx";
6
+ export { G9PageLoadingOverlay } from "./page-loading-overlay.jsx";
7
+ export { g9PageLoadingExitMs, g9PageLoadingWatchdogMarginMs } from "./readiness.jsx";
8
+ export { g9Hosts } from "./registry.jsx";
@@ -0,0 +1,24 @@
1
+ import type { G9HostServices } from '@g9tm/lynxcontrols-foundation';
2
+ /**
3
+ * Mark an element that takes keyboard focus (an `<input>`, `<textarea>`, or the field box around one) with these
4
+ * props. A tap on a marked element never dismisses the keyboard: focus moves between fields with the keyboard up
5
+ * (MAUI tap-outside rule, `Controls/G9Controls.md` §13).
6
+ */
7
+ export declare const g9KeyboardTargetProps: Readonly<{
8
+ 'data-g9keyboard': "target";
9
+ }>;
10
+ /**
11
+ * `true` when a tap target's dataset carries the {@link g9KeyboardTargetProps} mark. The key is one lower-case word
12
+ * so it reads the same whether the runtime keeps or camel-cases dataset keys.
13
+ */
14
+ export declare function isKeyboardTarget(target: {
15
+ readonly dataset?: Readonly<Record<string, unknown>>;
16
+ } | null | undefined): boolean;
17
+ /**
18
+ * Switches the window to pan the focused input above the keyboard while a flow needs it (MAUI
19
+ * `G9KeyboardHelper.UseAndroidPanSoftInputMode`). Returns an idempotent restore function; the default `'resize'`
20
+ * comes back when the last user restores. Users are counted per host, so overlapping sheets do not undo each other.
21
+ * On a host without soft-input modes (iOS, desktop: no `setSoftInputMode`) nothing changes, as in MAUI.
22
+ */
23
+ export declare function acquirePanSoftInputMode(host: G9HostServices): () => void;
24
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/host/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;EAAiD,CAAC;AAEpF;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAClF,OAAO,CAET;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,IAAI,CAcxE"}
@@ -0,0 +1,28 @@
1
+ const g9KeyboardTargetProps = Object.freeze({
2
+ 'data-g9keyboard': 'target'
3
+ });
4
+ function isKeyboardTarget(target) {
5
+ var _target_dataset;
6
+ return (null == target ? void 0 : null == (_target_dataset = target.dataset) ? void 0 : _target_dataset.g9keyboard) === 'target';
7
+ }
8
+ const panUsers = new WeakMap();
9
+ function acquirePanSoftInputMode(host) {
10
+ var _panUsers_get;
11
+ var _host_setSoftInputMode;
12
+ const setMode = null == (_host_setSoftInputMode = host.setSoftInputMode) ? void 0 : _host_setSoftInputMode.bind(host);
13
+ if (!setMode) return ()=>{};
14
+ const users = null != (_panUsers_get = panUsers.get(host)) ? _panUsers_get : 0;
15
+ panUsers.set(host, users + 1);
16
+ if (0 === users) setMode('pan');
17
+ let restored = false;
18
+ return ()=>{
19
+ if (restored) return;
20
+ restored = true;
21
+ const remaining = panUsers.get(host) - 1;
22
+ panUsers.set(host, remaining);
23
+ if (0 === remaining) setMode('resize');
24
+ };
25
+ }
26
+ export { acquirePanSoftInputMode, g9KeyboardTargetProps, isKeyboardTarget };
27
+
28
+ //# sourceMappingURL=keyboard.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host/keyboard.jsx","sources":["../../src/host/keyboard.ts"],"sourcesContent":["import type { G9HostServices } from '@g9tm/lynxcontrols-foundation';\n\n/**\n * Mark an element that takes keyboard focus (an `<input>`, `<textarea>`, or the field box around one) with these\n * props. A tap on a marked element never dismisses the keyboard: focus moves between fields with the keyboard up\n * (MAUI tap-outside rule, `Controls/G9Controls.md` §13).\n */\nexport const g9KeyboardTargetProps = Object.freeze({ 'data-g9keyboard': 'target' });\n\n/**\n * `true` when a tap target's dataset carries the {@link g9KeyboardTargetProps} mark. The key is one lower-case word\n * so it reads the same whether the runtime keeps or camel-cases dataset keys.\n */\nexport function isKeyboardTarget(\n target: { readonly dataset?: Readonly<Record<string, unknown>> } | null | undefined,\n): boolean {\n return target?.dataset?.g9keyboard === 'target';\n}\n\nconst panUsers = new WeakMap<G9HostServices, number>();\n\n/**\n * Switches the window to pan the focused input above the keyboard while a flow needs it (MAUI\n * `G9KeyboardHelper.UseAndroidPanSoftInputMode`). Returns an idempotent restore function; the default `'resize'`\n * comes back when the last user restores. Users are counted per host, so overlapping sheets do not undo each other.\n * On a host without soft-input modes (iOS, desktop: no `setSoftInputMode`) nothing changes, as in MAUI.\n */\nexport function acquirePanSoftInputMode(host: G9HostServices): () => void {\n const setMode = host.setSoftInputMode?.bind(host);\n if (!setMode) return () => {};\n const users = panUsers.get(host) ?? 0;\n panUsers.set(host, users + 1);\n if (users === 0) setMode('pan');\n let restored = false;\n return () => {\n if (restored) return;\n restored = true;\n const remaining = (panUsers.get(host) as number) - 1;\n panUsers.set(host, remaining);\n if (remaining === 0) setMode('resize');\n };\n}\n"],"names":["g9KeyboardTargetProps","Object","isKeyboardTarget","target","_target_dataset","panUsers","WeakMap","acquirePanSoftInputMode","host","_panUsers_get","_host_setSoftInputMode","setMode","users","restored","remaining"],"mappings":"AAOO,MAAMA,wBAAwBC,OAAO,MAAM,CAAC;IAAE,mBAAmB;AAAS;AAM1E,SAASC,iBACdC,MAAmF;QAE5EC;IAAP,OAAOA,AAAAA,CAAAA,QAAAA,SAAAA,KAAAA,IAAAA,QAAAA,CAAAA,kBAAAA,OAAQ,OAAO,AAAD,IAAdA,KAAAA,IAAAA,gBAAiB,UAAU,AAAD,MAAM;AACzC;AAEA,MAAMC,WAAW,IAAIC;AAQd,SAASC,wBAAwBC,IAAoB;QAG5CC;QAFEC;IAAhB,MAAMC,UAAU,QAAAD,CAAAA,yBAAAA,KAAK,gBAAgB,AAAD,IAApBA,KAAAA,IAAAA,uBAAuB,IAAI,CAACF;IAC5C,IAAI,CAACG,SAAS,OAAO,KAAO;IAC5B,MAAMC,QAAQ,QAAAH,CAAAA,gBAAAA,SAAS,GAAG,CAACD,KAAI,IAAjBC,gBAAsB;IACpCJ,SAAS,GAAG,CAACG,MAAMI,QAAQ;IAC3B,IAAIA,AAAU,MAAVA,OAAaD,QAAQ;IACzB,IAAIE,WAAW;IACf,OAAO;QACL,IAAIA,UAAU;QACdA,WAAW;QACX,MAAMC,YAAaT,SAAS,GAAG,CAACG,QAAmB;QACnDH,SAAS,GAAG,CAACG,MAAMM;QACnB,IAAIA,AAAc,MAAdA,WAAiBH,QAAQ;IAC/B;AACF"}
@@ -0,0 +1,69 @@
1
+ import type { ReactNode } from '@lynx-js/react';
2
+ /**
3
+ * The page layers a `G9Host` owns, bottom to top (plan/specs/01 §5, MAUI `G9PageTemplate.xaml` z-stack). Sibling order
4
+ * is the z-order; nothing relies on `z-index`.
5
+ *
6
+ * | Layer | MAUI template host | Holds |
7
+ * | --- | --- | --- |
8
+ * | `content` | `ContentHost` | the page itself (painted over `BackdropHost`) |
9
+ * | `edgePanel` | (page content) | side panels sliding over the content (WP06) |
10
+ * | `sheets` | `OverlayHost` | bottom sheets and their scrims (WP05) |
11
+ * | `popups` | `G9PopupHost` | popups (WP07) |
12
+ * | `feedback` | `ToastHost` | toasts, loaders, progress overlays: above sheets and popups |
13
+ * | `floating` | `DevHost` | always-available floating affordances (developer FAB, QA pill) |
14
+ *
15
+ * Only the page-loading cover sits above `floating`.
16
+ */
17
+ export declare const G9Layer: {
18
+ readonly Content: "content";
19
+ readonly EdgePanel: "edgePanel";
20
+ readonly Sheets: "sheets";
21
+ readonly Popups: "popups";
22
+ readonly Feedback: "feedback";
23
+ readonly Floating: "floating";
24
+ };
25
+ export type G9Layer = (typeof G9Layer)[keyof typeof G9Layer];
26
+ /** Every layer, bottom to top. */
27
+ export declare const g9LayerOrder: readonly G9Layer[];
28
+ /** The layers items can be registered into (`content` is the page's own children). */
29
+ export type G9OverlayLayer = Exclude<G9Layer, 'content'>;
30
+ /** Position of `layer` in the z-stack (0 = bottom). */
31
+ export declare function layerRank(layer: G9Layer): number;
32
+ /** One thing mounted into a layer. */
33
+ export interface G9LayerItem {
34
+ /** Identity within the layer. Registering an existing key replaces its element and order in place. */
35
+ readonly key: string;
36
+ /** What to render. */
37
+ readonly element: ReactNode;
38
+ /** Ordering inside the layer: lower paints first (below). Ties keep registration order (later on top). Default 0. */
39
+ readonly order?: number;
40
+ }
41
+ /** A registered item as the layer renders it. */
42
+ export interface G9LayerEntry {
43
+ readonly key: string;
44
+ readonly element: ReactNode;
45
+ readonly order: number;
46
+ /** Registration sequence; stable while the key stays registered. */
47
+ readonly sequence: number;
48
+ }
49
+ /** The items of every overlay layer of one host. */
50
+ export interface G9LayerStore {
51
+ /** The layer's items, bottom first. The same array until the layer changes. */
52
+ getSnapshot(layer: G9OverlayLayer): ReadonlyArray<G9LayerEntry>;
53
+ /** Called after each change of `layer`. Returns an unsubscribe function. */
54
+ subscribe(layer: G9OverlayLayer, listener: () => void): () => void;
55
+ /**
56
+ * Mounts `item` into `layer` (or replaces the item with the same key). Returns a function that removes exactly this
57
+ * registration: it does nothing once the key was removed or registered again by someone else.
58
+ */
59
+ register(layer: G9OverlayLayer, item: G9LayerItem): () => void;
60
+ /** Removes the item with `key`; `false` when there was none. */
61
+ remove(layer: G9OverlayLayer, key: string): boolean;
62
+ /** Number of items in `layer`. */
63
+ count(layer: G9OverlayLayer): number;
64
+ /** Removes every item of every layer (host unmount). */
65
+ clear(): void;
66
+ }
67
+ /** Creates an empty {@link G9LayerStore}. */
68
+ export declare function createLayerStore(): G9LayerStore;
69
+ //# sourceMappingURL=layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/host/layers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AACX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAE7D,kCAAkC;AAClC,eAAO,MAAM,YAAY,EAAE,SAAS,OAAO,EAOzC,CAAC;AAEH,sFAAsF;AACtF,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAEzD,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIhD;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,sGAAsG;IACtG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,qHAAqH;IACrH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAChE,4EAA4E;IAC5E,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACnE;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI,CAAC;IAC/D,gEAAgE;IAChE,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACpD,kCAAkC;IAClC,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAAC;IACrC,wDAAwD;IACxD,KAAK,IAAI,IAAI,CAAC;CACf;AAsBD,6CAA6C;AAC7C,wBAAgB,gBAAgB,IAAI,YAAY,CAsE/C"}
@@ -0,0 +1,111 @@
1
+ import { G9Error } from "@g9tm/lynxcontrols-foundation";
2
+ const G9Layer = {
3
+ Content: 'content',
4
+ EdgePanel: 'edgePanel',
5
+ Sheets: 'sheets',
6
+ Popups: 'popups',
7
+ Feedback: 'feedback',
8
+ Floating: 'floating'
9
+ };
10
+ const g9LayerOrder = Object.freeze([
11
+ 'content',
12
+ 'edgePanel',
13
+ 'sheets',
14
+ 'popups',
15
+ 'feedback',
16
+ 'floating'
17
+ ]);
18
+ function layerRank(layer) {
19
+ const rank = g9LayerOrder.indexOf(layer);
20
+ if (rank < 0) throw new G9Error('host-layer', `"${String(layer)}" is not a G9 layer.`);
21
+ return rank;
22
+ }
23
+ const EMPTY = Object.freeze([]);
24
+ function checkLayer(layer) {
25
+ if ('content' === layer) throw new G9Error('host-layer', 'The content layer holds the page itself; register items into an overlay layer.');
26
+ layerRank(layer);
27
+ }
28
+ function checkItem(item) {
29
+ var _item_order;
30
+ if ('string' != typeof (null == item ? void 0 : item.key) || '' === item.key) throw new G9Error('host-layer-item', 'A layer item needs a non-empty string key.');
31
+ const order = null != (_item_order = item.order) ? _item_order : 0;
32
+ if ('number' != typeof order || !Number.isFinite(order)) throw new G9Error('host-layer-item', `Layer item "${item.key}" has an invalid order (${String(order)}).`);
33
+ return order;
34
+ }
35
+ function createLayerStore() {
36
+ const layers = new Map();
37
+ const snapshots = new Map();
38
+ const listeners = new Map();
39
+ let sequence = 0;
40
+ function changed(layer) {
41
+ var _ref, _listeners_get;
42
+ var _layers_get;
43
+ const entries = Array.from(null != (_ref = null == (_layers_get = layers.get(layer)) ? void 0 : _layers_get.values()) ? _ref : []);
44
+ entries.sort((a, b)=>a.order - b.order || a.sequence - b.sequence);
45
+ snapshots.set(layer, entries.length ? Object.freeze(entries) : EMPTY);
46
+ for (const listener of Array.from(null != (_listeners_get = listeners.get(layer)) ? _listeners_get : []))listener();
47
+ }
48
+ const store = {
49
+ getSnapshot (layer) {
50
+ var _snapshots_get;
51
+ return null != (_snapshots_get = snapshots.get(layer)) ? _snapshots_get : EMPTY;
52
+ },
53
+ subscribe (layer, listener) {
54
+ checkLayer(layer);
55
+ let set = listeners.get(layer);
56
+ if (!set) {
57
+ set = new Set();
58
+ listeners.set(layer, set);
59
+ }
60
+ set.add(listener);
61
+ return ()=>{
62
+ set.delete(listener);
63
+ };
64
+ },
65
+ register (layer, item) {
66
+ checkLayer(layer);
67
+ const order = checkItem(item);
68
+ let entries = layers.get(layer);
69
+ if (!entries) {
70
+ entries = new Map();
71
+ layers.set(layer, entries);
72
+ }
73
+ const existing = entries.get(item.key);
74
+ sequence += 1;
75
+ const entry = Object.freeze({
76
+ key: item.key,
77
+ element: item.element,
78
+ order,
79
+ sequence: existing ? existing.sequence : sequence
80
+ });
81
+ entries.set(item.key, entry);
82
+ changed(layer);
83
+ return ()=>{
84
+ var _layers_get;
85
+ if ((null == (_layers_get = layers.get(layer)) ? void 0 : _layers_get.get(item.key)) === entry) store.remove(layer, item.key);
86
+ };
87
+ },
88
+ remove (layer, key) {
89
+ checkLayer(layer);
90
+ const entries = layers.get(layer);
91
+ if (!(null == entries ? void 0 : entries.delete(key))) return false;
92
+ changed(layer);
93
+ return true;
94
+ },
95
+ count (layer) {
96
+ var _ref;
97
+ var _layers_get;
98
+ return null != (_ref = null == (_layers_get = layers.get(layer)) ? void 0 : _layers_get.size) ? _ref : 0;
99
+ },
100
+ clear () {
101
+ for (const [layer, entries] of Array.from(layers))if (0 !== entries.size) {
102
+ entries.clear();
103
+ changed(layer);
104
+ }
105
+ }
106
+ };
107
+ return store;
108
+ }
109
+ export { G9Layer, createLayerStore, g9LayerOrder, layerRank };
110
+
111
+ //# sourceMappingURL=layers.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host/layers.jsx","sources":["../../src/host/layers.ts"],"sourcesContent":["import { G9Error } from '@g9tm/lynxcontrols-foundation';\nimport type { ReactNode } from '@lynx-js/react';\n\n/**\n * The page layers a `G9Host` owns, bottom to top (plan/specs/01 §5, MAUI `G9PageTemplate.xaml` z-stack). Sibling order\n * is the z-order; nothing relies on `z-index`.\n *\n * | Layer | MAUI template host | Holds |\n * | --- | --- | --- |\n * | `content` | `ContentHost` | the page itself (painted over `BackdropHost`) |\n * | `edgePanel` | (page content) | side panels sliding over the content (WP06) |\n * | `sheets` | `OverlayHost` | bottom sheets and their scrims (WP05) |\n * | `popups` | `G9PopupHost` | popups (WP07) |\n * | `feedback` | `ToastHost` | toasts, loaders, progress overlays: above sheets and popups |\n * | `floating` | `DevHost` | always-available floating affordances (developer FAB, QA pill) |\n *\n * Only the page-loading cover sits above `floating`.\n */\nexport const G9Layer = {\n Content: 'content',\n EdgePanel: 'edgePanel',\n Sheets: 'sheets',\n Popups: 'popups',\n Feedback: 'feedback',\n Floating: 'floating',\n} as const;\nexport type G9Layer = (typeof G9Layer)[keyof typeof G9Layer];\n\n/** Every layer, bottom to top. */\nexport const g9LayerOrder: readonly G9Layer[] = Object.freeze([\n 'content',\n 'edgePanel',\n 'sheets',\n 'popups',\n 'feedback',\n 'floating',\n]);\n\n/** The layers items can be registered into (`content` is the page's own children). */\nexport type G9OverlayLayer = Exclude<G9Layer, 'content'>;\n\n/** Position of `layer` in the z-stack (0 = bottom). */\nexport function layerRank(layer: G9Layer): number {\n const rank = g9LayerOrder.indexOf(layer);\n if (rank < 0) throw new G9Error('host-layer', `\"${String(layer)}\" is not a G9 layer.`);\n return rank;\n}\n\n/** One thing mounted into a layer. */\nexport interface G9LayerItem {\n /** Identity within the layer. Registering an existing key replaces its element and order in place. */\n readonly key: string;\n /** What to render. */\n readonly element: ReactNode;\n /** Ordering inside the layer: lower paints first (below). Ties keep registration order (later on top). Default 0. */\n readonly order?: number;\n}\n\n/** A registered item as the layer renders it. */\nexport interface G9LayerEntry {\n readonly key: string;\n readonly element: ReactNode;\n readonly order: number;\n /** Registration sequence; stable while the key stays registered. */\n readonly sequence: number;\n}\n\n/** The items of every overlay layer of one host. */\nexport interface G9LayerStore {\n /** The layer's items, bottom first. The same array until the layer changes. */\n getSnapshot(layer: G9OverlayLayer): ReadonlyArray<G9LayerEntry>;\n /** Called after each change of `layer`. Returns an unsubscribe function. */\n subscribe(layer: G9OverlayLayer, listener: () => void): () => void;\n /**\n * Mounts `item` into `layer` (or replaces the item with the same key). Returns a function that removes exactly this\n * registration: it does nothing once the key was removed or registered again by someone else.\n */\n register(layer: G9OverlayLayer, item: G9LayerItem): () => void;\n /** Removes the item with `key`; `false` when there was none. */\n remove(layer: G9OverlayLayer, key: string): boolean;\n /** Number of items in `layer`. */\n count(layer: G9OverlayLayer): number;\n /** Removes every item of every layer (host unmount). */\n clear(): void;\n}\n\nconst EMPTY: ReadonlyArray<G9LayerEntry> = Object.freeze([]);\n\nfunction checkLayer(layer: G9OverlayLayer): void {\n if (layer === ('content' as G9Layer)) {\n throw new G9Error('host-layer', 'The content layer holds the page itself; register items into an overlay layer.');\n }\n layerRank(layer);\n}\n\nfunction checkItem(item: G9LayerItem): number {\n if (typeof item?.key !== 'string' || item.key === '') {\n throw new G9Error('host-layer-item', 'A layer item needs a non-empty string key.');\n }\n const order = item.order ?? 0;\n if (typeof order !== 'number' || !Number.isFinite(order)) {\n throw new G9Error('host-layer-item', `Layer item \"${item.key}\" has an invalid order (${String(order)}).`);\n }\n return order;\n}\n\n/** Creates an empty {@link G9LayerStore}. */\nexport function createLayerStore(): G9LayerStore {\n const layers = new Map<G9OverlayLayer, Map<string, G9LayerEntry>>();\n const snapshots = new Map<G9OverlayLayer, ReadonlyArray<G9LayerEntry>>();\n const listeners = new Map<G9OverlayLayer, Set<() => void>>();\n let sequence = 0;\n\n function changed(layer: G9OverlayLayer): void {\n const entries = Array.from(layers.get(layer)?.values() ?? []);\n entries.sort((a, b) => a.order - b.order || a.sequence - b.sequence);\n snapshots.set(layer, entries.length ? Object.freeze(entries) : EMPTY);\n for (const listener of Array.from(listeners.get(layer) ?? [])) listener();\n }\n\n const store: G9LayerStore = {\n getSnapshot(layer) {\n return snapshots.get(layer) ?? EMPTY;\n },\n subscribe(layer, listener) {\n checkLayer(layer);\n let set = listeners.get(layer);\n if (!set) {\n set = new Set();\n listeners.set(layer, set);\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n register(layer, item) {\n checkLayer(layer);\n const order = checkItem(item);\n let entries = layers.get(layer);\n if (!entries) {\n entries = new Map();\n layers.set(layer, entries);\n }\n const existing = entries.get(item.key);\n sequence += 1;\n const entry: G9LayerEntry = Object.freeze({\n key: item.key,\n element: item.element,\n order,\n sequence: existing ? existing.sequence : sequence,\n });\n entries.set(item.key, entry);\n changed(layer);\n return () => {\n if (layers.get(layer)?.get(item.key) === entry) store.remove(layer, item.key);\n };\n },\n remove(layer, key) {\n checkLayer(layer);\n const entries = layers.get(layer);\n if (!entries?.delete(key)) return false;\n changed(layer);\n return true;\n },\n count(layer) {\n return layers.get(layer)?.size ?? 0;\n },\n clear() {\n for (const [layer, entries] of Array.from(layers)) {\n if (entries.size === 0) continue;\n entries.clear();\n changed(layer);\n }\n },\n };\n return store;\n}\n"],"names":["G9Layer","g9LayerOrder","Object","layerRank","layer","rank","G9Error","String","EMPTY","checkLayer","checkItem","item","_item_order","order","Number","createLayerStore","layers","Map","snapshots","listeners","sequence","changed","_listeners_get","_layers_get","entries","Array","a","b","listener","store","_snapshots_get","set","Set","existing","entry","key"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from '@lynx-js/react';
2
+ /** Props of {@link G9PageLoadingOverlay}. */
3
+ export interface G9PageLoadingOverlayProps {
4
+ /** Play the exit (scale to 0.9 and fade, 200 ms). */
5
+ readonly exiting?: boolean;
6
+ /** Cover colour. Default the theme's `Primary`. */
7
+ readonly backgroundColor?: string;
8
+ /** Spinner colour. Default the theme's `OnPrimary`. */
9
+ readonly spinnerColor?: string;
10
+ }
11
+ /**
12
+ * The full-screen cover that hides a page while it assembles itself (MAUI `G9PageLoadingOverlay`): input-opaque, a
13
+ * centred 48 px spinner, the top of the host's z-stack. `G9Host` mounts it and removes it after its exit; set the app
14
+ * default colours with `settings.pageLoading` (match the native splash colour for a seamless hand-off).
15
+ */
16
+ export declare function G9PageLoadingOverlay(props: G9PageLoadingOverlayProps): ReactNode;
17
+ //# sourceMappingURL=page-loading-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-loading-overlay.d.ts","sourceRoot":"","sources":["../../src/host/page-loading-overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,6CAA6C;AAC7C,MAAM,WAAW,yBAAyB;IACxC,qDAAqD;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,uDAAuD;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAKD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,SAAS,CAahF"}
@@ -0,0 +1,16 @@
1
+ const spinnerStyle = (color)=>({
2
+ borderLeftColor: color,
3
+ borderRightColor: color,
4
+ borderBottomColor: color
5
+ });
6
+ function G9PageLoadingOverlay(props) {
7
+ var _props_backgroundColor, _props_spinnerColor;
8
+ return <view className={`g9-page-loading${props.exiting ? ' g9-page-loading--exiting' : ''}`} style={{
9
+ backgroundColor: null != (_props_backgroundColor = props.backgroundColor) ? _props_backgroundColor : 'var(--g9-primary)'
10
+ }} accessibility-element={true} accessibility-label="Loading" catchtap={()=>{}}>
11
+ <view className="g9-page-loading__spinner" style={spinnerStyle(null != (_props_spinnerColor = props.spinnerColor) ? _props_spinnerColor : 'var(--g9-on-primary)')}/>
12
+ </view>;
13
+ }
14
+ export { G9PageLoadingOverlay };
15
+
16
+ //# sourceMappingURL=page-loading-overlay.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host/page-loading-overlay.jsx","sources":["../../src/host/page-loading-overlay.tsx"],"sourcesContent":["import type { ReactNode } from '@lynx-js/react';\n\n/** Props of {@link G9PageLoadingOverlay}. */\nexport interface G9PageLoadingOverlayProps {\n /** Play the exit (scale to 0.9 and fade, 200 ms). */\n readonly exiting?: boolean;\n /** Cover colour. Default the theme's `Primary`. */\n readonly backgroundColor?: string;\n /** Spinner colour. Default the theme's `OnPrimary`. */\n readonly spinnerColor?: string;\n}\n\n// Three coloured sides and a transparent top make the rotating arc (inline styles win over the class).\nconst spinnerStyle = (color: string) => ({ borderLeftColor: color, borderRightColor: color, borderBottomColor: color });\n\n/**\n * The full-screen cover that hides a page while it assembles itself (MAUI `G9PageLoadingOverlay`): input-opaque, a\n * centred 48 px spinner, the top of the host's z-stack. `G9Host` mounts it and removes it after its exit; set the app\n * default colours with `settings.pageLoading` (match the native splash colour for a seamless hand-off).\n */\nexport function G9PageLoadingOverlay(props: G9PageLoadingOverlayProps): ReactNode {\n return (\n <view\n className={`g9-page-loading${props.exiting ? ' g9-page-loading--exiting' : ''}`}\n style={{ backgroundColor: props.backgroundColor ?? 'var(--g9-primary)' }}\n accessibility-element={true}\n accessibility-label=\"Loading\"\n // Input-opaque on purpose: a tap must not reach a control that is not wired up yet (MAUI).\n catchtap={() => {}}\n >\n <view className=\"g9-page-loading__spinner\" style={spinnerStyle(props.spinnerColor ?? 'var(--g9-on-primary)')} />\n </view>\n );\n}\n"],"names":["spinnerStyle","color","G9PageLoadingOverlay","props","_props_backgroundColor","_props_spinnerColor","view"],"mappings":"AAaA,MAAMA,eAAe,CAACC,QAAmB;QAAE,iBAAiBA;QAAO,kBAAkBA;QAAO,mBAAmBA;IAAM;AAO9G,SAASC,qBAAqBC,KAAgC;QAIrCC,wBAMqCC;IATnE,QACGC,KACC,WAAW,CAAC,eAAe,EAAEH,MAAM,OAAO,GAAG,8BAA8B,IAAI,EAC/E,OAAO;QAAE,iBAAiB,QAAAC,CAAAA,yBAAAA,MAAM,eAAe,AAAD,IAApBA,yBAAyB;IAAoB,GACvE,uBAAuB,MACvB,oBAAoB,UAEpB,UAAU,KAAO,GAClB;MACC,CAACE,KAAK,UAAU,2BAA2B,OAAON,aAAa,QAAAK,CAAAA,sBAAAA,MAAM,YAAY,AAAD,IAAjBA,sBAAsB,0BAA2B;IAClH,EAAEC;AAEN"}
@@ -0,0 +1,57 @@
1
+ import { type G9AbortSignal } from '@g9tm/lynxcontrols-foundation';
2
+ /** Duration of the cover's exit (MAUI: scale to 0.9 and fade out together, 200 ms, cubic-in). */
3
+ export declare const g9PageLoadingExitMs = 200;
4
+ /** Margin of the cover's watchdog behind the normal path (MAUI `RunPageLoadingWatchdogAsync`). */
5
+ export declare const g9PageLoadingWatchdogMarginMs = 500;
6
+ /** State of a host's page-loading cover and ready signal. */
7
+ export interface G9HostReadinessSnapshot {
8
+ /** The page reported itself ready: automatically after `onAppearing`, or by `release()`. Latched. */
9
+ readonly ready: boolean;
10
+ /** `'covering'` while the cover hides the page, `'exiting'` during its 200 ms exit, `'hidden'` otherwise. */
11
+ readonly cover: 'covering' | 'exiting' | 'hidden';
12
+ /** The cover is gone for good (it is one-shot per host, as in MAUI). */
13
+ readonly dismissed: boolean;
14
+ }
15
+ /** A host's readiness, as pages and outside code use it (MAUI `G9PageBase` loading-overlay members). */
16
+ export interface G9HostReadiness {
17
+ getSnapshot(): G9HostReadinessSnapshot;
18
+ subscribe(listener: (snapshot: G9HostReadinessSnapshot) => void): () => void;
19
+ /**
20
+ * Reports the page visually ready (MAUI `ReleasePageLoadingOverlay`): the cover leaves after the dismiss delay.
21
+ * Idempotent; calling it before the page appeared, or after the cover left, is harmless.
22
+ */
23
+ release(): void;
24
+ /** Settles once the cover has fully left, or at once when it never showed (MAUI `PageLoadingOverlayDismissed`). */
25
+ whenDismissed(): Promise<void>;
26
+ }
27
+ /** Inputs of {@link createHostReadiness}. */
28
+ export interface G9HostReadinessOptions {
29
+ /** Whether the host shows the cover at all. */
30
+ readonly cover: boolean;
31
+ /** The page releases itself (MAUI `PageLoadingManualRelease`). */
32
+ readonly manualRelease: boolean;
33
+ readonly dismissDelayMs: number;
34
+ readonly safetyTimeoutMs: number;
35
+ /** The page's appearing work (MAUI `OnAppearingAfterParentAsync`); aborted when the page disappears. */
36
+ readonly runAppearing: (signal: G9AbortSignal) => Promise<void>;
37
+ /** Holds a busy activity while the cover is up (MAUI `G9Diagnostics.Activity("page:…")`); returns its release. */
38
+ readonly startActivity?: () => () => void;
39
+ }
40
+ /** The host-side driver of {@link G9HostReadiness}. */
41
+ export interface G9HostReadinessController extends G9HostReadiness {
42
+ /** The page became visible (mount, or `active` turned on). */
43
+ appear(): void;
44
+ /** The page stopped being visible; an in-flight appearing run is aborted and the cover leaves. */
45
+ disappear(): void;
46
+ /** Unmount: stops every timer and settles `whenDismissed`. */
47
+ dispose(): void;
48
+ }
49
+ /**
50
+ * The MAUI page-loading lifecycle (`RunAppearingWithOverlayDismissAsync`, the watchdog and
51
+ * `DismissPageLoadingOverlayAsync`): on the first appearance run the appearing work, then (auto pages) report ready,
52
+ * wait for ready, wait the dismiss delay, and dismiss. Every wait is bounded by the safety timeout measured from the
53
+ * appearance, and a watchdog (safety + delay + 500 ms) dismisses even if the run never ends. Disappearing aborts the
54
+ * run and dismisses. Dismissal is one-shot; later appearances only run the appearing work.
55
+ */
56
+ export declare function createHostReadiness(options: G9HostReadinessOptions): G9HostReadinessController;
57
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../src/host/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG1F,iGAAiG;AACjG,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,kGAAkG;AAClG,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACtC,qGAAqG;IACrG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,6GAA6G;IAC7G,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAClD,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,wGAAwG;AACxG,MAAM,WAAW,eAAe;IAC9B,WAAW,IAAI,uBAAuB,CAAC;IACvC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,uBAAuB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC7E;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAC;IAChB,mHAAmH;IACnH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,wGAAwG;IACxG,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,kHAAkH;IAClH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,MAAM,IAAI,CAAC;CAC3C;AAED,uDAAuD;AACvD,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,8DAA8D;IAC9D,MAAM,IAAI,IAAI,CAAC;IACf,kGAAkG;IAClG,SAAS,IAAI,IAAI,CAAC;IAClB,8DAA8D;IAC9D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,yBAAyB,CAiI9F"}
@@ -0,0 +1,138 @@
1
+ import { createAbortController } from "@g9tm/lynxcontrols-foundation";
2
+ import { createDisposer } from "../base/disposer.jsx";
3
+ const g9PageLoadingExitMs = 200;
4
+ const g9PageLoadingWatchdogMarginMs = 500;
5
+ function createHostReadiness(options) {
6
+ const disposer = createDisposer();
7
+ const listeners = new Set();
8
+ let snapshot = Object.freeze({
9
+ ready: false,
10
+ cover: options.cover ? 'covering' : 'hidden',
11
+ dismissed: !options.cover
12
+ });
13
+ let resolveDismissed;
14
+ const dismissedPromise = new Promise((resolve)=>{
15
+ resolveDismissed = resolve;
16
+ });
17
+ if (!options.cover) resolveDismissed();
18
+ let readyWaiters = [];
19
+ let releaseActivity = options.cover && options.startActivity ? options.startActivity() : null;
20
+ let running = null;
21
+ function set(patch) {
22
+ snapshot = Object.freeze({
23
+ ...snapshot,
24
+ ...patch
25
+ });
26
+ if (disposer.disposed) return;
27
+ for (const listener of Array.from(listeners))listener(snapshot);
28
+ }
29
+ function stopActivity() {
30
+ const release = releaseActivity;
31
+ releaseActivity = null;
32
+ null == release || release();
33
+ }
34
+ function dismiss() {
35
+ if (snapshot.dismissed) return;
36
+ stopActivity();
37
+ set({
38
+ dismissed: true,
39
+ cover: 'exiting'
40
+ });
41
+ disposer.setTimeout(()=>{
42
+ set({
43
+ cover: 'hidden'
44
+ });
45
+ resolveDismissed();
46
+ }, g9PageLoadingExitMs);
47
+ }
48
+ function release() {
49
+ if (snapshot.ready) return;
50
+ set({
51
+ ready: true
52
+ });
53
+ const waiters = readyWaiters;
54
+ readyWaiters = [];
55
+ for (const waiter of waiters)waiter();
56
+ }
57
+ function race(signal, start) {
58
+ return new Promise((resolve)=>{
59
+ if (signal.aborted) return resolve(false);
60
+ const onAbort = ()=>resolve(false);
61
+ signal.addEventListener('abort', onAbort);
62
+ start(()=>{
63
+ signal.removeEventListener('abort', onAbort);
64
+ resolve(true);
65
+ });
66
+ });
67
+ }
68
+ async function run() {
69
+ const controller = createAbortController();
70
+ const signal = controller.signal;
71
+ running = {
72
+ abort: ()=>controller.abort()
73
+ };
74
+ const cancelSafety = disposer.setTimeout(()=>controller.abort(), options.safetyTimeoutMs);
75
+ try {
76
+ const appeared = await race(signal, (done)=>{
77
+ options.runAppearing(signal).then(done, done);
78
+ });
79
+ if (!appeared) return;
80
+ if (!options.manualRelease) release();
81
+ const ready = await race(signal, (done)=>{
82
+ if (snapshot.ready) done();
83
+ else readyWaiters.push(done);
84
+ });
85
+ if (!ready) return;
86
+ await race(signal, (done)=>{
87
+ disposer.setTimeout(done, options.dismissDelayMs);
88
+ });
89
+ } finally{
90
+ cancelSafety();
91
+ running = null;
92
+ if (!disposer.disposed) dismiss();
93
+ }
94
+ }
95
+ const controller = {
96
+ getSnapshot: ()=>snapshot,
97
+ subscribe (listener) {
98
+ listeners.add(listener);
99
+ return ()=>{
100
+ listeners.delete(listener);
101
+ };
102
+ },
103
+ release,
104
+ whenDismissed: ()=>dismissedPromise,
105
+ appear () {
106
+ if (disposer.disposed) return;
107
+ if (snapshot.dismissed) {
108
+ const appearance = createAbortController();
109
+ null == running || running.abort();
110
+ running = {
111
+ abort: ()=>appearance.abort()
112
+ };
113
+ options.runAppearing(appearance.signal).then(()=>{
114
+ if (!options.manualRelease) release();
115
+ }, ()=>{});
116
+ return;
117
+ }
118
+ if (running) return;
119
+ disposer.setTimeout(dismiss, options.safetyTimeoutMs + options.dismissDelayMs + g9PageLoadingWatchdogMarginMs);
120
+ run();
121
+ },
122
+ disappear () {
123
+ null == running || running.abort();
124
+ },
125
+ dispose () {
126
+ if (disposer.disposed) return;
127
+ null == running || running.abort();
128
+ stopActivity();
129
+ disposer.dispose();
130
+ readyWaiters = [];
131
+ resolveDismissed();
132
+ }
133
+ };
134
+ return controller;
135
+ }
136
+ export { createHostReadiness, g9PageLoadingExitMs, g9PageLoadingWatchdogMarginMs };
137
+
138
+ //# sourceMappingURL=readiness.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host/readiness.jsx","sources":["../../src/host/readiness.ts"],"sourcesContent":["import { createAbortController, type G9AbortSignal } from '@g9tm/lynxcontrols-foundation';\nimport { createDisposer } from '../base/disposer';\n\n/** Duration of the cover's exit (MAUI: scale to 0.9 and fade out together, 200 ms, cubic-in). */\nexport const g9PageLoadingExitMs = 200;\n/** Margin of the cover's watchdog behind the normal path (MAUI `RunPageLoadingWatchdogAsync`). */\nexport const g9PageLoadingWatchdogMarginMs = 500;\n\n/** State of a host's page-loading cover and ready signal. */\nexport interface G9HostReadinessSnapshot {\n /** The page reported itself ready: automatically after `onAppearing`, or by `release()`. Latched. */\n readonly ready: boolean;\n /** `'covering'` while the cover hides the page, `'exiting'` during its 200 ms exit, `'hidden'` otherwise. */\n readonly cover: 'covering' | 'exiting' | 'hidden';\n /** The cover is gone for good (it is one-shot per host, as in MAUI). */\n readonly dismissed: boolean;\n}\n\n/** A host's readiness, as pages and outside code use it (MAUI `G9PageBase` loading-overlay members). */\nexport interface G9HostReadiness {\n getSnapshot(): G9HostReadinessSnapshot;\n subscribe(listener: (snapshot: G9HostReadinessSnapshot) => void): () => void;\n /**\n * Reports the page visually ready (MAUI `ReleasePageLoadingOverlay`): the cover leaves after the dismiss delay.\n * Idempotent; calling it before the page appeared, or after the cover left, is harmless.\n */\n release(): void;\n /** Settles once the cover has fully left, or at once when it never showed (MAUI `PageLoadingOverlayDismissed`). */\n whenDismissed(): Promise<void>;\n}\n\n/** Inputs of {@link createHostReadiness}. */\nexport interface G9HostReadinessOptions {\n /** Whether the host shows the cover at all. */\n readonly cover: boolean;\n /** The page releases itself (MAUI `PageLoadingManualRelease`). */\n readonly manualRelease: boolean;\n readonly dismissDelayMs: number;\n readonly safetyTimeoutMs: number;\n /** The page's appearing work (MAUI `OnAppearingAfterParentAsync`); aborted when the page disappears. */\n readonly runAppearing: (signal: G9AbortSignal) => Promise<void>;\n /** Holds a busy activity while the cover is up (MAUI `G9Diagnostics.Activity(\"page:…\")`); returns its release. */\n readonly startActivity?: () => () => void;\n}\n\n/** The host-side driver of {@link G9HostReadiness}. */\nexport interface G9HostReadinessController extends G9HostReadiness {\n /** The page became visible (mount, or `active` turned on). */\n appear(): void;\n /** The page stopped being visible; an in-flight appearing run is aborted and the cover leaves. */\n disappear(): void;\n /** Unmount: stops every timer and settles `whenDismissed`. */\n dispose(): void;\n}\n\n/**\n * The MAUI page-loading lifecycle (`RunAppearingWithOverlayDismissAsync`, the watchdog and\n * `DismissPageLoadingOverlayAsync`): on the first appearance run the appearing work, then (auto pages) report ready,\n * wait for ready, wait the dismiss delay, and dismiss. Every wait is bounded by the safety timeout measured from the\n * appearance, and a watchdog (safety + delay + 500 ms) dismisses even if the run never ends. Disappearing aborts the\n * run and dismisses. Dismissal is one-shot; later appearances only run the appearing work.\n */\nexport function createHostReadiness(options: G9HostReadinessOptions): G9HostReadinessController {\n const disposer = createDisposer();\n const listeners = new Set<(snapshot: G9HostReadinessSnapshot) => void>();\n let snapshot: G9HostReadinessSnapshot = Object.freeze({\n ready: false,\n cover: options.cover ? 'covering' : 'hidden',\n dismissed: !options.cover,\n });\n let resolveDismissed!: () => void;\n const dismissedPromise = new Promise<void>((resolve) => {\n resolveDismissed = resolve;\n });\n if (!options.cover) resolveDismissed();\n let readyWaiters: Array<() => void> = [];\n let releaseActivity: (() => void) | null = options.cover && options.startActivity ? options.startActivity() : null;\n let running: { abort(): void } | null = null;\n\n function set(patch: Partial<G9HostReadinessSnapshot>): void {\n snapshot = Object.freeze({ ...snapshot, ...patch });\n if (disposer.disposed) return;\n for (const listener of Array.from(listeners)) listener(snapshot);\n }\n\n function stopActivity(): void {\n const release = releaseActivity;\n releaseActivity = null;\n release?.();\n }\n\n function dismiss(): void {\n if (snapshot.dismissed) return;\n // Released before the exit animation: the page is usable the moment dismissal starts (MAUI).\n stopActivity();\n set({ dismissed: true, cover: 'exiting' });\n disposer.setTimeout(() => {\n set({ cover: 'hidden' });\n resolveDismissed();\n }, g9PageLoadingExitMs);\n }\n\n function release(): void {\n if (snapshot.ready) return;\n set({ ready: true });\n const waiters = readyWaiters;\n readyWaiters = [];\n for (const waiter of waiters) waiter();\n }\n\n /** Resolves `true` when `start` settles, `false` when the run is aborted first. */\n function race(signal: G9AbortSignal, start: (done: () => void) => void): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n if (signal.aborted) return resolve(false);\n const onAbort = () => resolve(false);\n signal.addEventListener('abort', onAbort);\n start(() => {\n signal.removeEventListener('abort', onAbort);\n resolve(true);\n });\n });\n }\n\n async function run(): Promise<void> {\n const controller = createAbortController();\n const signal = controller.signal;\n running = { abort: () => controller.abort() };\n const cancelSafety = disposer.setTimeout(() => controller.abort(), options.safetyTimeoutMs);\n try {\n const appeared = await race(signal, (done) => {\n options.runAppearing(signal).then(done, done);\n });\n if (!appeared) return;\n if (!options.manualRelease) release();\n const ready = await race(signal, (done) => {\n if (snapshot.ready) done();\n else readyWaiters.push(done);\n });\n if (!ready) return;\n await race(signal, (done) => {\n disposer.setTimeout(done, options.dismissDelayMs);\n });\n } finally {\n cancelSafety();\n running = null;\n if (!disposer.disposed) dismiss();\n }\n }\n\n const controller: G9HostReadinessController = {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n release,\n whenDismissed: () => dismissedPromise,\n appear() {\n if (disposer.disposed) return;\n if (snapshot.dismissed) {\n const appearance = createAbortController();\n running?.abort();\n running = { abort: () => appearance.abort() };\n options.runAppearing(appearance.signal).then(\n () => {\n if (!options.manualRelease) release();\n },\n () => {},\n );\n return;\n }\n if (running) return;\n // The first appearance with the cover up (every later one finds it dismissed): start the watchdog once.\n disposer.setTimeout(dismiss, options.safetyTimeoutMs + options.dismissDelayMs + g9PageLoadingWatchdogMarginMs);\n void run();\n },\n disappear() {\n running?.abort();\n },\n dispose() {\n if (disposer.disposed) return;\n running?.abort();\n stopActivity();\n disposer.dispose();\n readyWaiters = [];\n resolveDismissed();\n },\n };\n return controller;\n}\n"],"names":["g9PageLoadingExitMs","g9PageLoadingWatchdogMarginMs","createHostReadiness","options","disposer","createDisposer","listeners","Set","snapshot","Object","resolveDismissed","dismissedPromise","Promise","resolve","readyWaiters","releaseActivity","running","set","patch","listener","Array","stopActivity","release","dismiss","waiters","waiter","race","signal","start","onAbort","run","controller","createAbortController","cancelSafety","appeared","done","ready","appearance"],"mappings":"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"}