@g9tm/lynxcontrols 0.0.0-stage → 1.4.2

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 (561) hide show
  1. package/README.md +29 -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 +68 -0
  6. package/dist/base/control.d.ts.map +1 -0
  7. package/dist/base/control.jsx +36 -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 +88 -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 +96 -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 +73 -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 +112 -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 +164 -0
  171. package/dist/fields/fields.css.map +1 -0
  172. package/dist/fields/index.d.ts +13 -0
  173. package/dist/fields/index.d.ts.map +1 -0
  174. package/dist/fields/index.jsx +12 -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/notch.d.ts +10 -0
  180. package/dist/fields/notch.d.ts.map +1 -0
  181. package/dist/fields/notch.jsx +9 -0
  182. package/dist/fields/notch.jsx.map +1 -0
  183. package/dist/fields/outlined-field.d.ts +152 -0
  184. package/dist/fields/outlined-field.d.ts.map +1 -0
  185. package/dist/fields/outlined-field.jsx +199 -0
  186. package/dist/fields/outlined-field.jsx.map +1 -0
  187. package/dist/fields/pin-entry.d.ts +65 -0
  188. package/dist/fields/pin-entry.d.ts.map +1 -0
  189. package/dist/fields/pin-entry.jsx +294 -0
  190. package/dist/fields/pin-entry.jsx.map +1 -0
  191. package/dist/fields/search-entry.d.ts +35 -0
  192. package/dist/fields/search-entry.d.ts.map +1 -0
  193. package/dist/fields/search-entry.jsx +118 -0
  194. package/dist/fields/search-entry.jsx.map +1 -0
  195. package/dist/fields/slot-layout.d.ts +33 -0
  196. package/dist/fields/slot-layout.d.ts.map +1 -0
  197. package/dist/fields/slot-layout.jsx +33 -0
  198. package/dist/fields/slot-layout.jsx.map +1 -0
  199. package/dist/fields/text-entry.d.ts +62 -0
  200. package/dist/fields/text-entry.d.ts.map +1 -0
  201. package/dist/fields/text-entry.jsx +82 -0
  202. package/dist/fields/text-entry.jsx.map +1 -0
  203. package/dist/fields/use-dictation.d.ts +34 -0
  204. package/dist/fields/use-dictation.d.ts.map +1 -0
  205. package/dist/fields/use-dictation.jsx +80 -0
  206. package/dist/fields/use-dictation.jsx.map +1 -0
  207. package/dist/fields/use-text-input.d.ts +150 -0
  208. package/dist/fields/use-text-input.d.ts.map +1 -0
  209. package/dist/fields/use-text-input.jsx +247 -0
  210. package/dist/fields/use-text-input.jsx.map +1 -0
  211. package/dist/fields/validator.d.ts +14 -0
  212. package/dist/fields/validator.d.ts.map +1 -0
  213. package/dist/fields/validator.jsx +20 -0
  214. package/dist/fields/validator.jsx.map +1 -0
  215. package/dist/host/back.d.ts +42 -0
  216. package/dist/host/back.d.ts.map +1 -0
  217. package/dist/host/back.jsx +47 -0
  218. package/dist/host/back.jsx.map +1 -0
  219. package/dist/host/hooks.d.ts +90 -0
  220. package/dist/host/hooks.d.ts.map +1 -0
  221. package/dist/host/hooks.jsx +166 -0
  222. package/dist/host/hooks.jsx.map +1 -0
  223. package/dist/host/host.css +81 -0
  224. package/dist/host/host.css.map +1 -0
  225. package/dist/host/host.d.ts +70 -0
  226. package/dist/host/host.d.ts.map +1 -0
  227. package/dist/host/host.jsx +229 -0
  228. package/dist/host/host.jsx.map +1 -0
  229. package/dist/host/index.d.ts +9 -0
  230. package/dist/host/index.d.ts.map +1 -0
  231. package/dist/host/index.jsx +8 -0
  232. package/dist/host/keyboard.d.ts +24 -0
  233. package/dist/host/keyboard.d.ts.map +1 -0
  234. package/dist/host/keyboard.jsx +28 -0
  235. package/dist/host/keyboard.jsx.map +1 -0
  236. package/dist/host/layers.d.ts +69 -0
  237. package/dist/host/layers.d.ts.map +1 -0
  238. package/dist/host/layers.jsx +111 -0
  239. package/dist/host/layers.jsx.map +1 -0
  240. package/dist/host/page-loading-overlay.d.ts +17 -0
  241. package/dist/host/page-loading-overlay.d.ts.map +1 -0
  242. package/dist/host/page-loading-overlay.jsx +16 -0
  243. package/dist/host/page-loading-overlay.jsx.map +1 -0
  244. package/dist/host/readiness.d.ts +57 -0
  245. package/dist/host/readiness.d.ts.map +1 -0
  246. package/dist/host/readiness.jsx +138 -0
  247. package/dist/host/readiness.jsx.map +1 -0
  248. package/dist/host/registry.d.ts +106 -0
  249. package/dist/host/registry.d.ts.map +1 -0
  250. package/dist/host/registry.jsx +93 -0
  251. package/dist/host/registry.jsx.map +1 -0
  252. package/dist/icon/icon.css +39 -0
  253. package/dist/icon/icon.css.map +1 -0
  254. package/dist/icon/icon.d.ts +57 -0
  255. package/dist/icon/icon.d.ts.map +1 -0
  256. package/dist/icon/icon.jsx +115 -0
  257. package/dist/icon/icon.jsx.map +1 -0
  258. package/dist/icon/index.d.ts +4 -0
  259. package/dist/icon/index.d.ts.map +1 -0
  260. package/dist/icon/index.jsx +3 -0
  261. package/dist/icon/slot.d.ts +45 -0
  262. package/dist/icon/slot.d.ts.map +1 -0
  263. package/dist/icon/slot.jsx +61 -0
  264. package/dist/icon/slot.jsx.map +1 -0
  265. package/dist/icon/swatch.d.ts +29 -0
  266. package/dist/icon/swatch.d.ts.map +1 -0
  267. package/dist/icon/swatch.jsx +25 -0
  268. package/dist/icon/swatch.jsx.map +1 -0
  269. package/dist/index.d.ts +23 -0
  270. package/dist/index.d.ts.map +1 -0
  271. package/dist/index.jsx +1 -0
  272. package/dist/pickers/combo-box.d.ts +42 -0
  273. package/dist/pickers/combo-box.d.ts.map +1 -0
  274. package/dist/pickers/combo-box.jsx +129 -0
  275. package/dist/pickers/combo-box.jsx.map +1 -0
  276. package/dist/pickers/date-time-picker.d.ts +63 -0
  277. package/dist/pickers/date-time-picker.d.ts.map +1 -0
  278. package/dist/pickers/date-time-picker.jsx +141 -0
  279. package/dist/pickers/date-time-picker.jsx.map +1 -0
  280. package/dist/pickers/date-time.d.ts +82 -0
  281. package/dist/pickers/date-time.d.ts.map +1 -0
  282. package/dist/pickers/date-time.jsx +130 -0
  283. package/dist/pickers/date-time.jsx.map +1 -0
  284. package/dist/pickers/index.d.ts +10 -0
  285. package/dist/pickers/index.d.ts.map +1 -0
  286. package/dist/pickers/index.jsx +9 -0
  287. package/dist/pickers/picker-sheet.d.ts +21 -0
  288. package/dist/pickers/picker-sheet.d.ts.map +1 -0
  289. package/dist/pickers/picker-sheet.jsx +61 -0
  290. package/dist/pickers/picker-sheet.jsx.map +1 -0
  291. package/dist/pickers/picker.d.ts +32 -0
  292. package/dist/pickers/picker.d.ts.map +1 -0
  293. package/dist/pickers/picker.jsx +72 -0
  294. package/dist/pickers/picker.jsx.map +1 -0
  295. package/dist/pickers/pickers.css +219 -0
  296. package/dist/pickers/pickers.css.map +1 -0
  297. package/dist/pickers/timespan-picker.d.ts +36 -0
  298. package/dist/pickers/timespan-picker.d.ts.map +1 -0
  299. package/dist/pickers/timespan-picker.jsx +99 -0
  300. package/dist/pickers/timespan-picker.jsx.map +1 -0
  301. package/dist/pickers/timespan.d.ts +38 -0
  302. package/dist/pickers/timespan.d.ts.map +1 -0
  303. package/dist/pickers/timespan.jsx +49 -0
  304. package/dist/pickers/timespan.jsx.map +1 -0
  305. package/dist/pickers/trigger.d.ts +34 -0
  306. package/dist/pickers/trigger.d.ts.map +1 -0
  307. package/dist/pickers/trigger.jsx +77 -0
  308. package/dist/pickers/trigger.jsx.map +1 -0
  309. package/dist/pickers/wheel-column.d.ts +32 -0
  310. package/dist/pickers/wheel-column.d.ts.map +1 -0
  311. package/dist/pickers/wheel-column.jsx +99 -0
  312. package/dist/pickers/wheel-column.jsx.map +1 -0
  313. package/dist/plus-button/index.d.ts +3 -0
  314. package/dist/plus-button/index.d.ts.map +1 -0
  315. package/dist/plus-button/index.jsx +2 -0
  316. package/dist/plus-button/model.d.ts +65 -0
  317. package/dist/plus-button/model.d.ts.map +1 -0
  318. package/dist/plus-button/model.jsx +86 -0
  319. package/dist/plus-button/model.jsx.map +1 -0
  320. package/dist/plus-button/plus-button.css +67 -0
  321. package/dist/plus-button/plus-button.css.map +1 -0
  322. package/dist/plus-button/plus-button.d.ts +38 -0
  323. package/dist/plus-button/plus-button.d.ts.map +1 -0
  324. package/dist/plus-button/plus-button.jsx +155 -0
  325. package/dist/plus-button/plus-button.jsx.map +1 -0
  326. package/dist/popup/frame.d.ts +101 -0
  327. package/dist/popup/frame.d.ts.map +1 -0
  328. package/dist/popup/frame.jsx +252 -0
  329. package/dist/popup/frame.jsx.map +1 -0
  330. package/dist/popup/index.d.ts +8 -0
  331. package/dist/popup/index.d.ts.map +1 -0
  332. package/dist/popup/index.jsx +7 -0
  333. package/dist/popup/input-form.d.ts +35 -0
  334. package/dist/popup/input-form.d.ts.map +1 -0
  335. package/dist/popup/input-form.jsx +160 -0
  336. package/dist/popup/input-form.jsx.map +1 -0
  337. package/dist/popup/input.d.ts +175 -0
  338. package/dist/popup/input.d.ts.map +1 -0
  339. package/dist/popup/input.jsx +176 -0
  340. package/dist/popup/input.jsx.map +1 -0
  341. package/dist/popup/popup-view.d.ts +25 -0
  342. package/dist/popup/popup-view.d.ts.map +1 -0
  343. package/dist/popup/popup-view.jsx +67 -0
  344. package/dist/popup/popup-view.jsx.map +1 -0
  345. package/dist/popup/popup.css +203 -0
  346. package/dist/popup/popup.css.map +1 -0
  347. package/dist/popup/queue.d.ts +90 -0
  348. package/dist/popup/queue.d.ts.map +1 -0
  349. package/dist/popup/queue.jsx +309 -0
  350. package/dist/popup/queue.jsx.map +1 -0
  351. package/dist/popup/service.d.ts +60 -0
  352. package/dist/popup/service.d.ts.map +1 -0
  353. package/dist/popup/service.jsx +350 -0
  354. package/dist/popup/service.jsx.map +1 -0
  355. package/dist/popup/types.d.ts +222 -0
  356. package/dist/popup/types.d.ts.map +1 -0
  357. package/dist/popup/types.jsx +218 -0
  358. package/dist/popup/types.jsx.map +1 -0
  359. package/dist/provider/contexts.d.ts +41 -0
  360. package/dist/provider/contexts.d.ts.map +1 -0
  361. package/dist/provider/contexts.jsx +11 -0
  362. package/dist/provider/contexts.jsx.map +1 -0
  363. package/dist/provider/global-events.d.ts +8 -0
  364. package/dist/provider/global-events.d.ts.map +1 -0
  365. package/dist/provider/global-events.jsx +17 -0
  366. package/dist/provider/global-events.jsx.map +1 -0
  367. package/dist/provider/hooks.d.ts +49 -0
  368. package/dist/provider/hooks.d.ts.map +1 -0
  369. package/dist/provider/hooks.jsx +72 -0
  370. package/dist/provider/hooks.jsx.map +1 -0
  371. package/dist/provider/index.d.ts +5 -0
  372. package/dist/provider/index.d.ts.map +1 -0
  373. package/dist/provider/index.jsx +3 -0
  374. package/dist/provider/provider.css +18 -0
  375. package/dist/provider/provider.css.map +1 -0
  376. package/dist/provider/provider.d.ts +51 -0
  377. package/dist/provider/provider.d.ts.map +1 -0
  378. package/dist/provider/provider.jsx +290 -0
  379. package/dist/provider/provider.jsx.map +1 -0
  380. package/dist/provider/settings.d.ts +99 -0
  381. package/dist/provider/settings.d.ts.map +1 -0
  382. package/dist/provider/settings.jsx +45 -0
  383. package/dist/provider/settings.jsx.map +1 -0
  384. package/dist/provider/theme-css.d.ts +12 -0
  385. package/dist/provider/theme-css.d.ts.map +1 -0
  386. package/dist/provider/theme-css.jsx +19 -0
  387. package/dist/provider/theme-css.jsx.map +1 -0
  388. package/dist/provider/theme-root.d.ts +10 -0
  389. package/dist/provider/theme-root.d.ts.map +1 -0
  390. package/dist/provider/theme-root.jsx +24 -0
  391. package/dist/provider/theme-root.jsx.map +1 -0
  392. package/dist/provider/theme.css +473 -0
  393. package/dist/provider/theme.css.map +1 -0
  394. package/dist/range-slider/index.d.ts +3 -0
  395. package/dist/range-slider/index.d.ts.map +1 -0
  396. package/dist/range-slider/index.jsx +2 -0
  397. package/dist/range-slider/math.d.ts +23 -0
  398. package/dist/range-slider/math.d.ts.map +1 -0
  399. package/dist/range-slider/math.jsx +71 -0
  400. package/dist/range-slider/math.jsx.map +1 -0
  401. package/dist/range-slider/range-slider.css +90 -0
  402. package/dist/range-slider/range-slider.css.map +1 -0
  403. package/dist/range-slider/range-slider.d.ts +52 -0
  404. package/dist/range-slider/range-slider.d.ts.map +1 -0
  405. package/dist/range-slider/range-slider.jsx +159 -0
  406. package/dist/range-slider/range-slider.jsx.map +1 -0
  407. package/dist/selection/index.d.ts +5 -0
  408. package/dist/selection/index.d.ts.map +1 -0
  409. package/dist/selection/index.jsx +3 -0
  410. package/dist/selection/model.d.ts +53 -0
  411. package/dist/selection/model.d.ts.map +1 -0
  412. package/dist/selection/model.jsx +69 -0
  413. package/dist/selection/model.jsx.map +1 -0
  414. package/dist/selection/selection-sheet.d.ts +80 -0
  415. package/dist/selection/selection-sheet.d.ts.map +1 -0
  416. package/dist/selection/selection-sheet.jsx +366 -0
  417. package/dist/selection/selection-sheet.jsx.map +1 -0
  418. package/dist/selection/selection.css +76 -0
  419. package/dist/selection/selection.css.map +1 -0
  420. package/dist/selection/use-selection-model.d.ts +9 -0
  421. package/dist/selection/use-selection-model.d.ts.map +1 -0
  422. package/dist/selection/use-selection-model.jsx +22 -0
  423. package/dist/selection/use-selection-model.jsx.map +1 -0
  424. package/dist/sheet/frame.d.ts +47 -0
  425. package/dist/sheet/frame.d.ts.map +1 -0
  426. package/dist/sheet/frame.jsx +270 -0
  427. package/dist/sheet/frame.jsx.map +1 -0
  428. package/dist/sheet/gesture.d.ts +51 -0
  429. package/dist/sheet/gesture.d.ts.map +1 -0
  430. package/dist/sheet/gesture.jsx +107 -0
  431. package/dist/sheet/gesture.jsx.map +1 -0
  432. package/dist/sheet/handoff.d.ts +32 -0
  433. package/dist/sheet/handoff.d.ts.map +1 -0
  434. package/dist/sheet/handoff.jsx +33 -0
  435. package/dist/sheet/handoff.jsx.map +1 -0
  436. package/dist/sheet/header.d.ts +46 -0
  437. package/dist/sheet/header.d.ts.map +1 -0
  438. package/dist/sheet/header.jsx +158 -0
  439. package/dist/sheet/header.jsx.map +1 -0
  440. package/dist/sheet/height-memo.d.ts +47 -0
  441. package/dist/sheet/height-memo.d.ts.map +1 -0
  442. package/dist/sheet/height-memo.jsx +100 -0
  443. package/dist/sheet/height-memo.jsx.map +1 -0
  444. package/dist/sheet/index.d.ts +12 -0
  445. package/dist/sheet/index.d.ts.map +1 -0
  446. package/dist/sheet/index.jsx +11 -0
  447. package/dist/sheet/loadable.d.ts +35 -0
  448. package/dist/sheet/loadable.d.ts.map +1 -0
  449. package/dist/sheet/loadable.jsx +65 -0
  450. package/dist/sheet/loadable.jsx.map +1 -0
  451. package/dist/sheet/motion.d.ts +59 -0
  452. package/dist/sheet/motion.d.ts.map +1 -0
  453. package/dist/sheet/motion.jsx +59 -0
  454. package/dist/sheet/motion.jsx.map +1 -0
  455. package/dist/sheet/options.d.ts +252 -0
  456. package/dist/sheet/options.d.ts.map +1 -0
  457. package/dist/sheet/options.jsx +92 -0
  458. package/dist/sheet/options.jsx.map +1 -0
  459. package/dist/sheet/processing.d.ts +22 -0
  460. package/dist/sheet/processing.d.ts.map +1 -0
  461. package/dist/sheet/processing.jsx +66 -0
  462. package/dist/sheet/processing.jsx.map +1 -0
  463. package/dist/sheet/service.d.ts +55 -0
  464. package/dist/sheet/service.d.ts.map +1 -0
  465. package/dist/sheet/service.jsx +143 -0
  466. package/dist/sheet/service.jsx.map +1 -0
  467. package/dist/sheet/sheet.css +246 -0
  468. package/dist/sheet/sheet.css.map +1 -0
  469. package/dist/sheet/sheet.d.ts +19 -0
  470. package/dist/sheet/sheet.d.ts.map +1 -0
  471. package/dist/sheet/sheet.jsx +40 -0
  472. package/dist/sheet/sheet.jsx.map +1 -0
  473. package/dist/sheet/sizing.d.ts +87 -0
  474. package/dist/sheet/sizing.d.ts.map +1 -0
  475. package/dist/sheet/sizing.jsx +159 -0
  476. package/dist/sheet/sizing.jsx.map +1 -0
  477. package/dist/sheet/stack.d.ts +161 -0
  478. package/dist/sheet/stack.d.ts.map +1 -0
  479. package/dist/sheet/stack.jsx +378 -0
  480. package/dist/sheet/stack.jsx.map +1 -0
  481. package/dist/swipe/index.d.ts +3 -0
  482. package/dist/swipe/index.d.ts.map +1 -0
  483. package/dist/swipe/index.jsx +2 -0
  484. package/dist/swipe/model.d.ts +72 -0
  485. package/dist/swipe/model.d.ts.map +1 -0
  486. package/dist/swipe/model.jsx +66 -0
  487. package/dist/swipe/model.jsx.map +1 -0
  488. package/dist/swipe/swipe-view.d.ts +40 -0
  489. package/dist/swipe/swipe-view.d.ts.map +1 -0
  490. package/dist/swipe/swipe-view.jsx +163 -0
  491. package/dist/swipe/swipe-view.jsx.map +1 -0
  492. package/dist/swipe/swipe.css +34 -0
  493. package/dist/swipe/swipe.css.map +1 -0
  494. package/dist/tab-bar/index.d.ts +4 -0
  495. package/dist/tab-bar/index.d.ts.map +1 -0
  496. package/dist/tab-bar/index.jsx +3 -0
  497. package/dist/tab-bar/metrics.d.ts +230 -0
  498. package/dist/tab-bar/metrics.d.ts.map +1 -0
  499. package/dist/tab-bar/metrics.jsx +221 -0
  500. package/dist/tab-bar/metrics.jsx.map +1 -0
  501. package/dist/tab-bar/model.d.ts +170 -0
  502. package/dist/tab-bar/model.d.ts.map +1 -0
  503. package/dist/tab-bar/model.jsx +349 -0
  504. package/dist/tab-bar/model.jsx.map +1 -0
  505. package/dist/tab-bar/tab-bar.css +173 -0
  506. package/dist/tab-bar/tab-bar.css.map +1 -0
  507. package/dist/tab-bar/tab-bar.d.ts +61 -0
  508. package/dist/tab-bar/tab-bar.d.ts.map +1 -0
  509. package/dist/tab-bar/tab-bar.jsx +346 -0
  510. package/dist/tab-bar/tab-bar.jsx.map +1 -0
  511. package/dist/tabs/index.d.ts +3 -0
  512. package/dist/tabs/index.d.ts.map +1 -0
  513. package/dist/tabs/index.jsx +2 -0
  514. package/dist/tabs/model.d.ts +83 -0
  515. package/dist/tabs/model.d.ts.map +1 -0
  516. package/dist/tabs/model.jsx +113 -0
  517. package/dist/tabs/model.jsx.map +1 -0
  518. package/dist/tabs/tab-view.d.ts +47 -0
  519. package/dist/tabs/tab-view.d.ts.map +1 -0
  520. package/dist/tabs/tab-view.jsx +227 -0
  521. package/dist/tabs/tab-view.jsx.map +1 -0
  522. package/dist/tabs/tabs.css +182 -0
  523. package/dist/tabs/tabs.css.map +1 -0
  524. package/dist/toast/index.d.ts +3 -0
  525. package/dist/toast/index.d.ts.map +1 -0
  526. package/dist/toast/index.jsx +2 -0
  527. package/dist/toast/service.d.ts +48 -0
  528. package/dist/toast/service.d.ts.map +1 -0
  529. package/dist/toast/service.jsx +238 -0
  530. package/dist/toast/service.jsx.map +1 -0
  531. package/dist/toast/store.d.ts +176 -0
  532. package/dist/toast/store.d.ts.map +1 -0
  533. package/dist/toast/store.jsx +355 -0
  534. package/dist/toast/store.jsx.map +1 -0
  535. package/dist/toast/toast.css +159 -0
  536. package/dist/toast/toast.css.map +1 -0
  537. package/dist/toggle/checkbox-math.d.ts +52 -0
  538. package/dist/toggle/checkbox-math.d.ts.map +1 -0
  539. package/dist/toggle/checkbox-math.jsx +111 -0
  540. package/dist/toggle/checkbox-math.jsx.map +1 -0
  541. package/dist/toggle/checkbox.d.ts +56 -0
  542. package/dist/toggle/checkbox.d.ts.map +1 -0
  543. package/dist/toggle/checkbox.jsx +152 -0
  544. package/dist/toggle/checkbox.jsx.map +1 -0
  545. package/dist/toggle/chip-group.d.ts +50 -0
  546. package/dist/toggle/chip-group.d.ts.map +1 -0
  547. package/dist/toggle/chip-group.jsx +107 -0
  548. package/dist/toggle/chip-group.jsx.map +1 -0
  549. package/dist/toggle/index.d.ts +5 -0
  550. package/dist/toggle/index.d.ts.map +1 -0
  551. package/dist/toggle/index.jsx +4 -0
  552. package/dist/toggle/switch.d.ts +52 -0
  553. package/dist/toggle/switch.d.ts.map +1 -0
  554. package/dist/toggle/switch.jsx +192 -0
  555. package/dist/toggle/switch.jsx.map +1 -0
  556. package/dist/toggle/toggle.css +188 -0
  557. package/dist/toggle/toggle.css.map +1 -0
  558. package/package.json +155 -4
  559. package/rspeedy/index.d.ts +21 -0
  560. package/rspeedy/index.mjs +75 -0
  561. package/rspeedy/index.test.mjs +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/provider/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,cAAc,EACnB,KAAK,aAAa,EAElB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAGlB,KAAK,cAAc,EACnB,KAAK,YAAY,EAIlB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,KAAK,SAAS,EAA8D,MAAM,gBAAgB,CAAC;AAgB5G,OAAO,EAAE,KAAK,UAAU,EAA4C,MAAM,YAAY,CAAC;AAEvF,OAAO,gBAAgB,CAAC;AACxB,OAAO,aAAa,CAAC;AAErB,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,cAAc,CAAC;IAC/C,kHAAkH;IAClH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B;AA6BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,CA8N5D"}
@@ -0,0 +1,290 @@
1
+ import { assertRequiredCapabilities, createCultureStore, createDiagnostics, createIconFontRegistry, createPreferences, createSafeExecutor, createStrings, createThemeStore, toCssVariables, toLayoutCssVariables, toMetricCssVariables } from "@g9tm/lynxcontrols-foundation";
2
+ import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from "@lynx-js/react";
3
+ import { useStableCallback } from "../base/use-stable-callback.jsx";
4
+ import { g9Hosts } from "../host/registry.jsx";
5
+ import { G9CoreContext, G9CultureContext, G9DiagnosticsContext, G9InsetsContext, G9KeyboardContext, G9SettingsContext, G9WindowContext } from "./contexts.jsx";
6
+ import { addGlobalListener } from "./global-events.jsx";
7
+ import { g9DefaultErrorPresenter, resolveSettings } from "./settings.jsx";
8
+ import { applyThemeVariables, changedVariables } from "./theme-root.jsx";
9
+ import "./provider.css";
10
+ import "./theme.css";
11
+ const THEME_PREFERENCE_KEY = 'theme';
12
+ const THEME_MODES = [
13
+ 'system',
14
+ 'light',
15
+ 'dark'
16
+ ];
17
+ let providerSequence = 0;
18
+ function isCultureStore(value) {
19
+ return 'object' == typeof value && null !== value && 'function' == typeof value.getSnapshot;
20
+ }
21
+ function isThemeStore(value) {
22
+ return 'object' == typeof value && null !== value && 'function' == typeof value.getSnapshot;
23
+ }
24
+ function initialWindow() {
25
+ var _ref, _ref1;
26
+ const info = globalThis.SystemInfo;
27
+ const ratio = (null == info ? void 0 : info.pixelRatio) && info.pixelRatio > 0 ? info.pixelRatio : 1;
28
+ return Object.freeze({
29
+ width: (null != (_ref = null == info ? void 0 : info.pixelWidth) ? _ref : 0) / ratio,
30
+ height: (null != (_ref1 = null == info ? void 0 : info.pixelHeight) ? _ref1 : 0) / ratio
31
+ });
32
+ }
33
+ const HIDDEN_KEYBOARD = Object.freeze({
34
+ visible: false,
35
+ height: 0,
36
+ compatHeight: 0
37
+ });
38
+ function finite(value) {
39
+ return 'number' == typeof value && Number.isFinite(value) && value > 0 ? value : 0;
40
+ }
41
+ function G9Provider(props) {
42
+ var _props_diagnostics, _props_culture;
43
+ const { services, persistTheme = true } = props;
44
+ assertRequiredCapabilities(services);
45
+ const [ownDiagnostics] = useState(createDiagnostics);
46
+ const diagnostics = null != (_props_diagnostics = props.diagnostics) ? _props_diagnostics : ownDiagnostics;
47
+ const [iconFonts] = useState(createIconFontRegistry);
48
+ const settings = useMemo(()=>resolveSettings(props.settings, iconFonts), [
49
+ props.settings,
50
+ iconFonts
51
+ ]);
52
+ const cultureProp = null != (_props_culture = props.culture) ? _props_culture : 'en';
53
+ const [ownCulture] = useState(()=>createCultureStore(isCultureStore(cultureProp) ? 'en' : cultureProp));
54
+ const cultureStore = isCultureStore(cultureProp) ? cultureProp : ownCulture;
55
+ useEffect(()=>{
56
+ if (!isCultureStore(cultureProp)) ownCulture.setCulture(cultureProp);
57
+ }, [
58
+ cultureProp,
59
+ ownCulture
60
+ ]);
61
+ const culture = useSyncExternalStore(cultureStore.subscribe, cultureStore.getSnapshot);
62
+ const strings = useMemo(()=>createStrings({
63
+ ...settings.strings,
64
+ culture
65
+ }), [
66
+ settings.strings,
67
+ culture
68
+ ]);
69
+ const cultureValue = useMemo(()=>({
70
+ culture,
71
+ strings,
72
+ store: cultureStore
73
+ }), [
74
+ culture,
75
+ strings,
76
+ cultureStore
77
+ ]);
78
+ const themeProp = props.theme;
79
+ const [ownTheme] = useState(()=>createThemeStore(isThemeStore(themeProp) ? {} : null != themeProp ? themeProp : {}));
80
+ const themeStore = isThemeStore(themeProp) ? themeProp : ownTheme;
81
+ const options = isThemeStore(themeProp) ? void 0 : themeProp;
82
+ useEffect(()=>{
83
+ if (!options) return;
84
+ ownTheme.beginBatch();
85
+ try {
86
+ if (void 0 !== options.mode) ownTheme.setMode(options.mode);
87
+ if (void 0 !== options.systemScheme) ownTheme.setSystemScheme(options.systemScheme);
88
+ ownTheme.setPalettes(options.palettes);
89
+ ownTheme.setOverrides(options.overrides);
90
+ } finally{
91
+ ownTheme.endBatch();
92
+ }
93
+ }, [
94
+ ownTheme,
95
+ null == options ? void 0 : options.mode,
96
+ null == options ? void 0 : options.systemScheme,
97
+ null == options ? void 0 : options.palettes,
98
+ null == options ? void 0 : options.overrides
99
+ ]);
100
+ useEffect(()=>{
101
+ if (void 0 !== props.systemScheme) themeStore.setSystemScheme(props.systemScheme);
102
+ }, [
103
+ themeStore,
104
+ props.systemScheme
105
+ ]);
106
+ const executorStrings = useRef(strings);
107
+ executorStrings.current = strings;
108
+ const [rootId] = useState(()=>{
109
+ providerSequence += 1;
110
+ return `g9-provider-${providerSequence}`;
111
+ });
112
+ const core = useMemo(()=>{
113
+ var _executorSettings_showError;
114
+ const preferences = createPreferences({
115
+ store: services.preferences,
116
+ onStoreError: (error, failure)=>diagnostics.log({
117
+ level: 'warning',
118
+ message: `Preference ${failure.operation} failed for '${failure.key}'.`,
119
+ source: 'G9Provider',
120
+ error
121
+ })
122
+ });
123
+ const executorSettings = settings.executor;
124
+ const executor = createSafeExecutor({
125
+ clock: services.clock,
126
+ diagnostics,
127
+ strings: {
128
+ get: (key)=>executorStrings.current.get(key)
129
+ },
130
+ showError: null != (_executorSettings_showError = executorSettings.showError) ? _executorSettings_showError : (request)=>{
131
+ const presenter = g9DefaultErrorPresenter.current;
132
+ if (presenter) return presenter(request);
133
+ diagnostics.log({
134
+ level: 'warning',
135
+ message: `No error presenter is configured; not shown: ${request.message}`,
136
+ source: request.source
137
+ });
138
+ },
139
+ ...executorSettings.diagnosticsHandler ? {
140
+ diagnosticsHandler: executorSettings.diagnosticsHandler
141
+ } : {},
142
+ ...executorSettings.diagnosticsAvailable ? {
143
+ diagnosticsAvailable: executorSettings.diagnosticsAvailable
144
+ } : {},
145
+ ...executorSettings.defaults ? {
146
+ defaults: executorSettings.defaults
147
+ } : {}
148
+ });
149
+ return Object.freeze({
150
+ services,
151
+ themeStore,
152
+ preferences,
153
+ diagnostics,
154
+ executor,
155
+ rootId
156
+ });
157
+ }, [
158
+ services,
159
+ themeStore,
160
+ diagnostics,
161
+ settings.executor,
162
+ rootId
163
+ ]);
164
+ useEffect(()=>()=>core.executor.dispose(), [
165
+ core
166
+ ]);
167
+ const [initialVariables] = useState(()=>({
168
+ ...toMetricCssVariables(),
169
+ ...toLayoutCssVariables(),
170
+ ...toCssVariables(themeStore.getSnapshot())
171
+ }));
172
+ const [initialScheme] = useState(()=>themeStore.getSnapshot().scheme);
173
+ const applied = useRef({});
174
+ const [fallbackVariables, setFallbackVariables] = useState(null);
175
+ useEffect(()=>{
176
+ const apply = ()=>{
177
+ const next = {
178
+ ...initialVariables,
179
+ ...applied.current,
180
+ ...toCssVariables(themeStore.getSnapshot())
181
+ };
182
+ const diff = changedVariables(applied.current, next);
183
+ applied.current = next;
184
+ if (!diff) return;
185
+ if (!applyThemeVariables(rootId, diff)) setFallbackVariables(next);
186
+ };
187
+ apply();
188
+ return themeStore.subscribe(apply);
189
+ }, [
190
+ themeStore,
191
+ rootId,
192
+ initialVariables
193
+ ]);
194
+ useEffect(()=>{
195
+ if (!persistTheme) return;
196
+ let alive = true;
197
+ const save = ()=>{
198
+ const value = THEME_MODES.indexOf(themeStore.getSnapshot().mode);
199
+ if (core.preferences.getInt(THEME_PREFERENCE_KEY, -1) !== value) core.preferences.setInt(THEME_PREFERENCE_KEY, value);
200
+ };
201
+ let lastMode = themeStore.getSnapshot().mode;
202
+ const unsubscribe = themeStore.subscribe((theme)=>{
203
+ if (theme.mode === lastMode) return;
204
+ lastMode = theme.mode;
205
+ save();
206
+ });
207
+ core.preferences.hydrate().then(()=>{
208
+ if (!alive) return;
209
+ const stored = THEME_MODES[core.preferences.getInt(THEME_PREFERENCE_KEY, -1)];
210
+ if (stored) themeStore.setMode(stored);
211
+ }, (error)=>diagnostics.log({
212
+ level: 'warning',
213
+ message: 'Theme restore failed.',
214
+ source: 'G9Provider',
215
+ error
216
+ }));
217
+ return ()=>{
218
+ alive = false;
219
+ unsubscribe();
220
+ };
221
+ }, [
222
+ persistTheme,
223
+ themeStore,
224
+ core,
225
+ diagnostics
226
+ ]);
227
+ const [keyboard, setKeyboard] = useState(HIDDEN_KEYBOARD);
228
+ useEffect(()=>addGlobalListener('keyboardstatuschanged', (status, height, compatHeight)=>{
229
+ setKeyboard('on' === status ? Object.freeze({
230
+ visible: true,
231
+ height: finite(height),
232
+ compatHeight: finite(compatHeight)
233
+ }) : HIDDEN_KEYBOARD);
234
+ }, (error)=>diagnostics.log({
235
+ level: 'warning',
236
+ message: 'Keyboard events are unavailable on this host.',
237
+ source: 'G9Provider',
238
+ error
239
+ })), [
240
+ diagnostics
241
+ ]);
242
+ const [windowState, setWindowState] = useState(initialWindow);
243
+ useEffect(()=>addGlobalListener('onWindowResize', (width, height)=>{
244
+ setWindowState((current)=>{
245
+ const next = {
246
+ width: 'number' == typeof width && width >= 0 ? width : current.width,
247
+ height: 'number' == typeof height && height >= 0 ? height : current.height
248
+ };
249
+ return next.width === current.width && next.height === current.height ? current : Object.freeze(next);
250
+ });
251
+ }), []);
252
+ const [insets, setInsets] = useState(()=>services.host.getSafeInsets());
253
+ useEffect(()=>{
254
+ setInsets(services.host.getSafeInsets());
255
+ return services.host.subscribeSafeInsets((next)=>setInsets(next));
256
+ }, [
257
+ services.host
258
+ ]);
259
+ const onBack = useStableCallback(()=>{
260
+ const host = g9Hosts.active();
261
+ if (host && host.services === services && 'handled' === host.back.dispatch()) return;
262
+ services.host.exit();
263
+ });
264
+ useEffect(()=>addGlobalListener(settings.backEventName, onBack), [
265
+ settings.backEventName,
266
+ onBack
267
+ ]);
268
+ const rootStyle = null != fallbackVariables ? fallbackVariables : initialVariables;
269
+ const directionClass = 'rtl' === culture.direction ? 'g9-dir-rtl' : 'g9-dir-ltr';
270
+ return <G9CoreContext.Provider value={core}>
271
+ <G9DiagnosticsContext.Provider value={diagnostics}>
272
+ <G9SettingsContext.Provider value={settings}>
273
+ <G9CultureContext.Provider value={cultureValue}>
274
+ <G9KeyboardContext.Provider value={keyboard}>
275
+ <G9WindowContext.Provider value={windowState}>
276
+ <G9InsetsContext.Provider value={insets}>
277
+ <view id={rootId} className={`g9-provider g9-theme-${initialScheme} ${directionClass}${props.className ? ` ${props.className}` : ''}`} style={rootStyle}>
278
+ {props.children}
279
+ </view>
280
+ </G9InsetsContext.Provider>
281
+ </G9WindowContext.Provider>
282
+ </G9KeyboardContext.Provider>
283
+ </G9CultureContext.Provider>
284
+ </G9SettingsContext.Provider>
285
+ </G9DiagnosticsContext.Provider>
286
+ </G9CoreContext.Provider>;
287
+ }
288
+ export { G9Provider };
289
+
290
+ //# sourceMappingURL=provider.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider/provider.jsx","sources":["../../src/provider/provider.tsx"],"sourcesContent":["import {\n assertRequiredCapabilities,\n createCultureStore,\n createDiagnostics,\n createIconFontRegistry,\n createPreferences,\n createSafeExecutor,\n createStrings,\n createThemeStore,\n type G9Capabilities,\n type G9ColorScheme,\n type G9CssVariables,\n type G9Culture,\n type G9CultureStore,\n type G9Diagnostics,\n type G9SafeInsets,\n type G9ThemeMode,\n type G9ThemeOptions,\n type G9ThemeStore,\n toCssVariables,\n toLayoutCssVariables,\n toMetricCssVariables,\n} from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useEffect, useMemo, useRef, useState, useSyncExternalStore } from '@lynx-js/react';\nimport { useStableCallback } from '../base/use-stable-callback';\nimport { g9Hosts } from '../host/registry';\nimport {\n G9CoreContext,\n G9CultureContext,\n G9DiagnosticsContext,\n G9InsetsContext,\n G9KeyboardContext,\n type G9KeyboardState,\n type G9ProviderCore,\n G9SettingsContext,\n G9WindowContext,\n type G9WindowState,\n} from './contexts';\nimport { addGlobalListener } from './global-events';\nimport { type G9Settings, g9DefaultErrorPresenter, resolveSettings } from './settings';\nimport { applyThemeVariables, changedVariables } from './theme-root';\nimport './provider.css';\nimport './theme.css';\n\n/** Props of {@link G9Provider}. */\nexport interface G9ProviderProps {\n /**\n * The app's platform services (plan/specs/01 §8). `clock`, `preferences` and `host` are required: a missing one\n * throws `G9CapabilityMissingError` naming it when the provider mounts. Pass a stable object.\n */\n readonly services: Partial<G9Capabilities>;\n /**\n * The culture: a store the app drives (`createCultureStore`), or a culture value / locale tag the provider keeps in\n * its own store (a new value switches it). Default `'en'`.\n */\n readonly culture?: G9CultureStore | G9Culture | string;\n /**\n * The theme: a store the app drives (`createThemeStore`), or options for the provider's own store (changes to\n * `mode`, `systemScheme`, `palettes`, `overrides` are applied to it). Default: system mode, stock palettes.\n */\n readonly theme?: G9ThemeStore | G9ThemeOptions;\n /** The platform's current colour scheme (MAUI `RequestedThemeChanged`); followed while the mode is `'system'`. */\n readonly systemScheme?: G9ColorScheme;\n /**\n * Save the theme mode in preferences and restore it at mount (MAUI `G9Theme.ChangeTheme` / `Init`, key\n * `g9controls.theme`, values 0 system, 1 light, 2 dark). Default `true`.\n */\n readonly persistTheme?: boolean;\n /** App-wide settings (plan/specs/03 §6). Validated at mount and on change. */\n readonly settings?: G9Settings;\n /** The diagnostics hub. Default: a hub the provider creates. */\n readonly diagnostics?: G9Diagnostics;\n readonly className?: string;\n readonly children?: ReactNode;\n}\n\nconst THEME_PREFERENCE_KEY = 'theme';\nconst THEME_MODES: readonly G9ThemeMode[] = ['system', 'light', 'dark'];\n\nlet providerSequence = 0;\n\nfunction isCultureStore(value: G9ProviderProps['culture']): value is G9CultureStore {\n return typeof value === 'object' && value !== null && typeof (value as G9CultureStore).getSnapshot === 'function';\n}\n\nfunction isThemeStore(value: G9ProviderProps['theme']): value is G9ThemeStore {\n return typeof value === 'object' && value !== null && typeof (value as G9ThemeStore).getSnapshot === 'function';\n}\n\n/** The logical window size the platform reports at startup (`SystemInfo` is in physical pixels). */\nfunction initialWindow(): G9WindowState {\n const info = (globalThis as { SystemInfo?: { pixelWidth?: number; pixelHeight?: number; pixelRatio?: number } })\n .SystemInfo;\n const ratio = info?.pixelRatio && info.pixelRatio > 0 ? info.pixelRatio : 1;\n return Object.freeze({ width: (info?.pixelWidth ?? 0) / ratio, height: (info?.pixelHeight ?? 0) / ratio });\n}\n\nconst HIDDEN_KEYBOARD: G9KeyboardState = Object.freeze({ visible: false, height: 0, compatHeight: 0 });\n\nfunction finite(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 0;\n}\n\n/**\n * The root every G9 component lives in (plan/specs/01 §5, MAUI `G9Theme`/`G9Culture`/`G9Strings` statics,\n * `G9ServiceProvider`, `G9ScreenHelper`, `G9KeyboardHelper`): culture and strings, the theme as CSS variables on one\n * root `<view>`, settings, services and capabilities, the diagnostics hub, the shared safe executor, keyboard, window\n * and safe-area state, and the dispatch of the system back event to the active `G9Host`. Mount it once per LynxView.\n *\n * - A theme change updates the root's CSS variables with `setProperty`: nothing re-renders except `useG9Theme`\n * readers. A culture change re-renders culture readers.\n * - One `keyboardstatuschanged` and one `onWindowResize` listener for the whole tree.\n * - The back event (`settings.backEventName`, default `g9:back`) goes to the active host's back stack; when nothing\n * handles it, `services.host.exit()` runs (desktop hosts send the same event for Escape).\n * - Unmounting removes every listener, subscription and timer it created.\n */\nexport function G9Provider(props: G9ProviderProps): ReactNode {\n const { services, persistTheme = true } = props;\n assertRequiredCapabilities(services);\n\n const [ownDiagnostics] = useState(createDiagnostics);\n const diagnostics = props.diagnostics ?? ownDiagnostics;\n const [iconFonts] = useState(createIconFontRegistry);\n const settings = useMemo(() => resolveSettings(props.settings, iconFonts), [props.settings, iconFonts]);\n\n // Culture: the app's store, or one the provider keeps in step with the prop.\n const cultureProp = props.culture ?? 'en';\n const [ownCulture] = useState(() => createCultureStore(isCultureStore(cultureProp) ? 'en' : cultureProp));\n const cultureStore = isCultureStore(cultureProp) ? cultureProp : ownCulture;\n useEffect(() => {\n if (!isCultureStore(cultureProp)) ownCulture.setCulture(cultureProp);\n }, [cultureProp, ownCulture]);\n const culture = useSyncExternalStore(cultureStore.subscribe, cultureStore.getSnapshot);\n const strings = useMemo(() => createStrings({ ...settings.strings, culture }), [settings.strings, culture]);\n const cultureValue = useMemo(() => ({ culture, strings, store: cultureStore }), [culture, strings, cultureStore]);\n\n // Theme: the app's store, or one the provider keeps in step with the options.\n const themeProp = props.theme;\n const [ownTheme] = useState(() => createThemeStore(isThemeStore(themeProp) ? {} : (themeProp ?? {})));\n const themeStore = isThemeStore(themeProp) ? themeProp : ownTheme;\n const options = isThemeStore(themeProp) ? undefined : themeProp;\n useEffect(() => {\n if (!options) return;\n ownTheme.beginBatch();\n try {\n if (options.mode !== undefined) ownTheme.setMode(options.mode);\n if (options.systemScheme !== undefined) ownTheme.setSystemScheme(options.systemScheme);\n ownTheme.setPalettes(options.palettes);\n ownTheme.setOverrides(options.overrides);\n } finally {\n ownTheme.endBatch();\n }\n // Field-wise on purpose: an inline `theme={{ … }}` object must not re-apply (and undo a restored mode) per render.\n }, [ownTheme, options?.mode, options?.systemScheme, options?.palettes, options?.overrides]);\n useEffect(() => {\n if (props.systemScheme !== undefined) themeStore.setSystemScheme(props.systemScheme);\n }, [themeStore, props.systemScheme]);\n\n const executorStrings = useRef(strings);\n executorStrings.current = strings;\n const [rootId] = useState(() => {\n providerSequence += 1;\n return `g9-provider-${providerSequence}`;\n });\n\n const core = useMemo<G9ProviderCore>(() => {\n const preferences = createPreferences({\n store: services.preferences,\n onStoreError: (error, failure) =>\n diagnostics.log({\n level: 'warning',\n message: `Preference ${failure.operation} failed for '${failure.key}'.`,\n source: 'G9Provider',\n error,\n }),\n });\n const executorSettings = settings.executor;\n const executor = createSafeExecutor({\n clock: services.clock,\n diagnostics,\n strings: { get: (key) => executorStrings.current.get(key) },\n // No app presenter: the default one (the error popup, registered by `@g9tm/lynxcontrols/popup`) if loaded.\n showError:\n executorSettings.showError ??\n ((request) => {\n const presenter = g9DefaultErrorPresenter.current;\n if (presenter) return presenter(request);\n diagnostics.log({\n level: 'warning',\n message: `No error presenter is configured; not shown: ${request.message}`,\n source: request.source,\n });\n return undefined;\n }),\n ...(executorSettings.diagnosticsHandler ? { diagnosticsHandler: executorSettings.diagnosticsHandler } : {}),\n ...(executorSettings.diagnosticsAvailable ? { diagnosticsAvailable: executorSettings.diagnosticsAvailable } : {}),\n ...(executorSettings.defaults ? { defaults: executorSettings.defaults } : {}),\n });\n return Object.freeze({ services, themeStore, preferences, diagnostics, executor, rootId });\n }, [services, themeStore, diagnostics, settings.executor, rootId]);\n useEffect(() => () => core.executor.dispose(), [core]);\n\n // Theme root. The Lynx engine drops custom properties in an inline style object (page config\n // `enableCSSInlineVariables` is off and not exposed), so the first frame takes the stock palette of the initial\n // scheme and the default metrics from theme.css classes; the inline copy below only serves engines that honour it.\n // At mount every variable is then written with setProperty (custom palettes, overrides, layout), and each later\n // theme change sends only what changed (no re-render).\n const [initialVariables] = useState<G9CssVariables>(() => ({\n ...toMetricCssVariables(),\n ...toLayoutCssVariables(),\n ...toCssVariables(themeStore.getSnapshot()),\n }));\n const [initialScheme] = useState(() => themeStore.getSnapshot().scheme);\n const applied = useRef<G9CssVariables>({});\n const [fallbackVariables, setFallbackVariables] = useState<G9CssVariables | null>(null);\n useEffect(() => {\n const apply = () => {\n const next = { ...initialVariables, ...applied.current, ...toCssVariables(themeStore.getSnapshot()) };\n const diff = changedVariables(applied.current, next);\n applied.current = next;\n if (!diff) return;\n // Without the element API (a host that lacks it), re-render the root's style instead: still no child render.\n if (!applyThemeVariables(rootId, diff)) setFallbackVariables(next);\n };\n apply();\n return themeStore.subscribe(apply);\n }, [themeStore, rootId, initialVariables]);\n\n // Theme persistence (MAUI ChangeTheme wrote the AppTheme number, Init read it back).\n useEffect(() => {\n if (!persistTheme) return;\n let alive = true;\n const save = () => {\n const value = THEME_MODES.indexOf(themeStore.getSnapshot().mode);\n if (core.preferences.getInt(THEME_PREFERENCE_KEY, -1) !== value) {\n void core.preferences.setInt(THEME_PREFERENCE_KEY, value);\n }\n };\n let lastMode = themeStore.getSnapshot().mode;\n const unsubscribe = themeStore.subscribe((theme) => {\n if (theme.mode === lastMode) return;\n lastMode = theme.mode;\n save();\n });\n core.preferences.hydrate().then(\n () => {\n if (!alive) return;\n const stored = THEME_MODES[core.preferences.getInt(THEME_PREFERENCE_KEY, -1)];\n if (stored) themeStore.setMode(stored);\n },\n (error: unknown) =>\n diagnostics.log({ level: 'warning', message: 'Theme restore failed.', source: 'G9Provider', error }),\n );\n return () => {\n alive = false;\n unsubscribe();\n };\n }, [persistTheme, themeStore, core, diagnostics]);\n\n // Keyboard and window: one listener each for the whole tree.\n const [keyboard, setKeyboard] = useState<G9KeyboardState>(HIDDEN_KEYBOARD);\n useEffect(\n () =>\n addGlobalListener(\n 'keyboardstatuschanged',\n (status: unknown, height: unknown, compatHeight: unknown) => {\n setKeyboard(\n status === 'on'\n ? Object.freeze({ visible: true, height: finite(height), compatHeight: finite(compatHeight) })\n : HIDDEN_KEYBOARD,\n );\n },\n // A host without keyboard detection (windowless Lynxtron): the keyboard simply stays hidden.\n (error) =>\n diagnostics.log({\n level: 'warning',\n message: 'Keyboard events are unavailable on this host.',\n source: 'G9Provider',\n error,\n }),\n ),\n [diagnostics],\n );\n const [windowState, setWindowState] = useState<G9WindowState>(initialWindow);\n useEffect(\n () =>\n addGlobalListener('onWindowResize', (width: unknown, height: unknown) => {\n setWindowState((current) => {\n const next = {\n width: typeof width === 'number' && width >= 0 ? width : current.width,\n height: typeof height === 'number' && height >= 0 ? height : current.height,\n };\n return next.width === current.width && next.height === current.height ? current : Object.freeze(next);\n });\n }),\n [],\n );\n\n // Safe-area insets from the host service.\n const [insets, setInsets] = useState<G9SafeInsets>(() => services.host.getSafeInsets());\n useEffect(() => {\n setInsets(services.host.getSafeInsets());\n return services.host.subscribeSafeInsets((next) => setInsets(next));\n }, [services.host]);\n\n // System back: the active host of this provider first, then exit.\n const onBack = useStableCallback(() => {\n const host = g9Hosts.active();\n if (host && host.services === services && host.back.dispatch() === 'handled') return;\n services.host.exit();\n });\n useEffect(() => addGlobalListener(settings.backEventName, onBack), [settings.backEventName, onBack]);\n\n const rootStyle = fallbackVariables ?? initialVariables;\n const directionClass = culture.direction === 'rtl' ? 'g9-dir-rtl' : 'g9-dir-ltr';\n return (\n <G9CoreContext.Provider value={core}>\n <G9DiagnosticsContext.Provider value={diagnostics}>\n <G9SettingsContext.Provider value={settings}>\n <G9CultureContext.Provider value={cultureValue}>\n <G9KeyboardContext.Provider value={keyboard}>\n <G9WindowContext.Provider value={windowState}>\n <G9InsetsContext.Provider value={insets}>\n <view\n id={rootId}\n className={`g9-provider g9-theme-${initialScheme} ${directionClass}${props.className ? ` ${props.className}` : ''}`}\n style={rootStyle}\n >\n {props.children}\n </view>\n </G9InsetsContext.Provider>\n </G9WindowContext.Provider>\n </G9KeyboardContext.Provider>\n </G9CultureContext.Provider>\n </G9SettingsContext.Provider>\n </G9DiagnosticsContext.Provider>\n </G9CoreContext.Provider>\n );\n}\n"],"names":["THEME_PREFERENCE_KEY","THEME_MODES","providerSequence","isCultureStore","value","isThemeStore","initialWindow","info","globalThis","ratio","Object","HIDDEN_KEYBOARD","finite","Number","G9Provider","props","_props_diagnostics","_props_culture","services","persistTheme","assertRequiredCapabilities","ownDiagnostics","useState","createDiagnostics","diagnostics","iconFonts","createIconFontRegistry","settings","useMemo","resolveSettings","cultureProp","ownCulture","createCultureStore","cultureStore","useEffect","culture","useSyncExternalStore","strings","createStrings","cultureValue","themeProp","ownTheme","createThemeStore","themeStore","options","undefined","executorStrings","useRef","rootId","core","_executorSettings_showError","preferences","createPreferences","error","failure","executorSettings","executor","createSafeExecutor","key","request","presenter","g9DefaultErrorPresenter","initialVariables","toMetricCssVariables","toLayoutCssVariables","toCssVariables","initialScheme","applied","fallbackVariables","setFallbackVariables","apply","next","diff","changedVariables","applyThemeVariables","alive","save","lastMode","unsubscribe","theme","stored","keyboard","setKeyboard","addGlobalListener","status","height","compatHeight","windowState","setWindowState","width","current","insets","setInsets","onBack","useStableCallback","host","g9Hosts","rootStyle","directionClass","G9CoreContext","G9DiagnosticsContext","G9SettingsContext","G9CultureContext","G9KeyboardContext","G9WindowContext","G9InsetsContext","view"],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { type G9DiagnosticsReport, type G9ErrorPopupRequest, type G9GlyphSlotOverrides, type G9GlyphSlots, type G9IconFontRegistry, type G9ImageSource, type G9SafeExecutorOptions, type G9StringsOptions } from '@g9tm/lynxcontrols-foundation';
2
+ import type { ReactNode } from '@lynx-js/react';
3
+ import { type G9PopupSettings } from '../popup/types.js';
4
+ import { type G9SheetSettings } from '../sheet/options.js';
5
+ /** The global event the native host sends for a system back press (Android back, desktop Escape). */
6
+ export declare const g9DefaultBackEventName = "g9:back";
7
+ /** App-wide page-loading cover settings (MAUI `G9PageLoadingOverlay` statics + `G9PageBase` timing defaults). */
8
+ export interface G9PageLoadingSettings {
9
+ /** Cover colour (MAUI `BackgroundColorOverride`). Default: the theme's `Primary` (`var(--g9-primary)`). */
10
+ readonly backgroundColor?: string;
11
+ /** Spinner colour (MAUI `SpinnerColorOverride`). Default: the theme's `OnPrimary`. */
12
+ readonly spinnerColor?: string;
13
+ /** Delay after "ready" before the cover animates out (MAUI `PageLoadingDismissDelayMs`). Default 369. */
14
+ readonly dismissDelayMs?: number;
15
+ /** Hard cap from appearing to dismissal (MAUI `PageLoadingSafetyTimeoutMs`). Default 5000. */
16
+ readonly safetyTimeoutMs?: number;
17
+ }
18
+ /**
19
+ * Renders a bitmap icon at a box size (MAUI `G9ImageFactory.Factory`): the seam for a caching image element. The default
20
+ * is a plain Lynx `<image>` (`aspectFill`), or `<svg content>` for an `{ svg }` source.
21
+ */
22
+ export type G9ImageRenderer = (source: G9ImageSource, size: number) => ReactNode;
23
+ /**
24
+ * The error presenter used when the app sets no `executor.showError`: `@g9tm/lynxcontrols/popup` installs the error
25
+ * popup here when it loads (so the provider does not depend on the popup module).
26
+ */
27
+ export declare const g9DefaultErrorPresenter: {
28
+ current: ((request: G9ErrorPopupRequest) => void | PromiseLike<void>) | null;
29
+ };
30
+ /** Settings of the shared safe executor (MAUI `G9SafeCommand` statics). */
31
+ export interface G9ExecutorSettings {
32
+ readonly showError?: (request: G9ErrorPopupRequest) => void | PromiseLike<void>;
33
+ readonly diagnosticsHandler?: (report: G9DiagnosticsReport) => void | PromiseLike<void>;
34
+ readonly diagnosticsAvailable?: () => boolean;
35
+ readonly defaults?: G9SafeExecutorOptions;
36
+ }
37
+ /**
38
+ * App-wide configuration (plan/specs/03 §6): what MAUI configured through static helpers. Later work packages add
39
+ * their families here (`sheets`, `popups`, `toasts`, `fields`).
40
+ */
41
+ export interface G9Settings {
42
+ /** String resolution (MAUI `G9Strings.UseProvider` / `Override`): everything but the culture. */
43
+ readonly strings?: Omit<G9StringsOptions, 'culture'>;
44
+ /** Replacements for the controls' own icons (MAUI `G9Glyphs.*` setters). */
45
+ readonly glyphs?: G9GlyphSlotOverrides;
46
+ /** The app's icon fonts (MAUI `G9IconFonts.Register`); default an empty registry. */
47
+ readonly iconFonts?: G9IconFontRegistry;
48
+ /** Bitmap icon renderer (MAUI `G9ImageFactory.Factory`). Default: {@link G9ImageRenderer}'s plain `<image>`. */
49
+ readonly imageRenderer?: G9ImageRenderer;
50
+ /** Name of the global back event (default {@link g9DefaultBackEventName}). */
51
+ readonly backEventName?: string;
52
+ /** Page-loading cover defaults for every `G9Host`. */
53
+ readonly pageLoading?: G9PageLoadingSettings;
54
+ /** The shared safe executor's popup, diagnostics surface and option defaults. */
55
+ readonly executor?: G9ExecutorSettings;
56
+ /**
57
+ * Pauses the app's background work while a view that asks for it is active (MAUI
58
+ * `G9ContentViewBase.BackgroundWorkSuppressionFactory`). Returns the release function, or nothing.
59
+ */
60
+ readonly backgroundWorkSuppression?: () => (() => void) | null | undefined;
61
+ /** Outlined-field defaults (MAUI `G9OutlinedFieldSettings`, set through `G9OutlinedFieldBase.Configure`). */
62
+ readonly fields?: G9FieldSettings;
63
+ /** Bottom-sheet defaults (MAUI `G9BottomSheetHelper.Configure(G9BottomSheetSettings)`). */
64
+ readonly sheets?: G9SheetSettings;
65
+ /** Popup defaults (MAUI `G9PopupHelper.ConfigureG9PopupDefaults`), merged under per-call settings. */
66
+ readonly popups?: G9PopupSettings;
67
+ }
68
+ /** App-wide outlined-field settings (MAUI `G9OutlinedFieldSettings`). */
69
+ export interface G9FieldSettings {
70
+ /**
71
+ * Whether a field holding a value (unfocused, no error) draws its outline and floated label in the primary colour.
72
+ * Default `true` (MAUI `HighlightFilledValue`); a field's own `filledValueHighlight` overrides it (ADR-0025).
73
+ */
74
+ readonly highlightFilledValue?: boolean;
75
+ }
76
+ /** {@link G9Settings} with every default filled in. */
77
+ export interface G9ResolvedSettings {
78
+ readonly strings: Omit<G9StringsOptions, 'culture'>;
79
+ readonly glyphs: G9GlyphSlots;
80
+ readonly iconFonts: G9IconFontRegistry;
81
+ readonly imageRenderer: G9ImageRenderer | undefined;
82
+ readonly backEventName: string;
83
+ readonly pageLoading: Required<G9PageLoadingSettings>;
84
+ readonly executor: G9ExecutorSettings;
85
+ readonly backgroundWorkSuppression: G9Settings['backgroundWorkSuppression'];
86
+ readonly fields: Required<G9FieldSettings>;
87
+ readonly sheets: Required<G9SheetSettings>;
88
+ readonly popups: G9PopupSettings;
89
+ }
90
+ /** MAUI `G9PageBase.PageLoadingDismissDelayMs` default. */
91
+ export declare const g9PageLoadingDismissDelayMs = 369;
92
+ /** MAUI `G9PageBase.PageLoadingSafetyTimeoutMs` default. */
93
+ export declare const g9PageLoadingSafetyTimeoutMs = 5000;
94
+ /**
95
+ * Validates `settings` and fills the defaults. Invalid values throw a `G9Error` (`settings-invalid`, or the
96
+ * foundation code for a malformed glyph slot) at provider mount rather than at first use.
97
+ */
98
+ export declare function resolveSettings(settings: G9Settings | undefined, fallbackIconFonts?: G9IconFontRegistry): G9ResolvedSettings;
99
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/provider/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAExB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EAEtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAA8B,KAAK,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,KAAK,eAAe,EAAwB,MAAM,kBAAkB,CAAC;AAE9E,qGAAqG;AACrG,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAEhD,iHAAiH;AACjH,MAAM,WAAW,qBAAqB;IACpC,2GAA2G;IAC3G,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,sFAAsF;IACtF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,yGAAyG;IACzG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,8FAA8F;IAC9F,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;AAEjF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE;IACpC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;CAC1D,CAAC;AAEtB,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACxF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,iGAAiG;IACjG,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACrD,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IACvC,qFAAqF;IACrF,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACxC,gHAAgH;IAChH,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC;IACzC,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,sDAAsD;IACtD,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3E,6GAA6G;IAC7G,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,sGAAsG;IACtG,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,eAAe,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,yBAAyB,EAAE,UAAU,CAAC,2BAA2B,CAAC,CAAC;IAC5E,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CAClC;AAED,2DAA2D;AAC3D,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,4DAA4D;AAC5D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAajD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,iBAAiB,CAAC,EAAE,kBAAkB,GACrC,kBAAkB,CA6BpB"}
@@ -0,0 +1,45 @@
1
+ import { G9Error, createIconFontRegistry, resolveGlyphSlots } from "@g9tm/lynxcontrols-foundation";
2
+ import { createDefaultPopupSettings, mergePopupSettings } from "../popup/types.jsx";
3
+ import { resolveSheetSettings } from "../sheet/options.jsx";
4
+ const g9DefaultBackEventName = 'g9:back';
5
+ const g9DefaultErrorPresenter = {
6
+ current: null
7
+ };
8
+ const g9PageLoadingDismissDelayMs = 369;
9
+ const g9PageLoadingSafetyTimeoutMs = 5000;
10
+ function nonNegative(name, value, fallback) {
11
+ if (void 0 === value) return fallback;
12
+ if ('number' != typeof value || !Number.isFinite(value) || value < 0) throw new G9Error('settings-invalid', `${name} must be a finite number of milliseconds ≥ 0 (got ${String(value)}).`);
13
+ return value;
14
+ }
15
+ function resolveSettings(settings, fallbackIconFonts) {
16
+ var _s_backEventName, _s_pageLoading, _s_strings, _ref, _s_iconFonts, _loading_backgroundColor, _loading_spinnerColor, _s_executor, _ref1;
17
+ var _s_fields;
18
+ const s = null != settings ? settings : {};
19
+ const backEventName = null != (_s_backEventName = s.backEventName) ? _s_backEventName : g9DefaultBackEventName;
20
+ if ('string' != typeof backEventName || '' === backEventName.trim()) throw new G9Error('settings-invalid', 'backEventName must be a non-blank string.');
21
+ const loading = null != (_s_pageLoading = s.pageLoading) ? _s_pageLoading : {};
22
+ return Object.freeze({
23
+ strings: null != (_s_strings = s.strings) ? _s_strings : {},
24
+ glyphs: resolveGlyphSlots(s.glyphs),
25
+ iconFonts: null != (_ref = null != (_s_iconFonts = s.iconFonts) ? _s_iconFonts : fallbackIconFonts) ? _ref : createIconFontRegistry(),
26
+ imageRenderer: s.imageRenderer,
27
+ backEventName,
28
+ pageLoading: Object.freeze({
29
+ backgroundColor: null != (_loading_backgroundColor = loading.backgroundColor) ? _loading_backgroundColor : 'var(--g9-primary)',
30
+ spinnerColor: null != (_loading_spinnerColor = loading.spinnerColor) ? _loading_spinnerColor : 'var(--g9-on-primary)',
31
+ dismissDelayMs: nonNegative('pageLoading.dismissDelayMs', loading.dismissDelayMs, g9PageLoadingDismissDelayMs),
32
+ safetyTimeoutMs: nonNegative('pageLoading.safetyTimeoutMs', loading.safetyTimeoutMs, g9PageLoadingSafetyTimeoutMs)
33
+ }),
34
+ executor: null != (_s_executor = s.executor) ? _s_executor : {},
35
+ backgroundWorkSuppression: s.backgroundWorkSuppression,
36
+ fields: Object.freeze({
37
+ highlightFilledValue: null != (_ref1 = null == (_s_fields = s.fields) ? void 0 : _s_fields.highlightFilledValue) ? _ref1 : true
38
+ }),
39
+ sheets: resolveSheetSettings(s.sheets),
40
+ popups: Object.freeze(mergePopupSettings(s.popups, createDefaultPopupSettings()))
41
+ });
42
+ }
43
+ export { g9DefaultBackEventName, g9DefaultErrorPresenter, g9PageLoadingDismissDelayMs, g9PageLoadingSafetyTimeoutMs, resolveSettings };
44
+
45
+ //# sourceMappingURL=settings.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider/settings.jsx","sources":["../../src/provider/settings.ts"],"sourcesContent":["import {\n createIconFontRegistry,\n type G9DiagnosticsReport,\n G9Error,\n type G9ErrorPopupRequest,\n type G9GlyphSlotOverrides,\n type G9GlyphSlots,\n type G9IconFontRegistry,\n type G9ImageSource,\n type G9SafeExecutorOptions,\n type G9StringsOptions,\n resolveGlyphSlots,\n} from '@g9tm/lynxcontrols-foundation';\nimport type { ReactNode } from '@lynx-js/react';\nimport { createDefaultPopupSettings, type G9PopupSettings, mergePopupSettings } from '../popup/types';\nimport { type G9SheetSettings, resolveSheetSettings } from '../sheet/options';\n\n/** The global event the native host sends for a system back press (Android back, desktop Escape). */\nexport const g9DefaultBackEventName = 'g9:back';\n\n/** App-wide page-loading cover settings (MAUI `G9PageLoadingOverlay` statics + `G9PageBase` timing defaults). */\nexport interface G9PageLoadingSettings {\n /** Cover colour (MAUI `BackgroundColorOverride`). Default: the theme's `Primary` (`var(--g9-primary)`). */\n readonly backgroundColor?: string;\n /** Spinner colour (MAUI `SpinnerColorOverride`). Default: the theme's `OnPrimary`. */\n readonly spinnerColor?: string;\n /** Delay after \"ready\" before the cover animates out (MAUI `PageLoadingDismissDelayMs`). Default 369. */\n readonly dismissDelayMs?: number;\n /** Hard cap from appearing to dismissal (MAUI `PageLoadingSafetyTimeoutMs`). Default 5000. */\n readonly safetyTimeoutMs?: number;\n}\n\n/**\n * Renders a bitmap icon at a box size (MAUI `G9ImageFactory.Factory`): the seam for a caching image element. The default\n * is a plain Lynx `<image>` (`aspectFill`), or `<svg content>` for an `{ svg }` source.\n */\nexport type G9ImageRenderer = (source: G9ImageSource, size: number) => ReactNode;\n\n/**\n * The error presenter used when the app sets no `executor.showError`: `@g9tm/lynxcontrols/popup` installs the error\n * popup here when it loads (so the provider does not depend on the popup module).\n */\nexport const g9DefaultErrorPresenter: {\n current: ((request: G9ErrorPopupRequest) => void | PromiseLike<void>) | null;\n} = { current: null };\n\n/** Settings of the shared safe executor (MAUI `G9SafeCommand` statics). */\nexport interface G9ExecutorSettings {\n readonly showError?: (request: G9ErrorPopupRequest) => void | PromiseLike<void>;\n readonly diagnosticsHandler?: (report: G9DiagnosticsReport) => void | PromiseLike<void>;\n readonly diagnosticsAvailable?: () => boolean;\n readonly defaults?: G9SafeExecutorOptions;\n}\n\n/**\n * App-wide configuration (plan/specs/03 §6): what MAUI configured through static helpers. Later work packages add\n * their families here (`sheets`, `popups`, `toasts`, `fields`).\n */\nexport interface G9Settings {\n /** String resolution (MAUI `G9Strings.UseProvider` / `Override`): everything but the culture. */\n readonly strings?: Omit<G9StringsOptions, 'culture'>;\n /** Replacements for the controls' own icons (MAUI `G9Glyphs.*` setters). */\n readonly glyphs?: G9GlyphSlotOverrides;\n /** The app's icon fonts (MAUI `G9IconFonts.Register`); default an empty registry. */\n readonly iconFonts?: G9IconFontRegistry;\n /** Bitmap icon renderer (MAUI `G9ImageFactory.Factory`). Default: {@link G9ImageRenderer}'s plain `<image>`. */\n readonly imageRenderer?: G9ImageRenderer;\n /** Name of the global back event (default {@link g9DefaultBackEventName}). */\n readonly backEventName?: string;\n /** Page-loading cover defaults for every `G9Host`. */\n readonly pageLoading?: G9PageLoadingSettings;\n /** The shared safe executor's popup, diagnostics surface and option defaults. */\n readonly executor?: G9ExecutorSettings;\n /**\n * Pauses the app's background work while a view that asks for it is active (MAUI\n * `G9ContentViewBase.BackgroundWorkSuppressionFactory`). Returns the release function, or nothing.\n */\n readonly backgroundWorkSuppression?: () => (() => void) | null | undefined;\n /** Outlined-field defaults (MAUI `G9OutlinedFieldSettings`, set through `G9OutlinedFieldBase.Configure`). */\n readonly fields?: G9FieldSettings;\n /** Bottom-sheet defaults (MAUI `G9BottomSheetHelper.Configure(G9BottomSheetSettings)`). */\n readonly sheets?: G9SheetSettings;\n /** Popup defaults (MAUI `G9PopupHelper.ConfigureG9PopupDefaults`), merged under per-call settings. */\n readonly popups?: G9PopupSettings;\n}\n\n/** App-wide outlined-field settings (MAUI `G9OutlinedFieldSettings`). */\nexport interface G9FieldSettings {\n /**\n * Whether a field holding a value (unfocused, no error) draws its outline and floated label in the primary colour.\n * Default `true` (MAUI `HighlightFilledValue`); a field's own `filledValueHighlight` overrides it (ADR-0025).\n */\n readonly highlightFilledValue?: boolean;\n}\n\n/** {@link G9Settings} with every default filled in. */\nexport interface G9ResolvedSettings {\n readonly strings: Omit<G9StringsOptions, 'culture'>;\n readonly glyphs: G9GlyphSlots;\n readonly iconFonts: G9IconFontRegistry;\n readonly imageRenderer: G9ImageRenderer | undefined;\n readonly backEventName: string;\n readonly pageLoading: Required<G9PageLoadingSettings>;\n readonly executor: G9ExecutorSettings;\n readonly backgroundWorkSuppression: G9Settings['backgroundWorkSuppression'];\n readonly fields: Required<G9FieldSettings>;\n readonly sheets: Required<G9SheetSettings>;\n readonly popups: G9PopupSettings;\n}\n\n/** MAUI `G9PageBase.PageLoadingDismissDelayMs` default. */\nexport const g9PageLoadingDismissDelayMs = 369;\n/** MAUI `G9PageBase.PageLoadingSafetyTimeoutMs` default. */\nexport const g9PageLoadingSafetyTimeoutMs = 5000;\n\nfunction nonNegative(name: string, value: number | undefined, fallback: number): number {\n if (value === undefined) return fallback;\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new G9Error(\n 'settings-invalid',\n `${name} must be a finite number of milliseconds ≥ 0 (got ${String(value)}).`,\n );\n }\n return value;\n}\n\n/**\n * Validates `settings` and fills the defaults. Invalid values throw a `G9Error` (`settings-invalid`, or the\n * foundation code for a malformed glyph slot) at provider mount rather than at first use.\n */\nexport function resolveSettings(\n settings: G9Settings | undefined,\n fallbackIconFonts?: G9IconFontRegistry,\n): G9ResolvedSettings {\n const s = settings ?? {};\n const backEventName = s.backEventName ?? g9DefaultBackEventName;\n if (typeof backEventName !== 'string' || backEventName.trim() === '') {\n throw new G9Error('settings-invalid', 'backEventName must be a non-blank string.');\n }\n const loading = s.pageLoading ?? {};\n return Object.freeze({\n strings: s.strings ?? {},\n glyphs: resolveGlyphSlots(s.glyphs),\n iconFonts: s.iconFonts ?? fallbackIconFonts ?? createIconFontRegistry(),\n imageRenderer: s.imageRenderer,\n backEventName,\n pageLoading: Object.freeze({\n backgroundColor: loading.backgroundColor ?? 'var(--g9-primary)',\n spinnerColor: loading.spinnerColor ?? 'var(--g9-on-primary)',\n dismissDelayMs: nonNegative('pageLoading.dismissDelayMs', loading.dismissDelayMs, g9PageLoadingDismissDelayMs),\n safetyTimeoutMs: nonNegative(\n 'pageLoading.safetyTimeoutMs',\n loading.safetyTimeoutMs,\n g9PageLoadingSafetyTimeoutMs,\n ),\n }),\n executor: s.executor ?? {},\n backgroundWorkSuppression: s.backgroundWorkSuppression,\n fields: Object.freeze({ highlightFilledValue: s.fields?.highlightFilledValue ?? true }),\n sheets: resolveSheetSettings(s.sheets),\n popups: Object.freeze(mergePopupSettings(s.popups, createDefaultPopupSettings())),\n });\n}\n"],"names":["g9DefaultBackEventName","g9DefaultErrorPresenter","g9PageLoadingDismissDelayMs","g9PageLoadingSafetyTimeoutMs","nonNegative","name","value","fallback","undefined","Number","G9Error","String","resolveSettings","settings","fallbackIconFonts","_s_backEventName","_s_pageLoading","_s_strings","_ref","_loading_backgroundColor","_loading_spinnerColor","_s_executor","_s_fields","s","backEventName","loading","Object","resolveGlyphSlots","createIconFontRegistry","resolveSheetSettings","mergePopupSettings","createDefaultPopupSettings"],"mappings":";;;AAkBO,MAAMA,yBAAyB;AAwB/B,MAAMC,0BAET;IAAE,SAAS;AAAK;AAmEb,MAAMC,8BAA8B;AAEpC,MAAMC,+BAA+B;AAE5C,SAASC,YAAYC,IAAY,EAAEC,KAAyB,EAAEC,QAAgB;IAC5E,IAAID,AAAUE,WAAVF,OAAqB,OAAOC;IAChC,IAAI,AAAiB,YAAjB,OAAOD,SAAsB,CAACG,OAAO,QAAQ,CAACH,UAAUA,QAAQ,GAClE,MAAM,IAAII,QACR,oBACA,GAAGL,KAAK,kDAAkD,EAAEM,OAAOL,OAAO,EAAE,CAAC;IAGjF,OAAOA;AACT;AAMO,SAASM,gBACdC,QAAgC,EAChCC,iBAAsC;QAGhBC,kBAINC,gBAELC,YAEEC,MAAAA,cAIQC,0BACHC,uBAQNC,aAAAA;QAEoCC;IAxBhD,MAAMC,IAAIV,QAAAA,WAAAA,WAAY,CAAC;IACvB,MAAMW,gBAAgB,QAAAT,CAAAA,mBAAAA,EAAE,aAAa,AAAD,IAAdA,mBAAmBf;IACzC,IAAI,AAAyB,YAAzB,OAAOwB,iBAA8BA,AAAyB,OAAzBA,cAAc,IAAI,IACzD,MAAM,IAAId,QAAQ,oBAAoB;IAExC,MAAMe,UAAU,QAAAT,CAAAA,iBAAAA,EAAE,WAAW,AAAD,IAAZA,iBAAiB,CAAC;IAClC,OAAOU,OAAO,MAAM,CAAC;QACnB,SAAS,QAAAT,CAAAA,aAAAA,EAAE,OAAO,AAAD,IAARA,aAAa,CAAC;QACvB,QAAQU,kBAAkBJ,EAAE,MAAM;QAClC,WAAW,QAAAL,CAAAA,OAAAA,QAAAA,CAAAA,eAAAA,EAAE,SAAS,AAAD,IAAVA,eAAeJ,iBAAgB,IAA/BI,OAAoCU;QAC/C,eAAeL,EAAE,aAAa;QAC9BC;QACA,aAAaE,OAAO,MAAM,CAAC;YACzB,iBAAiB,QAAAP,CAAAA,2BAAAA,QAAQ,eAAe,AAAD,IAAtBA,2BAA2B;YAC5C,cAAc,QAAAC,CAAAA,wBAAAA,QAAQ,YAAY,AAAD,IAAnBA,wBAAwB;YACtC,gBAAgBhB,YAAY,8BAA8BqB,QAAQ,cAAc,EAAEvB;YAClF,iBAAiBE,YACf,+BACAqB,QAAQ,eAAe,EACvBtB;QAEJ;QACA,UAAU,QAAAkB,CAAAA,cAAAA,EAAE,QAAQ,AAAD,IAATA,cAAc,CAAC;QACzB,2BAA2BE,EAAE,yBAAyB;QACtD,QAAQG,OAAO,MAAM,CAAC;YAAE,sBAAsB,QAAF,iBAAEJ,CAAAA,YAAAA,EAAE,MAAM,AAAD,IAAPA,KAAAA,IAAAA,UAAU,oBAAoB,AAAD,IAAC,QAAI;QAAK;QACrF,QAAQO,qBAAqBN,EAAE,MAAM;QACrC,QAAQG,OAAO,MAAM,CAACI,mBAAmBP,EAAE,MAAM,EAAEQ;IACrD;AACF"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The stylesheet behind `theme.css`: the stock light and dark palettes as `.g9-theme-light` / `.g9-theme-dark`
3
+ * classes and the default metric and layout variables on `.g9-provider`.
4
+ *
5
+ * Why a stylesheet: the Lynx engine ignores custom properties written in an inline style object unless the page
6
+ * config `enableCSSInlineVariables` is on, which the ReactLynx toolchain does not expose (found in the Lynxtron window
7
+ * on Windows, 2026-10-05: inline `--x` unset, a class-declared `--x` and `setProperty({ '--x': … })` both inherit). So
8
+ * the provider's first frame takes its values from these classes, and the provider then writes every variable with
9
+ * `setProperty` (custom palettes, overrides, layout overrides, every later theme change).
10
+ */
11
+ export declare function renderThemeStylesheet(): string;
12
+ //# sourceMappingURL=theme-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-css.d.ts","sourceRoot":"","sources":["../../src/provider/theme-css.ts"],"names":[],"mappings":"AASA;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAO9C"}
@@ -0,0 +1,19 @@
1
+ import { cssVariablesToText, g9DarkPalette, g9LightPalette, toCssVariables, toLayoutCssVariables, toMetricCssVariables } from "@g9tm/lynxcontrols-foundation";
2
+ function renderThemeStylesheet() {
3
+ return [
4
+ '/* Generated by renderThemeStylesheet (src/provider/theme-css.ts); `npm run gen:theme-css` rewrites it. */',
5
+ cssVariablesToText(toCssVariables({
6
+ palette: g9LightPalette
7
+ }), '.g9-theme-light'),
8
+ cssVariablesToText(toCssVariables({
9
+ palette: g9DarkPalette
10
+ }), '.g9-theme-dark'),
11
+ cssVariablesToText({
12
+ ...toMetricCssVariables(),
13
+ ...toLayoutCssVariables()
14
+ }, '.g9-provider')
15
+ ].join('\n');
16
+ }
17
+ export { renderThemeStylesheet };
18
+
19
+ //# sourceMappingURL=theme-css.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider/theme-css.jsx","sources":["../../src/provider/theme-css.ts"],"sourcesContent":["import {\n cssVariablesToText,\n g9DarkPalette,\n g9LightPalette,\n toCssVariables,\n toLayoutCssVariables,\n toMetricCssVariables,\n} from '@g9tm/lynxcontrols-foundation';\n\n/**\n * The stylesheet behind `theme.css`: the stock light and dark palettes as `.g9-theme-light` / `.g9-theme-dark`\n * classes and the default metric and layout variables on `.g9-provider`.\n *\n * Why a stylesheet: the Lynx engine ignores custom properties written in an inline style object unless the page\n * config `enableCSSInlineVariables` is on, which the ReactLynx toolchain does not expose (found in the Lynxtron window\n * on Windows, 2026-10-05: inline `--x` unset, a class-declared `--x` and `setProperty({ '--x': … })` both inherit). So\n * the provider's first frame takes its values from these classes, and the provider then writes every variable with\n * `setProperty` (custom palettes, overrides, layout overrides, every later theme change).\n */\nexport function renderThemeStylesheet(): string {\n return [\n '/* Generated by renderThemeStylesheet (src/provider/theme-css.ts); `npm run gen:theme-css` rewrites it. */',\n cssVariablesToText(toCssVariables({ palette: g9LightPalette }), '.g9-theme-light'),\n cssVariablesToText(toCssVariables({ palette: g9DarkPalette }), '.g9-theme-dark'),\n cssVariablesToText({ ...toMetricCssVariables(), ...toLayoutCssVariables() }, '.g9-provider'),\n ].join('\\n');\n}\n"],"names":["renderThemeStylesheet","cssVariablesToText","toCssVariables","g9LightPalette","g9DarkPalette","toMetricCssVariables","toLayoutCssVariables"],"mappings":";AAmBO,SAASA;IACd,OAAO;QACL;QACAC,mBAAmBC,eAAe;YAAE,SAASC;QAAe,IAAI;QAChEF,mBAAmBC,eAAe;YAAE,SAASE;QAAc,IAAI;QAC/DH,mBAAmB;YAAE,GAAGI,sBAAsB;YAAE,GAAGC,sBAAsB;QAAC,GAAG;KAC9E,CAAC,IAAI,CAAC;AACT"}
@@ -0,0 +1,10 @@
1
+ import type { G9CssVariables } from '@g9tm/lynxcontrols-foundation';
2
+ /** The variables of `next` whose value differs from `previous`, or `null` when nothing changed. */
3
+ export declare function changedVariables(previous: G9CssVariables, next: G9CssVariables): G9CssVariables | null;
4
+ /**
5
+ * Sets CSS variables on the element with `id` through the Lynx element API (`lynx.getElementById(id).setProperty`),
6
+ * which re-themes descendants without a React render (plan/specs/02 §2). Returns `false` when this runtime has no
7
+ * such API or element, so the caller can fall back to re-rendering the root's style.
8
+ */
9
+ export declare function applyThemeVariables(id: string, variables: G9CssVariables): boolean;
10
+ //# sourceMappingURL=theme-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-root.d.ts","sourceRoot":"","sources":["../../src/provider/theme-root.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,mGAAmG;AACnG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI,CAWtG;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAKlF"}
@@ -0,0 +1,24 @@
1
+ function changedVariables(previous, next) {
2
+ const diff = {};
3
+ let changed = false;
4
+ for (const name of Object.keys(next)){
5
+ const value = next[name];
6
+ if (previous[name] !== value) {
7
+ diff[name] = value;
8
+ changed = true;
9
+ }
10
+ }
11
+ return changed ? diff : null;
12
+ }
13
+ function applyThemeVariables(id, variables) {
14
+ var _lynx_getElementById, _lynx;
15
+ const element = null == (_lynx_getElementById = (_lynx = lynx).getElementById) ? void 0 : _lynx_getElementById.call(_lynx, id);
16
+ if (!element || 'function' != typeof element.setProperty) return false;
17
+ element.setProperty({
18
+ ...variables
19
+ });
20
+ return true;
21
+ }
22
+ export { applyThemeVariables, changedVariables };
23
+
24
+ //# sourceMappingURL=theme-root.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider/theme-root.jsx","sources":["../../src/provider/theme-root.ts"],"sourcesContent":["import type { G9CssVariables } from '@g9tm/lynxcontrols-foundation';\n\n/** The variables of `next` whose value differs from `previous`, or `null` when nothing changed. */\nexport function changedVariables(previous: G9CssVariables, next: G9CssVariables): G9CssVariables | null {\n const diff: Record<string, string> = {};\n let changed = false;\n for (const name of Object.keys(next)) {\n const value = next[name] as string;\n if (previous[name] !== value) {\n diff[name] = value;\n changed = true;\n }\n }\n return changed ? diff : null;\n}\n\ninterface ElementApi {\n getElementById?: (id: string) => { setProperty?: (props: Record<string, string>) => void } | null | undefined;\n}\n\n/**\n * Sets CSS variables on the element with `id` through the Lynx element API (`lynx.getElementById(id).setProperty`),\n * which re-themes descendants without a React render (plan/specs/02 §2). Returns `false` when this runtime has no\n * such API or element, so the caller can fall back to re-rendering the root's style.\n */\nexport function applyThemeVariables(id: string, variables: G9CssVariables): boolean {\n const element = (lynx as unknown as ElementApi).getElementById?.(id);\n if (!element || typeof element.setProperty !== 'function') return false;\n element.setProperty({ ...variables });\n return true;\n}\n"],"names":["changedVariables","previous","next","diff","changed","name","Object","value","applyThemeVariables","id","variables","_lynx_getElementById","_lynx","element"],"mappings":"AAGO,SAASA,iBAAiBC,QAAwB,EAAEC,IAAoB;IAC7E,MAAMC,OAA+B,CAAC;IACtC,IAAIC,UAAU;IACd,KAAK,MAAMC,QAAQC,OAAO,IAAI,CAACJ,MAAO;QACpC,MAAMK,QAAQL,IAAI,CAACG,KAAK;QACxB,IAAIJ,QAAQ,CAACI,KAAK,KAAKE,OAAO;YAC5BJ,IAAI,CAACE,KAAK,GAAGE;YACbH,UAAU;QACZ;IACF;IACA,OAAOA,UAAUD,OAAO;AAC1B;AAWO,SAASK,oBAAoBC,EAAU,EAAEC,SAAyB;QACvDC,sBAACC;IAAjB,MAAMC,UAAU,QAAAF,CAAAA,uBAAAA,AAACC,CAAAA,QAAAA,IAAG,EAA4B,cAAc,AAAD,IAA7CD,KAAAA,IAAAA,qBAAAA,IAAAA,CAACC,OAAgDH;IACjE,IAAI,CAACI,WAAW,AAA+B,cAA/B,OAAOA,QAAQ,WAAW,EAAiB,OAAO;IAClEA,QAAQ,WAAW,CAAC;QAAE,GAAGH,SAAS;IAAC;IACnC,OAAO;AACT"}