@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,90 @@
1
+ .g9-slider {
2
+ flex-direction: column;
3
+ justify-content: center;
4
+ padding-left: 16px;
5
+ padding-right: 16px;
6
+ display: flex;
7
+ position: relative;
8
+ }
9
+
10
+ .g9-slider--disabled {
11
+ opacity: .38;
12
+ }
13
+
14
+ .g9-slider__root {
15
+ justify-content: center;
16
+ height: 28px;
17
+ display: flex;
18
+ }
19
+
20
+ .g9-slider__track {
21
+ background-color: var(--g9-surface-variant);
22
+ border-radius: 4px;
23
+ flex: 1;
24
+ height: 8px;
25
+ position: relative;
26
+ }
27
+
28
+ .g9-slider__fill {
29
+ background-color: var(--g9-primary);
30
+ border-radius: 4px;
31
+ height: 8px;
32
+ position: absolute;
33
+ top: 10px;
34
+ left: 0;
35
+ right: 0;
36
+ }
37
+
38
+ .g9-slider__thumb {
39
+ width: 28px;
40
+ height: 28px;
41
+ }
42
+
43
+ .g9-slider__thumb-dot {
44
+ border-style: solid;
45
+ border-width: 2.5px;
46
+ border-color: var(--g9-primary);
47
+ background-color: var(--g9-surface);
48
+ border-radius: 14px;
49
+ width: 28px;
50
+ height: 28px;
51
+ }
52
+
53
+ .g9-slider__thumb-dot--active {
54
+ border-width: 3px;
55
+ }
56
+
57
+ .g9-slider__tooltip {
58
+ background-color: var(--g9-inverse-surface);
59
+ border-radius: 13px;
60
+ justify-content: center;
61
+ align-items: center;
62
+ min-width: 42px;
63
+ height: 26px;
64
+ margin-left: -21px;
65
+ padding-left: 8px;
66
+ padding-right: 8px;
67
+ display: flex;
68
+ position: absolute;
69
+ top: 4px;
70
+ }
71
+
72
+ .g9-slider__tooltip-text {
73
+ color: var(--g9-inverse-on-surface);
74
+ font-size: 12px;
75
+ }
76
+
77
+ .g9-slider__labels {
78
+ flex-direction: row;
79
+ justify-content: space-between;
80
+ margin-top: 18px;
81
+ display: flex;
82
+ }
83
+
84
+ .g9-slider__label {
85
+ color: var(--g9-text-secondary);
86
+ font-size: 12px;
87
+ }
88
+
89
+
90
+ /*# sourceMappingURL=range-slider.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["webpack://./src/range-slider/range-slider.css"],"names":[],"mappings":"AAAA;EACE,sBAAsB;EACtB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;EACnB,aAAa;EACb,kBAAkB;AACpB;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,uBAAuB;EACvB,YAAY;EACZ,aAAa;AACf;;AAIA;EADE,2CAA2C;EAC3C,kBAAkB;EAClB,OAAO;EACP,WAAW;EACX,kBAAkB;AACpB;;AAIA;EADE,mCAAmC;EACnC,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,SAAS;EACT,OAAO;EACP,QAAQ;AACV;;AAKA;EAFE,WAAW;EACX,YAAY;AACd;;AAKA;EAFE,mBAAmB;EACnB,mBAAmB;EACnB,+BAA+B;EAC/B,mCAAmC;EACnC,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAKA;EAFE,iBAAiB;AACnB;;AAKA;EAFE,2CAA2C;EAC3C,mBAAmB;EACnB,uBAAuB;EACvB,mBAAmB;EACnB,eAAe;EACf,YAAY;EACZ,kBAAkB;EAClB,iBAAiB;EACjB,kBAAkB;EAClB,aAAa;EACb,kBAAkB;EAClB,QAAQ;AACV;;AAKA;EAFE,mCAAmC;EACnC,eAAe;AACjB;;AAKA;EAFE,mBAAmB;EACnB,8BAA8B;EAC9B,gBAAgB;EAChB,aAAa;AACf;;AAKA;EAFE,+BAA+B;EAC/B,eAAe;AACjB","sourcesContent":[".g9-slider {\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding-left: 16px;\n padding-right: 16px;\n}\n\n.g9-slider--disabled {\n opacity: 0.38;\n}\n\n.g9-slider__root {\n height: 28px;\n display: flex;\n justify-content: center;\n}\n\n/* lynx-ui SliderTrack: a 28 px flex row holding this view (the visible track) next to the fill and the thumbs, which\n position against the 28 px row. The track takes the row's width; the fill is the 8 px band at its centre. */\n.g9-slider__track {\n position: relative;\n flex: 1;\n height: 8px;\n border-radius: 4px;\n background-color: var(--g9-surface-variant);\n}\n\n.g9-slider__fill {\n position: absolute;\n top: 10px;\n left: 0px;\n right: 0px;\n height: 8px;\n border-radius: 4px;\n background-color: var(--g9-primary);\n}\n\n/* lynx-ui SliderThumb centres this view on the value (top 50 %, translate -50 %). */\n.g9-slider__thumb {\n width: 28px;\n height: 28px;\n}\n\n.g9-slider__thumb-dot {\n width: 28px;\n height: 28px;\n border-radius: 14px;\n border-width: 2.5px;\n border-style: solid;\n border-color: var(--g9-primary);\n background-color: var(--g9-surface);\n}\n\n.g9-slider__thumb-dot--active {\n border-width: 3px;\n}\n\n.g9-slider__tooltip {\n position: absolute;\n top: 4px;\n height: 26px;\n margin-left: -21px;\n min-width: 42px;\n padding-left: 8px;\n padding-right: 8px;\n border-radius: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--g9-inverse-surface);\n}\n\n.g9-slider__tooltip-text {\n font-size: 12px;\n color: var(--g9-inverse-on-surface);\n}\n\n.g9-slider__labels {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n margin-top: 18px;\n}\n\n.g9-slider__label {\n font-size: 12px;\n color: var(--g9-text-secondary);\n}\n"],"sourceRoot":""}
@@ -0,0 +1,52 @@
1
+ import './range-slider.css';
2
+ import { G9RangeSliderMode } from '@g9tm/lynxcontrols-foundation';
3
+ import { type ReactNode } from '@lynx-js/react';
4
+ /** Layout tokens (MAUI `G9Metrics.Slider*`). */
5
+ export declare const g9SliderMetrics: Readonly<{
6
+ height: 104;
7
+ heightCompact: 36;
8
+ trackHeight: 8;
9
+ thumbRadius: 14;
10
+ horizontalInset: 16;
11
+ }>;
12
+ /** Props of {@link G9RangeSlider}. */
13
+ export interface G9RangeSliderProps {
14
+ /** Default 0. */
15
+ readonly minimum?: number;
16
+ /** Default 100. */
17
+ readonly maximum?: number;
18
+ /** `'single'` (one thumb, `value`) or `'range'` (two thumbs, `rangeStart`/`rangeEnd`). Default `'range'`. */
19
+ readonly mode?: G9RangeSliderMode;
20
+ /** Single mode value (MAUI `Value`). */
21
+ readonly value?: number;
22
+ readonly defaultValue?: number;
23
+ readonly onValueChange?: (value: number) => void;
24
+ /** Range mode thumbs (MAUI `RangeStart`/`RangeEnd`). */
25
+ readonly rangeStart?: number;
26
+ readonly rangeEnd?: number;
27
+ readonly defaultRangeStart?: number;
28
+ readonly defaultRangeEnd?: number;
29
+ readonly onRangeChange?: (start: number, end: number) => void;
30
+ /** Snap interval; 0 = continuous. Default 1. */
31
+ readonly step?: number;
32
+ /** Min/max edge labels and the drag tooltip (false = compact 36 px). Default true. */
33
+ readonly showLabels?: boolean;
34
+ /** .NET-style number format of labels and tooltip (`"0"`, `"0.0"`, `"0°"`). Default `"0"`. */
35
+ readonly valueFormat?: string | null;
36
+ readonly disabled?: boolean;
37
+ /** After the user changed a value: the single value, or the range end (MAUI `ValueChanged`). */
38
+ readonly onValueChanged?: (value: number) => void;
39
+ readonly accessibilityLabel?: string;
40
+ readonly className?: string;
41
+ }
42
+ /** Arrow/Home/End handling of the desktop keyboard: the new value, or `null` for another key. */
43
+ export declare function sliderKeyStep(key: string, value: number, min: number, max: number, step: number, rtl: boolean): number | null;
44
+ /**
45
+ * One- or two-thumb slider (MAUI `G9RangeSlider`) on lynx-ui `SliderRoot`: lynx-ui owns the gesture (main-thread
46
+ * drag, thumbs that meet but never cross); G9 maps minimum/maximum/step onto its normalized value, snaps with the
47
+ * MAUI formula, keeps the stored values as given until the user moves them (display is always coerced; MAUI's
48
+ * deferred write-back), paints the fill between the thumbs, shows min/max labels (swapped in RTL) and a tooltip
49
+ * while dragging, and moves with the arrow keys on desktop.
50
+ */
51
+ export declare function G9RangeSlider(props: G9RangeSliderProps): ReactNode;
52
+ //# sourceMappingURL=range-slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-slider.d.ts","sourceRoot":"","sources":["../../src/range-slider/range-slider.tsx"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAe,iBAAiB,EAAW,MAAM,+BAA+B,CAAC;AAExF,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,gBAAgB,CAAC;AAYlE,gDAAgD;AAChD,eAAO,MAAM,eAAe;;;;;;EAM1B,CAAC;AAEH,sCAAsC;AACtC,MAAM,WAAW,kBAAkB;IACjC,iBAAiB;IACjB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB;IACnB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6GAA6G;IAC7G,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IAClC,wCAAwC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,wDAAwD;IACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,gDAAgD;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,8FAA8F;IAC9F,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,gGAAgG;IAChG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,OAAO,GACX,MAAM,GAAG,IAAI,CAUf;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,CAqHlE"}
@@ -0,0 +1,159 @@
1
+ import "./range-slider.css";
2
+ import { G9RangeSliderMode, formatColor, lighten } from "@g9tm/lynxcontrols-foundation";
3
+ import { SliderIndicator, SliderRoot, SliderThumb, SliderTrack } from "@lynx-js/lynx-ui-slider";
4
+ import { useRef, useState } from "@lynx-js/react";
5
+ import { useControllableState } from "../base/use-controllable-state.jsx";
6
+ import { useG9Culture, useG9Direction, useG9Theme } from "../provider/hooks.jsx";
7
+ import { coerceSliderRange, formatSliderValue, sliderBounds, sliderRatio, sliderValueAt, snapSliderValue } from "./math.jsx";
8
+ const g9SliderMetrics = Object.freeze({
9
+ height: 104,
10
+ heightCompact: 36,
11
+ trackHeight: 8,
12
+ thumbRadius: 14,
13
+ horizontalInset: 16
14
+ });
15
+ function sliderKeyStep(key, value, min, max, step, rtl) {
16
+ const b = sliderBounds(min, max);
17
+ const delta = step > 0 ? step : (b.max - b.min) / 100;
18
+ const forward = rtl ? 'ArrowLeft' : 'ArrowRight';
19
+ const back = rtl ? 'ArrowRight' : 'ArrowLeft';
20
+ if (key === forward || 'ArrowUp' === key) return snapSliderValue(value + delta, min, max, step);
21
+ if (key === back || 'ArrowDown' === key) return snapSliderValue(value - delta, min, max, step);
22
+ if ('Home' === key) return b.min;
23
+ if ('End' === key) return b.max;
24
+ return null;
25
+ }
26
+ function G9RangeSlider(props) {
27
+ var _props_minimum, _props_maximum, _props_step, _props_defaultValue, _props_defaultRangeStart, _props_defaultRangeEnd, _ref, _props_accessibilityLabel;
28
+ const culture = useG9Culture();
29
+ const rtl = 'rtl' === useG9Direction();
30
+ const primary = useG9Theme().palette.Primary;
31
+ const fill = `linear-gradient(to ${rtl ? 'left' : 'right'}, ${formatColor(primary)}, ${formatColor(lighten(primary, 0.22))})`;
32
+ const min = null != (_props_minimum = props.minimum) ? _props_minimum : 0;
33
+ const max = null != (_props_maximum = props.maximum) ? _props_maximum : 100;
34
+ const step = null != (_props_step = props.step) ? _props_step : 1;
35
+ const single = props.mode === G9RangeSliderMode.Single;
36
+ const labels = false !== props.showLabels;
37
+ const bounds = sliderBounds(min, max);
38
+ const [value, setValue] = useControllableState({
39
+ value: props.value,
40
+ defaultValue: null != (_props_defaultValue = props.defaultValue) ? _props_defaultValue : 0,
41
+ onChange: props.onValueChange,
42
+ name: 'G9RangeSlider.value'
43
+ });
44
+ const [range, setRange] = useControllableState({
45
+ value: void 0 !== props.rangeStart && void 0 !== props.rangeEnd ? [
46
+ props.rangeStart,
47
+ props.rangeEnd
48
+ ] : void 0,
49
+ defaultValue: [
50
+ null != (_props_defaultRangeStart = props.defaultRangeStart) ? _props_defaultRangeStart : 0,
51
+ null != (_props_defaultRangeEnd = props.defaultRangeEnd) ? _props_defaultRangeEnd : 100
52
+ ],
53
+ onChange: (r)=>{
54
+ var _props_onRangeChange;
55
+ return null == (_props_onRangeChange = props.onRangeChange) ? void 0 : _props_onRangeChange.call(props, r[0], r[1]);
56
+ },
57
+ name: 'G9RangeSlider.range',
58
+ equals: (a, b)=>a[0] === b[0] && a[1] === b[1]
59
+ });
60
+ const [dragging, setDragging] = useState(null);
61
+ const shown = single ? snapSliderValue(value, min, max, step) : null;
62
+ const shownRange = coerceSliderRange(range[0], range[1], min, max, step);
63
+ const latest = useRef({
64
+ props,
65
+ shownRange,
66
+ shown
67
+ });
68
+ latest.current = {
69
+ props,
70
+ shownRange,
71
+ shown
72
+ };
73
+ const fmt = (v)=>{
74
+ var _props_valueFormat;
75
+ return formatSliderValue(v, null != (_props_valueFormat = props.valueFormat) ? _props_valueFormat : '0', culture);
76
+ };
77
+ const applySingle = (next)=>{
78
+ var _latest_current_props_onValueChanged, _latest_current_props;
79
+ if (next === latest.current.shown) return;
80
+ setValue(next);
81
+ null == (_latest_current_props_onValueChanged = (_latest_current_props = latest.current.props).onValueChanged) || _latest_current_props_onValueChanged.call(_latest_current_props, next);
82
+ };
83
+ const applyRange = (next)=>{
84
+ var _latest_current_props_onValueChanged, _latest_current_props;
85
+ const [s, e] = latest.current.shownRange;
86
+ if (next[0] === s && next[1] === e) return;
87
+ next[0] !== s ? setDragging((d)=>d ? {
88
+ index: 0
89
+ } : d) : setDragging((d)=>d ? {
90
+ index: 1
91
+ } : d);
92
+ setRange(next);
93
+ null == (_latest_current_props_onValueChanged = (_latest_current_props = latest.current.props).onValueChanged) || _latest_current_props_onValueChanged.call(_latest_current_props, next[1]);
94
+ };
95
+ const onValueChange = (v, source)=>{
96
+ if ('drag' !== source || props.disabled) return;
97
+ if ('number' == typeof v) applySingle(snapSliderValue(sliderValueAt(v, min, max), min, max, step));
98
+ else applyRange(coerceSliderRange(sliderValueAt(v[0], min, max), sliderValueAt(v[1], min, max), min, max, step));
99
+ };
100
+ const onDragging = ()=>setDragging((d)=>d ? null : {
101
+ index: 1
102
+ });
103
+ const onCommit = ()=>setDragging(null);
104
+ const onKey = (e)=>{
105
+ var _ref;
106
+ var _e_detail;
107
+ if (props.disabled) return;
108
+ const key = null != (_ref = null == (_e_detail = e.detail) ? void 0 : _e_detail.key) ? _ref : '';
109
+ if (single) {
110
+ const next = sliderKeyStep(key, shown, min, max, step, rtl);
111
+ if (null !== next) applySingle(next);
112
+ return;
113
+ }
114
+ const [s, end] = shownRange;
115
+ const next = sliderKeyStep(key, end, min, max, step, rtl);
116
+ if (null !== next) applyRange([
117
+ Math.min(s, next),
118
+ Math.max(s, next)
119
+ ]);
120
+ };
121
+ const sliderValue = single ? sliderRatio(shown, min, max) : [
122
+ sliderRatio(shownRange[0], min, max),
123
+ sliderRatio(shownRange[1], min, max)
124
+ ];
125
+ const tooltipValue = single ? shown : shownRange[null != (_ref = null == dragging ? void 0 : dragging.index) ? _ref : 1];
126
+ const tooltipRatio = sliderRatio(tooltipValue, min, max);
127
+ const thumb = (index)=><SliderThumb key={index} index={index} className="g9-slider__thumb">
128
+ <view className={`g9-slider__thumb-dot${dragging && dragging.index === index ? ' g9-slider__thumb-dot--active' : ''}`}/>
129
+ </SliderThumb>;
130
+ return <view className={`g9-slider${labels ? '' : ' g9-slider--compact'}${props.disabled ? ' g9-slider--disabled' : ''}${props.className ? ` ${props.className}` : ''}`} style={{
131
+ height: `${labels ? g9SliderMetrics.height : g9SliderMetrics.heightCompact}px`
132
+ }} accessibility-element={true} accessibility-label={null != (_props_accessibilityLabel = props.accessibilityLabel) ? _props_accessibilityLabel : ''} accessibility-value={single ? fmt(shown) : `${fmt(shownRange[0])} – ${fmt(shownRange[1])}`} bindkeydown={onKey}>
133
+ {labels && dragging ? <view className="g9-slider__tooltip" style={{
134
+ left: `${(rtl ? 1 - tooltipRatio : tooltipRatio) * 100}%`
135
+ }}>
136
+ <text className="g9-slider__tooltip-text">{fmt(tooltipValue)}</text>
137
+ </view> : null}
138
+ <SliderRoot className="g9-slider__root" value={sliderValue} {...step > 0 ? {
139
+ step: step / (bounds.max - bounds.min)
140
+ } : {}} disabled={true === props.disabled} enableRTL={rtl} onValueChange={onValueChange} onDragging={onDragging} onValueCommit={onCommit}>
141
+ <SliderTrack className="g9-slider__track">
142
+ <SliderIndicator className="g9-slider__fill" style={{
143
+ background: fill
144
+ }}/>
145
+ {single ? thumb(0) : [
146
+ thumb(0),
147
+ thumb(1)
148
+ ]}
149
+ </SliderTrack>
150
+ </SliderRoot>
151
+ {labels ? <view className="g9-slider__labels">
152
+ <text className="g9-slider__label">{fmt(rtl ? bounds.max : bounds.min)}</text>
153
+ <text className="g9-slider__label">{fmt(rtl ? bounds.min : bounds.max)}</text>
154
+ </view> : null}
155
+ </view>;
156
+ }
157
+ export { G9RangeSlider, g9SliderMetrics, sliderKeyStep };
158
+
159
+ //# sourceMappingURL=range-slider.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-slider/range-slider.jsx","sources":["../../src/range-slider/range-slider.tsx"],"sourcesContent":["import './range-slider.css';\nimport { formatColor, G9RangeSliderMode, lighten } from '@g9tm/lynxcontrols-foundation';\nimport { SliderIndicator, SliderRoot, SliderThumb, SliderTrack } from '@lynx-js/lynx-ui-slider';\nimport { type ReactNode, useRef, useState } from '@lynx-js/react';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { useG9Culture, useG9Direction, useG9Theme } from '../provider/hooks';\nimport {\n coerceSliderRange,\n formatSliderValue,\n sliderBounds,\n sliderRatio,\n sliderValueAt,\n snapSliderValue,\n} from './math';\n\n/** Layout tokens (MAUI `G9Metrics.Slider*`). */\nexport const g9SliderMetrics = Object.freeze({\n height: 104,\n heightCompact: 36,\n trackHeight: 8,\n thumbRadius: 14,\n horizontalInset: 16,\n});\n\n/** Props of {@link G9RangeSlider}. */\nexport interface G9RangeSliderProps {\n /** Default 0. */\n readonly minimum?: number;\n /** Default 100. */\n readonly maximum?: number;\n /** `'single'` (one thumb, `value`) or `'range'` (two thumbs, `rangeStart`/`rangeEnd`). Default `'range'`. */\n readonly mode?: G9RangeSliderMode;\n /** Single mode value (MAUI `Value`). */\n readonly value?: number;\n readonly defaultValue?: number;\n readonly onValueChange?: (value: number) => void;\n /** Range mode thumbs (MAUI `RangeStart`/`RangeEnd`). */\n readonly rangeStart?: number;\n readonly rangeEnd?: number;\n readonly defaultRangeStart?: number;\n readonly defaultRangeEnd?: number;\n readonly onRangeChange?: (start: number, end: number) => void;\n /** Snap interval; 0 = continuous. Default 1. */\n readonly step?: number;\n /** Min/max edge labels and the drag tooltip (false = compact 36 px). Default true. */\n readonly showLabels?: boolean;\n /** .NET-style number format of labels and tooltip (`\"0\"`, `\"0.0\"`, `\"0°\"`). Default `\"0\"`. */\n readonly valueFormat?: string | null;\n readonly disabled?: boolean;\n /** After the user changed a value: the single value, or the range end (MAUI `ValueChanged`). */\n readonly onValueChanged?: (value: number) => void;\n readonly accessibilityLabel?: string;\n readonly className?: string;\n}\n\n/** Arrow/Home/End handling of the desktop keyboard: the new value, or `null` for another key. */\nexport function sliderKeyStep(\n key: string,\n value: number,\n min: number,\n max: number,\n step: number,\n rtl: boolean,\n): number | null {\n const b = sliderBounds(min, max);\n const delta = step > 0 ? step : (b.max - b.min) / 100;\n const forward = rtl ? 'ArrowLeft' : 'ArrowRight';\n const back = rtl ? 'ArrowRight' : 'ArrowLeft';\n if (key === forward || key === 'ArrowUp') return snapSliderValue(value + delta, min, max, step);\n if (key === back || key === 'ArrowDown') return snapSliderValue(value - delta, min, max, step);\n if (key === 'Home') return b.min;\n if (key === 'End') return b.max;\n return null;\n}\n\n/**\n * One- or two-thumb slider (MAUI `G9RangeSlider`) on lynx-ui `SliderRoot`: lynx-ui owns the gesture (main-thread\n * drag, thumbs that meet but never cross); G9 maps minimum/maximum/step onto its normalized value, snaps with the\n * MAUI formula, keeps the stored values as given until the user moves them (display is always coerced; MAUI's\n * deferred write-back), paints the fill between the thumbs, shows min/max labels (swapped in RTL) and a tooltip\n * while dragging, and moves with the arrow keys on desktop.\n */\nexport function G9RangeSlider(props: G9RangeSliderProps): ReactNode {\n const culture = useG9Culture();\n const rtl = useG9Direction() === 'rtl';\n const primary = useG9Theme().palette.Primary;\n // MAUI G9RangeSliderDrawable: saturated at the minimum end, 22 % lighter towards the value, in reading direction.\n const fill = `linear-gradient(to ${rtl ? 'left' : 'right'}, ${formatColor(primary)}, ${formatColor(lighten(primary, 0.22))})`;\n const min = props.minimum ?? 0;\n const max = props.maximum ?? 100;\n const step = props.step ?? 1;\n const single = props.mode === G9RangeSliderMode.Single;\n const labels = props.showLabels !== false;\n const bounds = sliderBounds(min, max);\n const [value, setValue] = useControllableState<number>({\n value: props.value,\n defaultValue: props.defaultValue ?? 0,\n onChange: props.onValueChange,\n name: 'G9RangeSlider.value',\n });\n const [range, setRange] = useControllableState<readonly [number, number], []>({\n value:\n props.rangeStart !== undefined && props.rangeEnd !== undefined ? [props.rangeStart, props.rangeEnd] : undefined,\n defaultValue: [props.defaultRangeStart ?? 0, props.defaultRangeEnd ?? 100],\n onChange: (r) => props.onRangeChange?.(r[0], r[1]),\n name: 'G9RangeSlider.range',\n equals: (a, b) => a[0] === b[0] && a[1] === b[1],\n });\n const [dragging, setDragging] = useState<{ index: 0 | 1 } | null>(null);\n const shown = single ? snapSliderValue(value, min, max, step) : null;\n const shownRange = coerceSliderRange(range[0], range[1], min, max, step);\n const latest = useRef({ props, shownRange, shown });\n latest.current = { props, shownRange, shown };\n const fmt = (v: number) => formatSliderValue(v, props.valueFormat ?? '0', culture);\n\n const applySingle = (next: number) => {\n if (next === latest.current.shown) return;\n setValue(next);\n latest.current.props.onValueChanged?.(next);\n };\n const applyRange = (next: readonly [number, number]) => {\n const [s, e] = latest.current.shownRange;\n if (next[0] === s && next[1] === e) return;\n if (next[0] !== s) setDragging((d) => (d ? { index: 0 } : d));\n else setDragging((d) => (d ? { index: 1 } : d));\n setRange(next);\n latest.current.props.onValueChanged?.(next[1]);\n };\n const onValueChange = (v: number | readonly [number, number], source: 'external' | 'drag') => {\n if (source !== 'drag' || props.disabled) return;\n if (typeof v === 'number') applySingle(snapSliderValue(sliderValueAt(v, min, max), min, max, step));\n else applyRange(coerceSliderRange(sliderValueAt(v[0], min, max), sliderValueAt(v[1], min, max), min, max, step));\n };\n // lynx-ui reports the drag start and end through `onDragging`; the commit closes it for sure.\n const onDragging = () => setDragging((d) => (d ? null : { index: 1 }));\n const onCommit = () => setDragging(null);\n const onKey = (e: { detail?: { key?: string } }) => {\n if (props.disabled) return;\n const key = e.detail?.key ?? '';\n if (single) {\n const next = sliderKeyStep(key, shown as number, min, max, step, rtl);\n if (next !== null) applySingle(next);\n return;\n }\n // Keys move the end thumb, never past the start (and vice versa with Shift-less Home).\n const [s, end] = shownRange;\n const next = sliderKeyStep(key, end, min, max, step, rtl);\n if (next !== null) applyRange([Math.min(s, next), Math.max(s, next)]);\n };\n\n const sliderValue = single\n ? sliderRatio(shown as number, min, max)\n : ([sliderRatio(shownRange[0], min, max), sliderRatio(shownRange[1], min, max)] as const);\n const tooltipValue = single ? (shown as number) : shownRange[dragging?.index ?? 1];\n const tooltipRatio = sliderRatio(tooltipValue, min, max);\n const thumb = (index: 0 | 1) => (\n <SliderThumb key={index} index={index} className=\"g9-slider__thumb\">\n <view\n className={`g9-slider__thumb-dot${dragging && dragging.index === index ? ' g9-slider__thumb-dot--active' : ''}`}\n />\n </SliderThumb>\n );\n return (\n <view\n className={`g9-slider${labels ? '' : ' g9-slider--compact'}${props.disabled ? ' g9-slider--disabled' : ''}${props.className ? ` ${props.className}` : ''}`}\n style={{ height: `${labels ? g9SliderMetrics.height : g9SliderMetrics.heightCompact}px` }}\n accessibility-element={true}\n accessibility-label={props.accessibilityLabel ?? ''}\n accessibility-value={single ? fmt(shown as number) : `${fmt(shownRange[0])} – ${fmt(shownRange[1])}`}\n bindkeydown={onKey}\n >\n {labels && dragging ? (\n <view className=\"g9-slider__tooltip\" style={{ left: `${(rtl ? 1 - tooltipRatio : tooltipRatio) * 100}%` }}>\n <text className=\"g9-slider__tooltip-text\">{fmt(tooltipValue)}</text>\n </view>\n ) : null}\n <SliderRoot\n className=\"g9-slider__root\"\n value={sliderValue as number}\n {...(step > 0 ? { step: step / (bounds.max - bounds.min) } : {})}\n disabled={props.disabled === true}\n enableRTL={rtl}\n onValueChange={onValueChange as (v: number, s: 'external' | 'drag') => void}\n onDragging={onDragging}\n onValueCommit={onCommit}\n >\n <SliderTrack className=\"g9-slider__track\">\n <SliderIndicator className=\"g9-slider__fill\" style={{ background: fill }} />\n {single ? thumb(0) : [thumb(0), thumb(1)]}\n </SliderTrack>\n </SliderRoot>\n {labels ? (\n <view className=\"g9-slider__labels\">\n <text className=\"g9-slider__label\">{fmt(rtl ? bounds.max : bounds.min)}</text>\n <text className=\"g9-slider__label\">{fmt(rtl ? bounds.min : bounds.max)}</text>\n </view>\n ) : null}\n </view>\n );\n}\n"],"names":["g9SliderMetrics","Object","sliderKeyStep","key","value","min","max","step","rtl","b","sliderBounds","delta","forward","back","snapSliderValue","G9RangeSlider","props","_props_minimum","_props_maximum","_props_step","_props_defaultValue","_props_defaultRangeStart","_props_defaultRangeEnd","_props_accessibilityLabel","culture","useG9Culture","useG9Direction","primary","useG9Theme","fill","formatColor","lighten","single","G9RangeSliderMode","labels","bounds","setValue","useControllableState","range","setRange","undefined","r","a","dragging","setDragging","useState","shown","shownRange","coerceSliderRange","latest","useRef","fmt","v","_props_valueFormat","formatSliderValue","applySingle","next","_latest_current_props","applyRange","s","e","d","onValueChange","source","sliderValueAt","onDragging","onCommit","onKey","_e_detail","end","Math","sliderValue","sliderRatio","tooltipValue","tooltipRatio","thumb","index","SliderThumb","view","text","SliderRoot","SliderTrack","SliderIndicator"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { G9SelectionItem } from '../base/selection-item.js';
2
+ export { createSelectionModel, foldSearchText, type G9SelectionMode, type G9SelectionModel, type G9SelectionModelOptions, } from './model.js';
3
+ export { estimateSelectionHeight, type G9ListSheetRequest, type G9SelectionSheetRequest, type G9SelectionSheetResult, g9SelectionCloseDelayMs, g9SelectionEagerBuildItemLimit, g9SelectionRowHeight, g9SelectionSearchDebounceMs, selectionIdentities, showListSheet, showSelectionSheet, } from './selection-sheet.js';
4
+ export { type G9SelectionModelHookOptions, useSelectionModel } from './use-selection-model.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/selection/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,aAAa,EACb,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createSelectionModel, foldSearchText } from "./model.jsx";
2
+ export { estimateSelectionHeight, g9SelectionCloseDelayMs, g9SelectionEagerBuildItemLimit, g9SelectionRowHeight, g9SelectionSearchDebounceMs, selectionIdentities, showListSheet, showSelectionSheet } from "./selection-sheet.jsx";
3
+ export { useSelectionModel } from "./use-selection-model.jsx";
@@ -0,0 +1,53 @@
1
+ /** Single or multiple selection (MAUI `G9SelectionSheet` modes). */
2
+ export type G9SelectionMode = 'single' | 'multiple';
3
+ /**
4
+ * Folds text for search: lower case, Persian/Arabic digits to ASCII, Arabic letter variants to their Persian forms
5
+ * (ي→ی, ك→ک, ة→ه, أ/إ/آ→ا), zero-width non-joiner and tatweel removed, whitespace collapsed. Without `Intl`.
6
+ */
7
+ export declare function foldSearchText(text: string): string;
8
+ /** Options of {@link createSelectionModel}. */
9
+ export interface G9SelectionModelOptions<T> {
10
+ readonly items: ReadonlyArray<T>;
11
+ /** Stable identity of an item (MAUI `IG9SelectionIdentity`): replaced objects with equal keys stay selected. Default `String(item)`. */
12
+ readonly getKey?: (item: T) => string;
13
+ /** Text matched by search. Default `String(item)`. */
14
+ readonly getText?: (item: T) => string;
15
+ readonly mode: G9SelectionMode;
16
+ /** Initially selected keys. */
17
+ readonly selectedKeys?: ReadonlyArray<string>;
18
+ /** Whether an item can be chosen. Default every item. */
19
+ readonly isEnabled?: (item: T) => boolean;
20
+ }
21
+ /** A selection in progress (the sheet's draft): toggled freely, then committed or cancelled. */
22
+ export interface G9SelectionModel<T> {
23
+ readonly mode: G9SelectionMode;
24
+ /** The draft selection's keys, in selection order. */
25
+ readonly selectedKeys: ReadonlyArray<string>;
26
+ isSelected(key: string): boolean;
27
+ /**
28
+ * Toggles `key`. Single mode replaces the selection (a second toggle of the selected key keeps it unless
29
+ * `allowNone`). Returns the new model; the input is unchanged.
30
+ */
31
+ toggle(key: string, allowNone?: boolean): G9SelectionModel<T>;
32
+ /** Clears the draft. */
33
+ clear(): G9SelectionModel<T>;
34
+ /** The selected items in the order of `items` (keys whose item is gone are kept out). */
35
+ selectedItems(): T[];
36
+ /**
37
+ * Items whose text contains `query`, case-insensitively (MAUI `Contains(query, CurrentCultureIgnoreCase)`); a blank
38
+ * query returns every item. `trim` trims the query (the list picker does, the selection sheet does not); `fold`
39
+ * also folds Persian/Arabic letter variants and digits and matches every word (opt-in; MAUI has no folding).
40
+ */
41
+ filter(query: string, options?: {
42
+ readonly trim?: boolean;
43
+ readonly fold?: boolean;
44
+ }): T[];
45
+ /** The model for new `items` (same keys stay selected). */
46
+ withItems(items: ReadonlyArray<T>): G9SelectionModel<T>;
47
+ }
48
+ /**
49
+ * Creates an immutable selection model (plan/specs/03 §5 `useSelectionModel`). Lookups are O(1) per row (a key set),
50
+ * search folds every item text once per model.
51
+ */
52
+ export declare function createSelectionModel<T>(options: G9SelectionModelOptions<T>): G9SelectionModel<T>;
53
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/selection/model.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED,+CAA+C;AAC/C,MAAM,WAAW,uBAAuB,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACjC,wIAAwI;IACxI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACtC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,+BAA+B;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;CAC3C;AAED,gGAAgG;AAChG,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC9D,wBAAwB;IACxB,KAAK,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC7B,yFAAyF;IACzF,aAAa,IAAI,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,CAAC,EAAE,CAAC;IAC3F,2DAA2D;IAC3D,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;CACzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAkDhG"}
@@ -0,0 +1,69 @@
1
+ import { normalizeToAscii } from "@g9tm/lynxcontrols-foundation";
2
+ function foldSearchText(text) {
3
+ return normalizeToAscii(text).toLowerCase().replace(/[يى]/g, 'ی').replace(/ك/g, 'ک').replace(/ة/g, 'ه').replace(/[أإآ]/g, 'ا').replace(/\u200c|\u200d|\u0640/g, '').replace(/\s+/g, ' ').trim();
4
+ }
5
+ function createSelectionModel(options) {
6
+ var _options_selectedKeys, _options_selectedKeys1, _options_getText, _options_getKey, _options_isEnabled;
7
+ const keys = 'single' === options.mode ? (null != (_options_selectedKeys = options.selectedKeys) ? _options_selectedKeys : []).slice(0, 1) : [
8
+ ...null != (_options_selectedKeys1 = options.selectedKeys) ? _options_selectedKeys1 : []
9
+ ];
10
+ const unique = [];
11
+ const set = new Set();
12
+ for (const k of keys)if (!set.has(k)) {
13
+ set.add(k);
14
+ unique.push(k);
15
+ }
16
+ const getText = null != (_options_getText = options.getText) ? _options_getText : (item)=>String(item);
17
+ const getKey = null != (_options_getKey = options.getKey) ? _options_getKey : (item)=>String(item);
18
+ const isEnabled = null != (_options_isEnabled = options.isEnabled) ? _options_isEnabled : ()=>true;
19
+ let folded = null;
20
+ let lowered = null;
21
+ const byKey = new Map();
22
+ for (const item of options.items)byKey.set(getKey(item), item);
23
+ const next = (selectedKeys, items = options.items)=>createSelectionModel({
24
+ ...options,
25
+ items,
26
+ selectedKeys
27
+ });
28
+ return {
29
+ mode: options.mode,
30
+ selectedKeys: unique,
31
+ isSelected: (key)=>set.has(key),
32
+ toggle (key, allowNone = false) {
33
+ const item = byKey.get(key);
34
+ if (void 0 !== item && !isEnabled(item)) return this;
35
+ if ('single' === options.mode) {
36
+ if (set.has(key)) return allowNone ? next([]) : this;
37
+ return next([
38
+ key
39
+ ]);
40
+ }
41
+ return next(set.has(key) ? unique.filter((k)=>k !== key) : [
42
+ ...unique,
43
+ key
44
+ ]);
45
+ },
46
+ clear: ()=>next([]),
47
+ selectedItems: ()=>options.items.filter((item)=>set.has(getKey(item))),
48
+ filter (query, filterOptions = {}) {
49
+ const q = filterOptions.trim ? query.trim() : query;
50
+ if ('' === q.trim()) return [
51
+ ...options.items
52
+ ];
53
+ if (filterOptions.fold) {
54
+ const words = foldSearchText(q).split(' ').filter(Boolean);
55
+ null != folded || (folded = options.items.map((item)=>foldSearchText(getText(item))));
56
+ const texts = folded;
57
+ return options.items.filter((_, i)=>words.every((w)=>texts[i].includes(w)));
58
+ }
59
+ const needle = q.toLowerCase();
60
+ null != lowered || (lowered = options.items.map((item)=>getText(item).toLowerCase()));
61
+ const texts = lowered;
62
+ return options.items.filter((_, i)=>texts[i].includes(needle));
63
+ },
64
+ withItems: (items)=>next(unique, items)
65
+ };
66
+ }
67
+ export { createSelectionModel, foldSearchText };
68
+
69
+ //# sourceMappingURL=model.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection/model.jsx","sources":["../../src/selection/model.ts"],"sourcesContent":["import { normalizeToAscii } from '@g9tm/lynxcontrols-foundation';\n\n/** Single or multiple selection (MAUI `G9SelectionSheet` modes). */\nexport type G9SelectionMode = 'single' | 'multiple';\n\n/**\n * Folds text for search: lower case, Persian/Arabic digits to ASCII, Arabic letter variants to their Persian forms\n * (ي→ی, ك→ک, ة→ه, أ/إ/آ→ا), zero-width non-joiner and tatweel removed, whitespace collapsed. Without `Intl`.\n */\nexport function foldSearchText(text: string): string {\n return normalizeToAscii(text)\n .toLowerCase()\n .replace(/[يى]/g, 'ی')\n .replace(/ك/g, 'ک')\n .replace(/ة/g, 'ه')\n .replace(/[أإآ]/g, 'ا')\n .replace(/\\u200c|\\u200d|\\u0640/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/** Options of {@link createSelectionModel}. */\nexport interface G9SelectionModelOptions<T> {\n readonly items: ReadonlyArray<T>;\n /** Stable identity of an item (MAUI `IG9SelectionIdentity`): replaced objects with equal keys stay selected. Default `String(item)`. */\n readonly getKey?: (item: T) => string;\n /** Text matched by search. Default `String(item)`. */\n readonly getText?: (item: T) => string;\n readonly mode: G9SelectionMode;\n /** Initially selected keys. */\n readonly selectedKeys?: ReadonlyArray<string>;\n /** Whether an item can be chosen. Default every item. */\n readonly isEnabled?: (item: T) => boolean;\n}\n\n/** A selection in progress (the sheet's draft): toggled freely, then committed or cancelled. */\nexport interface G9SelectionModel<T> {\n readonly mode: G9SelectionMode;\n /** The draft selection's keys, in selection order. */\n readonly selectedKeys: ReadonlyArray<string>;\n isSelected(key: string): boolean;\n /**\n * Toggles `key`. Single mode replaces the selection (a second toggle of the selected key keeps it unless\n * `allowNone`). Returns the new model; the input is unchanged.\n */\n toggle(key: string, allowNone?: boolean): G9SelectionModel<T>;\n /** Clears the draft. */\n clear(): G9SelectionModel<T>;\n /** The selected items in the order of `items` (keys whose item is gone are kept out). */\n selectedItems(): T[];\n /**\n * Items whose text contains `query`, case-insensitively (MAUI `Contains(query, CurrentCultureIgnoreCase)`); a blank\n * query returns every item. `trim` trims the query (the list picker does, the selection sheet does not); `fold`\n * also folds Persian/Arabic letter variants and digits and matches every word (opt-in; MAUI has no folding).\n */\n filter(query: string, options?: { readonly trim?: boolean; readonly fold?: boolean }): T[];\n /** The model for new `items` (same keys stay selected). */\n withItems(items: ReadonlyArray<T>): G9SelectionModel<T>;\n}\n\n/**\n * Creates an immutable selection model (plan/specs/03 §5 `useSelectionModel`). Lookups are O(1) per row (a key set),\n * search folds every item text once per model.\n */\nexport function createSelectionModel<T>(options: G9SelectionModelOptions<T>): G9SelectionModel<T> {\n const keys = options.mode === 'single' ? (options.selectedKeys ?? []).slice(0, 1) : [...(options.selectedKeys ?? [])];\n const unique: string[] = [];\n const set = new Set<string>();\n for (const k of keys) {\n if (!set.has(k)) {\n set.add(k);\n unique.push(k);\n }\n }\n const getText = options.getText ?? ((item: T) => String(item));\n const getKey = options.getKey ?? ((item: T) => String(item));\n const isEnabled = options.isEnabled ?? (() => true);\n let folded: string[] | null = null;\n let lowered: string[] | null = null;\n const byKey = new Map<string, T>();\n for (const item of options.items) byKey.set(getKey(item), item);\n const next = (selectedKeys: ReadonlyArray<string>, items = options.items) =>\n createSelectionModel({ ...options, items, selectedKeys });\n return {\n mode: options.mode,\n selectedKeys: unique,\n isSelected: (key) => set.has(key),\n toggle(key, allowNone = false) {\n const item = byKey.get(key);\n if (item !== undefined && !isEnabled(item)) return this;\n if (options.mode === 'single') {\n if (set.has(key)) return allowNone ? next([]) : this;\n return next([key]);\n }\n return next(set.has(key) ? unique.filter((k) => k !== key) : [...unique, key]);\n },\n clear: () => next([]),\n selectedItems: () => options.items.filter((item) => set.has(getKey(item))),\n filter(query, filterOptions = {}) {\n const q = filterOptions.trim ? query.trim() : query;\n if (q.trim() === '') return [...options.items];\n if (filterOptions.fold) {\n const words = foldSearchText(q).split(' ').filter(Boolean);\n folded ??= options.items.map((item) => foldSearchText(getText(item)));\n const texts = folded;\n return options.items.filter((_, i) => words.every((w) => (texts[i] as string).includes(w)));\n }\n const needle = q.toLowerCase();\n lowered ??= options.items.map((item) => getText(item).toLowerCase());\n const texts = lowered;\n return options.items.filter((_, i) => (texts[i] as string).includes(needle));\n },\n withItems: (items) => next(unique, items),\n };\n}\n"],"names":["foldSearchText","text","normalizeToAscii","createSelectionModel","options","_options_selectedKeys","_options_selectedKeys1","_options_getText","_options_getKey","_options_isEnabled","keys","unique","set","Set","k","getText","item","String","getKey","isEnabled","folded","lowered","byKey","Map","next","selectedKeys","items","key","allowNone","undefined","query","filterOptions","q","words","Boolean","texts","_","i","w","needle"],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import './selection.css';
2
+ import { type G9TextInputDirection } from '@g9tm/lynxcontrols-foundation';
3
+ import type { G9SelectionItem } from '../base/selection-item.js';
4
+ import { type G9SheetOptions } from '../sheet/options.js';
5
+ import type { G9SheetService } from '../sheet/service.js';
6
+ /** MAUI `G9SelectionSheet.EagerBuildItemLimit`: lists up to 40 items are built at once; longer lists defer. */
7
+ export declare const g9SelectionEagerBuildItemLimit = 40;
8
+ /** Row height of the selection sheet (MAUI 52). */
9
+ export declare const g9SelectionRowHeight = 52;
10
+ /** Search debounce of the selection sheet (MAUI 150 ms). */
11
+ export declare const g9SelectionSearchDebounceMs = 150;
12
+ /** Wait after a close-on-select pick before closing (MAUI 120 ms). */
13
+ export declare const g9SelectionCloseDelayMs = 120;
14
+ /** The outcome of a selection sheet (MAUI `G9SelectionSheetResult`). */
15
+ export interface G9SelectionSheetResult<T extends G9SelectionItem = G9SelectionItem> {
16
+ /** A pick on a close-on-select sheet, Done, or Reset; `false` for every dismissal. */
17
+ readonly wasAccepted: boolean;
18
+ /** The selection differs from the opening one. */
19
+ readonly selectionChanged: boolean;
20
+ /** The final selection (opening items that are not listed or disabled stay unless deselected). */
21
+ readonly items: ReadonlyArray<T>;
22
+ }
23
+ /**
24
+ * The selection identity of an item inside one list (MAUI `G9SelectionSheet.KeyOf`): `k:<key>` when the key is set,
25
+ * else `t:<text>` when the text is unique among key-less items, else the position (`i:<n>`). Keys and texts never
26
+ * match each other.
27
+ */
28
+ export declare function selectionIdentities(items: ReadonlyArray<G9SelectionItem>): string[];
29
+ /** Estimated body height (MAUI `EstimateContentHeight`): rows × 52 + chrome, clamped to [2 rows + chrome, 520]. */
30
+ export declare function estimateSelectionHeight(count: number, showSearch: boolean): number;
31
+ /** Arguments of {@link showSelectionSheet} (MAUI `ShowForResultAsync`). */
32
+ export interface G9SelectionSheetRequest<T extends G9SelectionItem> {
33
+ readonly title: string;
34
+ readonly items: ReadonlyArray<T>;
35
+ readonly selectedItems?: ReadonlyArray<T>;
36
+ readonly allowMultiple?: boolean;
37
+ /** Single mode: a pick completes and closes after 120 ms. Default true. */
38
+ readonly closeOnSingleSelection?: boolean;
39
+ readonly showSearch?: boolean;
40
+ /** No-results text. Default the `noResults` string. */
41
+ readonly emptyText?: string | null;
42
+ /** Row text direction. Default `'matchParent'`. */
43
+ readonly itemTextDirection?: G9TextInputDirection;
44
+ /** A non-empty reset selection adds a Reset toolbar item that completes with it. */
45
+ readonly resetSelection?: ReadonlyArray<T> | null;
46
+ /** Count pill label (multi). Default `"{n} {selected}"`. */
47
+ readonly countLabel?: (count: number) => string;
48
+ /** Extra sheet options (merged over the defaults). */
49
+ readonly options?: G9SheetOptions;
50
+ }
51
+ /**
52
+ * Shows the selection sheet (MAUI `G9SelectionSheet.ShowForResultAsync`): a fit sheet with a header (title near the
53
+ * close button), optional search (150 ms debounce, text match, hidden selected rows stay selected), rows with icon or
54
+ * swatch, check mark and selection tint. Single mode with `closeOnSingleSelection` completes on a pick; multi mode
55
+ * shows a count pill and Done; a reset selection adds Reset. Any dismissal resolves `wasAccepted: false` with the
56
+ * current draft (or the opening selection when the sheet never built).
57
+ */
58
+ export declare function showSelectionSheet<T extends G9SelectionItem>(sheets: G9SheetService, request: G9SelectionSheetRequest<T>): Promise<G9SelectionSheetResult<T>>;
59
+ /** Arguments of {@link showListSheet} (MAUI `ShowListG9BottomSheetAsync`). */
60
+ export interface G9ListSheetRequest<T extends G9SelectionItem> {
61
+ readonly title: string;
62
+ readonly items: ReadonlyArray<T>;
63
+ readonly selected?: ReadonlyArray<T>;
64
+ readonly multiple?: boolean;
65
+ /** Default true. */
66
+ readonly closeOnSingleSelection?: boolean;
67
+ /** Shows the search field (250 ms debounce, trimmed) with this placeholder. */
68
+ readonly searchPlaceholder?: string | null;
69
+ /** Default full screen without a handle (MAUI). A fit-to-content `sizeMode` keeps the sheet compact. */
70
+ readonly options?: G9SheetOptions;
71
+ /** Apply button text (multi). Default the `save` string. */
72
+ readonly applyButtonText?: string;
73
+ }
74
+ /**
75
+ * The shared list picker (MAUI `ShowListG9BottomSheetAsync` / `G9BottomSheetListPickerModal`): search field with
76
+ * placeholder, rows with a selection tint (no check mark), Apply in multi mode, close-on-select after 120 ms. Resolves
77
+ * with the selection when it completes or closes (no accepted/dismissed distinction, as MAUI); `[]` when throttled.
78
+ */
79
+ export declare function showListSheet<T extends G9SelectionItem>(sheets: G9SheetService, request: G9ListSheetRequest<T>): Promise<T[]>;
80
+ //# sourceMappingURL=selection-sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-sheet.d.ts","sourceRoot":"","sources":["../../src/selection/selection-sheet.tsx"],"names":[],"mappings":"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"}