@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,56 @@
1
+ import './tab-bar.css';
2
+ import { type ReactNode } from '@lynx-js/react';
3
+ import { type G9TabBarStyle } from './metrics.js';
4
+ import { type G9TabBarFabTappedEventArgs, type G9TabBarItem, type G9TabBarSelectionChangedEventArgs } from './model.js';
5
+ /** Props of {@link G9TabBar}. */
6
+ export interface G9TabBarProps {
7
+ /** Bar items (MAUI `Items`). More than 5 collapse the extras behind a More trigger. */
8
+ readonly items: readonly G9TabBarItem[];
9
+ /** Items of the FAB's horizontal sub-menu row (MAUI `SubMenuItems`). */
10
+ readonly subMenuItems?: readonly G9TabBarItem[];
11
+ /** Which item becomes the floating action button; -1 = none (MAUI `FabIndex`). Default 2. */
12
+ readonly fabIndex?: number;
13
+ /** Controlled selection (MAUI `SelectedIndex`, two-way). */
14
+ readonly selectedIndex?: number;
15
+ /** Initial selection while uncontrolled (MAUI `DefaultSelectedIndex`). Default 0. */
16
+ readonly defaultSelectedIndex?: number;
17
+ readonly onSelectedIndexChange?: (index: number) => void;
18
+ /** Controlled FAB-floating state (MAUI `IsCenterFloating`, two-way). */
19
+ readonly isCenterFloating?: boolean;
20
+ readonly onCenterFloatingChange?: (floating: boolean) => void;
21
+ /** Controlled sub-menu state (MAUI `IsFabOpen`, two-way). */
22
+ readonly isFabOpen?: boolean;
23
+ readonly onFabOpenChange?: (open: boolean) => void;
24
+ /** Controlled overflow column state (MAUI `IsOverflowOpen`, two-way). */
25
+ readonly isOverflowOpen?: boolean;
26
+ readonly onOverflowOpenChange?: (open: boolean) => void;
27
+ /** Selecting a non-FAB item returns the FAB to the bar (MAUI `ResetCenterOnMenuSelection`). Default true. */
28
+ readonly resetCenterOnMenuSelection?: boolean;
29
+ /** Label of the More trigger (MAUI `OverflowText`). Default: the app's `More` string, else "More". */
30
+ readonly overflowText?: string | null;
31
+ /** A bar, overflow or sub-menu item was tapped (MAUI `ItemSelected`), after its own callbacks. */
32
+ readonly onItemSelected?: (args: G9TabBarSelectionChangedEventArgs) => void;
33
+ /**
34
+ * The FAB was tapped, before any state changes (MAUI `FabTapped`). Set `args.handled = true` (or return
35
+ * `'handled'`) to replace the built-in fan-out; the bar then changes nothing.
36
+ */
37
+ readonly onFabTapped?: (args: G9TabBarFabTappedEventArgs) => undefined | 'handled' | undefined;
38
+ /**
39
+ * The visual style (MAUI 1.4.0 `BarStyle`): `'classic'` (default: the glass bar, semicircle notch, selection pill) or
40
+ * `'sculpted'` (the opaque bar with a soft shadow, the S-shouldered cradle, the flat primary disc, filled-icon
41
+ * selection). Behaviour is identical; switching at runtime keeps the selection and the FAB and overflow state. A host
42
+ * reserving the bar's height reads `g9TabBarStyleMetrics.for(barStyle)` (MAUI `CurrentMetrics`).
43
+ */
44
+ readonly barStyle?: G9TabBarStyle;
45
+ readonly className?: string;
46
+ }
47
+ /**
48
+ * Bottom navigation with a floating action button (MAUI `G9TabBar`): the FAB rises out of a notch and fans out a
49
+ * horizontal sub-menu row; more than five items collapse behind a More trigger with a vertical overflow column; a tap
50
+ * outside the open menus (on the backdrop) closes them. The state machine is the pure transitions in `./model`. Two
51
+ * styles (`barStyle`): Classic (a flat `<svg>` chrome with a 1 px highlight, a semicircular notch, an animated pill on
52
+ * the selection; no shadow) and Sculpted (an opaque chrome over its own blurred outline, the cradle notch, a flat
53
+ * primary disc with its shadow, the selected item in its `selectedIcon` and the primary colour).
54
+ */
55
+ export declare function G9TabBar(props: G9TabBarProps): ReactNode;
56
+ //# sourceMappingURL=tab-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-bar.d.ts","sourceRoot":"","sources":["../../src/tab-bar/tab-bar.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,SAAS,EAA+B,MAAM,gBAAgB,CAAC;AAO7E,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,WAAW,CAAC;AACnB,OAAO,EAGL,KAAK,0BAA0B,EAC/B,KAAK,YAAY,EACjB,KAAK,iCAAiC,EAyBvC,MAAM,SAAS,CAAC;AAEjB,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,qFAAqF;IACrF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,yEAAyE;IACzE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,6GAA6G;IAC7G,QAAQ,CAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAC9C,sGAAsG;IACtG,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,kGAAkG;IAClG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,iCAAiC,KAAK,IAAI,CAAC;IAC5E;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/F;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAWD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,CAwWxD"}
@@ -0,0 +1,343 @@
1
+ import "./tab-bar.css";
2
+ import { useEffect, useRef, useState } from "@lynx-js/react";
3
+ import { usePressVisual } from "../base/press.jsx";
4
+ import { startTimer, stopTimer } from "../base/timers.jsx";
5
+ import { useControllableState } from "../base/use-controllable-state.jsx";
6
+ import { useG9Back } from "../host/hooks.jsx";
7
+ import { G9Icon } from "../icon/icon.jsx";
8
+ import { useG9Diagnostics, useG9Direction, useG9Strings, useG9Theme, useG9Window } from "../provider/hooks.jsx";
9
+ import { easeOutBackCss, g9TabBarMetrics, g9TabBarStyleMetrics } from "./metrics.jsx";
10
+ import { initialTabBarState, overflowColumnLayout, reconcileTabBarState, resolveTabBarFabIndex, subMenuRowLayout, tabBarBackdropTap, tabBarChromeSvg, tabBarFabCenterX, tabBarFabPlusSvg, tabBarFabShadowSvg, tabBarFabTap, tabBarHasOverflow, tabBarIndicatorSlot, tabBarItemTap, tabBarOverflowIndices, tabBarOverflowItemTap, tabBarOverflowSlot, tabBarOverflowTriggerTap, tabBarReservedHeight, tabBarSlotCenterX, tabBarSlots, tabBarSubMenuTap } from "./model.jsx";
11
+ const PRESS = Object.freeze({
12
+ property: 'opacity',
13
+ rest: g9TabBarMetrics.defaultRestOpacity,
14
+ pressed: g9TabBarMetrics.itemPressedOpacity,
15
+ hovered: g9TabBarMetrics.itemHoveredOpacity,
16
+ inMs: g9TabBarMetrics.touchAnimationDurationMs,
17
+ outMs: g9TabBarMetrics.touchAnimationDurationMs
18
+ });
19
+ function G9TabBar(props) {
20
+ var _props_subMenuItems, _props_fabIndex, _props_resetCenterOnMenuSelection, _props_defaultSelectedIndex, _props_className, _items_fab_text;
21
+ const items = props.items;
22
+ const subMenuItems = null != (_props_subMenuItems = props.subMenuItems) ? _props_subMenuItems : [];
23
+ const barStyle = 'sculpted' === props.barStyle ? 'sculpted' : 'classic';
24
+ const metrics = g9TabBarStyleMetrics["for"](barStyle);
25
+ const sculpted = 'sculpted' === barStyle;
26
+ const config = {
27
+ itemCount: items.length,
28
+ subMenuCount: subMenuItems.length,
29
+ fabIndex: null != (_props_fabIndex = props.fabIndex) ? _props_fabIndex : g9TabBarMetrics.defaultFabIndex,
30
+ resetCenterOnMenuSelection: null != (_props_resetCenterOnMenuSelection = props.resetCenterOnMenuSelection) ? _props_resetCenterOnMenuSelection : true,
31
+ barStyle
32
+ };
33
+ const initial = useRef(null);
34
+ if (null === initial.current) initial.current = initialTabBarState(config, null != (_props_defaultSelectedIndex = props.defaultSelectedIndex) ? _props_defaultSelectedIndex : 0);
35
+ const [selectedIndex, setSelectedIndex] = useControllableState({
36
+ value: props.selectedIndex,
37
+ defaultValue: initial.current.selectedIndex,
38
+ onChange: props.onSelectedIndexChange,
39
+ name: 'G9TabBar.selectedIndex'
40
+ });
41
+ const [isCenterFloating, setCenterFloating] = useControllableState({
42
+ value: props.isCenterFloating,
43
+ defaultValue: initial.current.isCenterFloating,
44
+ onChange: props.onCenterFloatingChange,
45
+ name: 'G9TabBar.isCenterFloating'
46
+ });
47
+ const [isFabOpen, setFabOpen] = useControllableState({
48
+ value: props.isFabOpen,
49
+ defaultValue: false,
50
+ onChange: props.onFabOpenChange,
51
+ name: 'G9TabBar.isFabOpen'
52
+ });
53
+ const [isOverflowOpen, setOverflowOpen] = useControllableState({
54
+ value: props.isOverflowOpen,
55
+ defaultValue: false,
56
+ onChange: props.onOverflowOpenChange,
57
+ name: 'G9TabBar.isOverflowOpen'
58
+ });
59
+ const state = {
60
+ selectedIndex,
61
+ isCenterFloating,
62
+ isFabOpen,
63
+ isOverflowOpen
64
+ };
65
+ const apply = (next)=>{
66
+ if (next.selectedIndex !== state.selectedIndex) setSelectedIndex(next.selectedIndex);
67
+ if (next.isCenterFloating !== state.isCenterFloating) setCenterFloating(next.isCenterFloating);
68
+ if (next.isFabOpen !== state.isFabOpen) setFabOpen(next.isFabOpen);
69
+ if (next.isOverflowOpen !== state.isOverflowOpen) setOverflowOpen(next.isOverflowOpen);
70
+ };
71
+ useEffect(()=>{
72
+ apply(reconcileTabBarState(state, config));
73
+ }, [
74
+ selectedIndex,
75
+ config.fabIndex,
76
+ config.itemCount,
77
+ config.resetCenterOnMenuSelection
78
+ ]);
79
+ const [revealing, setRevealing] = useState(g9TabBarMetrics.startupSelectionRevealEnabled);
80
+ const revealTimer = useRef(null);
81
+ useEffect(()=>{
82
+ if (!revealing) return;
83
+ revealTimer.current = startTimer(()=>setRevealing(false), g9TabBarMetrics.startupSelectionRevealDelayMs);
84
+ return ()=>stopTimer(revealTimer.current);
85
+ }, []);
86
+ const cancelReveal = ()=>{
87
+ if (!revealing) return;
88
+ stopTimer(revealTimer.current);
89
+ setRevealing(false);
90
+ };
91
+ const diagnostics = useG9Diagnostics();
92
+ const run = (effect)=>{
93
+ if (!effect) return;
94
+ const item = (effect.isSubMenuItem ? subMenuItems : items)[effect.index];
95
+ const context = {
96
+ index: effect.index,
97
+ item,
98
+ isSubMenuItem: effect.isSubMenuItem
99
+ };
100
+ try {
101
+ var _item_onClick, _props_onItemSelected;
102
+ null == (_item_onClick = item.onClick) || _item_onClick.call(item, context);
103
+ if (item.command && false !== item.canExecute) item.command(item.commandParameter);
104
+ null == (_props_onItemSelected = props.onItemSelected) || _props_onItemSelected.call(props, context);
105
+ } catch (error) {
106
+ diagnostics.log({
107
+ level: 'error',
108
+ message: 'G9TabBar: item handler failed.',
109
+ source: 'G9TabBar',
110
+ error
111
+ });
112
+ }
113
+ };
114
+ const transition = (t)=>{
115
+ cancelReveal();
116
+ apply(t.state);
117
+ run(t.effect);
118
+ };
119
+ const onFab = ()=>{
120
+ var _props_onFabTapped;
121
+ cancelReveal();
122
+ const args = {
123
+ handled: false
124
+ };
125
+ const result = null == (_props_onFabTapped = props.onFabTapped) ? void 0 : _props_onFabTapped.call(props, args);
126
+ if (args.handled || 'handled' === result) return;
127
+ transition(tabBarFabTap(state, config));
128
+ };
129
+ const open = isFabOpen || isOverflowOpen;
130
+ useG9Back(()=>{
131
+ apply(tabBarBackdropTap(state, config));
132
+ return true;
133
+ }, {
134
+ enabled: open
135
+ });
136
+ const rtl = 'rtl' === useG9Direction();
137
+ const strings = useG9Strings();
138
+ const palette = useG9Theme().palette;
139
+ const win = useG9Window();
140
+ const [measured, setMeasured] = useState(0);
141
+ const width = measured > 0 ? measured : win.width;
142
+ const barWidth = Math.max(width - 2 * g9TabBarMetrics.barHorizontalGap, 0);
143
+ const slots = tabBarSlots(items.length);
144
+ const slotCount = slots.length;
145
+ const fab = resolveTabBarFabIndex(config.fabIndex, config.itemCount);
146
+ const floating = isCenterFloating && fab >= 0;
147
+ const fabCenterX = fab >= 0 ? tabBarFabCenterX(fab, slotCount, width, rtl, barStyle) : 0;
148
+ const indicatorSlot = tabBarIndicatorSlot(state, config);
149
+ const overflowLabel = props.overflowText || strings.resolve('More') || 'More';
150
+ const overflowSelected = tabBarHasOverflow(items.length) && selectedIndex >= tabBarOverflowSlot;
151
+ const reserved = tabBarReservedHeight(state, config);
152
+ const bounce = easeOutBackCss(g9TabBarMetrics.fabPopBackCoefficient);
153
+ const chromeFill = sculpted ? palette.CardBackground : palette.SurfaceContainerHigh;
154
+ const chromeStroke = palette.OutlineVariant;
155
+ const pad = g9TabBarMetrics.chromeShadowPadding;
156
+ const chromeBox = sculpted ? {
157
+ left: `${-pad}px`,
158
+ top: `${-pad}px`,
159
+ width: `${barWidth + 2 * pad}px`,
160
+ height: `${metrics.barHeight + 2 * pad}px`
161
+ } : {
162
+ height: `${metrics.barHeight}px`
163
+ };
164
+ const fabShadow = tabBarFabShadowSvg(barStyle);
165
+ const visualSlot = (slot)=>rtl ? slotCount - 1 - slot : slot;
166
+ const slotViews = slots.map((slot, i)=>{
167
+ const isOverflow = 'overflow' === slot.kind;
168
+ const index = 'item' === slot.kind ? slot.index : -1;
169
+ const item = isOverflow ? {
170
+ text: overflowLabel,
171
+ icon: 'menu'
172
+ } : items[index];
173
+ const selected = isOverflow ? overflowSelected : index === selectedIndex;
174
+ const hiddenUnderFab = index === fab && floating;
175
+ const revealPose = revealing && selected && !hiddenUnderFab;
176
+ return <TabBarSlot key={isOverflow ? 'overflow' : `item-${index}`} item={item} selected={selected} hidden={hiddenUnderFab} revealPose={revealPose} order={visualSlot(i)} metrics={metrics} onTap={()=>transition(isOverflow ? tabBarOverflowTriggerTap(state, config) : tabBarItemTap(state, config, index))}/>;
177
+ });
178
+ const sub = subMenuRowLayout(subMenuItems.length, fabCenterX, width);
179
+ const overflowIndices = tabBarOverflowIndices(items.length);
180
+ const column = overflowColumnLayout(overflowIndices.length, tabBarSlotCenterX(tabBarOverflowSlot, slotCount, width, rtl, metrics.itemsHorizontalPadding), width, barStyle);
181
+ return <view className={`g9-tab-bar${sculpted ? ' g9-tab-bar--sculpted' : ''} ${null != (_props_className = props.className) ? _props_className : ''}`} style={{
182
+ height: `${reserved}px`
183
+ }} bindlayoutchange={(e)=>{
184
+ var _e_detail;
185
+ const w = Number(null == (_e_detail = e.detail) ? void 0 : _e_detail.width);
186
+ if (Number.isFinite(w) && w > 0 && w !== measured) setMeasured(w);
187
+ }}>
188
+ {open ? <view className="g9-tab-bar__backdrop" style={{
189
+ zIndex: g9TabBarMetrics.backdropZIndex,
190
+ top: `${g9TabBarMetrics.backdropTopInset}px`
191
+ }} bindtap={()=>apply(tabBarBackdropTap(state, config))}/> : null}
192
+ <view className="g9-tab-bar__chrome" style={{
193
+ zIndex: 2,
194
+ height: `${metrics.barHeight}px`
195
+ }}>
196
+ <svg className="g9-tab-bar__chrome-flat" content={tabBarChromeSvg(barWidth, metrics.barHeight, null, chromeFill, chromeStroke, barStyle)} style={{
197
+ ...chromeBox,
198
+ opacity: floating ? 0 : 1,
199
+ transition: `opacity ${g9TabBarMetrics.centerStateDurationMs}ms ease-out`
200
+ }}/>
201
+ {fab >= 0 ? <svg className="g9-tab-bar__chrome-notched" content={tabBarChromeSvg(barWidth, metrics.barHeight, fabCenterX - g9TabBarMetrics.barHorizontalGap, chromeFill, chromeStroke, barStyle)} style={{
202
+ ...chromeBox,
203
+ opacity: floating ? 1 : 0,
204
+ transition: `opacity ${g9TabBarMetrics.centerStateDurationMs}ms ease-out`
205
+ }}/> : null}
206
+ <view className="g9-tab-bar__slots" style={metrics.itemsHorizontalPadding > 0 ? {
207
+ left: `${metrics.itemsHorizontalPadding}px`,
208
+ right: `${metrics.itemsHorizontalPadding}px`
209
+ } : {}}>
210
+ {indicatorSlot >= 0 && metrics.showsSelectionIndicator ? <view className="g9-tab-bar__indicator" style={{
211
+ left: `${(visualSlot(slots.findIndex((s)=>'item' === s.kind ? s.index === indicatorSlot : indicatorSlot === tabBarOverflowSlot)) + 0.5) * 100 / slotCount}%`,
212
+ transition: `left ${g9TabBarMetrics.indicatorMoveDurationMs}ms cubic-bezier(0.215, 0.61, 0.355, 1)`,
213
+ top: `${g9TabBarMetrics.indicatorTopOffset + metrics.selectedItemNudgeY}px`
214
+ }}/> : null}
215
+ {slotViews}
216
+ </view>
217
+ </view>
218
+ {fab >= 0 ? <view className={`g9-tab-bar__fab${floating ? ' g9-tab-bar__fab--floating' : ''}`} accessibility-element accessibility-traits="button" accessibility-label={null != (_items_fab_text = items[fab].text) ? _items_fab_text : ''} style={{
219
+ zIndex: 3,
220
+ width: `${metrics.fabSize}px`,
221
+ height: `${metrics.fabSize}px`,
222
+ borderRadius: `${metrics.fabSize / 2}px`,
223
+ left: `${fabCenterX - metrics.fabSize / 2}px`,
224
+ bottom: `${g9TabBarMetrics.barBottomGap + metrics.barHeight - (metrics.fabSize - metrics.fabProtrusionAboveBar)}px`,
225
+ opacity: floating ? 1 : 0,
226
+ transform: floating ? 'translateY(0px) scale(1)' : `translateY(${g9TabBarMetrics.fabIdleVerticalOffset}px) scale(${g9TabBarMetrics.fabIdleScaleMin})`,
227
+ transition: floating ? `transform ${g9TabBarMetrics.centerStateBouncyDurationMs}ms ${bounce}, opacity ${g9TabBarMetrics.centerStateDurationMs}ms ease-out` : `transform ${g9TabBarMetrics.centerStateDurationMs}ms cubic-bezier(0.55, 0.055, 0.675, 0.19), opacity ${g9TabBarMetrics.centerStateDurationMs}ms ease-in`
228
+ }} bindtap={floating ? onFab : void 0}>
229
+ {fabShadow ? <svg className="g9-tab-bar__fab-shadow" content={fabShadow} style={{
230
+ left: `${-pad}px`,
231
+ top: `${-pad}px`,
232
+ width: `${metrics.fabSize + 2 * pad}px`,
233
+ height: `${metrics.fabSize + 2 * pad}px`
234
+ }}/> : null}
235
+ <view className="g9-tab-bar__fab-inner" style={{
236
+ width: `${metrics.fabInnerSize}px`,
237
+ height: `${metrics.fabInnerSize}px`,
238
+ borderRadius: `${metrics.fabInnerSize / 2}px`
239
+ }}>
240
+ <view className="g9-tab-bar__fab-icon" style={{
241
+ transform: `rotate(${isFabOpen ? g9TabBarMetrics.fabRotationOpenDegrees : 0}deg)`,
242
+ transition: `transform ${g9TabBarMetrics.openStateDurationMs}ms ease-out`
243
+ }}>
244
+ {sculpted ? <svg className="g9-tab-bar__fab-plus" content={tabBarFabPlusSvg(metrics.fabIconSize, metrics.fabPlusArmRatio, metrics.fabPlusStrokeRatio, palette.OnPrimary)} style={{
245
+ width: `${metrics.fabIconSize}px`,
246
+ height: `${metrics.fabIconSize}px`
247
+ }}/> : <G9Icon icon="plus" size={0.7 * g9TabBarMetrics.fabIconSize} color="var(--g9-on-primary)"/>}
248
+ </view>
249
+ </view>
250
+ </view> : null}
251
+ {isFabOpen && subMenuItems.length > 0 ? <view className="g9-tab-bar__submenu" style={{
252
+ zIndex: 3,
253
+ left: `${sub.left}px`,
254
+ height: `${g9TabBarMetrics.subMenuRowCellHeight}px`,
255
+ bottom: `${g9TabBarMetrics.barBottomGap + metrics.barHeight + metrics.fabProtrusionAboveBar + g9TabBarMetrics.subMenuRowAboveFabGap}px`
256
+ }}>
257
+ {subMenuItems.map((item, i)=><MenuCell key={`sub-${i}`} className="g9-tab-bar__submenu-cell" item={item} size={g9TabBarMetrics.subMenuRowItemSize} height={g9TabBarMetrics.subMenuRowCellHeight} left={sub.cells[i].x} bottom={0} delayMs={sub.cells[i].delayMs} durationMs={g9TabBarMetrics.openStateDurationMs} travelX={g9TabBarMetrics.subMenuRowRevealTravelX * (i < (subMenuItems.length - 1) / 2 ? 1 : -1)} travelY={g9TabBarMetrics.subMenuRowRevealTravelY} iconSize={g9TabBarMetrics.subMenuRowIconSizeMax} fontSize={g9TabBarMetrics.subMenuRowFontSizeMax} selected={false} onAccent={sculpted} onTap={()=>transition(tabBarSubMenuTap(state, config, i))}/>)}
258
+ </view> : null}
259
+ {isOverflowOpen && overflowIndices.length > 0 ? <view className="g9-tab-bar__overflow" style={{
260
+ zIndex: 3,
261
+ left: `${column.left}px`
262
+ }}>
263
+ {overflowIndices.map((source, k)=><MenuCell key={`overflow-${source}`} className="g9-tab-bar__overflow-item" item={items[source]} size={g9TabBarMetrics.overflowItemSize} height={g9TabBarMetrics.overflowItemSize} left={0} bottom={column.items[k].bottom} delayMs={column.items[k].delayMs} durationMs={g9TabBarMetrics.overflowStateDurationMs} travelX={0} travelY={g9TabBarMetrics.overflowRevealTravelY} iconSize={g9TabBarMetrics.overflowItemIconSize} fontSize={g9TabBarMetrics.overflowItemFontSize} selected={source === selectedIndex} onAccent={false} onTap={()=>transition(tabBarOverflowItemTap(state, config, source))}/>)}
264
+ </view> : null}
265
+ </view>;
266
+ }
267
+ function TabBarSlot(props) {
268
+ var _item_icon, _item_text, _item_text1;
269
+ const press = usePressVisual(PRESS, false);
270
+ const { item, selected, hidden, revealPose, metrics } = props;
271
+ const sculpted = 'sculpted' === metrics.style;
272
+ const color = sculpted ? selected ? 'var(--g9-primary)' : 'var(--g9-text-secondary)' : selected ? 'var(--g9-on-primary-container)' : 'var(--g9-on-surface-variant)';
273
+ const icon = sculpted && selected && void 0 !== item.selectedIcon ? item.selectedIcon : null != (_item_icon = item.icon) ? _item_icon : 'check';
274
+ const pose = hidden ? {
275
+ opacity: 0,
276
+ transform: `translateY(${g9TabBarMetrics.centerItemHiddenTranslationY}px) scale(${1 - g9TabBarMetrics.centerItemHiddenScaleAmount})`,
277
+ transition: `opacity ${g9TabBarMetrics.centerStateDurationMs}ms ease-out, transform ${g9TabBarMetrics.centerStateDurationMs}ms ease-out`
278
+ } : revealPose ? {
279
+ opacity: g9TabBarMetrics.selectedReturnRevealStartOpacity,
280
+ transform: `translateY(${g9TabBarMetrics.selectedReturnRevealTranslationY}px) scale(${g9TabBarMetrics.selectedReturnRevealStartScale})`
281
+ } : {
282
+ opacity: 1,
283
+ transform: `translateY(${g9TabBarMetrics.selectedItemTranslationY}px) scale(1)`,
284
+ transition: `opacity ${g9TabBarMetrics.selectedReturnRevealDurationMs}ms ease-out, transform ${g9TabBarMetrics.selectedReturnRevealDurationMs}ms ease-out`
285
+ };
286
+ return <view className={`g9-tab-bar__slot${selected ? ' g9-tab-bar__slot--selected' : ''}${hidden ? ' g9-tab-bar__slot--hidden' : ''}`} {...item.automationId ? {
287
+ id: item.automationId
288
+ } : {}} style={{
289
+ order: props.order,
290
+ minWidth: `${g9TabBarMetrics.slotItemMinWidth}px`,
291
+ maxWidth: `${g9TabBarMetrics.slotItemMaxWidth}px`
292
+ }} accessibility-element accessibility-traits="button" accessibility-label={null != (_item_text = item.text) ? _item_text : ''} bindtap={hidden ? void 0 : props.onTap} {...press}>
293
+ <view className="g9-tab-bar__slot-body" style={{
294
+ ...pose,
295
+ rowGap: `${metrics.bottomContentSpacing}px`
296
+ }}>
297
+ <G9Icon icon={icon} size={metrics.bottomIconSize} color={color}/>
298
+ <text className="g9-tab-bar__label" text-maxline="1" style={{
299
+ color,
300
+ fontSize: `${metrics.bottomLabelFontSize}px`,
301
+ fontWeight: selected ? '700' : '400'
302
+ }}>
303
+ {null != (_item_text1 = item.text) ? _item_text1 : ''}
304
+ </text>
305
+ </view>
306
+ </view>;
307
+ }
308
+ function MenuCell(props) {
309
+ var _props_item_text, _props_item_icon, _props_item_text1;
310
+ const [shown, setShown] = useState(false);
311
+ useEffect(()=>{
312
+ const t = startTimer(()=>setShown(true), 16);
313
+ return ()=>stopTimer(t);
314
+ }, []);
315
+ const press = usePressVisual(PRESS, false);
316
+ const bounce = easeOutBackCss(g9TabBarMetrics.fabPopBackCoefficient);
317
+ const color = props.selected ? 'var(--g9-on-primary)' : 'var(--g9-on-surface)';
318
+ const iconColor = props.onAccent ? 'var(--g9-on-primary)' : color;
319
+ return <view className={`${props.className}${props.selected ? ` ${props.className}--selected` : ''}`} {...props.item.automationId ? {
320
+ id: props.item.automationId
321
+ } : {}} accessibility-element accessibility-traits="button" accessibility-label={null != (_props_item_text = props.item.text) ? _props_item_text : ''} style={{
322
+ left: `${props.left}px`,
323
+ bottom: `${props.bottom}px`,
324
+ width: `${props.size}px`,
325
+ height: `${props.height}px`,
326
+ opacity: shown ? 1 : 0,
327
+ transform: shown ? 'translate(0px, 0px) scale(1)' : `translate(${props.travelX}px, ${props.travelY}px) scale(${g9TabBarMetrics.fabIdleScaleMin})`,
328
+ transition: `opacity ${props.durationMs}ms ease-out ${props.delayMs}ms, transform ${props.durationMs}ms ${bounce} ${props.delayMs}ms`
329
+ }} bindtap={props.onTap} {...press}>
330
+ <view className="g9-tab-bar__cell-accent">
331
+ <G9Icon icon={null != (_props_item_icon = props.item.icon) ? _props_item_icon : 'check'} size={props.iconSize} color={iconColor}/>
332
+ </view>
333
+ <text className="g9-tab-bar__cell-label" text-maxline="1" style={{
334
+ fontSize: `${props.fontSize}px`,
335
+ color
336
+ }}>
337
+ {null != (_props_item_text1 = props.item.text) ? _props_item_text1 : ''}
338
+ </text>
339
+ </view>;
340
+ }
341
+ export { G9TabBar };
342
+
343
+ //# sourceMappingURL=tab-bar.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-bar/tab-bar.jsx","sources":["../../src/tab-bar/tab-bar.tsx"],"sourcesContent":["import './tab-bar.css';\nimport { type ReactNode, useEffect, useRef, useState } from '@lynx-js/react';\nimport { usePressVisual } from '../base/press';\nimport { startTimer, stopTimer } from '../base/timers';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { useG9Back } from '../host/hooks';\nimport { G9Icon } from '../icon/icon';\nimport { useG9Diagnostics, useG9Direction, useG9Strings, useG9Theme, useG9Window } from '../provider/hooks';\nimport {\n easeOutBackCss,\n type G9TabBarStyle,\n type G9TabBarStyleMetrics,\n g9TabBarStyleMetrics,\n g9TabBarMetrics as M,\n} from './metrics';\nimport {\n type G9TabBarClickContext,\n type G9TabBarConfig,\n type G9TabBarFabTappedEventArgs,\n type G9TabBarItem,\n type G9TabBarSelectionChangedEventArgs,\n type G9TabBarState,\n type G9TabBarTransition,\n initialTabBarState,\n overflowColumnLayout,\n reconcileTabBarState,\n resolveTabBarFabIndex,\n subMenuRowLayout,\n tabBarBackdropTap,\n tabBarChromeSvg,\n tabBarFabCenterX,\n tabBarFabPlusSvg,\n tabBarFabShadowSvg,\n tabBarFabTap,\n tabBarHasOverflow,\n tabBarIndicatorSlot,\n tabBarItemTap,\n tabBarOverflowIndices,\n tabBarOverflowItemTap,\n tabBarOverflowSlot,\n tabBarOverflowTriggerTap,\n tabBarReservedHeight,\n tabBarSlotCenterX,\n tabBarSlots,\n tabBarSubMenuTap,\n} from './model';\n\n/** Props of {@link G9TabBar}. */\nexport interface G9TabBarProps {\n /** Bar items (MAUI `Items`). More than 5 collapse the extras behind a More trigger. */\n readonly items: readonly G9TabBarItem[];\n /** Items of the FAB's horizontal sub-menu row (MAUI `SubMenuItems`). */\n readonly subMenuItems?: readonly G9TabBarItem[];\n /** Which item becomes the floating action button; -1 = none (MAUI `FabIndex`). Default 2. */\n readonly fabIndex?: number;\n /** Controlled selection (MAUI `SelectedIndex`, two-way). */\n readonly selectedIndex?: number;\n /** Initial selection while uncontrolled (MAUI `DefaultSelectedIndex`). Default 0. */\n readonly defaultSelectedIndex?: number;\n readonly onSelectedIndexChange?: (index: number) => void;\n /** Controlled FAB-floating state (MAUI `IsCenterFloating`, two-way). */\n readonly isCenterFloating?: boolean;\n readonly onCenterFloatingChange?: (floating: boolean) => void;\n /** Controlled sub-menu state (MAUI `IsFabOpen`, two-way). */\n readonly isFabOpen?: boolean;\n readonly onFabOpenChange?: (open: boolean) => void;\n /** Controlled overflow column state (MAUI `IsOverflowOpen`, two-way). */\n readonly isOverflowOpen?: boolean;\n readonly onOverflowOpenChange?: (open: boolean) => void;\n /** Selecting a non-FAB item returns the FAB to the bar (MAUI `ResetCenterOnMenuSelection`). Default true. */\n readonly resetCenterOnMenuSelection?: boolean;\n /** Label of the More trigger (MAUI `OverflowText`). Default: the app's `More` string, else \"More\". */\n readonly overflowText?: string | null;\n /** A bar, overflow or sub-menu item was tapped (MAUI `ItemSelected`), after its own callbacks. */\n readonly onItemSelected?: (args: G9TabBarSelectionChangedEventArgs) => void;\n /**\n * The FAB was tapped, before any state changes (MAUI `FabTapped`). Set `args.handled = true` (or return\n * `'handled'`) to replace the built-in fan-out; the bar then changes nothing.\n */\n readonly onFabTapped?: (args: G9TabBarFabTappedEventArgs) => undefined | 'handled' | undefined;\n /**\n * The visual style (MAUI 1.4.0 `BarStyle`): `'classic'` (default: the glass bar, semicircle notch, selection pill) or\n * `'sculpted'` (the opaque bar with a soft shadow, the S-shouldered cradle, the flat primary disc, filled-icon\n * selection). Behaviour is identical; switching at runtime keeps the selection and the FAB and overflow state. A host\n * reserving the bar's height reads `g9TabBarStyleMetrics.for(barStyle)` (MAUI `CurrentMetrics`).\n */\n readonly barStyle?: G9TabBarStyle;\n readonly className?: string;\n}\n\nconst PRESS = Object.freeze({\n property: 'opacity' as const,\n rest: M.defaultRestOpacity,\n pressed: M.itemPressedOpacity,\n hovered: M.itemHoveredOpacity,\n inMs: M.touchAnimationDurationMs,\n outMs: M.touchAnimationDurationMs,\n});\n\n/**\n * Bottom navigation with a floating action button (MAUI `G9TabBar`): the FAB rises out of a notch and fans out a\n * horizontal sub-menu row; more than five items collapse behind a More trigger with a vertical overflow column; a tap\n * outside the open menus (on the backdrop) closes them. The state machine is the pure transitions in `./model`. Two\n * styles (`barStyle`): Classic (a flat `<svg>` chrome with a 1 px highlight, a semicircular notch, an animated pill on\n * the selection; no shadow) and Sculpted (an opaque chrome over its own blurred outline, the cradle notch, a flat\n * primary disc with its shadow, the selected item in its `selectedIcon` and the primary colour).\n */\nexport function G9TabBar(props: G9TabBarProps): ReactNode {\n const items = props.items;\n const subMenuItems = props.subMenuItems ?? [];\n const barStyle: G9TabBarStyle = props.barStyle === 'sculpted' ? 'sculpted' : 'classic';\n const metrics = g9TabBarStyleMetrics.for(barStyle);\n const sculpted = barStyle === 'sculpted';\n const config: G9TabBarConfig = {\n itemCount: items.length,\n subMenuCount: subMenuItems.length,\n fabIndex: props.fabIndex ?? M.defaultFabIndex,\n resetCenterOnMenuSelection: props.resetCenterOnMenuSelection ?? true,\n barStyle,\n };\n const initial = useRef<G9TabBarState | null>(null);\n if (initial.current === null) initial.current = initialTabBarState(config, props.defaultSelectedIndex ?? 0);\n const [selectedIndex, setSelectedIndex] = useControllableState<number>({\n value: props.selectedIndex,\n defaultValue: initial.current.selectedIndex,\n onChange: props.onSelectedIndexChange,\n name: 'G9TabBar.selectedIndex',\n });\n const [isCenterFloating, setCenterFloating] = useControllableState<boolean>({\n value: props.isCenterFloating,\n defaultValue: initial.current.isCenterFloating,\n onChange: props.onCenterFloatingChange,\n name: 'G9TabBar.isCenterFloating',\n });\n const [isFabOpen, setFabOpen] = useControllableState<boolean>({\n value: props.isFabOpen,\n defaultValue: false,\n onChange: props.onFabOpenChange,\n name: 'G9TabBar.isFabOpen',\n });\n const [isOverflowOpen, setOverflowOpen] = useControllableState<boolean>({\n value: props.isOverflowOpen,\n defaultValue: false,\n onChange: props.onOverflowOpenChange,\n name: 'G9TabBar.isOverflowOpen',\n });\n const state: G9TabBarState = { selectedIndex, isCenterFloating, isFabOpen, isOverflowOpen };\n const apply = (next: G9TabBarState) => {\n if (next.selectedIndex !== state.selectedIndex) setSelectedIndex(next.selectedIndex);\n if (next.isCenterFloating !== state.isCenterFloating) setCenterFloating(next.isCenterFloating);\n if (next.isFabOpen !== state.isFabOpen) setFabOpen(next.isFabOpen);\n if (next.isOverflowOpen !== state.isOverflowOpen) setOverflowOpen(next.isOverflowOpen);\n };\n\n // Programmatic selection / FabIndex / Items changes bring the FAB state with them (MAUI ReconcileFabStateWithSelection).\n useEffect(() => {\n apply(reconcileTabBarState(state, config));\n }, [selectedIndex, config.fabIndex, config.itemCount, config.resetCenterOnMenuSelection]);\n\n // Startup reveal of the selected item, once (MAUI StartupSelectionReveal).\n const [revealing, setRevealing] = useState<boolean>(M.startupSelectionRevealEnabled);\n const revealTimer = useRef<ReturnType<typeof startTimer> | null>(null);\n useEffect(() => {\n if (!revealing) return;\n revealTimer.current = startTimer(() => setRevealing(false), M.startupSelectionRevealDelayMs);\n return () => stopTimer(revealTimer.current);\n }, []);\n const cancelReveal = () => {\n if (!revealing) return;\n stopTimer(revealTimer.current);\n setRevealing(false);\n };\n\n const diagnostics = useG9Diagnostics();\n const run = (effect: G9TabBarTransition['effect']) => {\n if (!effect) return;\n const item = (effect.isSubMenuItem ? subMenuItems : items)[effect.index] as G9TabBarItem;\n const context: G9TabBarClickContext = { index: effect.index, item, isSubMenuItem: effect.isSubMenuItem };\n try {\n item.onClick?.(context);\n if (item.command && item.canExecute !== false) item.command(item.commandParameter);\n props.onItemSelected?.(context);\n } catch (error) {\n diagnostics.log({ level: 'error', message: 'G9TabBar: item handler failed.', source: 'G9TabBar', error });\n }\n };\n const transition = (t: G9TabBarTransition) => {\n cancelReveal();\n apply(t.state);\n run(t.effect);\n };\n const onFab = () => {\n cancelReveal();\n const args: G9TabBarFabTappedEventArgs = { handled: false };\n const result = props.onFabTapped?.(args);\n if (args.handled || result === 'handled') return;\n transition(tabBarFabTap(state, config));\n };\n\n const open = isFabOpen || isOverflowOpen;\n useG9Back(\n () => {\n apply(tabBarBackdropTap(state, config));\n return true;\n },\n { enabled: open },\n );\n\n const rtl = useG9Direction() === 'rtl';\n const strings = useG9Strings();\n const palette = useG9Theme().palette;\n const win = useG9Window();\n const [measured, setMeasured] = useState(0);\n const width = measured > 0 ? measured : win.width;\n const barWidth = Math.max(width - M.barHorizontalGap * 2, 0);\n const slots = tabBarSlots(items.length);\n const slotCount = slots.length;\n const fab = resolveTabBarFabIndex(config.fabIndex, config.itemCount);\n const floating = isCenterFloating && fab >= 0;\n const fabCenterX = fab >= 0 ? tabBarFabCenterX(fab, slotCount, width, rtl, barStyle) : 0;\n const indicatorSlot = tabBarIndicatorSlot(state, config);\n const overflowLabel = props.overflowText || strings.resolve('More') || 'More';\n const overflowSelected = tabBarHasOverflow(items.length) && selectedIndex >= tabBarOverflowSlot;\n const reserved = tabBarReservedHeight(state, config);\n const bounce = easeOutBackCss(M.fabPopBackCoefficient);\n\n // SVG content cannot read CSS variables: the chrome takes literal palette colours.\n const chromeFill = sculpted ? palette.CardBackground : palette.SurfaceContainerHigh;\n const chromeStroke = palette.OutlineVariant;\n const pad = M.chromeShadowPadding;\n // Sculpted's chrome carries its shadow, so its SVG is `pad` larger on every side and sits `pad` up and left of the bar.\n const chromeBox = sculpted\n ? {\n left: `${-pad}px`,\n top: `${-pad}px`,\n width: `${barWidth + pad * 2}px`,\n height: `${metrics.barHeight + pad * 2}px`,\n }\n : { height: `${metrics.barHeight}px` };\n const fabShadow = tabBarFabShadowSvg(barStyle);\n const visualSlot = (slot: number) => (rtl ? slotCount - 1 - slot : slot);\n\n const slotViews = slots.map((slot, i) => {\n const isOverflow = slot.kind === 'overflow';\n const index = slot.kind === 'item' ? slot.index : -1;\n const item = isOverflow ? { text: overflowLabel, icon: 'menu' } : (items[index] as G9TabBarItem);\n const selected = isOverflow ? overflowSelected : index === selectedIndex;\n const hiddenUnderFab = index === fab && floating;\n const revealPose = revealing && selected && !hiddenUnderFab;\n return (\n <TabBarSlot\n key={isOverflow ? 'overflow' : `item-${index}`}\n item={item as G9TabBarItem}\n selected={selected}\n hidden={hiddenUnderFab}\n revealPose={revealPose}\n order={visualSlot(i)}\n metrics={metrics}\n onTap={() =>\n transition(isOverflow ? tabBarOverflowTriggerTap(state, config) : tabBarItemTap(state, config, index))\n }\n />\n );\n });\n\n const sub = subMenuRowLayout(subMenuItems.length, fabCenterX, width);\n const overflowIndices = tabBarOverflowIndices(items.length);\n const column = overflowColumnLayout(\n overflowIndices.length,\n tabBarSlotCenterX(tabBarOverflowSlot, slotCount, width, rtl, metrics.itemsHorizontalPadding),\n width,\n barStyle,\n );\n\n return (\n <view\n className={`g9-tab-bar${sculpted ? ' g9-tab-bar--sculpted' : ''} ${props.className ?? ''}`}\n style={{ height: `${reserved}px` }}\n bindlayoutchange={(e: { detail?: { width?: number } }) => {\n const w = Number(e.detail?.width);\n if (Number.isFinite(w) && w > 0 && w !== measured) setMeasured(w);\n }}\n >\n {open ? (\n <view\n className=\"g9-tab-bar__backdrop\"\n style={{ zIndex: M.backdropZIndex, top: `${M.backdropTopInset}px` }}\n bindtap={() => apply(tabBarBackdropTap(state, config))}\n />\n ) : null}\n <view className=\"g9-tab-bar__chrome\" style={{ zIndex: 2, height: `${metrics.barHeight}px` }}>\n <svg\n className=\"g9-tab-bar__chrome-flat\"\n content={tabBarChromeSvg(barWidth, metrics.barHeight, null, chromeFill, chromeStroke, barStyle)}\n style={{\n ...chromeBox,\n opacity: floating ? 0 : 1,\n transition: `opacity ${M.centerStateDurationMs}ms ease-out`,\n }}\n />\n {fab >= 0 ? (\n <svg\n className=\"g9-tab-bar__chrome-notched\"\n content={tabBarChromeSvg(\n barWidth,\n metrics.barHeight,\n fabCenterX - M.barHorizontalGap,\n chromeFill,\n chromeStroke,\n barStyle,\n )}\n style={{\n ...chromeBox,\n opacity: floating ? 1 : 0,\n transition: `opacity ${M.centerStateDurationMs}ms ease-out`,\n }}\n />\n ) : null}\n <view\n className=\"g9-tab-bar__slots\"\n style={\n metrics.itemsHorizontalPadding > 0\n ? { left: `${metrics.itemsHorizontalPadding}px`, right: `${metrics.itemsHorizontalPadding}px` }\n : {}\n }\n >\n {indicatorSlot >= 0 && metrics.showsSelectionIndicator ? (\n <view\n className=\"g9-tab-bar__indicator\"\n style={{\n left: `${((visualSlot(slots.findIndex((s) => (s.kind === 'item' ? s.index === indicatorSlot : indicatorSlot === tabBarOverflowSlot))) + 0.5) * 100) / slotCount}%`,\n transition: `left ${M.indicatorMoveDurationMs}ms cubic-bezier(0.215, 0.61, 0.355, 1)`,\n top: `${M.indicatorTopOffset + metrics.selectedItemNudgeY}px`,\n }}\n />\n ) : null}\n {slotViews}\n </view>\n </view>\n {fab >= 0 ? (\n <view\n className={`g9-tab-bar__fab${floating ? ' g9-tab-bar__fab--floating' : ''}`}\n accessibility-element\n accessibility-traits=\"button\"\n accessibility-label={(items[fab] as G9TabBarItem).text ?? ''}\n style={{\n zIndex: 3,\n width: `${metrics.fabSize}px`,\n height: `${metrics.fabSize}px`,\n borderRadius: `${metrics.fabSize / 2}px`,\n left: `${fabCenterX - metrics.fabSize / 2}px`,\n // The box rises fabProtrusionAboveBar above the bar's top edge (Classic: half of it; Sculpted: the disc's\n // centre sinks 9 px into the cradle).\n bottom: `${M.barBottomGap + metrics.barHeight - (metrics.fabSize - metrics.fabProtrusionAboveBar)}px`,\n opacity: floating ? 1 : 0,\n transform: floating\n ? 'translateY(0px) scale(1)'\n : `translateY(${M.fabIdleVerticalOffset}px) scale(${M.fabIdleScaleMin})`,\n transition: floating\n ? `transform ${M.centerStateBouncyDurationMs}ms ${bounce}, opacity ${M.centerStateDurationMs}ms ease-out`\n : `transform ${M.centerStateDurationMs}ms cubic-bezier(0.55, 0.055, 0.675, 0.19), opacity ${M.centerStateDurationMs}ms ease-in`,\n }}\n bindtap={floating ? onFab : undefined}\n >\n {fabShadow ? (\n <svg\n className=\"g9-tab-bar__fab-shadow\"\n content={fabShadow}\n style={{\n left: `${-pad}px`,\n top: `${-pad}px`,\n width: `${metrics.fabSize + pad * 2}px`,\n height: `${metrics.fabSize + pad * 2}px`,\n }}\n />\n ) : null}\n <view\n className=\"g9-tab-bar__fab-inner\"\n style={{\n width: `${metrics.fabInnerSize}px`,\n height: `${metrics.fabInnerSize}px`,\n borderRadius: `${metrics.fabInnerSize / 2}px`,\n }}\n >\n <view\n className=\"g9-tab-bar__fab-icon\"\n style={{\n transform: `rotate(${isFabOpen ? M.fabRotationOpenDegrees : 0}deg)`,\n transition: `transform ${M.openStateDurationMs}ms ease-out`,\n }}\n >\n {sculpted ? (\n <svg\n className=\"g9-tab-bar__fab-plus\"\n content={tabBarFabPlusSvg(\n metrics.fabIconSize,\n metrics.fabPlusArmRatio,\n metrics.fabPlusStrokeRatio,\n palette.OnPrimary,\n )}\n style={{ width: `${metrics.fabIconSize}px`, height: `${metrics.fabIconSize}px` }}\n />\n ) : (\n <G9Icon icon=\"plus\" size={M.fabIconSize * 0.7} color=\"var(--g9-on-primary)\" />\n )}\n </view>\n </view>\n </view>\n ) : null}\n {isFabOpen && subMenuItems.length > 0 ? (\n <view\n className=\"g9-tab-bar__submenu\"\n style={{\n zIndex: 3,\n left: `${sub.left}px`,\n height: `${M.subMenuRowCellHeight}px`,\n bottom: `${M.barBottomGap + metrics.barHeight + metrics.fabProtrusionAboveBar + M.subMenuRowAboveFabGap}px`,\n }}\n >\n {subMenuItems.map((item, i) => (\n <MenuCell\n key={`sub-${i}`}\n className=\"g9-tab-bar__submenu-cell\"\n item={item}\n size={M.subMenuRowItemSize}\n height={M.subMenuRowCellHeight}\n left={(sub.cells[i] as { x: number }).x}\n bottom={0}\n delayMs={(sub.cells[i] as { delayMs: number }).delayMs}\n durationMs={M.openStateDurationMs}\n travelX={M.subMenuRowRevealTravelX * (i < (subMenuItems.length - 1) / 2 ? 1 : -1)}\n travelY={M.subMenuRowRevealTravelY}\n iconSize={M.subMenuRowIconSizeMax}\n fontSize={M.subMenuRowFontSizeMax}\n selected={false}\n onAccent={sculpted}\n onTap={() => transition(tabBarSubMenuTap(state, config, i))}\n />\n ))}\n </view>\n ) : null}\n {isOverflowOpen && overflowIndices.length > 0 ? (\n <view className=\"g9-tab-bar__overflow\" style={{ zIndex: 3, left: `${column.left}px` }}>\n {overflowIndices.map((source, k) => (\n <MenuCell\n key={`overflow-${source}`}\n className=\"g9-tab-bar__overflow-item\"\n item={items[source] as G9TabBarItem}\n size={M.overflowItemSize}\n height={M.overflowItemSize}\n left={0}\n bottom={(column.items[k] as { bottom: number }).bottom}\n delayMs={(column.items[k] as { delayMs: number }).delayMs}\n durationMs={M.overflowStateDurationMs}\n travelX={0}\n travelY={M.overflowRevealTravelY}\n iconSize={M.overflowItemIconSize}\n fontSize={M.overflowItemFontSize}\n selected={source === selectedIndex}\n onAccent={false}\n onTap={() => transition(tabBarOverflowItemTap(state, config, source))}\n />\n ))}\n </view>\n ) : null}\n </view>\n );\n}\n\nfunction TabBarSlot(props: {\n readonly item: G9TabBarItem;\n readonly selected: boolean;\n readonly hidden: boolean;\n readonly revealPose: boolean;\n readonly order: number;\n readonly metrics: G9TabBarStyleMetrics;\n readonly onTap: () => void;\n}): ReactNode {\n const press = usePressVisual(PRESS, false);\n const { item, selected, hidden, revealPose, metrics } = props;\n // Classic: ink on the pill; Sculpted (no pill): the selection IS the primary colour and the filled icon.\n const sculpted = metrics.style === 'sculpted';\n const color = sculpted\n ? selected\n ? 'var(--g9-primary)'\n : 'var(--g9-text-secondary)'\n : selected\n ? 'var(--g9-on-primary-container)'\n : 'var(--g9-on-surface-variant)';\n const icon = sculpted && selected && item.selectedIcon !== undefined ? item.selectedIcon : (item.icon ?? 'check');\n const pose = hidden\n ? {\n opacity: 0,\n transform: `translateY(${M.centerItemHiddenTranslationY}px) scale(${1 - M.centerItemHiddenScaleAmount})`,\n transition: `opacity ${M.centerStateDurationMs}ms ease-out, transform ${M.centerStateDurationMs}ms ease-out`,\n }\n : revealPose\n ? {\n opacity: M.selectedReturnRevealStartOpacity,\n transform: `translateY(${M.selectedReturnRevealTranslationY}px) scale(${M.selectedReturnRevealStartScale})`,\n }\n : {\n opacity: 1,\n transform: `translateY(${M.selectedItemTranslationY}px) scale(1)`,\n transition: `opacity ${M.selectedReturnRevealDurationMs}ms ease-out, transform ${M.selectedReturnRevealDurationMs}ms ease-out`,\n };\n return (\n <view\n className={`g9-tab-bar__slot${selected ? ' g9-tab-bar__slot--selected' : ''}${hidden ? ' g9-tab-bar__slot--hidden' : ''}`}\n {...(item.automationId ? { id: item.automationId } : {})}\n style={{ order: props.order, minWidth: `${M.slotItemMinWidth}px`, maxWidth: `${M.slotItemMaxWidth}px` }}\n accessibility-element\n accessibility-traits=\"button\"\n accessibility-label={item.text ?? ''}\n bindtap={hidden ? undefined : props.onTap}\n {...press}\n >\n <view className=\"g9-tab-bar__slot-body\" style={{ ...pose, rowGap: `${metrics.bottomContentSpacing}px` }}>\n <G9Icon icon={icon} size={metrics.bottomIconSize} color={color} />\n <text\n className=\"g9-tab-bar__label\"\n text-maxline=\"1\"\n style={{ color, fontSize: `${metrics.bottomLabelFontSize}px`, fontWeight: selected ? '700' : '400' }}\n >\n {item.text ?? ''}\n </text>\n </view>\n </view>\n );\n}\n\nfunction MenuCell(props: {\n readonly className: string;\n readonly item: G9TabBarItem;\n readonly size: number;\n readonly height: number;\n readonly left: number;\n readonly bottom: number;\n readonly delayMs: number;\n readonly durationMs: number;\n readonly travelX: number;\n readonly travelY: number;\n readonly iconSize: number;\n readonly fontSize: number;\n readonly selected: boolean;\n /** The icon sits on a solid primary accent (Sculpted sub-menu cells): `OnPrimary`. */\n readonly onAccent: boolean;\n readonly onTap: () => void;\n}): ReactNode {\n const [shown, setShown] = useState(false);\n useEffect(() => {\n const t = startTimer(() => setShown(true), 16);\n return () => stopTimer(t);\n }, []);\n const press = usePressVisual(PRESS, false);\n const bounce = easeOutBackCss(M.fabPopBackCoefficient);\n const color = props.selected ? 'var(--g9-on-primary)' : 'var(--g9-on-surface)';\n const iconColor = props.onAccent ? 'var(--g9-on-primary)' : color;\n return (\n <view\n className={`${props.className}${props.selected ? ` ${props.className}--selected` : ''}`}\n {...(props.item.automationId ? { id: props.item.automationId } : {})}\n accessibility-element\n accessibility-traits=\"button\"\n accessibility-label={props.item.text ?? ''}\n style={{\n left: `${props.left}px`,\n bottom: `${props.bottom}px`,\n width: `${props.size}px`,\n height: `${props.height}px`,\n opacity: shown ? 1 : 0,\n transform: shown\n ? 'translate(0px, 0px) scale(1)'\n : `translate(${props.travelX}px, ${props.travelY}px) scale(${M.fabIdleScaleMin})`,\n transition: `opacity ${props.durationMs}ms ease-out ${props.delayMs}ms, transform ${props.durationMs}ms ${bounce} ${props.delayMs}ms`,\n }}\n bindtap={props.onTap}\n {...press}\n >\n <view className=\"g9-tab-bar__cell-accent\">\n <G9Icon icon={props.item.icon ?? 'check'} size={props.iconSize} color={iconColor} />\n </view>\n <text className=\"g9-tab-bar__cell-label\" text-maxline=\"1\" style={{ fontSize: `${props.fontSize}px`, color }}>\n {props.item.text ?? ''}\n </text>\n </view>\n );\n}\n"],"names":["PRESS","Object","M","G9TabBar","props","_props_subMenuItems","_props_fabIndex","_props_resetCenterOnMenuSelection","_props_defaultSelectedIndex","_props_className","_items_fab_text","items","subMenuItems","barStyle","metrics","g9TabBarStyleMetrics","sculpted","config","initial","useRef","initialTabBarState","selectedIndex","setSelectedIndex","useControllableState","isCenterFloating","setCenterFloating","isFabOpen","setFabOpen","isOverflowOpen","setOverflowOpen","state","apply","next","useEffect","reconcileTabBarState","revealing","setRevealing","useState","revealTimer","startTimer","stopTimer","cancelReveal","diagnostics","useG9Diagnostics","run","effect","item","context","error","transition","t","onFab","args","result","tabBarFabTap","open","useG9Back","tabBarBackdropTap","rtl","useG9Direction","strings","useG9Strings","palette","useG9Theme","win","useG9Window","measured","setMeasured","width","barWidth","Math","slots","tabBarSlots","slotCount","fab","resolveTabBarFabIndex","floating","fabCenterX","tabBarFabCenterX","indicatorSlot","tabBarIndicatorSlot","overflowLabel","overflowSelected","tabBarHasOverflow","tabBarOverflowSlot","reserved","tabBarReservedHeight","bounce","easeOutBackCss","chromeFill","chromeStroke","pad","chromeBox","fabShadow","tabBarFabShadowSvg","visualSlot","slot","slotViews","i","isOverflow","index","selected","hiddenUnderFab","revealPose","TabBarSlot","tabBarOverflowTriggerTap","tabBarItemTap","sub","subMenuRowLayout","overflowIndices","tabBarOverflowIndices","column","overflowColumnLayout","tabBarSlotCenterX","view","e","_e_detail","w","Number","svg","tabBarChromeSvg","s","undefined","tabBarFabPlusSvg","G9Icon","MenuCell","tabBarSubMenuTap","source","k","tabBarOverflowItemTap","_item_icon","_item_text","_item_text1","press","usePressVisual","hidden","color","icon","pose","text","_props_item_text","_props_item_icon","_props_item_text1","shown","setShown","iconColor"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { effectiveTabIndex, type G9TabBarPosition, type G9TabItem, type G9TabMode, G9TabRealizer, type G9TabStyle, g9TabViewMetrics, tabBadge, tabContentSlideFrom, tabKey, tabVisualOrder, thicknessCss, } from './model.js';
2
+ export { G9TabView, type G9TabViewProps } from './tab-view.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,aAAa,EACb,KAAK,UAAU,EACf,gBAAgB,EAChB,QAAQ,EACR,mBAAmB,EACnB,MAAM,EACN,cAAc,EACd,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { G9TabRealizer, effectiveTabIndex, g9TabViewMetrics, tabBadge, tabContentSlideFrom, tabKey, tabVisualOrder, thicknessCss } from "./model.jsx";
2
+ export { G9TabView } from "./tab-view.jsx";
@@ -0,0 +1,83 @@
1
+ import { type G9ImageSource, type G9NumberingSystem } from '@g9tm/lynxcontrols-foundation';
2
+ import type { ReactNode } from '@lynx-js/react';
3
+ import type { G9IconInput } from '../icon/icon.js';
4
+ /** Visual treatment of the bar (MAUI `G9TabStyle`). */
5
+ export type G9TabStyle = 'underlined' | 'pill';
6
+ /** Cell sizing (MAUI `G9TabMode`): equal full-width cells, or auto-width cells in a horizontal scroller. */
7
+ export type G9TabMode = 'fixed' | 'scrollable';
8
+ /** Where the bar sits relative to the content (MAUI `G9TabBarPosition`). */
9
+ export type G9TabBarPosition = 'top' | 'bottom';
10
+ /**
11
+ * One tab (MAUI `G9TabItem`). A plain descriptor: change a field and re-render, and only that cell updates (MAUI
12
+ * `VisualChanged` + in-place `UpdateCellContent`). Icon slot precedence as everywhere: emoji → icon → image path →
13
+ * image source.
14
+ */
15
+ export interface G9TabItem {
16
+ /** Stable identity; keeps a realized body (and its state) with its tab across reorders. Default: the index. */
17
+ readonly key?: string;
18
+ readonly text?: string | null;
19
+ readonly emoji?: string | null;
20
+ readonly icon?: G9IconInput;
21
+ readonly imagePath?: string | null;
22
+ readonly image?: G9ImageSource | null;
23
+ /** Inline pill badge with the formatted count; 0 = none. */
24
+ readonly badgeCount?: number;
25
+ /** Inline pill badge with custom text; wins over `badgeCount`. */
26
+ readonly badgeText?: string | null;
27
+ /** A 7×7 dot instead of a pill. */
28
+ readonly badgeDot?: boolean;
29
+ /** Badge fill. Default `var(--g9-error)`. */
30
+ readonly badgeColor?: string | null;
31
+ /** The body shown while this tab is active (MAUI `TabContent`); a function is called when the tab realizes. */
32
+ readonly content?: ReactNode | (() => ReactNode);
33
+ }
34
+ /** Tab view metrics (MAUI `G9Metrics` tab constants and `G9TabView` private constants). */
35
+ export declare const g9TabViewMetrics: Readonly<{
36
+ tabHeight: 52;
37
+ barInnerPadding: 4;
38
+ barRadius: 26;
39
+ pillVerticalInset: 2;
40
+ pillRadius: 18;
41
+ barToContentGap: 8;
42
+ underlineThickness: 2.5;
43
+ edgeLineThickness: 1;
44
+ separatorVerticalInset: 12;
45
+ indicatorMoveMs: 240;
46
+ contentTransitionMs: 160;
47
+ contentSlidePx: 6;
48
+ lazyRealizeDelayMs: 240;
49
+ contentPadding: readonly [10, 10, 10, 0];
50
+ }>;
51
+ /** The index actually shown: the selection clamped into the items (MAUI `EffectiveIndex`); -1 with no items. */
52
+ export declare function effectiveTabIndex(selectedIndex: number, count: number): number;
53
+ /** The identity of a tab: its `key`, else its index. */
54
+ export declare function tabKey(item: G9TabItem, index: number): string;
55
+ /** The inline badge of a tab: `null`, `'dot'`, or the pill text (custom text wins; counts are `N0`-grouped). */
56
+ export declare function tabBadge(item: G9TabItem, numberingSystem: G9NumberingSystem): 'dot' | string | null;
57
+ /** Visual (left-to-right) order of the cells: reversed in RTL so the first tab sits at the reading start. */
58
+ export declare function tabVisualOrder(count: number, rtl: boolean): number[];
59
+ /** Content slide start offset: forward arrives from the trailing edge, back from the leading edge; RTL mirrors. */
60
+ export declare function tabContentSlideFrom(previous: number, next: number, rtl: boolean): number;
61
+ /** CSS padding from a MAUI-style thickness: one value, `[h, v]` or `[l, t, r, b]`. */
62
+ export declare function thicknessCss(value: number | readonly number[]): string;
63
+ /**
64
+ * Lazy-once realization (MAUI "Lazy tab-body rendering"): a body is built on its first activation, after
65
+ * `lazyRealizeDelayMs` (a spinner meanwhile), and then stays built, hidden while inactive, so its state survives. A
66
+ * pending token makes rapid switches realize only the latest selection. `eager` builds everything up front.
67
+ */
68
+ export declare class G9TabRealizer {
69
+ private readonly eager;
70
+ private readonly realized;
71
+ private pending;
72
+ private generation;
73
+ constructor(eager: () => boolean);
74
+ isRealized(key: string): boolean;
75
+ /** Marks `key` active: returns `'shown'` when it is already built, else a token to pass to {@link realize}. */
76
+ activate(key: string): 'shown' | number;
77
+ /** Realizes the pending key when `token` is still the latest activation; returns whether it did. */
78
+ realize(token: number): boolean;
79
+ /** Drops keys that are no longer in the items (a removed tab's body is released). */
80
+ retain(keys: readonly string[]): void;
81
+ get pendingKey(): string | null;
82
+ }
83
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/tabs/model.ts"],"names":[],"mappings":"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"}