@hzblj/kara-components 0.20.1 → 0.21.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 (480) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/lib/module/atoms/activity-indicator/activity-indicator.android.js +1 -1
  3. package/lib/module/atoms/activity-indicator/activity-indicator.android.js.map +1 -1
  4. package/lib/module/atoms/activity-indicator/activity-indicator.ios.js +1 -1
  5. package/lib/module/atoms/activity-indicator/activity-indicator.ios.js.map +1 -1
  6. package/lib/module/atoms/badge/badge.android.js +1 -1
  7. package/lib/module/atoms/badge/badge.android.js.map +1 -1
  8. package/lib/module/atoms/badge/badge.ios.js +1 -1
  9. package/lib/module/atoms/badge/badge.ios.js.map +1 -1
  10. package/lib/module/atoms/blur-view/blur-view.android.js +22 -1
  11. package/lib/module/atoms/blur-view/blur-view.android.js.map +1 -1
  12. package/lib/module/atoms/blur-view/blur-view.ios.js +20 -0
  13. package/lib/module/atoms/blur-view/blur-view.ios.js.map +1 -1
  14. package/lib/module/atoms/button/button.android.js +1 -1
  15. package/lib/module/atoms/button/button.android.js.map +1 -1
  16. package/lib/module/atoms/button/button.ios.js +1 -1
  17. package/lib/module/atoms/button/button.ios.js.map +1 -1
  18. package/lib/module/atoms/card/card.android.js +1 -1
  19. package/lib/module/atoms/card/card.android.js.map +1 -1
  20. package/lib/module/atoms/card/card.ios.js +1 -1
  21. package/lib/module/atoms/card/card.ios.js.map +1 -1
  22. package/lib/module/atoms/checkbox/checkbox.android.js +1 -1
  23. package/lib/module/atoms/checkbox/checkbox.android.js.map +1 -1
  24. package/lib/module/atoms/checkbox/checkbox.ios.js +1 -1
  25. package/lib/module/atoms/checkbox/checkbox.ios.js.map +1 -1
  26. package/lib/module/atoms/color-picker/color-picker.android.js +1 -1
  27. package/lib/module/atoms/color-picker/color-picker.android.js.map +1 -1
  28. package/lib/module/atoms/color-picker/color-picker.ios.js +1 -1
  29. package/lib/module/atoms/color-picker/color-picker.ios.js.map +1 -1
  30. package/lib/module/atoms/date-picker/date-picker.android.js +1 -1
  31. package/lib/module/atoms/date-picker/date-picker.android.js.map +1 -1
  32. package/lib/module/atoms/date-picker/date-picker.ios.js +1 -1
  33. package/lib/module/atoms/date-picker/date-picker.ios.js.map +1 -1
  34. package/lib/module/atoms/divider/divider.android.js +1 -1
  35. package/lib/module/atoms/divider/divider.android.js.map +1 -1
  36. package/lib/module/atoms/divider/divider.ios.js +1 -1
  37. package/lib/module/atoms/divider/divider.ios.js.map +1 -1
  38. package/lib/module/atoms/fab/fab.android.js +1 -1
  39. package/lib/module/atoms/fab/fab.android.js.map +1 -1
  40. package/lib/module/atoms/fab/fab.ios.js +1 -1
  41. package/lib/module/atoms/fab/fab.ios.js.map +1 -1
  42. package/lib/module/atoms/glyph/glyph-button.android.js.map +1 -0
  43. package/lib/module/atoms/glyph/glyph-button.ios.js.map +1 -0
  44. package/lib/module/atoms/glyph/glyph-button.types.js.map +1 -0
  45. package/lib/module/atoms/glyph/glyph.android.js.map +1 -0
  46. package/lib/module/atoms/glyph/glyph.ios.js.map +1 -0
  47. package/lib/module/atoms/glyph/glyph.types.js.map +1 -0
  48. package/lib/module/atoms/glyph/index.js.map +1 -0
  49. package/lib/module/atoms/glyph/rn-glyph.android.js.map +1 -0
  50. package/lib/module/atoms/glyph/rn-glyph.ios.js.map +1 -0
  51. package/lib/module/atoms/h-stack/h-stack.android.js +2 -2
  52. package/lib/module/atoms/h-stack/h-stack.android.js.map +1 -1
  53. package/lib/module/atoms/h-stack/h-stack.ios.js +2 -2
  54. package/lib/module/atoms/h-stack/h-stack.ios.js.map +1 -1
  55. package/lib/module/atoms/icon/icon.android.js +1 -1
  56. package/lib/module/atoms/icon/icon.android.js.map +1 -1
  57. package/lib/module/atoms/icon/icon.ios.js +1 -1
  58. package/lib/module/atoms/icon/icon.ios.js.map +1 -1
  59. package/lib/module/atoms/icon-button/icon-button.android.js +1 -1
  60. package/lib/module/atoms/icon-button/icon-button.android.js.map +1 -1
  61. package/lib/module/atoms/icon-button/icon-button.ios.js +1 -1
  62. package/lib/module/atoms/icon-button/icon-button.ios.js.map +1 -1
  63. package/lib/module/atoms/island/island.android.js +3 -1
  64. package/lib/module/atoms/island/island.android.js.map +1 -1
  65. package/lib/module/atoms/island/island.ios.js +3 -1
  66. package/lib/module/atoms/island/island.ios.js.map +1 -1
  67. package/lib/module/atoms/list/list.android.js +2 -2
  68. package/lib/module/atoms/list/list.android.js.map +1 -1
  69. package/lib/module/atoms/list/list.ios.js +1 -1
  70. package/lib/module/atoms/list/list.ios.js.map +1 -1
  71. package/lib/module/atoms/picker/picker.android.js +2 -2
  72. package/lib/module/atoms/picker/picker.android.js.map +1 -1
  73. package/lib/module/atoms/picker/picker.ios.js +1 -1
  74. package/lib/module/atoms/picker/picker.ios.js.map +1 -1
  75. package/lib/module/atoms/pressable/pressable.js +1 -1
  76. package/lib/module/atoms/pressable/pressable.js.map +1 -1
  77. package/lib/module/atoms/progress/progress.android.js +1 -1
  78. package/lib/module/atoms/progress/progress.android.js.map +1 -1
  79. package/lib/module/atoms/progress/progress.ios.js +1 -1
  80. package/lib/module/atoms/progress/progress.ios.js.map +1 -1
  81. package/lib/module/atoms/scroll-view/scroll-view.android.js +2 -2
  82. package/lib/module/atoms/scroll-view/scroll-view.android.js.map +1 -1
  83. package/lib/module/atoms/scroll-view/scroll-view.ios.js +1 -1
  84. package/lib/module/atoms/scroll-view/scroll-view.ios.js.map +1 -1
  85. package/lib/module/atoms/segmented-control/segmented-control.android.js +1 -1
  86. package/lib/module/atoms/segmented-control/segmented-control.android.js.map +1 -1
  87. package/lib/module/atoms/segmented-control/segmented-control.ios.js +1 -1
  88. package/lib/module/atoms/segmented-control/segmented-control.ios.js.map +1 -1
  89. package/lib/module/atoms/slider/slider.android.js +1 -1
  90. package/lib/module/atoms/slider/slider.android.js.map +1 -1
  91. package/lib/module/atoms/slider/slider.ios.js +1 -1
  92. package/lib/module/atoms/slider/slider.ios.js.map +1 -1
  93. package/lib/module/atoms/spacer/spacer.android.js +1 -1
  94. package/lib/module/atoms/spacer/spacer.android.js.map +1 -1
  95. package/lib/module/atoms/spacer/spacer.ios.js +1 -1
  96. package/lib/module/atoms/spacer/spacer.ios.js.map +1 -1
  97. package/lib/module/atoms/surface/surface.android.js +1 -1
  98. package/lib/module/atoms/surface/surface.android.js.map +1 -1
  99. package/lib/module/atoms/surface/surface.ios.js +1 -1
  100. package/lib/module/atoms/surface/surface.ios.js.map +1 -1
  101. package/lib/module/atoms/switch/switch.android.js +1 -1
  102. package/lib/module/atoms/switch/switch.android.js.map +1 -1
  103. package/lib/module/atoms/switch/switch.ios.js +1 -1
  104. package/lib/module/atoms/switch/switch.ios.js.map +1 -1
  105. package/lib/module/atoms/text/text.android.js +1 -1
  106. package/lib/module/atoms/text/text.android.js.map +1 -1
  107. package/lib/module/atoms/text/text.ios.js +1 -1
  108. package/lib/module/atoms/text/text.ios.js.map +1 -1
  109. package/lib/module/atoms/text-field/text-field.android.js +2 -2
  110. package/lib/module/atoms/text-field/text-field.android.js.map +1 -1
  111. package/lib/module/atoms/text-field/text-field.ios.js +1 -1
  112. package/lib/module/atoms/text-field/text-field.ios.js.map +1 -1
  113. package/lib/module/atoms/v-stack/v-stack.android.js +2 -2
  114. package/lib/module/atoms/v-stack/v-stack.android.js.map +1 -1
  115. package/lib/module/atoms/v-stack/v-stack.ios.js +2 -2
  116. package/lib/module/atoms/v-stack/v-stack.ios.js.map +1 -1
  117. package/lib/module/atoms/z-stack/z-stack.android.js +2 -2
  118. package/lib/module/atoms/z-stack/z-stack.android.js.map +1 -1
  119. package/lib/module/atoms/z-stack/z-stack.ios.js +2 -2
  120. package/lib/module/atoms/z-stack/z-stack.ios.js.map +1 -1
  121. package/lib/module/hooks/host-context.js.map +1 -0
  122. package/lib/module/hooks/use-refresh-state.js.map +1 -0
  123. package/lib/module/hooks/use-stack-modifiers.js.map +1 -0
  124. package/lib/module/molecules/collapsible/collapsible.android.js +2 -2
  125. package/lib/module/molecules/collapsible/collapsible.android.js.map +1 -1
  126. package/lib/module/molecules/collapsible/collapsible.ios.js +1 -1
  127. package/lib/module/molecules/collapsible/collapsible.ios.js.map +1 -1
  128. package/lib/module/molecules/labeled-content/labeled-content.js +1 -1
  129. package/lib/module/molecules/labeled-content/labeled-content.js.map +1 -1
  130. package/lib/module/molecules/list-item/list-item.js +1 -1
  131. package/lib/module/molecules/list-item/list-item.js.map +1 -1
  132. package/lib/module/molecules/navigation-bar/navigation-bar.constants.js +5 -0
  133. package/lib/module/molecules/navigation-bar/navigation-bar.constants.js.map +1 -0
  134. package/lib/module/molecules/navigation-bar/navigation-bar.ios.js +31 -4
  135. package/lib/module/molecules/navigation-bar/navigation-bar.ios.js.map +1 -1
  136. package/lib/module/molecules/pager/pager.android.js +1 -1
  137. package/lib/module/molecules/pager/pager.android.js.map +1 -1
  138. package/lib/module/molecules/pager/pager.ios.js +1 -1
  139. package/lib/module/molecules/pager/pager.ios.js.map +1 -1
  140. package/lib/module/molecules/radio-group/radio-group.android.js +1 -1
  141. package/lib/module/molecules/radio-group/radio-group.android.js.map +1 -1
  142. package/lib/module/molecules/radio-group/radio-group.ios.js +2 -2
  143. package/lib/module/molecules/radio-group/radio-group.ios.js.map +1 -1
  144. package/lib/module/molecules/rn-list-item/rn-list-item.js +1 -1
  145. package/lib/module/molecules/rn-list-item/rn-list-item.js.map +1 -1
  146. package/lib/module/molecules/rn-tooltip/rn-tooltip.android.js +1 -1
  147. package/lib/module/molecules/rn-tooltip/rn-tooltip.android.js.map +1 -1
  148. package/lib/module/molecules/search-bar/search-bar.js +1 -1
  149. package/lib/module/molecules/search-bar/search-bar.js.map +1 -1
  150. package/lib/module/molecules/stepper/stepper.android.js +2 -2
  151. package/lib/module/molecules/stepper/stepper.android.js.map +1 -1
  152. package/lib/module/molecules/stepper/stepper.ios.js +1 -1
  153. package/lib/module/molecules/stepper/stepper.ios.js.map +1 -1
  154. package/lib/module/molecules/tooltip/tooltip.android.js +1 -1
  155. package/lib/module/molecules/tooltip/tooltip.android.js.map +1 -1
  156. package/lib/module/molecules/tooltip/tooltip.ios.js +1 -1
  157. package/lib/module/molecules/tooltip/tooltip.ios.js.map +1 -1
  158. package/lib/module/organisms/action-sheet/action-sheet.android.js +1 -1
  159. package/lib/module/organisms/action-sheet/action-sheet.android.js.map +1 -1
  160. package/lib/module/organisms/action-sheet/action-sheet.ios.js +1 -1
  161. package/lib/module/organisms/action-sheet/action-sheet.ios.js.map +1 -1
  162. package/lib/module/organisms/alert/alert.android.js +1 -1
  163. package/lib/module/organisms/alert/alert.android.js.map +1 -1
  164. package/lib/module/organisms/alert/alert.ios.js +1 -1
  165. package/lib/module/organisms/alert/alert.ios.js.map +1 -1
  166. package/lib/module/organisms/context-menu/context-menu.android.js +2 -2
  167. package/lib/module/organisms/context-menu/context-menu.android.js.map +1 -1
  168. package/lib/module/organisms/fab-menu/fab-menu.android.js +2 -2
  169. package/lib/module/organisms/fab-menu/fab-menu.android.js.map +1 -1
  170. package/lib/module/organisms/fab-menu/fab-menu.ios.js +2 -2
  171. package/lib/module/organisms/fab-menu/fab-menu.ios.js.map +1 -1
  172. package/lib/module/organisms/form/form.android.js +1 -1
  173. package/lib/module/organisms/form/form.android.js.map +1 -1
  174. package/lib/module/organisms/form/form.ios.js +1 -1
  175. package/lib/module/organisms/form/form.ios.js.map +1 -1
  176. package/lib/module/organisms/header/header-color.js +8 -0
  177. package/lib/module/organisms/header/header-color.js.map +1 -0
  178. package/lib/module/organisms/header/header-inset.android.js +6 -0
  179. package/lib/module/organisms/header/header-inset.android.js.map +1 -0
  180. package/lib/module/organisms/header/header-inset.ios.js +19 -0
  181. package/lib/module/organisms/header/header-inset.ios.js.map +1 -0
  182. package/lib/module/organisms/header/header-options.android.js +180 -0
  183. package/lib/module/organisms/header/header-options.android.js.map +1 -0
  184. package/lib/module/organisms/header/header-options.ios.js +145 -0
  185. package/lib/module/organisms/header/header-options.ios.js.map +1 -0
  186. package/lib/module/organisms/header/header-options.types.js +4 -0
  187. package/lib/module/organisms/header/header-options.types.js.map +1 -0
  188. package/lib/module/organisms/header/header-search-accessory.android.js +5 -0
  189. package/lib/module/organisms/header/header-search-accessory.android.js.map +1 -0
  190. package/lib/module/organisms/header/header-search-accessory.ios.js +35 -0
  191. package/lib/module/organisms/header/header-search-accessory.ios.js.map +1 -0
  192. package/lib/module/organisms/header/header-search-accessory.types.js +4 -0
  193. package/lib/module/organisms/header/header-search-accessory.types.js.map +1 -0
  194. package/lib/module/organisms/header/header-search-input.android.js +80 -0
  195. package/lib/module/organisms/header/header-search-input.android.js.map +1 -0
  196. package/lib/module/organisms/header/header-search-input.ios.js +8 -0
  197. package/lib/module/organisms/header/header-search-input.ios.js.map +1 -0
  198. package/lib/module/organisms/header/header-search-input.types.js +4 -0
  199. package/lib/module/organisms/header/header-search-input.types.js.map +1 -0
  200. package/lib/module/organisms/header/header-search-scrim.js +62 -0
  201. package/lib/module/organisms/header/header-search-scrim.js.map +1 -0
  202. package/lib/module/organisms/header/header-title.js +230 -0
  203. package/lib/module/organisms/header/header-title.js.map +1 -0
  204. package/lib/module/organisms/header/header.types.js +4 -0
  205. package/lib/module/organisms/header/header.types.js.map +1 -0
  206. package/lib/module/organisms/header/hero-header-background.android.js +33 -0
  207. package/lib/module/organisms/header/hero-header-background.android.js.map +1 -0
  208. package/lib/module/organisms/header/hero-header-background.ios.js +40 -0
  209. package/lib/module/organisms/header/hero-header-background.ios.js.map +1 -0
  210. package/lib/module/organisms/header/hero-header-background.types.js +4 -0
  211. package/lib/module/organisms/header/hero-header-background.types.js.map +1 -0
  212. package/lib/module/organisms/header/index.js +13 -0
  213. package/lib/module/organisms/header/index.js.map +1 -0
  214. package/lib/module/organisms/header/native-subtitle.android.js +5 -0
  215. package/lib/module/organisms/header/native-subtitle.android.js.map +1 -0
  216. package/lib/module/organisms/header/native-subtitle.ios.js +22 -0
  217. package/lib/module/organisms/header/native-subtitle.ios.js.map +1 -0
  218. package/lib/module/organisms/header/native-subtitle.types.js +4 -0
  219. package/lib/module/organisms/header/native-subtitle.types.js.map +1 -0
  220. package/lib/module/organisms/header/sheet-grabber.android.js +5 -0
  221. package/lib/module/organisms/header/sheet-grabber.android.js.map +1 -0
  222. package/lib/module/organisms/header/sheet-grabber.ios.js +15 -0
  223. package/lib/module/organisms/header/sheet-grabber.ios.js.map +1 -0
  224. package/lib/module/organisms/header/sheet-grabber.types.js +4 -0
  225. package/lib/module/organisms/header/sheet-grabber.types.js.map +1 -0
  226. package/lib/module/organisms/header/use-header-bar-inset.android.js +4 -0
  227. package/lib/module/organisms/header/use-header-bar-inset.android.js.map +1 -0
  228. package/lib/module/organisms/header/use-header-bar-inset.ios.js +9 -0
  229. package/lib/module/organisms/header/use-header-bar-inset.ios.js.map +1 -0
  230. package/lib/module/organisms/header/use-header-bar-inset.types.js +2 -0
  231. package/lib/module/organisms/header/use-header-bar-inset.types.js.map +1 -0
  232. package/lib/module/organisms/header/use-header-scroll-to-top.js +51 -0
  233. package/lib/module/organisms/header/use-header-scroll-to-top.js.map +1 -0
  234. package/lib/module/organisms/header/use-header-search.js +135 -0
  235. package/lib/module/organisms/header/use-header-search.js.map +1 -0
  236. package/lib/module/organisms/header/use-header.js +74 -0
  237. package/lib/module/organisms/header/use-header.js.map +1 -0
  238. package/lib/module/organisms/header/use-hero-header.js +189 -0
  239. package/lib/module/organisms/header/use-hero-header.js.map +1 -0
  240. package/lib/module/organisms/header/use-stack-screen-options.js +77 -0
  241. package/lib/module/organisms/header/use-stack-screen-options.js.map +1 -0
  242. package/lib/module/organisms/menu/menu.android.js +2 -2
  243. package/lib/module/organisms/menu/menu.android.js.map +1 -1
  244. package/lib/module/organisms/menu/menu.ios.js +1 -1
  245. package/lib/module/organisms/menu/menu.ios.js.map +1 -1
  246. package/lib/module/organisms/sheet/use-sheet-header.js +3 -1
  247. package/lib/module/organisms/sheet/use-sheet-header.js.map +1 -1
  248. package/lib/module/organisms/snackbar/snackbar.js +1 -1
  249. package/lib/module/organisms/snackbar/snackbar.js.map +1 -1
  250. package/lib/module/organisms/swipe-actions/swipe-actions.android.js +1 -1
  251. package/lib/module/organisms/swipe-actions/swipe-actions.android.js.map +1 -1
  252. package/lib/module/organisms/swipe-actions/swipe-actions.ios.js +1 -1
  253. package/lib/module/organisms/swipe-actions/swipe-actions.ios.js.map +1 -1
  254. package/lib/module/templates/screen/screen.android.js +3 -3
  255. package/lib/module/templates/screen/screen.android.js.map +1 -1
  256. package/lib/module/templates/screen/screen.ios.js +3 -3
  257. package/lib/module/templates/screen/screen.ios.js.map +1 -1
  258. package/lib/module/utils/ripple-clip.js.map +1 -0
  259. package/lib/module/utils/tap-modifiers.js.map +1 -0
  260. package/lib/typescript/atoms/blur-view/blur-view.types.d.ts +8 -0
  261. package/lib/typescript/atoms/island/island.types.d.ts +17 -0
  262. package/lib/typescript/molecules/navigation-bar/navigation-bar.constants.d.ts +2 -0
  263. package/lib/typescript/molecules/navigation-bar/navigation-bar.types.d.ts +67 -4
  264. package/lib/typescript/organisms/header/header-color.d.ts +6 -0
  265. package/lib/typescript/organisms/header/header-inset.d.ts +1 -0
  266. package/lib/typescript/organisms/header/header-inset.ios.d.ts +2 -0
  267. package/lib/typescript/organisms/header/header-options.d.ts +1 -0
  268. package/lib/typescript/organisms/header/header-options.ios.d.ts +2 -0
  269. package/lib/typescript/organisms/header/header-options.types.d.ts +4 -0
  270. package/lib/typescript/organisms/header/header-search-accessory.d.ts +1 -0
  271. package/lib/typescript/organisms/header/header-search-accessory.ios.d.ts +6 -0
  272. package/lib/typescript/organisms/header/header-search-accessory.types.d.ts +9 -0
  273. package/lib/typescript/organisms/header/header-search-input.d.ts +1 -0
  274. package/lib/typescript/organisms/header/header-search-input.ios.d.ts +5 -0
  275. package/lib/typescript/organisms/header/header-search-input.types.d.ts +17 -0
  276. package/lib/typescript/organisms/header/header-search-scrim.d.ts +11 -0
  277. package/lib/typescript/organisms/header/header-title.d.ts +22 -0
  278. package/lib/typescript/organisms/header/header.types.d.ts +440 -0
  279. package/lib/typescript/organisms/header/hero-header-background.d.ts +1 -0
  280. package/lib/typescript/organisms/header/hero-header-background.ios.d.ts +7 -0
  281. package/lib/typescript/organisms/header/hero-header-background.types.d.ts +9 -0
  282. package/lib/typescript/organisms/header/index.d.ts +11 -0
  283. package/lib/typescript/organisms/header/native-subtitle.d.ts +1 -0
  284. package/lib/typescript/organisms/header/native-subtitle.ios.d.ts +4 -0
  285. package/lib/typescript/organisms/header/native-subtitle.types.d.ts +6 -0
  286. package/lib/typescript/organisms/header/sheet-grabber.d.ts +1 -0
  287. package/lib/typescript/organisms/header/sheet-grabber.ios.d.ts +7 -0
  288. package/lib/typescript/organisms/header/sheet-grabber.types.d.ts +6 -0
  289. package/lib/typescript/organisms/header/use-header-bar-inset.d.ts +1 -0
  290. package/lib/typescript/organisms/header/use-header-bar-inset.ios.d.ts +1 -0
  291. package/lib/typescript/organisms/header/use-header-bar-inset.types.d.ts +6 -0
  292. package/lib/typescript/organisms/header/use-header-scroll-to-top.d.ts +8 -0
  293. package/lib/typescript/organisms/header/use-header-search.d.ts +12 -0
  294. package/lib/typescript/organisms/header/use-header.d.ts +14 -0
  295. package/lib/typescript/organisms/header/use-hero-header.d.ts +10 -0
  296. package/lib/typescript/organisms/header/use-stack-screen-options.d.ts +17 -0
  297. package/lib/typescript/templates/screen/screen.types.d.ts +6 -2
  298. package/package.json +24 -5
  299. package/src/atoms/activity-indicator/activity-indicator.android.tsx +1 -1
  300. package/src/atoms/activity-indicator/activity-indicator.ios.tsx +1 -1
  301. package/src/atoms/badge/badge.android.tsx +1 -1
  302. package/src/atoms/badge/badge.ios.tsx +1 -1
  303. package/src/atoms/blur-view/blur-view.android.tsx +28 -1
  304. package/src/atoms/blur-view/blur-view.ios.tsx +25 -0
  305. package/src/atoms/blur-view/blur-view.types.ts +8 -0
  306. package/src/atoms/button/button.android.tsx +1 -1
  307. package/src/atoms/button/button.ios.tsx +1 -1
  308. package/src/atoms/card/card.android.tsx +1 -1
  309. package/src/atoms/card/card.ios.tsx +1 -1
  310. package/src/atoms/checkbox/checkbox.android.tsx +1 -1
  311. package/src/atoms/checkbox/checkbox.ios.tsx +1 -1
  312. package/src/atoms/color-picker/color-picker.android.tsx +1 -1
  313. package/src/atoms/color-picker/color-picker.ios.tsx +1 -1
  314. package/src/atoms/date-picker/date-picker.android.tsx +1 -1
  315. package/src/atoms/date-picker/date-picker.ios.tsx +1 -1
  316. package/src/atoms/divider/divider.android.tsx +1 -1
  317. package/src/atoms/divider/divider.ios.tsx +1 -1
  318. package/src/atoms/fab/fab.android.tsx +1 -1
  319. package/src/atoms/fab/fab.ios.tsx +1 -1
  320. package/src/atoms/h-stack/h-stack.android.tsx +2 -2
  321. package/src/atoms/h-stack/h-stack.ios.tsx +2 -2
  322. package/src/atoms/icon/icon.android.tsx +1 -1
  323. package/src/atoms/icon/icon.ios.tsx +1 -1
  324. package/src/atoms/icon-button/icon-button.android.tsx +1 -1
  325. package/src/atoms/icon-button/icon-button.ios.tsx +1 -1
  326. package/src/atoms/island/island.android.tsx +3 -1
  327. package/src/atoms/island/island.ios.tsx +10 -2
  328. package/src/atoms/island/island.types.ts +18 -0
  329. package/src/atoms/list/list.android.tsx +2 -2
  330. package/src/atoms/list/list.ios.tsx +1 -1
  331. package/src/atoms/picker/picker.android.tsx +2 -3
  332. package/src/atoms/picker/picker.ios.tsx +1 -1
  333. package/src/atoms/pressable/pressable.tsx +1 -1
  334. package/src/atoms/progress/progress.android.tsx +1 -1
  335. package/src/atoms/progress/progress.ios.tsx +1 -1
  336. package/src/atoms/scroll-view/scroll-view.android.tsx +2 -2
  337. package/src/atoms/scroll-view/scroll-view.ios.tsx +1 -1
  338. package/src/atoms/segmented-control/segmented-control.android.tsx +1 -1
  339. package/src/atoms/segmented-control/segmented-control.ios.tsx +1 -1
  340. package/src/atoms/slider/slider.android.tsx +1 -1
  341. package/src/atoms/slider/slider.ios.tsx +1 -1
  342. package/src/atoms/spacer/spacer.android.tsx +1 -1
  343. package/src/atoms/spacer/spacer.ios.tsx +1 -1
  344. package/src/atoms/surface/surface.android.tsx +1 -1
  345. package/src/atoms/surface/surface.ios.tsx +1 -1
  346. package/src/atoms/switch/switch.android.tsx +1 -1
  347. package/src/atoms/switch/switch.ios.tsx +1 -1
  348. package/src/atoms/text/text.android.tsx +1 -1
  349. package/src/atoms/text/text.ios.tsx +1 -1
  350. package/src/atoms/text-field/text-field.android.tsx +2 -2
  351. package/src/atoms/text-field/text-field.ios.tsx +1 -1
  352. package/src/atoms/v-stack/v-stack.android.tsx +2 -2
  353. package/src/atoms/v-stack/v-stack.ios.tsx +2 -2
  354. package/src/atoms/z-stack/z-stack.android.tsx +2 -2
  355. package/src/atoms/z-stack/z-stack.ios.tsx +2 -2
  356. package/src/molecules/collapsible/collapsible.android.tsx +2 -2
  357. package/src/molecules/collapsible/collapsible.ios.tsx +1 -1
  358. package/src/molecules/labeled-content/labeled-content.tsx +1 -1
  359. package/src/molecules/list-item/list-item.tsx +1 -2
  360. package/src/molecules/navigation-bar/navigation-bar.constants.ts +2 -0
  361. package/src/molecules/navigation-bar/navigation-bar.ios.tsx +35 -5
  362. package/src/molecules/navigation-bar/navigation-bar.types.ts +69 -5
  363. package/src/molecules/pager/pager.android.tsx +1 -1
  364. package/src/molecules/pager/pager.ios.tsx +1 -1
  365. package/src/molecules/radio-group/radio-group.android.tsx +1 -1
  366. package/src/molecules/radio-group/radio-group.ios.tsx +2 -2
  367. package/src/molecules/rn-list-item/rn-list-item.tsx +1 -1
  368. package/src/molecules/rn-tooltip/rn-tooltip.android.tsx +1 -1
  369. package/src/molecules/search-bar/search-bar.tsx +1 -1
  370. package/src/molecules/stepper/stepper.android.tsx +2 -2
  371. package/src/molecules/stepper/stepper.ios.tsx +1 -1
  372. package/src/molecules/tooltip/tooltip.android.tsx +1 -1
  373. package/src/molecules/tooltip/tooltip.ios.tsx +1 -1
  374. package/src/organisms/action-sheet/action-sheet.android.tsx +1 -1
  375. package/src/organisms/action-sheet/action-sheet.ios.tsx +1 -1
  376. package/src/organisms/alert/alert.android.tsx +1 -1
  377. package/src/organisms/alert/alert.ios.tsx +1 -1
  378. package/src/organisms/context-menu/context-menu.android.tsx +2 -2
  379. package/src/organisms/fab-menu/fab-menu.android.tsx +2 -2
  380. package/src/organisms/fab-menu/fab-menu.ios.tsx +2 -3
  381. package/src/organisms/form/form.android.tsx +1 -1
  382. package/src/organisms/form/form.ios.tsx +1 -1
  383. package/src/organisms/header/header-color.ts +7 -0
  384. package/src/organisms/header/header-inset.android.tsx +3 -0
  385. package/src/organisms/header/header-inset.ios.tsx +12 -0
  386. package/src/organisms/header/header-options.android.tsx +168 -0
  387. package/src/organisms/header/header-options.ios.tsx +138 -0
  388. package/src/organisms/header/header-options.types.ts +6 -0
  389. package/src/organisms/header/header-search-accessory.android.tsx +4 -0
  390. package/src/organisms/header/header-search-accessory.ios.tsx +42 -0
  391. package/src/organisms/header/header-search-accessory.types.ts +12 -0
  392. package/src/organisms/header/header-search-input.android.tsx +89 -0
  393. package/src/organisms/header/header-search-input.ios.tsx +7 -0
  394. package/src/organisms/header/header-search-input.types.ts +21 -0
  395. package/src/organisms/header/header-search-scrim.tsx +49 -0
  396. package/src/organisms/header/header-title.tsx +220 -0
  397. package/src/organisms/header/header.types.ts +416 -0
  398. package/src/organisms/header/hero-header-background.android.tsx +22 -0
  399. package/src/organisms/header/hero-header-background.ios.tsx +26 -0
  400. package/src/organisms/header/hero-header-background.types.ts +11 -0
  401. package/src/organisms/header/index.ts +11 -0
  402. package/src/organisms/header/native-subtitle.android.tsx +5 -0
  403. package/src/organisms/header/native-subtitle.ios.tsx +22 -0
  404. package/src/organisms/header/native-subtitle.types.ts +8 -0
  405. package/src/organisms/header/sheet-grabber.android.tsx +4 -0
  406. package/src/organisms/header/sheet-grabber.ios.tsx +12 -0
  407. package/src/organisms/header/sheet-grabber.types.ts +8 -0
  408. package/src/organisms/header/use-header-bar-inset.android.ts +1 -0
  409. package/src/organisms/header/use-header-bar-inset.ios.ts +7 -0
  410. package/src/organisms/header/use-header-bar-inset.types.ts +6 -0
  411. package/src/organisms/header/use-header-scroll-to-top.ts +48 -0
  412. package/src/organisms/header/use-header-search.tsx +138 -0
  413. package/src/organisms/header/use-header.ts +67 -0
  414. package/src/organisms/header/use-hero-header.tsx +222 -0
  415. package/src/organisms/header/use-stack-screen-options.ts +66 -0
  416. package/src/organisms/menu/menu.android.tsx +2 -2
  417. package/src/organisms/menu/menu.ios.tsx +1 -1
  418. package/src/organisms/sheet/use-sheet-header.tsx +4 -1
  419. package/src/organisms/snackbar/snackbar.tsx +1 -1
  420. package/src/organisms/swipe-actions/swipe-actions.android.tsx +1 -1
  421. package/src/organisms/swipe-actions/swipe-actions.ios.tsx +1 -1
  422. package/src/templates/screen/screen.android.tsx +8 -3
  423. package/src/templates/screen/screen.ios.tsx +8 -3
  424. package/src/templates/screen/screen.types.ts +7 -2
  425. package/lib/module/glyph/glyph-button.android.js.map +0 -1
  426. package/lib/module/glyph/glyph-button.ios.js.map +0 -1
  427. package/lib/module/glyph/glyph-button.types.js.map +0 -1
  428. package/lib/module/glyph/glyph.android.js.map +0 -1
  429. package/lib/module/glyph/glyph.ios.js.map +0 -1
  430. package/lib/module/glyph/glyph.types.js.map +0 -1
  431. package/lib/module/glyph/index.js.map +0 -1
  432. package/lib/module/glyph/rn-glyph.android.js.map +0 -1
  433. package/lib/module/glyph/rn-glyph.ios.js.map +0 -1
  434. package/lib/module/host-context.js.map +0 -1
  435. package/lib/module/ripple-clip.js.map +0 -1
  436. package/lib/module/tap-modifiers.js.map +0 -1
  437. package/lib/module/use-refresh-state.js.map +0 -1
  438. package/lib/module/use-stack-modifiers.js.map +0 -1
  439. /package/lib/module/{glyph → atoms/glyph}/glyph-button.android.js +0 -0
  440. /package/lib/module/{glyph → atoms/glyph}/glyph-button.ios.js +0 -0
  441. /package/lib/module/{glyph → atoms/glyph}/glyph-button.types.js +0 -0
  442. /package/lib/module/{glyph → atoms/glyph}/glyph.android.js +0 -0
  443. /package/lib/module/{glyph → atoms/glyph}/glyph.ios.js +0 -0
  444. /package/lib/module/{glyph → atoms/glyph}/glyph.types.js +0 -0
  445. /package/lib/module/{glyph → atoms/glyph}/index.js +0 -0
  446. /package/lib/module/{glyph → atoms/glyph}/rn-glyph.android.js +0 -0
  447. /package/lib/module/{glyph → atoms/glyph}/rn-glyph.ios.js +0 -0
  448. /package/lib/module/{host-context.js → hooks/host-context.js} +0 -0
  449. /package/lib/module/{use-refresh-state.js → hooks/use-refresh-state.js} +0 -0
  450. /package/lib/module/{use-stack-modifiers.js → hooks/use-stack-modifiers.js} +0 -0
  451. /package/lib/module/{ripple-clip.js → utils/ripple-clip.js} +0 -0
  452. /package/lib/module/{tap-modifiers.js → utils/tap-modifiers.js} +0 -0
  453. /package/lib/typescript/{glyph → atoms/glyph}/glyph-button.d.ts +0 -0
  454. /package/lib/typescript/{glyph → atoms/glyph}/glyph-button.ios.d.ts +0 -0
  455. /package/lib/typescript/{glyph → atoms/glyph}/glyph-button.types.d.ts +0 -0
  456. /package/lib/typescript/{glyph → atoms/glyph}/glyph.d.ts +0 -0
  457. /package/lib/typescript/{glyph → atoms/glyph}/glyph.ios.d.ts +0 -0
  458. /package/lib/typescript/{glyph → atoms/glyph}/glyph.types.d.ts +0 -0
  459. /package/lib/typescript/{glyph → atoms/glyph}/index.d.ts +0 -0
  460. /package/lib/typescript/{glyph → atoms/glyph}/rn-glyph.d.ts +0 -0
  461. /package/lib/typescript/{glyph → atoms/glyph}/rn-glyph.ios.d.ts +0 -0
  462. /package/lib/typescript/{host-context.d.ts → hooks/host-context.d.ts} +0 -0
  463. /package/lib/typescript/{use-refresh-state.d.ts → hooks/use-refresh-state.d.ts} +0 -0
  464. /package/lib/typescript/{use-stack-modifiers.d.ts → hooks/use-stack-modifiers.d.ts} +0 -0
  465. /package/lib/typescript/{ripple-clip.d.ts → utils/ripple-clip.d.ts} +0 -0
  466. /package/lib/typescript/{tap-modifiers.d.ts → utils/tap-modifiers.d.ts} +0 -0
  467. /package/src/{glyph → atoms/glyph}/glyph-button.android.tsx +0 -0
  468. /package/src/{glyph → atoms/glyph}/glyph-button.ios.tsx +0 -0
  469. /package/src/{glyph → atoms/glyph}/glyph-button.types.ts +0 -0
  470. /package/src/{glyph → atoms/glyph}/glyph.android.tsx +0 -0
  471. /package/src/{glyph → atoms/glyph}/glyph.ios.tsx +0 -0
  472. /package/src/{glyph → atoms/glyph}/glyph.types.ts +0 -0
  473. /package/src/{glyph → atoms/glyph}/index.ts +0 -0
  474. /package/src/{glyph → atoms/glyph}/rn-glyph.android.tsx +0 -0
  475. /package/src/{glyph → atoms/glyph}/rn-glyph.ios.tsx +0 -0
  476. /package/src/{host-context.tsx → hooks/host-context.tsx} +0 -0
  477. /package/src/{use-refresh-state.ts → hooks/use-refresh-state.ts} +0 -0
  478. /package/src/{use-stack-modifiers.ts → hooks/use-stack-modifiers.ts} +0 -0
  479. /package/src/{ripple-clip.ts → utils/ripple-clip.ts} +0 -0
  480. /package/src/{tap-modifiers.ts → utils/tap-modifiers.ts} +0 -0
@@ -0,0 +1,440 @@
1
+ import type { ColorToken } from '@hzblj/kara-theme';
2
+ import type { ReactElement, ReactNode, RefObject } from 'react';
3
+ import type { ColorValue, ImageSourcePropType } from 'react-native';
4
+ import type { SharedValue } from 'react-native-reanimated';
5
+ import type { SearchBarCommands } from 'react-native-screens';
6
+ import type { SFSymbol } from 'sf-symbols-typescript';
7
+ import type { IconName } from '../../atoms/icon';
8
+ import type { SearchFieldVoice } from '../../molecules/navigation-bar/navigation-bar.types';
9
+ type HeaderActionBase = {
10
+ /**
11
+ * iOS 26: neighbouring actions on one side share a glass capsule; this gives the action its own. A close next to
12
+ * other actions usually wants it. Material has no grouped capsules, so Android ignores it.
13
+ */
14
+ separated?: boolean;
15
+ /** iOS: the bar item's `identifier`, which UI tests match; Android: the button's test tag. */
16
+ testID?: string;
17
+ };
18
+ /**
19
+ * The platform's own back or close: a chevron or a cross (an SF Symbol on iOS, a Material Symbol on Android), named
20
+ * `Back` / `Close` for VoiceOver and TalkBack unless given another label. `icon` puts one of the app's icons in their
21
+ * place.
22
+ */
23
+ export type HeaderNavigationAction = HeaderActionBase & {
24
+ /** One of the app's icons in place of the platform's glyph. */
25
+ icon?: IconName;
26
+ /** What VoiceOver and TalkBack say. `Back` or `Close` by default. */
27
+ label?: string;
28
+ /** Called when the action is pressed. */
29
+ onPress: () => void;
30
+ type: 'back' | 'close';
31
+ };
32
+ /** An action drawn as one of the app's icons. */
33
+ export type HeaderIconAction = HeaderActionBase & {
34
+ /** iOS 26: a badge on the item, a count or a short text. Android ignores it. */
35
+ badge?: number | string;
36
+ /** The icon's colour. The header's own tint by default. */
37
+ color?: ColorToken;
38
+ /** Dims the action and stops it responding. */
39
+ disabled?: boolean;
40
+ /** One of the app's icons. */
41
+ icon: IconName;
42
+ /**
43
+ * What VoiceOver and TalkBack say, since an icon has no words of its own, and the row iOS 26 shows when the items no
44
+ * longer fit and collapse into its overflow menu.
45
+ */
46
+ label: string;
47
+ /** Shows a spinner in the action's place while what it started is still running. */
48
+ loading?: boolean;
49
+ /** Called when the action is pressed. */
50
+ onPress: () => void;
51
+ /** iOS: draws the item in its selected state. Android ignores it. */
52
+ selected?: boolean;
53
+ type: 'icon';
54
+ };
55
+ /** An action drawn as its label: "Edit", "Done". */
56
+ export type HeaderTextAction = HeaderActionBase & {
57
+ /** Dims the action and stops it responding. */
58
+ disabled?: boolean;
59
+ /** The action's text. */
60
+ label: string;
61
+ /** Called when the action is pressed. */
62
+ onPress: () => void;
63
+ /** iOS: the prominent style, filled on iOS 26. Android ignores it. */
64
+ prominent?: boolean;
65
+ type: 'text';
66
+ };
67
+ /** One row of a header menu. */
68
+ export type HeaderMenuAction = {
69
+ /** iOS: a checkmark before the row, for a menu that picks one of several. Android ignores it. */
70
+ checked?: boolean;
71
+ /** iOS: a second line under the label. Android ignores it. */
72
+ description?: string;
73
+ /** Draws the row in the destructive colour. */
74
+ destructive?: boolean;
75
+ /** Greys the row out and stops it responding. */
76
+ disabled?: boolean;
77
+ /** One of the app's icons, beside the label. */
78
+ icon?: IconName;
79
+ /** The row's text. */
80
+ label: string;
81
+ /** Called when the row is chosen; the menu closes by itself. */
82
+ onPress: () => void;
83
+ type: 'action';
84
+ };
85
+ /**
86
+ * A group of rows: on iOS a nested menu, or with `inline` a section of its parent. Android's dropdown has no nesting,
87
+ * so it lists the group's rows in place.
88
+ */
89
+ export type HeaderSubmenu = {
90
+ /** iOS: one of the app's icons beside the group's label. */
91
+ icon?: IconName;
92
+ /** iOS: shows the rows as a section of the parent menu instead of behind a row of their own. */
93
+ inline?: boolean;
94
+ /** The group's rows, top to bottom. */
95
+ items: HeaderMenuItem[];
96
+ /** The group's label. */
97
+ label: string;
98
+ type: 'submenu';
99
+ };
100
+ export type HeaderMenuItem = HeaderMenuAction | HeaderSubmenu;
101
+ /** An icon that opens a menu: a `UIMenu` from the bar item on iOS, a Material dropdown under it on Android. */
102
+ export type HeaderMenu = HeaderActionBase & {
103
+ /** One of the app's icons on the item. */
104
+ icon: IconName;
105
+ /** The menu's rows, top to bottom. */
106
+ items: HeaderMenuItem[];
107
+ /** What VoiceOver and TalkBack say for the item: "More options". */
108
+ label: string;
109
+ /** iOS: a title above the rows. Android ignores it. */
110
+ title?: string;
111
+ type: 'menu';
112
+ };
113
+ /** Any React Native element in the header, for what the other actions cannot draw: an avatar, a count. */
114
+ export type HeaderCustomAction = {
115
+ /** The element, laid out at its own size. */
116
+ element: ReactElement;
117
+ /** Identifies the element among the side's actions. */
118
+ key: string;
119
+ /** iOS 26: keeps the element apart from its neighbours' shared glass. Android ignores it. */
120
+ separated?: boolean;
121
+ type: 'custom';
122
+ };
123
+ /**
124
+ * One action of a screen's header. iOS draws them as the navigation bar's own `UIBarButtonItem`s (the same glass,
125
+ * press and overflow menu as the system's), Android as Material icon and text buttons in the top app bar.
126
+ */
127
+ export type HeaderAction = HeaderCustomAction | HeaderIconAction | HeaderMenu | HeaderNavigationAction | HeaderTextAction;
128
+ export type HeaderParams = {
129
+ /**
130
+ * Hides the stack's own back button. On Android a trailing `close` then takes the navigation icon's place at the
131
+ * start, as Material's full-screen dialogs have it, unless there are leading actions.
132
+ */
133
+ backHidden?: boolean;
134
+ /**
135
+ * A large title that collapses into the bar as the list scrolls. iOS draws UIKit's own; Android, where the native
136
+ * stack has none, puts it into the content as the list's first row (`largeTitle` in the result) and fades the bar's
137
+ * title in once that row has scrolled away, as Material's large top app bar does. Wire `onScroll` for it.
138
+ */
139
+ largeTitle?: boolean;
140
+ /**
141
+ * The leading side's actions, in screen order from the edge. On iOS they follow the back button. Unset leaves the
142
+ * side as the stack's options have it; an empty array clears it.
143
+ */
144
+ leadingActions?: HeaderAction[];
145
+ /**
146
+ * A search field in the header, from `useHeaderSearch`: UIKit's search bar under the title on iOS. Android has no
147
+ * field in its top app bar, so `useHeaderSearch` gives the screen a row of its own to put under it.
148
+ */
149
+ search?: HeaderSearchBarOptions;
150
+ /**
151
+ * A line under the title, both on the leading side. iOS 26 sets it as the navigation item's own subtitle, which
152
+ * truncates and morphs between screens natively; elsewhere a title and subtitle are drawn in the bar.
153
+ */
154
+ subtitle?: string;
155
+ /** The screen's title, in the bar. */
156
+ title?: string;
157
+ /** Keeps the bar without a title, for a screen that draws its own under it. */
158
+ titleHidden?: boolean;
159
+ /**
160
+ * Fades the title (and subtitle) in as this goes from 0 to 1, for a detail screen whose title appears once its image
161
+ * has scrolled away. Past half, iOS 26 switches its native title and subtitle on with a cross-dissolve.
162
+ */
163
+ titleRevealProgress?: SharedValue<number>;
164
+ /**
165
+ * The trailing side's actions, in screen order toward the edge: the close usually last. Unset leaves the side as the
166
+ * stack's options have it; an empty array clears it.
167
+ */
168
+ trailingActions?: HeaderAction[];
169
+ };
170
+ type NativeHeaderItemIcon = {
171
+ name: SFSymbol;
172
+ type: 'sfSymbol';
173
+ } | {
174
+ source: ImageSourcePropType;
175
+ type: 'image';
176
+ };
177
+ type NativeHeaderItemShared = {
178
+ accessibilityLabel?: string;
179
+ badge?: {
180
+ value: number | string;
181
+ };
182
+ disabled?: boolean;
183
+ icon?: NativeHeaderItemIcon;
184
+ identifier?: string;
185
+ label: string;
186
+ sharesBackground?: boolean;
187
+ tintColor?: ColorValue;
188
+ variant?: 'done' | 'plain' | 'prominent';
189
+ };
190
+ export type NativeHeaderMenuElement = {
191
+ description?: string;
192
+ destructive?: boolean;
193
+ disabled?: boolean;
194
+ icon?: NativeHeaderItemIcon;
195
+ label: string;
196
+ onPress: () => void;
197
+ state?: 'mixed' | 'off' | 'on';
198
+ type: 'action';
199
+ } | {
200
+ icon?: NativeHeaderItemIcon;
201
+ inline?: boolean;
202
+ items: NativeHeaderMenuElement[];
203
+ label: string;
204
+ type: 'submenu';
205
+ };
206
+ /** A native-stack header item, the shape React Navigation's and Expo Router's native stacks both take. */
207
+ export type NativeHeaderItem = (NativeHeaderItemShared & {
208
+ menu: {
209
+ items: NativeHeaderMenuElement[];
210
+ title?: string;
211
+ };
212
+ type: 'menu';
213
+ }) | (NativeHeaderItemShared & {
214
+ onPress: () => void;
215
+ selected?: boolean;
216
+ type: 'button';
217
+ }) | {
218
+ element: ReactElement;
219
+ hidesSharedBackground?: boolean;
220
+ type: 'custom';
221
+ } | {
222
+ spacing: number;
223
+ type: 'spacing';
224
+ };
225
+ export type HeaderItemProps = {
226
+ /** Whether the stack can go back from this screen. */
227
+ canGoBack?: boolean;
228
+ /** The header's tint. */
229
+ tintColor?: ColorValue;
230
+ };
231
+ /**
232
+ * Native-stack screen options, as React Navigation's native stack and Expo Router's `Stack` both take them: spread them
233
+ * into `options`, or hand them to `navigation.setOptions`.
234
+ */
235
+ export type HeaderOptions = {
236
+ headerBackground?: () => ReactNode;
237
+ headerBackVisible?: boolean;
238
+ headerBlurEffect?: 'none' | 'systemChromeMaterial';
239
+ headerLargeTitleEnabled?: boolean;
240
+ headerLeft?: (props: HeaderItemProps) => ReactNode;
241
+ headerRight?: (props: HeaderItemProps) => ReactNode;
242
+ headerSearchBarOptions?: HeaderSearchBarOptions;
243
+ headerShown?: boolean;
244
+ headerStyle?: {
245
+ backgroundColor?: string;
246
+ };
247
+ headerTintColor?: string;
248
+ headerTitle?: string | (() => ReactNode);
249
+ headerTransparent?: boolean;
250
+ scrollEdgeEffects?: {
251
+ top?: 'automatic' | 'hidden';
252
+ };
253
+ statusBarStyle?: 'auto' | 'dark' | 'light';
254
+ title?: string;
255
+ unstable_headerLeftItems?: (props: HeaderItemProps) => NativeHeaderItem[];
256
+ unstable_headerRightItems?: (props: HeaderItemProps) => NativeHeaderItem[];
257
+ };
258
+ /** What a list under the header needs from it. */
259
+ export type HeaderContent = {
260
+ /**
261
+ * Hand it to the list: `automatic` lets iOS inset the content under its transparent bar, `never` (a hero header)
262
+ * lets the content run under it.
263
+ */
264
+ contentInsetAdjustmentBehavior: 'automatic' | 'never';
265
+ /** Android, with `largeTitle`: the large title, to render as the list's first row. `null` everywhere else. */
266
+ largeTitle: ReactElement | null;
267
+ /** A worklet to call with the list's vertical offset from its scroll handler, for what follows the scroll. */
268
+ onScroll: (offsetY: number) => void;
269
+ };
270
+ /** `HeaderContent` plus the options, for a screen that sets them itself (Expo Router's `<Stack.Screen options>`). */
271
+ export type HeaderOptionsResult = HeaderContent & {
272
+ options: HeaderOptions;
273
+ };
274
+ /** UIKit's search bar options, as the native stack takes them (`headerSearchBarOptions`). */
275
+ export type HeaderSearchBarOptions = {
276
+ allowToolbarIntegration?: boolean;
277
+ autoCapitalize?: 'characters' | 'none' | 'sentences' | 'words';
278
+ hideNavigationBar?: boolean;
279
+ hideWhenScrolling?: boolean;
280
+ obscureBackground?: boolean;
281
+ onBlur?: () => void;
282
+ onCancelButtonPress?: () => void;
283
+ onChangeText?: (event: {
284
+ nativeEvent: {
285
+ text: string;
286
+ };
287
+ }) => void;
288
+ onFocus?: () => void;
289
+ placeholder?: string;
290
+ placement?: 'automatic' | 'inline' | 'integrated' | 'integratedButton' | 'integratedCentered' | 'stacked';
291
+ ref?: RefObject<SearchBarCommands | null>;
292
+ tintColor?: string;
293
+ };
294
+ /**
295
+ * Where the search goes on iOS: `stacked` in a row under the title (title and items kept); `integratedButton` as a
296
+ * search button in the bar's trailing corner that opens the field in the bar, the title and items hidden meanwhile.
297
+ * The integrated field's close is the system's: iOS gives it no other glyph.
298
+ */
299
+ export type HeaderSearchPlacement = 'integratedButton' | 'stacked';
300
+ export type HeaderSearchParams = {
301
+ /** iOS: the cancel circle beside a focused stacked field (iOS 26), one of the app's icons; the system cross unset. */
302
+ cancelIcon?: IconName;
303
+ /** The field's clear button, one of the app's icons; the platform's unset. */
304
+ clearIcon?: IconName;
305
+ /** Off leaves the header without a field, for a screen that searches only sometimes. On by default. */
306
+ enabled?: boolean;
307
+ /** Shown while the field is empty. `Search` by default. */
308
+ placeholder?: string;
309
+ /** iOS: `stacked` by default. Android always puts its field in a row under the bar. */
310
+ placement?: HeaderSearchPlacement;
311
+ /** A microphone in the field: see `SearchFieldVoice`. Write what it hears with `setText`. */
312
+ voice?: SearchFieldVoice;
313
+ };
314
+ /**
315
+ * A header's search: what to give `useHeader` (`searchBar`, iOS), the row Android puts under its bar (`searchInput`),
316
+ * the scrim that washes the content out while the field is focused and empty (render it last, over the content), and
317
+ * the query to filter by.
318
+ */
319
+ export type HeaderSearch = {
320
+ /** Empties the field and ends the search. */
321
+ clear: () => void;
322
+ /** The field's text. */
323
+ query: string;
324
+ /**
325
+ * Over the content while the field is focused and empty; a tap on it ends the search. On iOS it also carries the
326
+ * field's glyphs and voice, which have to sit in the screen's tree. Render it last.
327
+ */
328
+ scrim: ReactElement | null;
329
+ /** Android: the Material search field, a row to put right under the bar. `null` on iOS. */
330
+ searchInput: ReactElement | null;
331
+ /** iOS: `search` for `useHeader`. `undefined` on Android. */
332
+ searchBar: HeaderSearchBarOptions | undefined;
333
+ /** Puts text into the field and the query, the way dictation fills it in. */
334
+ setText: (text: string) => void;
335
+ };
336
+ /** Whether the header over a hero is light (over a dark image) or dark (over a light one). */
337
+ export type HeroHeaderStyle = 'dark' | 'light';
338
+ export type HeroHeaderParams = Pick<HeaderParams, 'backHidden' | 'leadingActions' | 'subtitle' | 'trailingActions'> & {
339
+ /** The hero's height: the header fades in while the part of it under the bar scrolls away. */
340
+ heroHeight: number;
341
+ /**
342
+ * Holds the header in its revealed look while above 0, for a hero that opens with an intro (the bar's background, tint
343
+ * and status bar; the title and the trailing actions follow the scroll alone).
344
+ */
345
+ introProgress?: SharedValue<number>;
346
+ /** The items and status bar over the hero. `light` (over a dark image) by default. */
347
+ overHeroStyle?: HeroHeaderStyle;
348
+ /** Trailing actions that join the bar, in front of `trailingActions`, once the title is revealed. */
349
+ revealedTrailingActions?: HeaderAction[];
350
+ /** The screen's title, revealed in the bar once the hero has scrolled away. */
351
+ title: string;
352
+ };
353
+ /** A hero header: a transparent bar over a full-bleed image that fades in as the image scrolls away. */
354
+ export type HeroHeader = HeaderContent & {
355
+ /**
356
+ * The bar's background below iOS 26 and on Android, and the status bar over the hero. Render it after the list.
357
+ */
358
+ background: ReactElement;
359
+ /** How far the header has faded in, intro included: 0 over the hero, 1 revealed. */
360
+ progress: SharedValue<number>;
361
+ /** The same from the scroll alone, without the intro. */
362
+ scrollProgress: SharedValue<number>;
363
+ };
364
+ /**
365
+ * What `useHeroHeader` needs of a screen's navigation object, React Navigation's and Expo Router's `useNavigation()`
366
+ * both: setting options, and whether the screen is focused, so its status bar applies to it alone.
367
+ */
368
+ export type HeroHeaderNavigation = HeaderNavigation & {
369
+ addListener(event: 'blur' | 'focus', callback: () => void): () => void;
370
+ isFocused(): boolean;
371
+ };
372
+ /** A native stack's screen options, as React Navigation's native stack and Expo Router's `Stack` both take them. */
373
+ export type StackScreenOptions = {
374
+ contentStyle?: {
375
+ backgroundColor?: string;
376
+ };
377
+ headerBackButtonDisplayMode?: 'default' | 'generic' | 'minimal';
378
+ headerBlurEffect?: 'none' | 'systemChromeMaterial';
379
+ headerLargeTitleEnabled?: boolean;
380
+ headerLargeTitleShadowVisible?: boolean;
381
+ headerLargeTitleStyle?: {
382
+ color?: string;
383
+ fontFamily?: string;
384
+ fontSize?: number;
385
+ };
386
+ headerShadowVisible?: boolean;
387
+ headerShown?: boolean;
388
+ headerStyle?: {
389
+ backgroundColor?: string;
390
+ };
391
+ headerTintColor?: string;
392
+ headerTitleStyle?: {
393
+ color?: string;
394
+ fontFamily?: string;
395
+ fontSize?: number;
396
+ };
397
+ headerTransparent?: boolean;
398
+ scrollEdgeEffects?: {
399
+ top?: 'automatic' | 'hidden';
400
+ };
401
+ };
402
+ /** What `useHeader` needs of a screen's navigation object: React Navigation's and Expo Router's `useNavigation()` both. */
403
+ export type HeaderNavigation = {
404
+ setOptions(options: HeaderOptions): void;
405
+ };
406
+ /** Something a list can scroll with: a `ScrollView`, a `FlatList`, a `FlashList` or a `LegendList`. */
407
+ export type HeaderScrollable = {
408
+ getScrollResponder: () => {
409
+ scrollTo: (options: {
410
+ animated?: boolean;
411
+ y?: number;
412
+ }) => void;
413
+ } | null | undefined;
414
+ } | {
415
+ scrollTo: (options: {
416
+ animated?: boolean;
417
+ y?: number;
418
+ }) => void;
419
+ } | {
420
+ scrollToOffset: (params: {
421
+ animated?: boolean;
422
+ offset: number;
423
+ }) => void;
424
+ };
425
+ export type HeaderScrollToTopOptions = {
426
+ /** Whether the screen has a large title, which the top includes on iOS. */
427
+ largeTitle?: boolean;
428
+ /** Extra room above the content, for a bar the screen lays out under the header itself. */
429
+ topInset?: number;
430
+ };
431
+ /** What React Navigation's and Expo Router's `useScrollToTop` call when its tab is pressed again. */
432
+ export type HeaderScrollToTopRef = RefObject<{
433
+ scrollToTop: () => void;
434
+ }>;
435
+ export type HeaderInsetProps = {
436
+ /** The content that starts right under the header. */
437
+ children?: ReactNode;
438
+ };
439
+ export type HeaderInsetComponent = (props: HeaderInsetProps) => ReactNode;
440
+ export {};
@@ -0,0 +1 @@
1
+ export * from './hero-header-background.ios';
@@ -0,0 +1,7 @@
1
+ import type { HeroHeaderBackgroundComponent } from './hero-header-background.types';
2
+ /**
3
+ * iOS 26 draws the bar's background itself: its scroll edge effect, switched on once the reveal starts. Before it the
4
+ * bar's own blur cannot fade, so the bar's chrome material comes in behind the transparent bar by its intensity, the
5
+ * way UIKit fades a material in, rather than by its opacity.
6
+ */
7
+ export declare const HeroHeaderBackground: HeroHeaderBackgroundComponent;
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { SharedValue } from 'react-native-reanimated';
3
+ export type HeroHeaderBackgroundProps = {
4
+ /** The bar's height, status bar included. */
5
+ height: number;
6
+ /** How far the header has faded in: 0 over the hero, 1 revealed. */
7
+ progress: SharedValue<number>;
8
+ };
9
+ export type HeroHeaderBackgroundComponent = (props: HeroHeaderBackgroundProps) => ReactNode;
@@ -0,0 +1,11 @@
1
+ export * from './header.types';
2
+ export * from './header-inset';
3
+ export { useIsTitleRevealed } from './header-title';
4
+ export * from './sheet-grabber';
5
+ export type { SheetGrabberProps } from './sheet-grabber.types';
6
+ export * from './use-header';
7
+ export * from './use-header-bar-inset';
8
+ export * from './use-header-scroll-to-top';
9
+ export * from './use-header-search';
10
+ export * from './use-hero-header';
11
+ export * from './use-stack-screen-options';
@@ -0,0 +1 @@
1
+ export * from './native-subtitle.ios';
@@ -0,0 +1,4 @@
1
+ import type { NativeSubtitleComponent } from './native-subtitle.types';
2
+ /** iOS 26 puts a title and its subtitle on the leading side itself (`UINavigationItem.style = .browser`). */
3
+ export declare const hasNativeSubtitle: boolean;
4
+ export declare const NativeSubtitle: NativeSubtitleComponent;
@@ -0,0 +1,6 @@
1
+ import type { ReactNode } from 'react';
2
+ export type NativeSubtitleProps = {
3
+ subtitle: string;
4
+ subtitleHidden: boolean;
5
+ };
6
+ export type NativeSubtitleComponent = (props: NativeSubtitleProps) => ReactNode;
@@ -0,0 +1 @@
1
+ export * from './sheet-grabber.ios';
@@ -0,0 +1,7 @@
1
+ import type { SheetGrabberComponent } from './sheet-grabber.types';
2
+ /**
3
+ * The system grabber of a native-stack screen presented as a sheet (`presentation: 'modal'`), which react-native-screens
4
+ * gives only `formSheet`. Render it anywhere in the presented content, a nested stack's screens included; it takes no
5
+ * room. Android draws no grabber on a full-screen modal, and this renders nothing there.
6
+ */
7
+ export declare const SheetGrabber: SheetGrabberComponent;
@@ -0,0 +1,6 @@
1
+ import type { ReactNode } from 'react';
2
+ export type SheetGrabberProps = {
3
+ /** Shows the grabber. `true` by default. */
4
+ visible?: boolean;
5
+ };
6
+ export type SheetGrabberComponent = (props: SheetGrabberProps) => ReactNode;
@@ -0,0 +1 @@
1
+ export * from './use-header-bar-inset.ios';
@@ -0,0 +1 @@
1
+ export declare const useHeaderBarInset: () => number;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * How far a transparent header reaches into the screen: the status bar plus the bar's own height on iOS, 0 on Android,
3
+ * where the top app bar sits above the content. Known on the first render, unlike a measured header height, so content
4
+ * laid out by it never jumps once the bar reports its size.
5
+ */
6
+ export type UseHeaderBarInset = () => number;
@@ -0,0 +1,8 @@
1
+ import { type RefObject } from 'react';
2
+ import type { HeaderScrollable, HeaderScrollToTopOptions, HeaderScrollToTopRef } from './header.types';
3
+ /**
4
+ * A ref for React Navigation's or Expo Router's `useScrollToTop`: pressing the tab again scrolls the list back under a
5
+ * transparent header, with a large title expanded, where scrolling to 0 would leave the content under the bar and the
6
+ * title collapsed. `useScrollToTop(useHeaderScrollToTop(listRef, {largeTitle: true}))`.
7
+ */
8
+ export declare const useHeaderScrollToTop: (ref: RefObject<HeaderScrollable | null>, { largeTitle, topInset }?: HeaderScrollToTopOptions) => HeaderScrollToTopRef;
@@ -0,0 +1,12 @@
1
+ import type { HeaderSearch, HeaderSearchParams } from './header.types';
2
+ /**
3
+ * A search field for a screen's header. iOS: UIKit's search bar stacked under the title, with the title and items kept
4
+ * and nothing dimmed by the system, so a list can filter live, or behind a search button in the bar's corner
5
+ * (`placement`); pass `searchBar` to `useHeader` as `search`. Android: Material's search field with its cancel button,
6
+ * as a row for the screen to put right under the top app bar (`searchInput`). Both report the `query`; `scrim` washes
7
+ * the content out while the field is focused and empty and, on iOS, carries the field's glyphs and voice.
8
+ *
9
+ * With `voice` the field has a microphone; the app runs the dictation and writes what it hears with `setText`. Typing
10
+ * over it, or ending the search, calls `voice.onCancel`.
11
+ */
12
+ export declare const useHeaderSearch: ({ cancelIcon, clearIcon, enabled, placeholder, placement, voice, }?: HeaderSearchParams) => HeaderSearch;
@@ -0,0 +1,14 @@
1
+ import type { HeaderContent, HeaderNavigation, HeaderOptionsResult, HeaderParams } from './header.types';
2
+ /**
3
+ * A screen's header as native-stack options, with what its list needs alongside: the title (centred, leading with a
4
+ * subtitle, revealed on scroll or large), the actions on both sides (the navigation bar's own items on iOS, Material
5
+ * buttons on Android) and a search field. Spread `options` into Expo Router's `<Stack.Screen options>` or a React
6
+ * Navigation screen's `options`. Memoize the action arrays: new arrays build new options on every render.
7
+ */
8
+ export declare const useHeaderOptions: ({ backHidden, largeTitle, leadingActions, search, subtitle, title, titleHidden, titleRevealProgress, trailingActions, }: HeaderParams) => HeaderOptionsResult;
9
+ /**
10
+ * Sets the screen's header through its navigation object, from React Navigation's or Expo Router's `useNavigation()`,
11
+ * before the screen first paints, and returns what its list needs. What a screen has from the moment it is pushed
12
+ * belongs in its static `options` too: iOS morphs the bar items between screens only when they exist at the push.
13
+ */
14
+ export declare const useHeader: (navigation: HeaderNavigation, params: HeaderParams) => HeaderContent;
@@ -0,0 +1,10 @@
1
+ import type { HeroHeader, HeroHeaderNavigation, HeroHeaderParams } from './header.types';
2
+ /**
3
+ * A header over a full-bleed hero: the content runs under a transparent bar, and while 50 to 70 % of the hero's part
4
+ * under the bar scrolls away the header fades in — the title (and subtitle) in the bar, the bar's background
5
+ * (`background`: iOS 26's scroll edge effect switched on, the bar's material coming in below iOS 26, the top app bar's
6
+ * surface on Android), the items' tint and the status bar, light over the hero with `overHeroStyle` `light`. `revealedTrailingActions` join the
7
+ * bar once the title is shown. Give the screen `HERO_HEADER_SCREEN_OPTIONS` as static options, so its first frame has
8
+ * no large title, render `background` after the list and call `onScroll` with its offset.
9
+ */
10
+ export declare const useHeroHeader: (navigation: HeroHeaderNavigation, { backHidden, heroHeight, introProgress, leadingActions, overHeroStyle, revealedTrailingActions, subtitle, title, trailingActions, }: HeroHeaderParams) => HeroHeader;
@@ -0,0 +1,17 @@
1
+ import type { StackScreenOptions } from './header.types';
2
+ /**
3
+ * A native stack's `screenOptions` in the active theme: the surface behind every screen, a minimal back button, the
4
+ * title and large title in the theme's `headline` and `headingM`, no hairline under the bar. iOS keeps the bar
5
+ * transparent so iOS 26 blurs what scrolls under it (older iOS gets the bar's material); Android gets a solid top app
6
+ * bar in the surface colour.
7
+ */
8
+ export declare const useStackScreenOptions: () => StackScreenOptions;
9
+ /** A screen with a large title that collapses into the bar as its list scrolls. */
10
+ export declare const LARGE_TITLE_SCREEN_OPTIONS: StackScreenOptions;
11
+ /** A screen without the stack's header, for one that draws its own or none. */
12
+ export declare const HIDDEN_HEADER_SCREEN_OPTIONS: StackScreenOptions;
13
+ /**
14
+ * A screen whose content runs under a transparent bar, a full-bleed image above all, for `useHeroHeader`. Static, so the
15
+ * first frame already has no large title and no bar background over the image.
16
+ */
17
+ export declare const HERO_HEADER_SCREEN_OPTIONS: StackScreenOptions;
@@ -1,5 +1,6 @@
1
1
  import type { Sx } from '@hzblj/kara-sx';
2
2
  import type { ReactNode } from 'react';
3
+ import type { IgnoredSafeArea } from '../../atoms/island';
3
4
  /**
4
5
  * The full-bleed native host a screen starts with: a SwiftUI or Compose `Host` filling its parent, so native atoms
5
6
  * render anywhere inside it. The background runs to the edges; the content keeps clear of the status bar where the
@@ -10,8 +11,11 @@ export type ScreenProps = {
10
11
  bg?: Sx['bg'];
11
12
  /** Laid out in a column that fills the screen. */
12
13
  children?: ReactNode;
13
- /** Keeps the content where it is when the keyboard opens, instead of avoiding it. Android reads it once, on mount. */
14
- ignoreKeyboardInset?: boolean;
14
+ /**
15
+ * Which insets the content ignores. `none` by default: a screen keeps clear of the status bar, the home indicator and
16
+ * the keyboard. `keyboard` keeps the content where it is when the keyboard opens. See `IgnoredSafeArea`.
17
+ */
18
+ ignoreSafeArea?: IgnoredSafeArea;
15
19
  /** Test identifier, on the host view on iOS and on the view around it on Android. */
16
20
  testID?: string;
17
21
  };