@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,29 @@
1
+ import { type G9Color } from '@g9tm/lynxcontrols-foundation';
2
+ import { type ReactNode } from '@lynx-js/react';
3
+ /** Props of {@link G9Swatch}. */
4
+ export interface G9SwatchProps {
5
+ /** The first stored colour (a variety's `FirstColor`). */
6
+ readonly first?: G9Color | null | undefined;
7
+ /** The second stored colour (a variety's `SecondColor`). */
8
+ readonly second?: G9Color | null | undefined;
9
+ /** Diameter in px. Default 18 (MAUI `G9Metrics.SelectionIconSize`). */
10
+ readonly size?: number;
11
+ /**
12
+ * Which side the first half of a two-colour swatch sits on: its reading start, as a MAUI `Grid` column 0 does under
13
+ * the inherited `FlowDirection`. Default the provider's culture direction (LTR without a provider).
14
+ */
15
+ readonly direction?: 'ltr' | 'rtl';
16
+ /** Extra class names (spacing next to a label). */
17
+ readonly className?: string;
18
+ }
19
+ /** The default swatch diameter (MAUI `G9Metrics.SelectionIconSize`). */
20
+ export declare const g9SwatchDefaultSize = 18;
21
+ /**
22
+ * The variety colour swatch shown in place of an icon for items that only carry stored colours (MAUI
23
+ * `G9Visuals.CreateSwatch`), ONE convention for every surface that shows a variety (picker and combo triggers,
24
+ * selection-sheet rows, read-only displays): no colour → a zero-size invisible element (mount it unconditionally),
25
+ * one colour (first or second) → a solid circle, two → a circle split into two vertical halves, first at the reading
26
+ * start. Never a touch target.
27
+ */
28
+ export declare function G9Swatch(props: G9SwatchProps): ReactNode;
29
+ //# sourceMappingURL=swatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swatch.d.ts","sourceRoot":"","sources":["../../src/icon/swatch.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAa,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,gBAAgB,CAAC;AAG5D,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACnC,mDAAmD;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,CAwBxD"}
@@ -0,0 +1,25 @@
1
+ import { hasSwatch } from "@g9tm/lynxcontrols-foundation";
2
+ import { useContext } from "@lynx-js/react";
3
+ import { G9CultureContext } from "../provider/contexts.jsx";
4
+ const g9SwatchDefaultSize = 18;
5
+ function G9Swatch(props) {
6
+ var _props_size, _ref, _props_direction;
7
+ var _props_first, _props_second;
8
+ const culture = useContext(G9CultureContext);
9
+ const first = (null == (_props_first = props.first) ? void 0 : _props_first.trim()) ? props.first : null;
10
+ const second = (null == (_props_second = props.second) ? void 0 : _props_second.trim()) ? props.second : null;
11
+ const className = props.className ? ` ${props.className}` : '';
12
+ if (!hasSwatch(first, second)) return <view className={`g9-icon-empty${className}`}/>;
13
+ const size = null != (_props_size = props.size) ? _props_size : g9SwatchDefaultSize;
14
+ const both = null !== first && null !== second;
15
+ const towards = (null != (_ref = null != (_props_direction = props.direction) ? _props_direction : null == culture ? void 0 : culture.culture.direction) ? _ref : 'ltr') === 'rtl' ? 'left' : 'right';
16
+ return <view className={`g9-swatch${className}`} accessibility-element={false} style={{
17
+ width: `${size}px`,
18
+ height: `${size}px`,
19
+ borderRadius: `${size / 2}px`,
20
+ background: both ? `linear-gradient(to ${towards}, ${first} 50%, ${second} 50%)` : null != first ? first : second
21
+ }}/>;
22
+ }
23
+ export { G9Swatch, g9SwatchDefaultSize };
24
+
25
+ //# sourceMappingURL=swatch.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon/swatch.jsx","sources":["../../src/icon/swatch.tsx"],"sourcesContent":["import { type G9Color, hasSwatch } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useContext } from '@lynx-js/react';\nimport { G9CultureContext } from '../provider/contexts';\n\n/** Props of {@link G9Swatch}. */\nexport interface G9SwatchProps {\n /** The first stored colour (a variety's `FirstColor`). */\n readonly first?: G9Color | null | undefined;\n /** The second stored colour (a variety's `SecondColor`). */\n readonly second?: G9Color | null | undefined;\n /** Diameter in px. Default 18 (MAUI `G9Metrics.SelectionIconSize`). */\n readonly size?: number;\n /**\n * Which side the first half of a two-colour swatch sits on: its reading start, as a MAUI `Grid` column 0 does under\n * the inherited `FlowDirection`. Default the provider's culture direction (LTR without a provider).\n */\n readonly direction?: 'ltr' | 'rtl';\n /** Extra class names (spacing next to a label). */\n readonly className?: string;\n}\n\n/** The default swatch diameter (MAUI `G9Metrics.SelectionIconSize`). */\nexport const g9SwatchDefaultSize = 18;\n\n/**\n * The variety colour swatch shown in place of an icon for items that only carry stored colours (MAUI\n * `G9Visuals.CreateSwatch`), ONE convention for every surface that shows a variety (picker and combo triggers,\n * selection-sheet rows, read-only displays): no colour → a zero-size invisible element (mount it unconditionally),\n * one colour (first or second) → a solid circle, two → a circle split into two vertical halves, first at the reading\n * start. Never a touch target.\n */\nexport function G9Swatch(props: G9SwatchProps): ReactNode {\n const culture = useContext(G9CultureContext);\n // A blank stored colour (an empty database column) is no colour, as a null MAUI `Color?` is.\n const first = props.first?.trim() ? props.first : null;\n const second = props.second?.trim() ? props.second : null;\n const className = props.className ? ` ${props.className}` : '';\n if (!hasSwatch(first, second)) return <view className={`g9-icon-empty${className}`} />;\n const size = props.size ?? g9SwatchDefaultSize;\n const both = first !== null && second !== null;\n const towards = (props.direction ?? culture?.culture.direction ?? 'ltr') === 'rtl' ? 'left' : 'right';\n return (\n <view\n className={`g9-swatch${className}`}\n accessibility-element={false}\n style={{\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: `${size / 2}px`,\n background: both\n ? `linear-gradient(to ${towards}, ${first} 50%, ${second} 50%)`\n : ((first ?? second) as string),\n }}\n />\n );\n}\n"],"names":["g9SwatchDefaultSize","G9Swatch","props","_props_size","_ref","_props_first","_props_second","culture","useContext","G9CultureContext","first","second","className","hasSwatch","view","size","both","towards"],"mappings":";;;AAsBO,MAAMA,sBAAsB;AAS5B,SAASC,SAASC,KAAoB;QAO9BC,aAEIC,MAAAA;QANHC,cACCC;IAHf,MAAMC,UAAUC,WAAWC;IAE3B,MAAMC,QAAQL,AAAAA,SAAAA,CAAAA,eAAAA,MAAM,KAAK,AAAD,IAAVA,KAAAA,IAAAA,aAAa,IAAI,EAAC,IAAIH,MAAM,KAAK,GAAG;IAClD,MAAMS,SAASL,AAAAA,SAAAA,CAAAA,gBAAAA,MAAM,MAAM,AAAD,IAAXA,KAAAA,IAAAA,cAAc,IAAI,EAAC,IAAIJ,MAAM,MAAM,GAAG;IACrD,MAAMU,YAAYV,MAAM,SAAS,GAAG,CAAC,CAAC,EAAEA,MAAM,SAAS,EAAE,GAAG;IAC5D,IAAI,CAACW,UAAUH,OAAOC,SAAS,QAAQG,KAAK,WAAW,CAAC,aAAa,EAAEF,WAAW;IAClF,MAAMG,OAAO,QAAAZ,CAAAA,cAAAA,MAAM,IAAI,AAAD,IAATA,cAAcH;IAC3B,MAAMgB,OAAON,AAAU,SAAVA,SAAkBC,AAAW,SAAXA;IAC/B,MAAMM,UAAU,AAAC,SAAAb,CAAAA,OAAAA,QAAAA,CAAAA,mBAAAA,MAAM,SAAS,AAAD,IAAdA,mBAAmBG,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,OAAO,CAAC,SAAS,AAAD,IAA5CH,OAAiD,KAAI,MAAO,QAAQ,SAAS;IAC9F,QACGU,KACC,WAAW,CAAC,SAAS,EAAEF,WAAW,EAClC,uBAAuB,OACvB,OAAO;QACL,OAAO,GAAGG,KAAK,EAAE,CAAC;QAClB,QAAQ,GAAGA,KAAK,EAAE,CAAC;QACnB,cAAc,GAAGA,OAAO,EAAE,EAAE,CAAC;QAC7B,YAAYC,OACR,CAAC,mBAAmB,EAAEC,QAAQ,EAAE,EAAEP,MAAM,MAAM,EAAEC,OAAO,KAAK,CAAC,GAC3DD,QAAAA,QAAAA,QAASC;IACjB;AAGN"}
@@ -0,0 +1,23 @@
1
+ export type * from './base/index.js';
2
+ export type * from './button/index.js';
3
+ export type * from './cascade/index.js';
4
+ export type * from './deferred/index.js';
5
+ export type * from './display/index.js';
6
+ export type * from './edge-panel/index.js';
7
+ export type * from './expander/index.js';
8
+ export type * from './fields/index.js';
9
+ export type * from './host/index.js';
10
+ export type * from './icon/index.js';
11
+ export type * from './pickers/index.js';
12
+ export type * from './plus-button/index.js';
13
+ export type * from './popup/index.js';
14
+ export type * from './provider/index.js';
15
+ export type * from './range-slider/index.js';
16
+ export type * from './selection/index.js';
17
+ export type * from './sheet/index.js';
18
+ export type * from './swipe/index.js';
19
+ export type * from './tab-bar/index.js';
20
+ export type * from './tabs/index.js';
21
+ export type * from './toast/index.js';
22
+ export type * from './toggle/index.js';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,UAAU,CAAC;AAC9B,mBAAmB,WAAW,CAAC;AAC/B,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,WAAW,CAAC;AAC/B,mBAAmB,cAAc,CAAC;AAClC,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,UAAU,CAAC;AAC9B,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,WAAW,CAAC;AAC/B,mBAAmB,eAAe,CAAC;AACnC,mBAAmB,SAAS,CAAC;AAC7B,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,gBAAgB,CAAC;AACpC,mBAAmB,aAAa,CAAC;AACjC,mBAAmB,SAAS,CAAC;AAC7B,mBAAmB,SAAS,CAAC;AAC7B,mBAAmB,WAAW,CAAC;AAC/B,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,SAAS,CAAC;AAC7B,mBAAmB,UAAU,CAAC"}
package/dist/index.jsx ADDED
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,42 @@
1
+ import './pickers.css';
2
+ import { type G9TextInputDirection } from '@g9tm/lynxcontrols-foundation';
3
+ import { type ReactNode } from '@lynx-js/react';
4
+ import { type G9SelectionItem } from '../base/selection-item.js';
5
+ import { type G9PickerFieldProps } from './trigger.js';
6
+ /** Chips shown in the box before the `+N` overflow chip (MAUI combo). */
7
+ export declare const g9ComboMaxChips = 2;
8
+ /** Props of {@link G9ComboBox}. */
9
+ export interface G9ComboBoxProps<T extends G9SelectionItem = G9SelectionItem> extends G9PickerFieldProps {
10
+ /** The rows (MAUI `ItemsSource`). Disabled items are left out except selected ones (shown dimmed). */
11
+ readonly items: ReadonlyArray<T>;
12
+ /** Multi-selection (MAUI `AllowMultipleSelection`): `values` instead of `value`, Done commits. Default false. */
13
+ readonly allowMultiple?: boolean;
14
+ /** Single mode: the selected key (MAUI `SelectedItem`). */
15
+ readonly value?: string | null;
16
+ readonly defaultValue?: string | null;
17
+ readonly onValueChange?: (key: string | null, item: T | null) => void;
18
+ /** Multi mode: the selected keys, in list order (MAUI `SelectedItems`). */
19
+ readonly values?: ReadonlyArray<string>;
20
+ readonly defaultValues?: ReadonlyArray<string>;
21
+ readonly onValuesChange?: (keys: ReadonlyArray<string>, items: ReadonlyArray<T>) => void;
22
+ /** Sheet title; default the label, else the placeholder. */
23
+ readonly sheetTitle?: string | null;
24
+ /** Text when the search finds nothing (MAUI `EmptyStateText`, default localized "No results"). */
25
+ readonly emptyStateText?: string | null;
26
+ /** A × in the trailing slot clears the selection while there is one (MAUI `ClearButton`). Default true. */
27
+ readonly clearButton?: boolean;
28
+ /** Direction of the value/chips and the sheet rows (MAUI `ValueTextDirection`). Default follows the culture. */
29
+ readonly valueTextDirection?: G9TextInputDirection;
30
+ }
31
+ /** Two key lists hold the same keys in the same order. */
32
+ export declare function sameSelectionKeys(a: ReadonlyArray<string>, b: ReadonlyArray<string>): boolean;
33
+ /**
34
+ * Searchable single or multi selection in an outlined box (MAUI `G9ComboBox`). The sheet always has search. Single:
35
+ * only a pick writes the value; a dismissal leaves it. Multi: Done commits, and so does dismissing a sheet whose
36
+ * selection changed; an untouched dismissal writes nothing. The box shows the value (icon or swatch + text), or up
37
+ * to two chips and a `+N` chip; with `clearButton` the trailing search glyph becomes × while there is a value and a
38
+ * tap on it clears without opening. A result that arrives after the field unmounted, or after a newer open, is
39
+ * dropped.
40
+ */
41
+ export declare function G9ComboBox<T extends G9SelectionItem = G9SelectionItem>(props: G9ComboBoxProps<T>): ReactNode;
42
+ //# sourceMappingURL=combo-box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combo-box.d.ts","sourceRoot":"","sources":["../../src/pickers/combo-box.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAgD,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACxH,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,KAAK,eAAe,EAAgB,MAAM,wBAAwB,CAAC;AAK5E,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,WAAW,CAAC;AAEnB,yEAAyE;AACzE,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,mCAAmC;AACnC,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,kBAAkB;IACtG,sGAAsG;IACtG,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACjC,iHAAiH;IACjH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IACtE,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACzF,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,kGAAkG;IAClG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,2GAA2G;IAC3G,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,gHAAgH;IAChH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;CACpD;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAE7F;AAGD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAqH5G"}
@@ -0,0 +1,129 @@
1
+ import "./pickers.css";
2
+ import { G9StringKey, buildSolidOrGradient, fillToCss } from "@g9tm/lynxcontrols-foundation";
3
+ import { useRef } from "@lynx-js/react";
4
+ import { g9RowStyle } from "../base/control.jsx";
5
+ import { selectionKey } from "../base/selection-item.jsx";
6
+ import { useControllableState } from "../base/use-controllable-state.jsx";
7
+ import { useG9Direction, useG9Settings, useG9Strings, useG9Theme } from "../provider/hooks.jsx";
8
+ import { showSelectionSheet } from "../selection/selection-sheet.jsx";
9
+ import { useG9Sheets } from "../sheet/service.jsx";
10
+ import { PickerField, SelectionValueIcon, usePickerOpen, valueDirection, valueDirectionClass } from "./trigger.jsx";
11
+ const g9ComboMaxChips = 2;
12
+ function sameSelectionKeys(a, b) {
13
+ return a.length === b.length && a.every((k, i)=>k === b[i]);
14
+ }
15
+ const sameKeys = sameSelectionKeys;
16
+ function G9ComboBox(props) {
17
+ var _props_defaultValue, _props_defaultValues, _props_placeholder;
18
+ const sheets = useG9Sheets();
19
+ const glyphs = useG9Settings().glyphs;
20
+ const strings = useG9Strings();
21
+ const culture = useG9Direction();
22
+ const primary = useG9Theme().palette.Primary;
23
+ const open = usePickerOpen();
24
+ const multiple = true === props.allowMultiple;
25
+ const byKey = (keys)=>keys.map((k)=>props.items.find((i)=>selectionKey(i) === k)).filter((i)=>void 0 !== i);
26
+ const [key, setKey] = useControllableState({
27
+ value: props.value,
28
+ defaultValue: null != (_props_defaultValue = props.defaultValue) ? _props_defaultValue : null,
29
+ onChange: props.onValueChange,
30
+ name: 'G9ComboBox.value'
31
+ });
32
+ const [keys, setKeys] = useControllableState({
33
+ value: props.values,
34
+ defaultValue: null != (_props_defaultValues = props.defaultValues) ? _props_defaultValues : [],
35
+ onChange: props.onValuesChange,
36
+ name: 'G9ComboBox.values',
37
+ equals: sameKeys
38
+ });
39
+ const latest = useRef({
40
+ props,
41
+ key,
42
+ keys
43
+ });
44
+ latest.current = {
45
+ props,
46
+ key,
47
+ keys
48
+ };
49
+ const selected = multiple ? byKey(keys) : byKey(null === key ? [] : [
50
+ key
51
+ ]);
52
+ const hasValue = selected.length > 0;
53
+ const blocked = true === props.disabled || true === props.readOnly;
54
+ const clear = ()=>{
55
+ if (multiple) setKeys([], []);
56
+ else setKey(null, null);
57
+ };
58
+ const onOpen = ()=>open(async (isCurrent)=>{
59
+ var _ref, _p_label, _p_emptyStateText;
60
+ var _p_sheetTitle;
61
+ const { props: p, key: k, keys: ks } = latest.current;
62
+ const current = p.allowMultiple ? ks : null === k ? [] : [
63
+ k
64
+ ];
65
+ const picked = current.map((c)=>p.items.find((i)=>selectionKey(i) === c)).filter((i)=>void 0 !== i);
66
+ const items = p.items.filter((i)=>false !== i.isEnabled || picked.includes(i));
67
+ if (0 === items.length) return;
68
+ const result = await showSelectionSheet(sheets, {
69
+ title: (null == (_p_sheetTitle = p.sheetTitle) ? void 0 : _p_sheetTitle.trim()) ? p.sheetTitle : null != (_ref = null != (_p_label = p.label) ? _p_label : p.placeholder) ? _ref : '',
70
+ items,
71
+ selectedItems: picked,
72
+ allowMultiple: true === p.allowMultiple,
73
+ closeOnSingleSelection: true !== p.allowMultiple,
74
+ showSearch: true,
75
+ emptyText: null != (_p_emptyStateText = p.emptyStateText) ? _p_emptyStateText : strings.get(G9StringKey.NoResults),
76
+ ...p.valueTextDirection ? {
77
+ itemTextDirection: p.valueTextDirection
78
+ } : {}
79
+ });
80
+ if (!isCurrent()) return;
81
+ if (p.allowMultiple) {
82
+ if (!result.wasAccepted && !result.selectionChanged) return;
83
+ const next = result.items.map(selectionKey);
84
+ if (sameKeys(next, latest.current.keys)) return;
85
+ setKeys(next, result.items);
86
+ } else if (result.wasAccepted) {
87
+ var _result_items_;
88
+ const item = null != (_result_items_ = result.items[0]) ? _result_items_ : null;
89
+ setKey(item ? selectionKey(item) : null, item);
90
+ }
91
+ });
92
+ const showClear = false !== props.clearButton && hasValue && !blocked;
93
+ const dir = valueDirectionClass(props.valueTextDirection, culture);
94
+ const row = g9RowStyle(valueDirection(props.valueTextDirection, culture));
95
+ return <PickerField field={{
96
+ trailingIcon: glyphs.search,
97
+ ...props
98
+ }} hasValue={hasValue} onOpen={onOpen} trailingAffordance={showClear ? {
99
+ icon: glyphs.clear,
100
+ signature: 'clear',
101
+ label: strings.get(G9StringKey.Clear),
102
+ onPress: clear
103
+ } : null}>
104
+ <view className={`g9-combo__value ${dir}`} style={row}>
105
+ {multiple && hasValue ? <view className="g9-combo__chips" style={row}>
106
+ {selected.slice(0, g9ComboMaxChips).map((item)=><view key={selectionKey(item)} className="g9-combo__chip" style={{
107
+ ...row,
108
+ background: fillToCss(buildSolidOrGradient(primary, true))
109
+ }}>
110
+ <SelectionValueIcon item={item} color="var(--g9-on-primary)"/>
111
+ <text className="g9-combo__chip-text" text-maxline="1">
112
+ {item.text}
113
+ </text>
114
+ </view>)}
115
+ {selected.length > g9ComboMaxChips ? <view className="g9-combo__chip g9-combo__chip--more">
116
+ <text className="g9-combo__chip-text">{`+${selected.length - g9ComboMaxChips}`}</text>
117
+ </view> : null}
118
+ </view> : [
119
+ hasValue ? <SelectionValueIcon key="i" item={selected[0]}/> : null,
120
+ <text key="t" className={`g9-picker__text${hasValue ? '' : ' g9-picker__text--placeholder'}`} text-maxline="1">
121
+ {hasValue ? selected[0].text : props.label ? '' : null != (_props_placeholder = props.placeholder) ? _props_placeholder : ''}
122
+ </text>
123
+ ]}
124
+ </view>
125
+ </PickerField>;
126
+ }
127
+ export { G9ComboBox, g9ComboMaxChips, sameSelectionKeys };
128
+
129
+ //# sourceMappingURL=combo-box.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickers/combo-box.jsx","sources":["../../src/pickers/combo-box.tsx"],"sourcesContent":["import './pickers.css';\nimport { buildSolidOrGradient, fillToCss, G9StringKey, type G9TextInputDirection } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useRef } from '@lynx-js/react';\nimport { g9RowStyle } from '../base/control';\nimport { type G9SelectionItem, selectionKey } from '../base/selection-item';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { useG9Direction, useG9Settings, useG9Strings, useG9Theme } from '../provider/hooks';\nimport { showSelectionSheet } from '../selection/selection-sheet';\nimport { useG9Sheets } from '../sheet/service';\nimport {\n type G9PickerFieldProps,\n PickerField,\n SelectionValueIcon,\n usePickerOpen,\n valueDirection,\n valueDirectionClass,\n} from './trigger';\n\n/** Chips shown in the box before the `+N` overflow chip (MAUI combo). */\nexport const g9ComboMaxChips = 2;\n\n/** Props of {@link G9ComboBox}. */\nexport interface G9ComboBoxProps<T extends G9SelectionItem = G9SelectionItem> extends G9PickerFieldProps {\n /** The rows (MAUI `ItemsSource`). Disabled items are left out except selected ones (shown dimmed). */\n readonly items: ReadonlyArray<T>;\n /** Multi-selection (MAUI `AllowMultipleSelection`): `values` instead of `value`, Done commits. Default false. */\n readonly allowMultiple?: boolean;\n /** Single mode: the selected key (MAUI `SelectedItem`). */\n readonly value?: string | null;\n readonly defaultValue?: string | null;\n readonly onValueChange?: (key: string | null, item: T | null) => void;\n /** Multi mode: the selected keys, in list order (MAUI `SelectedItems`). */\n readonly values?: ReadonlyArray<string>;\n readonly defaultValues?: ReadonlyArray<string>;\n readonly onValuesChange?: (keys: ReadonlyArray<string>, items: ReadonlyArray<T>) => void;\n /** Sheet title; default the label, else the placeholder. */\n readonly sheetTitle?: string | null;\n /** Text when the search finds nothing (MAUI `EmptyStateText`, default localized \"No results\"). */\n readonly emptyStateText?: string | null;\n /** A × in the trailing slot clears the selection while there is one (MAUI `ClearButton`). Default true. */\n readonly clearButton?: boolean;\n /** Direction of the value/chips and the sheet rows (MAUI `ValueTextDirection`). Default follows the culture. */\n readonly valueTextDirection?: G9TextInputDirection;\n}\n\n/** Two key lists hold the same keys in the same order. */\nexport function sameSelectionKeys(a: ReadonlyArray<string>, b: ReadonlyArray<string>): boolean {\n return a.length === b.length && a.every((k, i) => k === b[i]);\n}\nconst sameKeys = sameSelectionKeys;\n\n/**\n * Searchable single or multi selection in an outlined box (MAUI `G9ComboBox`). The sheet always has search. Single:\n * only a pick writes the value; a dismissal leaves it. Multi: Done commits, and so does dismissing a sheet whose\n * selection changed; an untouched dismissal writes nothing. The box shows the value (icon or swatch + text), or up\n * to two chips and a `+N` chip; with `clearButton` the trailing search glyph becomes × while there is a value and a\n * tap on it clears without opening. A result that arrives after the field unmounted, or after a newer open, is\n * dropped.\n */\nexport function G9ComboBox<T extends G9SelectionItem = G9SelectionItem>(props: G9ComboBoxProps<T>): ReactNode {\n const sheets = useG9Sheets();\n const glyphs = useG9Settings().glyphs;\n const strings = useG9Strings();\n const culture = useG9Direction();\n const primary = useG9Theme().palette.Primary;\n const open = usePickerOpen();\n const multiple = props.allowMultiple === true;\n const byKey = (keys: ReadonlyArray<string>) =>\n keys.map((k) => props.items.find((i) => selectionKey(i) === k)).filter((i): i is T => i !== undefined);\n const [key, setKey] = useControllableState<string | null, [T | null]>({\n value: props.value,\n defaultValue: props.defaultValue ?? null,\n onChange: props.onValueChange,\n name: 'G9ComboBox.value',\n });\n const [keys, setKeys] = useControllableState<ReadonlyArray<string>, [ReadonlyArray<T>]>({\n value: props.values,\n defaultValue: props.defaultValues ?? [],\n onChange: props.onValuesChange,\n name: 'G9ComboBox.values',\n equals: sameKeys,\n });\n const latest = useRef({ props, key, keys });\n latest.current = { props, key, keys };\n\n const selected = multiple ? byKey(keys) : byKey(key === null ? [] : [key]);\n const hasValue = selected.length > 0;\n const blocked = props.disabled === true || props.readOnly === true;\n\n const clear = () => {\n if (multiple) setKeys([], []);\n else setKey(null, null);\n };\n\n const onOpen = () =>\n open(async (isCurrent) => {\n const { props: p, key: k, keys: ks } = latest.current;\n const current = p.allowMultiple ? ks : k === null ? [] : [k];\n const picked = current\n .map((c) => p.items.find((i) => selectionKey(i) === c))\n .filter((i): i is T => i !== undefined);\n const items = p.items.filter((i) => i.isEnabled !== false || picked.includes(i));\n if (items.length === 0) return;\n const result = await showSelectionSheet(sheets, {\n title: p.sheetTitle?.trim() ? p.sheetTitle : (p.label ?? p.placeholder ?? ''),\n items,\n selectedItems: picked,\n allowMultiple: p.allowMultiple === true,\n closeOnSingleSelection: p.allowMultiple !== true,\n showSearch: true,\n emptyText: p.emptyStateText ?? strings.get(G9StringKey.NoResults),\n ...(p.valueTextDirection ? { itemTextDirection: p.valueTextDirection } : {}),\n });\n if (!isCurrent()) return;\n if (p.allowMultiple) {\n if (!result.wasAccepted && !result.selectionChanged) return;\n const next = result.items.map(selectionKey);\n if (sameKeys(next, latest.current.keys)) return;\n setKeys(next, result.items);\n } else if (result.wasAccepted) {\n const item = result.items[0] ?? null;\n setKey(item ? selectionKey(item) : null, item);\n }\n });\n\n const showClear = props.clearButton !== false && hasValue && !blocked;\n const dir = valueDirectionClass(props.valueTextDirection, culture);\n const row = g9RowStyle(valueDirection(props.valueTextDirection, culture));\n return (\n <PickerField\n field={{ trailingIcon: glyphs.search, ...props }}\n hasValue={hasValue}\n onOpen={onOpen}\n trailingAffordance={\n showClear\n ? { icon: glyphs.clear, signature: 'clear', label: strings.get(G9StringKey.Clear), onPress: clear }\n : null\n }\n >\n <view className={`g9-combo__value ${dir}`} style={row}>\n {multiple && hasValue ? (\n <view className=\"g9-combo__chips\" style={row}>\n {selected.slice(0, g9ComboMaxChips).map((item) => (\n // MAUI G9Colors.BuildSolidOrGradient(palette.Primary, useGradient: true).\n <view\n key={selectionKey(item)}\n className=\"g9-combo__chip\"\n style={{ ...row, background: fillToCss(buildSolidOrGradient(primary, true)) }}\n >\n <SelectionValueIcon item={item} color=\"var(--g9-on-primary)\" />\n <text className=\"g9-combo__chip-text\" text-maxline=\"1\">\n {item.text}\n </text>\n </view>\n ))}\n {selected.length > g9ComboMaxChips ? (\n <view className=\"g9-combo__chip g9-combo__chip--more\">\n <text className=\"g9-combo__chip-text\">{`+${selected.length - g9ComboMaxChips}`}</text>\n </view>\n ) : null}\n </view>\n ) : (\n [\n hasValue ? <SelectionValueIcon key=\"i\" item={selected[0] as T} /> : null,\n <text\n key=\"t\"\n className={`g9-picker__text${hasValue ? '' : ' g9-picker__text--placeholder'}`}\n text-maxline=\"1\"\n >\n {hasValue ? (selected[0] as T).text : props.label ? '' : (props.placeholder ?? '')}\n </text>,\n ]\n )}\n </view>\n </PickerField>\n );\n}\n"],"names":["g9ComboMaxChips","sameSelectionKeys","a","b","k","i","sameKeys","G9ComboBox","props","_props_defaultValue","_props_defaultValues","_props_placeholder","sheets","useG9Sheets","glyphs","useG9Settings","strings","useG9Strings","culture","useG9Direction","primary","useG9Theme","open","usePickerOpen","multiple","byKey","keys","selectionKey","undefined","key","setKey","useControllableState","setKeys","latest","useRef","selected","hasValue","blocked","clear","onOpen","isCurrent","_ref","_p_emptyStateText","_p_sheetTitle","p","ks","current","picked","c","items","result","showSelectionSheet","G9StringKey","next","_result_items_","item","showClear","dir","valueDirectionClass","row","g9RowStyle","valueDirection","PickerField","view","fillToCss","buildSolidOrGradient","SelectionValueIcon","text"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import './pickers.css';
2
+ import { type G9CalendarSystem, type G9Culture, G9DateTimeDisplayFormat, G9DateTimePickerMode, type G9LocalDate, type G9LocalDateTime } from '@g9tm/lynxcontrols-foundation';
3
+ import { type ReactNode } from '@lynx-js/react';
4
+ import { type G9PickerFieldProps } from './trigger.js';
5
+ /** Years the year window grows by at an edge (MAUI `YearWindowStep`). */
6
+ export declare const g9YearWindowStep = 25;
7
+ /** Props of {@link G9DateTimePicker}. */
8
+ export interface G9DateTimePickerProps extends G9PickerFieldProps {
9
+ /** The value, always Gregorian (MAUI `SelectedDateTime`); `null` = none. Controlled with `onValueChange`. */
10
+ readonly value?: G9LocalDateTime | null;
11
+ readonly defaultValue?: G9LocalDateTime | null;
12
+ readonly onValueChange?: (value: G9LocalDateTime | null) => void;
13
+ /** Default `'date'`. */
14
+ readonly mode?: G9DateTimePickerMode;
15
+ /** Default `'shortDate'`. */
16
+ readonly displayFormat?: G9DateTimeDisplayFormat;
17
+ /** Text of the `'custom'` format (MAUI `FormattedDisplayText`). */
18
+ readonly formattedDisplayText?: string | null;
19
+ readonly minDate?: G9LocalDate | null;
20
+ readonly maxDate?: G9LocalDate | null;
21
+ /** Hours 0–23 instead of 12-hour AM/PM. Default false. */
22
+ readonly twentyFourHourDisplay?: boolean;
23
+ /**
24
+ * Default true (MAUI `RestoreOnCancel`): Cancel or a dismissal puts back the value the picker had when it opened if
25
+ * it changed meanwhile. False leaves the current value.
26
+ */
27
+ readonly restoreOnCancel?: boolean;
28
+ /** The Today / Now chip. Default true. */
29
+ readonly showTodayButton?: boolean;
30
+ /** Calendar override; default Persian for `fa`, else Gregorian (follows the language, not the direction). */
31
+ readonly calendar?: G9CalendarSystem | null;
32
+ /** Done confirmed a value (MAUI `DateTimeSelected`). */
33
+ readonly onDateTimeSelected?: (value: G9LocalDateTime) => void;
34
+ }
35
+ interface SheetBodyProps {
36
+ readonly title: string;
37
+ readonly initial: G9LocalDateTime;
38
+ readonly now: () => G9LocalDateTime;
39
+ readonly mode: G9DateTimePickerMode;
40
+ readonly calendar: G9CalendarSystem;
41
+ readonly culture: G9Culture;
42
+ readonly bounds: {
43
+ min: G9LocalDateTime | null;
44
+ max: G9LocalDateTime | null;
45
+ };
46
+ readonly twentyFourHour: boolean;
47
+ readonly showToday: boolean;
48
+ readonly format: (value: G9LocalDateTime) => string;
49
+ readonly done: (value: G9LocalDateTime) => void;
50
+ readonly cancel: () => void;
51
+ }
52
+ /** The drum sheet body (MAUI `G9DateTimePickerSheet`): header, live preview, Today/Now chip, the wheels. */
53
+ export declare function DateTimeSheetBody(props: SheetBodyProps): ReactNode;
54
+ /**
55
+ * Date, time or date-time in an outlined box (MAUI `G9DateTimePicker`): a tap opens the drum sheet (Cancel, title,
56
+ * Done, live preview, Today/Now, day/month/year and hour/minute wheels). The calendar follows the language (`fa` →
57
+ * Persian) unless `calendar` is set; the value stays Gregorian. Min/max clamp the drums (they roll onto the clamped
58
+ * value); a day past the month's end clamps to its last day. Done writes the value and fires `onDateTimeSelected`;
59
+ * Cancel and dismissals write nothing (see `restoreOnCancel`). Must be inside a `G9Host`.
60
+ */
61
+ export declare function G9DateTimePicker(props: G9DateTimePickerProps): ReactNode;
62
+ export {};
63
+ //# sourceMappingURL=date-time-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-time-picker.d.ts","sourceRoot":"","sources":["../../src/pickers/date-time-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EAGrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,gBAAgB,CAAC;AAqBlE,OAAO,EAAE,KAAK,kBAAkB,EAA8B,MAAM,WAAW,CAAC;AAGhF,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,yCAAyC;AACzC,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,6GAA6G;IAC7G,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IACjE,wBAAwB;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC;IACrC,6BAA6B;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACjD,mEAAmE;IACnE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACtC,0DAA0D;IAC1D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,6GAA6G;IAC7G,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC5C,wDAAwD;IACxD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CAChE;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,eAAe,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9E,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,4GAA4G;AAC5G,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAmGlE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CA6ExE"}
@@ -0,0 +1,141 @@
1
+ import "./pickers.css";
2
+ import { G9DateTimeDisplayFormat, G9DateTimePickerMode, G9StringKey, daysInMonth, localDateTimeFromDate } from "@g9tm/lynxcontrols-foundation";
3
+ import { useRef, useState } from "@lynx-js/react";
4
+ import { useG9Press } from "../base/press.jsx";
5
+ import { useControllableState } from "../base/use-controllable-state.jsx";
6
+ import { useG9Culture, useG9Service, useG9Settings, useG9Strings } from "../provider/hooks.jsx";
7
+ import { useG9Sheets } from "../sheet/service.jsx";
8
+ import { asDateTime, clampPickerValue, composePickerValue, dayWheelItems, formatPickerValue, hourWheelItems, minuteWheelItems, monthWheelItems, normalizePickerBounds, pickerParts, resolvePickerCalendar, yearWheelItems, yearWindow } from "./date-time.jsx";
9
+ import { PickerSheetHeader, showPickerSheet } from "./picker-sheet.jsx";
10
+ import { PickerField, usePickerOpen } from "./trigger.jsx";
11
+ import { G9WheelColumn } from "./wheel-column.jsx";
12
+ const g9YearWindowStep = 25;
13
+ function DateTimeSheetBody(props) {
14
+ const strings = useG9Strings();
15
+ const { calendar, culture, bounds, mode } = props;
16
+ const [value, setValueState] = useState(()=>clampPickerValue(props.initial, bounds, calendar));
17
+ const latest = useRef(value);
18
+ const setValue = (next)=>{
19
+ latest.current = next;
20
+ setValueState(next);
21
+ };
22
+ const partsOf = (v)=>({
23
+ ...pickerParts(v, calendar),
24
+ hour: v.hour,
25
+ minute: v.minute
26
+ });
27
+ const parts = partsOf(value);
28
+ const minYear = bounds.min ? pickerParts(bounds.min, calendar).year : null;
29
+ const maxYear = bounds.max ? pickerParts(bounds.max, calendar).year : null;
30
+ const [years, setYears] = useState(()=>yearWindow(parts.year, minYear, maxYear));
31
+ const window_ = parts.year < years.from || parts.year > years.to ? yearWindow(parts.year, minYear, maxYear) : years;
32
+ const change = (patch)=>setValue(composePickerValue({
33
+ ...partsOf(latest.current),
34
+ ...patch
35
+ }, calendar, bounds));
36
+ const grow = (edge)=>setYears((w)=>'end' === edge ? {
37
+ from: w.from,
38
+ to: Math.min(null != maxYear ? maxYear : 9999, 9999, w.to + g9YearWindowStep)
39
+ } : {
40
+ from: Math.max(null != minYear ? minYear : 1, 1, w.from - g9YearWindowStep),
41
+ to: w.to
42
+ });
43
+ const today = useG9Press(()=>{
44
+ const now = props.now();
45
+ setValue(clampPickerValue(mode === G9DateTimePickerMode.Date ? asDateTime(now) : now, bounds, calendar));
46
+ }, {
47
+ source: 'G9DateTimePicker',
48
+ guardMs: 0
49
+ });
50
+ const showDate = mode !== G9DateTimePickerMode.Time;
51
+ const showTime = mode !== G9DateTimePickerMode.Date;
52
+ return <view className="g9-picker-sheet">
53
+ <PickerSheetHeader title={props.title} onCancel={props.cancel} onDone={()=>props.done(latest.current)}/>
54
+ <text className="g9-picker-sheet__preview" text-maxline="1">
55
+ {props.format(value)}
56
+ </text>
57
+ {props.showToday ? <view className="g9-picker-sheet__today" accessibility-element={true} accessibility-traits="button" bindtap={today}>
58
+ <text className="g9-picker-sheet__today-text">
59
+ {strings.get(mode === G9DateTimePickerMode.Time ? G9StringKey.Now : G9StringKey.Today)}
60
+ </text>
61
+ </view> : null}
62
+ <view className={`g9-picker-sheet__wheels g9-dir-${culture.direction}`}>
63
+ {showDate ? <G9WheelColumn label={strings.get(G9StringKey.Day)} items={dayWheelItems(daysInMonth(calendar, parts.year, parts.month), culture)} value={parts.day} onValueChange={(day)=>change({
64
+ day
65
+ })}/> : null}
66
+ {showDate ? <G9WheelColumn label={strings.get(G9StringKey.Month)} items={monthWheelItems(calendar, culture)} value={parts.month} onValueChange={(month)=>change({
67
+ month
68
+ })}/> : null}
69
+ {showDate ? <G9WheelColumn label={strings.get(G9StringKey.Year)} items={yearWheelItems(window_.from, window_.to, culture)} value={parts.year} onValueChange={(year)=>change({
70
+ year
71
+ })} onNearEdge={grow}/> : null}
72
+ {showTime ? <G9WheelColumn label={strings.get(G9StringKey.Hour)} items={hourWheelItems(props.twentyFourHour, culture)} value={parts.hour} onValueChange={(hour)=>change({
73
+ hour
74
+ })}/> : null}
75
+ {showTime ? <G9WheelColumn label={strings.get(G9StringKey.Minute)} items={minuteWheelItems(culture)} value={parts.minute} onValueChange={(minute)=>change({
76
+ minute
77
+ })}/> : null}
78
+ </view>
79
+ </view>;
80
+ }
81
+ function G9DateTimePicker(props) {
82
+ var _props_defaultValue, _props_mode, _props_placeholder;
83
+ const sheets = useG9Sheets();
84
+ const culture = useG9Culture();
85
+ const strings = useG9Strings();
86
+ const glyphs = useG9Settings().glyphs;
87
+ const clock = useG9Service('clock');
88
+ const open = usePickerOpen();
89
+ const [value, setValue] = useControllableState({
90
+ value: props.value,
91
+ defaultValue: null != (_props_defaultValue = props.defaultValue) ? _props_defaultValue : null,
92
+ onChange: props.onValueChange,
93
+ name: 'G9DateTimePicker.value'
94
+ });
95
+ const latest = useRef({
96
+ props,
97
+ value
98
+ });
99
+ latest.current = {
100
+ props,
101
+ value
102
+ };
103
+ const mode = null != (_props_mode = props.mode) ? _props_mode : G9DateTimePickerMode.Date;
104
+ const calendar = resolvePickerCalendar(culture, props.calendar);
105
+ const format = (v)=>{
106
+ var _props_displayFormat, _props_formattedDisplayText;
107
+ return formatPickerValue(v, culture, {
108
+ mode,
109
+ displayFormat: null != (_props_displayFormat = props.displayFormat) ? _props_displayFormat : G9DateTimeDisplayFormat.ShortDate,
110
+ twentyFourHour: true === props.twentyFourHourDisplay,
111
+ calendar,
112
+ customText: null != (_props_formattedDisplayText = props.formattedDisplayText) ? _props_formattedDisplayText : null
113
+ });
114
+ };
115
+ const onOpen = ()=>open(async (isCurrent)=>{
116
+ var _p_label;
117
+ const previous = latest.current.value;
118
+ const p = latest.current.props;
119
+ const now = ()=>localDateTimeFromDate(new Date(clock.now()));
120
+ const title = (null == (_p_label = p.label) ? void 0 : _p_label.trim()) ? p.label : strings.get(mode === G9DateTimePickerMode.Time ? G9StringKey.SelectTime : mode === G9DateTimePickerMode.DateTime ? G9StringKey.SelectDateTime : G9StringKey.SelectDate);
121
+ const bounds = normalizePickerBounds(p.minDate, p.maxDate, calendar);
122
+ const result = await showPickerSheet(sheets, ({ done, cancel })=><DateTimeSheetBody title={title} initial={null != previous ? previous : now()} now={now} mode={mode} calendar={calendar} culture={culture} bounds={bounds} twentyFourHour={true === p.twentyFourHourDisplay} showToday={false !== p.showTodayButton} format={format} done={done} cancel={cancel}/>);
123
+ if (!isCurrent()) return;
124
+ if (result) {
125
+ var _latest_current_props_onDateTimeSelected, _latest_current_props;
126
+ setValue(result);
127
+ null == (_latest_current_props_onDateTimeSelected = (_latest_current_props = latest.current.props).onDateTimeSelected) || _latest_current_props_onDateTimeSelected.call(_latest_current_props, result);
128
+ } else if (false !== latest.current.props.restoreOnCancel && latest.current.value !== previous) setValue(previous);
129
+ });
130
+ return <PickerField field={{
131
+ trailingIcon: mode === G9DateTimePickerMode.Time ? glyphs.clock : glyphs.calendar,
132
+ ...props
133
+ }} hasValue={null !== value} onOpen={onOpen}>
134
+ <text className={`g9-picker__text${value ? '' : ' g9-picker__text--placeholder'}`} text-maxline="1">
135
+ {value ? format(value) : props.label ? '' : null != (_props_placeholder = props.placeholder) ? _props_placeholder : ''}
136
+ </text>
137
+ </PickerField>;
138
+ }
139
+ export { DateTimeSheetBody, G9DateTimePicker, g9YearWindowStep };
140
+
141
+ //# sourceMappingURL=date-time-picker.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickers/date-time-picker.jsx","sources":["../../src/pickers/date-time-picker.tsx"],"sourcesContent":["import './pickers.css';\nimport {\n daysInMonth,\n type G9CalendarSystem,\n type G9Culture,\n G9DateTimeDisplayFormat,\n G9DateTimePickerMode,\n type G9LocalDate,\n type G9LocalDateTime,\n G9StringKey,\n localDateTimeFromDate,\n} from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useRef, useState } from '@lynx-js/react';\nimport { useG9Press } from '../base/press';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { useG9Culture, useG9Service, useG9Settings, useG9Strings } from '../provider/hooks';\nimport { useG9Sheets } from '../sheet/service';\nimport {\n asDateTime,\n clampPickerValue,\n composePickerValue,\n dayWheelItems,\n formatPickerValue,\n hourWheelItems,\n minuteWheelItems,\n monthWheelItems,\n normalizePickerBounds,\n pickerParts,\n resolvePickerCalendar,\n yearWheelItems,\n yearWindow,\n} from './date-time';\nimport { PickerSheetHeader, showPickerSheet } from './picker-sheet';\nimport { type G9PickerFieldProps, PickerField, usePickerOpen } from './trigger';\nimport { G9WheelColumn } from './wheel-column';\n\n/** Years the year window grows by at an edge (MAUI `YearWindowStep`). */\nexport const g9YearWindowStep = 25;\n\n/** Props of {@link G9DateTimePicker}. */\nexport interface G9DateTimePickerProps extends G9PickerFieldProps {\n /** The value, always Gregorian (MAUI `SelectedDateTime`); `null` = none. Controlled with `onValueChange`. */\n readonly value?: G9LocalDateTime | null;\n readonly defaultValue?: G9LocalDateTime | null;\n readonly onValueChange?: (value: G9LocalDateTime | null) => void;\n /** Default `'date'`. */\n readonly mode?: G9DateTimePickerMode;\n /** Default `'shortDate'`. */\n readonly displayFormat?: G9DateTimeDisplayFormat;\n /** Text of the `'custom'` format (MAUI `FormattedDisplayText`). */\n readonly formattedDisplayText?: string | null;\n readonly minDate?: G9LocalDate | null;\n readonly maxDate?: G9LocalDate | null;\n /** Hours 0–23 instead of 12-hour AM/PM. Default false. */\n readonly twentyFourHourDisplay?: boolean;\n /**\n * Default true (MAUI `RestoreOnCancel`): Cancel or a dismissal puts back the value the picker had when it opened if\n * it changed meanwhile. False leaves the current value.\n */\n readonly restoreOnCancel?: boolean;\n /** The Today / Now chip. Default true. */\n readonly showTodayButton?: boolean;\n /** Calendar override; default Persian for `fa`, else Gregorian (follows the language, not the direction). */\n readonly calendar?: G9CalendarSystem | null;\n /** Done confirmed a value (MAUI `DateTimeSelected`). */\n readonly onDateTimeSelected?: (value: G9LocalDateTime) => void;\n}\n\ninterface SheetBodyProps {\n readonly title: string;\n readonly initial: G9LocalDateTime;\n readonly now: () => G9LocalDateTime;\n readonly mode: G9DateTimePickerMode;\n readonly calendar: G9CalendarSystem;\n readonly culture: G9Culture;\n readonly bounds: { min: G9LocalDateTime | null; max: G9LocalDateTime | null };\n readonly twentyFourHour: boolean;\n readonly showToday: boolean;\n readonly format: (value: G9LocalDateTime) => string;\n readonly done: (value: G9LocalDateTime) => void;\n readonly cancel: () => void;\n}\n\n/** The drum sheet body (MAUI `G9DateTimePickerSheet`): header, live preview, Today/Now chip, the wheels. */\nexport function DateTimeSheetBody(props: SheetBodyProps): ReactNode {\n const strings = useG9Strings();\n const { calendar, culture, bounds, mode } = props;\n const [value, setValueState] = useState(() => clampPickerValue(props.initial, bounds, calendar));\n // The latest value, written synchronously: a wheel that settles and a Done tap (or a second wheel) can arrive before\n // the re-render binds handlers that close over the new state. Reading the render's `value` there returned the old\n // one, and a second wheel overwrote the first (seen on the Windows CI agent, Azure builds 539/541).\n const latest = useRef(value);\n const setValue = (next: G9LocalDateTime) => {\n latest.current = next;\n setValueState(next);\n };\n const partsOf = (v: G9LocalDateTime) => ({ ...pickerParts(v, calendar), hour: v.hour, minute: v.minute });\n const parts = partsOf(value);\n const minYear = bounds.min ? pickerParts(bounds.min, calendar).year : null;\n const maxYear = bounds.max ? pickerParts(bounds.max, calendar).year : null;\n const [years, setYears] = useState(() => yearWindow(parts.year, minYear, maxYear));\n // A value outside the window (Today, a clamp) rebuilds it around the value.\n const window_ = parts.year < years.from || parts.year > years.to ? yearWindow(parts.year, minYear, maxYear) : years;\n const change = (patch: Partial<typeof parts>) =>\n setValue(composePickerValue({ ...partsOf(latest.current), ...patch }, calendar, bounds));\n const grow = (edge: 'start' | 'end') =>\n setYears((w) =>\n edge === 'end'\n ? { from: w.from, to: Math.min(maxYear ?? 9999, 9999, w.to + g9YearWindowStep) }\n : { from: Math.max(minYear ?? 1, 1, w.from - g9YearWindowStep), to: w.to },\n );\n const today = useG9Press(\n () => {\n const now = props.now();\n setValue(clampPickerValue(mode === G9DateTimePickerMode.Date ? asDateTime(now) : now, bounds, calendar));\n },\n { source: 'G9DateTimePicker', guardMs: 0 },\n );\n const showDate = mode !== G9DateTimePickerMode.Time;\n const showTime = mode !== G9DateTimePickerMode.Date;\n return (\n <view className=\"g9-picker-sheet\">\n <PickerSheetHeader title={props.title} onCancel={props.cancel} onDone={() => props.done(latest.current)} />\n <text className=\"g9-picker-sheet__preview\" text-maxline=\"1\">\n {props.format(value)}\n </text>\n {props.showToday ? (\n <view\n className=\"g9-picker-sheet__today\"\n accessibility-element={true}\n accessibility-traits=\"button\"\n bindtap={today}\n >\n <text className=\"g9-picker-sheet__today-text\">\n {strings.get(mode === G9DateTimePickerMode.Time ? G9StringKey.Now : G9StringKey.Today)}\n </text>\n </view>\n ) : null}\n <view className={`g9-picker-sheet__wheels g9-dir-${culture.direction}`}>\n {showDate ? (\n <G9WheelColumn\n label={strings.get(G9StringKey.Day)}\n items={dayWheelItems(daysInMonth(calendar, parts.year, parts.month), culture)}\n value={parts.day}\n onValueChange={(day) => change({ day })}\n />\n ) : null}\n {showDate ? (\n <G9WheelColumn\n label={strings.get(G9StringKey.Month)}\n items={monthWheelItems(calendar, culture)}\n value={parts.month}\n onValueChange={(month) => change({ month })}\n />\n ) : null}\n {showDate ? (\n <G9WheelColumn\n label={strings.get(G9StringKey.Year)}\n items={yearWheelItems(window_.from, window_.to, culture)}\n value={parts.year}\n onValueChange={(year) => change({ year })}\n onNearEdge={grow}\n />\n ) : null}\n {showTime ? (\n <G9WheelColumn\n label={strings.get(G9StringKey.Hour)}\n items={hourWheelItems(props.twentyFourHour, culture)}\n value={parts.hour}\n onValueChange={(hour) => change({ hour })}\n />\n ) : null}\n {showTime ? (\n <G9WheelColumn\n label={strings.get(G9StringKey.Minute)}\n items={minuteWheelItems(culture)}\n value={parts.minute}\n onValueChange={(minute) => change({ minute })}\n />\n ) : null}\n </view>\n </view>\n );\n}\n\n/**\n * Date, time or date-time in an outlined box (MAUI `G9DateTimePicker`): a tap opens the drum sheet (Cancel, title,\n * Done, live preview, Today/Now, day/month/year and hour/minute wheels). The calendar follows the language (`fa` →\n * Persian) unless `calendar` is set; the value stays Gregorian. Min/max clamp the drums (they roll onto the clamped\n * value); a day past the month's end clamps to its last day. Done writes the value and fires `onDateTimeSelected`;\n * Cancel and dismissals write nothing (see `restoreOnCancel`). Must be inside a `G9Host`.\n */\nexport function G9DateTimePicker(props: G9DateTimePickerProps): ReactNode {\n const sheets = useG9Sheets();\n const culture = useG9Culture();\n const strings = useG9Strings();\n const glyphs = useG9Settings().glyphs;\n const clock = useG9Service('clock');\n const open = usePickerOpen();\n const [value, setValue] = useControllableState<G9LocalDateTime | null>({\n value: props.value,\n defaultValue: props.defaultValue ?? null,\n onChange: props.onValueChange,\n name: 'G9DateTimePicker.value',\n });\n const latest = useRef({ props, value });\n latest.current = { props, value };\n const mode = props.mode ?? G9DateTimePickerMode.Date;\n const calendar = resolvePickerCalendar(culture, props.calendar);\n const format = (v: G9LocalDateTime) =>\n formatPickerValue(v, culture, {\n mode,\n displayFormat: props.displayFormat ?? G9DateTimeDisplayFormat.ShortDate,\n twentyFourHour: props.twentyFourHourDisplay === true,\n calendar,\n customText: props.formattedDisplayText ?? null,\n });\n\n const onOpen = () =>\n open(async (isCurrent) => {\n const previous = latest.current.value;\n const p = latest.current.props;\n const now = () => localDateTimeFromDate(new Date(clock.now()));\n const title = p.label?.trim()\n ? p.label\n : strings.get(\n mode === G9DateTimePickerMode.Time\n ? G9StringKey.SelectTime\n : mode === G9DateTimePickerMode.DateTime\n ? G9StringKey.SelectDateTime\n : G9StringKey.SelectDate,\n );\n const bounds = normalizePickerBounds(p.minDate, p.maxDate, calendar);\n const result = await showPickerSheet<G9LocalDateTime>(sheets, ({ done, cancel }) => (\n <DateTimeSheetBody\n title={title}\n initial={previous ?? now()}\n now={now}\n mode={mode}\n calendar={calendar}\n culture={culture}\n bounds={bounds}\n twentyFourHour={p.twentyFourHourDisplay === true}\n showToday={p.showTodayButton !== false}\n format={format}\n done={done}\n cancel={cancel}\n />\n ));\n if (!isCurrent()) return;\n if (result) {\n setValue(result);\n latest.current.props.onDateTimeSelected?.(result);\n } else if (latest.current.props.restoreOnCancel !== false && latest.current.value !== previous) {\n setValue(previous);\n }\n });\n\n return (\n <PickerField\n field={{ trailingIcon: mode === G9DateTimePickerMode.Time ? glyphs.clock : glyphs.calendar, ...props }}\n hasValue={value !== null}\n onOpen={onOpen}\n >\n <text className={`g9-picker__text${value ? '' : ' g9-picker__text--placeholder'}`} text-maxline=\"1\">\n {value ? format(value) : props.label ? '' : (props.placeholder ?? '')}\n </text>\n </PickerField>\n );\n}\n"],"names":["g9YearWindowStep","DateTimeSheetBody","props","strings","useG9Strings","calendar","culture","bounds","mode","value","setValueState","useState","clampPickerValue","latest","useRef","setValue","next","partsOf","v","pickerParts","parts","minYear","maxYear","years","setYears","yearWindow","window_","change","patch","composePickerValue","grow","edge","w","Math","today","useG9Press","now","G9DateTimePickerMode","asDateTime","showDate","showTime","view","PickerSheetHeader","text","G9StringKey","G9WheelColumn","dayWheelItems","daysInMonth","day","monthWheelItems","month","yearWheelItems","year","hourWheelItems","hour","minuteWheelItems","minute","G9DateTimePicker","_props_defaultValue","_props_mode","_props_placeholder","sheets","useG9Sheets","useG9Culture","glyphs","useG9Settings","clock","useG9Service","open","usePickerOpen","useControllableState","resolvePickerCalendar","format","_props_displayFormat","_props_formattedDisplayText","formatPickerValue","G9DateTimeDisplayFormat","onOpen","isCurrent","_p_label","previous","p","localDateTimeFromDate","Date","title","normalizePickerBounds","result","showPickerSheet","done","cancel","_latest_current_props","PickerField"],"mappings":"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"}