@satinhq/kit 0.1.0-beta.2 → 0.1.0-beta.4

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 (309) hide show
  1. package/NOTICE +2 -2
  2. package/README.md +2 -3
  3. package/dist/acknowledgements/inventory.json +5 -5
  4. package/dist/actions/RowActions.d.ts +4 -4
  5. package/dist/actions/RowActions.js +93 -27
  6. package/dist/actions/fullSwipeContact.d.ts +73 -0
  7. package/dist/actions/fullSwipeContact.js +186 -0
  8. package/dist/actions/rowScrub.d.ts +7 -4
  9. package/dist/actions/rowScrub.js +39 -37
  10. package/dist/actions/types.d.ts +13 -7
  11. package/dist/app/InstallComponents.d.ts +4 -7
  12. package/dist/app/InstallComponents.js +7 -7
  13. package/dist/app/InstallationDiagnostics.d.ts +2 -1
  14. package/dist/app/InstallationDiagnostics.js +2 -1
  15. package/dist/app/appearance.d.ts +5 -3
  16. package/dist/app/appearance.js +5 -3
  17. package/dist/app/appearanceStore.d.ts +3 -2
  18. package/dist/app/buildInfo.d.ts +4 -4
  19. package/dist/app/buildInfo.js +2 -2
  20. package/dist/app/definition.d.ts +11 -3
  21. package/dist/app/definition.js +2 -0
  22. package/dist/app/head.d.ts +2 -1
  23. package/dist/app/head.js +13 -16
  24. package/dist/app/inlineCSP.d.ts +6 -0
  25. package/dist/app/inlineCSP.js +25 -0
  26. package/dist/app/install.d.ts +1 -0
  27. package/dist/app/install.js +5 -2
  28. package/dist/app/installCheck.js +32 -86
  29. package/dist/app/installContext.d.ts +10 -5
  30. package/dist/app/installContext.js +2 -0
  31. package/dist/app/installCustom.js +1 -0
  32. package/dist/app/installExperience.js +0 -60
  33. package/dist/app/installationFailure.d.ts +3 -2
  34. package/dist/app/installationFailure.js +1 -1
  35. package/dist/app/launchScreen.d.ts +6 -2
  36. package/dist/app/launchScreen.js +104 -1
  37. package/dist/app/launchScreenRuntime.d.ts +31 -4
  38. package/dist/app/launchScreenRuntime.js +150 -22
  39. package/dist/app/launchWatchdog.js +25 -65
  40. package/dist/app/platformScripts.js +11 -0
  41. package/dist/app/styles.d.ts +3 -0
  42. package/dist/app/styles.js +42 -0
  43. package/dist/app/viewportValue.d.ts +2 -1
  44. package/dist/app/vite.d.ts +4 -0
  45. package/dist/app/vite.js +22 -24
  46. package/dist/content/content.d.ts +35 -30
  47. package/dist/content/content.js +19 -16
  48. package/dist/content/layout.d.ts +10 -2
  49. package/dist/content/layout.js +4 -2
  50. package/dist/content/scaledMetric.d.ts +2 -1
  51. package/dist/content/scaledMetric.js +2 -1
  52. package/dist/controls/ColorPicker.d.ts +2 -4
  53. package/dist/controls/ColorPicker.js +2 -4
  54. package/dist/controls/DatePicker.d.ts +4 -4
  55. package/dist/controls/DatePicker.js +2 -2
  56. package/dist/controls/ProgressView.d.ts +4 -4
  57. package/dist/controls/ProgressView.js +1 -2
  58. package/dist/controls/civilDate.d.ts +1 -1
  59. package/dist/controls/civilDate.js +1 -1
  60. package/dist/data/database.d.ts +9 -8
  61. package/dist/data/database.js +4 -4
  62. package/dist/docs/components/file-importer.md +1 -1
  63. package/dist/docs/components/paste-button.md +1 -1
  64. package/dist/docs/components/photos-picker.md +1 -1
  65. package/dist/docs/components/share-link.md +1 -1
  66. package/dist/docs/limitations.md +1 -1
  67. package/dist/docs/push.md +3 -3
  68. package/dist/docs/reference.md +1888 -0
  69. package/dist/docs/tailwind.md +76 -0
  70. package/dist/docs/tokens.md +1 -1
  71. package/dist/gestures/GestureView.d.ts +3 -1
  72. package/dist/gestures/GestureView.js +2 -1
  73. package/dist/gestures/gesture.d.ts +22 -2
  74. package/dist/gestures/gesture.js +7 -2
  75. package/dist/glass/GlassEffect.d.ts +2 -1
  76. package/dist/glass/GlassEffect.js +2 -1
  77. package/dist/glass/GlassPresentation.d.ts +1 -0
  78. package/dist/glass/GlassPresentation.js +21 -4
  79. package/dist/glass/TabBar.js +23 -1
  80. package/dist/glass/errorAlert.js +2 -1
  81. package/dist/glass/errors.d.ts +3 -1
  82. package/dist/glass/fallback/runtime.d.ts +1 -0
  83. package/dist/glass/fallback/runtime.js +8 -1
  84. package/dist/glass/lens/controlLift.d.ts +1 -1
  85. package/dist/glass/lens/controlLift.js +1 -1
  86. package/dist/glass/lens/interactivePress.d.ts +2 -2
  87. package/dist/glass/lens/interactivePress.js +2 -2
  88. package/dist/glass/lens/menu-opening-native-fits.json +1 -1
  89. package/dist/glass/lens/menuContextFit.json +1 -1
  90. package/dist/glass/lens/menuDropFit.json +1 -1
  91. package/dist/glass/lens/menuField.d.ts +2 -2
  92. package/dist/glass/lens/menuField.js +3 -3
  93. package/dist/glass/lens/menuGlyphDropFit.json +1 -1
  94. package/dist/glass/lens/menuMorphFit.json +1 -1
  95. package/dist/glass/lens/menuMorphPhoneFit.json +1 -1
  96. package/dist/glass/lens/tabAccessoryMotion.d.ts +1 -1
  97. package/dist/glass/lens/tabSearchMember.d.ts +1 -1
  98. package/dist/glass/lens/tabSearchMember.js +1 -1
  99. package/dist/glass/liquidContext.d.ts +2 -0
  100. package/dist/glass/menuPresenter.d.ts +2 -0
  101. package/dist/glass/menuPresenter.js +1 -1
  102. package/dist/glass/regions.d.ts +3 -2
  103. package/dist/glass/regions.js +1 -1
  104. package/dist/glass/renderSpecs.d.ts +1 -0
  105. package/dist/glass/renderSpecs.js +1 -0
  106. package/dist/glass/shapeTrack.d.ts +1 -1
  107. package/dist/glass/submenuMotion.d.ts +1 -1
  108. package/dist/glass/submenuMotion.js +1 -1
  109. package/dist/glass/webgpu/controlRim.d.ts +29 -0
  110. package/dist/glass/webgpu/controlRim.js +68 -0
  111. package/dist/glass/webgpu/entry.worker.js +3 -6
  112. package/dist/glass/webgpu/frameClock.d.ts +6 -2
  113. package/dist/glass/webgpu/frameClock.js +9 -2
  114. package/dist/glass/webgpu/frameProbe.d.ts +1 -1
  115. package/dist/glass/webgpu/frameProbe.js +3 -3
  116. package/dist/glass/webgpu/passes.d.ts +2 -2
  117. package/dist/glass/webgpu/production.d.ts +1 -0
  118. package/dist/glass/webgpu/production.js +31 -1
  119. package/dist/glass/webgpu/raster.d.ts +18 -0
  120. package/dist/glass/webgpu/raster.js +105 -15
  121. package/dist/glass/webgpu/rasterMaterial.d.ts +4 -0
  122. package/dist/glass/webgpu/rasterMaterial.js +17 -1
  123. package/dist/glass/webgpu/rasterUniforms.js +9 -0
  124. package/dist/glass/webgpu/regionScene.d.ts +4 -1
  125. package/dist/glass/webgpu/regionScene.js +30 -1
  126. package/dist/glass/webgpu/renderer.js +23 -7
  127. package/dist/glass/webgpu/shaders.d.ts +2 -2
  128. package/dist/glass/webgpu/shaders.js +5 -1
  129. package/dist/haptics/SensoryButton.d.ts +4 -4
  130. package/dist/haptics/SensoryButton.js +3 -3
  131. package/dist/image/Image.d.ts +6 -3
  132. package/dist/image/Image.js +4 -3
  133. package/dist/image/asset.d.ts +2 -1
  134. package/dist/keyboard/adapter.d.ts +3 -4
  135. package/dist/keyboard/adapter.js +2 -2
  136. package/dist/keyboard/avoidance.d.ts +1 -1
  137. package/dist/keyboard/avoidance.js +1 -1
  138. package/dist/keyboard/geometry.d.ts +1 -1
  139. package/dist/keyboard/motion.d.ts +1 -1
  140. package/dist/keyboard/motion.js +1 -1
  141. package/dist/list-form/ListForm.d.ts +10 -9
  142. package/dist/list-form/ListForm.js +3 -3
  143. package/dist/list-form/ListItem.js +1 -1
  144. package/dist/list-form/RowLabel.d.ts +1 -1
  145. package/dist/list-form/RowLabel.js +1 -1
  146. package/dist/list-form/Slider.js +1 -1
  147. package/dist/list-form/editMotion.js +1 -1
  148. package/dist/list-form/editing.d.ts +10 -11
  149. package/dist/list-form/editing.js +5 -6
  150. package/dist/list-form/offsets.d.ts +2 -2
  151. package/dist/list-form/offsets.js +2 -2
  152. package/dist/media/react.d.ts +2 -1
  153. package/dist/media/react.js +2 -1
  154. package/dist/media/types.d.ts +6 -3
  155. package/dist/motion/TransitionView.d.ts +4 -2
  156. package/dist/motion/TransitionView.js +3 -2
  157. package/dist/motion/animationValue.d.ts +2 -2
  158. package/dist/motion/animationValue.js +9 -10
  159. package/dist/motion/matchedGeometry.d.ts +10 -9
  160. package/dist/motion/matchedGeometry.js +9 -9
  161. package/dist/motion/springTrack.d.ts +1 -2
  162. package/dist/motion/springTrack.js +10 -5
  163. package/dist/motion/transition.d.ts +4 -1
  164. package/dist/motion/transition.js +2 -0
  165. package/dist/navigation/DetailList.d.ts +1 -1
  166. package/dist/navigation/DetailList.js +1 -1
  167. package/dist/navigation/ScreenContainer.js +1 -1
  168. package/dist/navigation/Sidebar.d.ts +3 -1
  169. package/dist/navigation/Sidebar.js +1 -1
  170. package/dist/navigation/SidebarSymbol.d.ts +2 -1
  171. package/dist/navigation/SidebarSymbol.js +2 -1
  172. package/dist/navigation/chromeCurves.js +1 -1
  173. package/dist/navigation/navigationContext.d.ts +2 -1
  174. package/dist/navigation/navigationContext.js +2 -1
  175. package/dist/navigation/splitContext.d.ts +2 -1
  176. package/dist/navigation/splitContext.js +2 -1
  177. package/dist/navigation/toolbarMinimization.d.ts +4 -3
  178. package/dist/navigation/types.d.ts +8 -6
  179. package/dist/navigation/zoomGeometry.js +1 -1
  180. package/dist/navigation/zoomMotion.d.ts +1 -1
  181. package/dist/navigation/zoomMotion.js +2 -2
  182. package/dist/navigation/zoomTransition.js +3 -4
  183. package/dist/presentation/Presentation.d.ts +10 -9
  184. package/dist/presentation/Presentation.js +4 -3
  185. package/dist/presentation/model.d.ts +2 -1
  186. package/dist/presentation/presentationSource.js +1 -1
  187. package/dist/press/Pressable.d.ts +5 -1
  188. package/dist/press/Pressable.js +2 -0
  189. package/dist/press/stateMachine.d.ts +1 -1
  190. package/dist/public/Label.d.ts +2 -1
  191. package/dist/public/Label.js +2 -1
  192. package/dist/public/Screen.d.ts +4 -6
  193. package/dist/public/actions.d.ts +2 -1
  194. package/dist/public/actions.js +2 -1
  195. package/dist/public/buttonBorderShape.d.ts +2 -1
  196. package/dist/public/colors.d.ts +7 -4
  197. package/dist/public/colors.js +3 -2
  198. package/dist/public/controlStyle.d.ts +17 -14
  199. package/dist/public/controls.d.ts +29 -28
  200. package/dist/public/controls.js +25 -24
  201. package/dist/public/deviceActions.d.ts +6 -4
  202. package/dist/public/deviceActions.js +4 -2
  203. package/dist/public/environment.d.ts +16 -13
  204. package/dist/public/environment.js +11 -9
  205. package/dist/public/filePickers.d.ts +6 -4
  206. package/dist/public/filePickers.js +3 -2
  207. package/dist/public/glass.d.ts +8 -6
  208. package/dist/public/glass.js +2 -2
  209. package/dist/public/glassValue.d.ts +3 -4
  210. package/dist/public/glassValue.js +3 -4
  211. package/dist/public/keyboard.d.ts +4 -1
  212. package/dist/public/keyboard.js +2 -1
  213. package/dist/public/navigationTransition.d.ts +6 -6
  214. package/dist/public/navigationTransition.js +3 -3
  215. package/dist/public/presentation.d.ts +8 -7
  216. package/dist/public/presentation.js +5 -5
  217. package/dist/public/runtime.d.ts +9 -8
  218. package/dist/public/runtime.js +7 -7
  219. package/dist/public/scroll.d.ts +6 -3
  220. package/dist/public/scroll.js +3 -1
  221. package/dist/public/structure.d.ts +2 -2
  222. package/dist/public/toolbar.d.ts +15 -11
  223. package/dist/public/toolbar.js +13 -8
  224. package/dist/reachability/model.d.ts +4 -3
  225. package/dist/reachability/react.d.ts +4 -1
  226. package/dist/reachability/react.js +2 -1
  227. package/dist/root/SatinRoot.d.ts +3 -3
  228. package/dist/root/SatinRoot.js +12 -36
  229. package/dist/root/mountSatin.d.ts +1 -1
  230. package/dist/root/mountSatin.js +26 -35
  231. package/dist/root/runtimeContext.d.ts +2 -1
  232. package/dist/root/runtimeContext.js +2 -1
  233. package/dist/safe-area/Overlay.d.ts +3 -2
  234. package/dist/safe-area/Overlay.js +2 -1
  235. package/dist/safe-area/SafeAreaInset.d.ts +11 -7
  236. package/dist/safe-area/SafeAreaInset.js +10 -9
  237. package/dist/safe-area/context.d.ts +3 -3
  238. package/dist/safe-area/context.js +1 -1
  239. package/dist/safe-area/displayCorners.d.ts +4 -2
  240. package/dist/safe-area/displayCorners.js +4 -2
  241. package/dist/safe-area/modifiers.d.ts +14 -10
  242. package/dist/safe-area/modifiers.js +10 -6
  243. package/dist/safe-area/useSafeAreaMetrics.js +2 -2
  244. package/dist/scroll/ScrollSurface.d.ts +5 -5
  245. package/dist/scroll/ScrollSurface.js +6 -2
  246. package/dist/scroll/ScrollTarget.d.ts +1 -1
  247. package/dist/scroll/ScrollTarget.js +1 -1
  248. package/dist/scroll/edgePolicy.d.ts +2 -2
  249. package/dist/scroll/position.d.ts +5 -3
  250. package/dist/scroll/position.js +1 -1
  251. package/dist/scroll/screenGeometry.d.ts +1 -1
  252. package/dist/scroll/screenGeometry.js +1 -1
  253. package/dist/scroll/types.d.ts +1 -1
  254. package/dist/search/PadSearchDrawer.d.ts +7 -0
  255. package/dist/search/PadSearchDrawer.js +8 -0
  256. package/dist/search/PadSearchPresentationContext.d.ts +6 -0
  257. package/dist/search/PadSearchPresentationContext.js +4 -0
  258. package/dist/search/SearchDrawer.d.ts +1 -1
  259. package/dist/search/SearchDrawer.js +7 -2
  260. package/dist/search/SearchSuggestionsPopover.d.ts +6 -0
  261. package/dist/search/SearchSuggestionsPopover.js +42 -0
  262. package/dist/search/SearchToolbarField.d.ts +2 -1
  263. package/dist/search/SearchToolbarField.js +28 -7
  264. package/dist/search/padSearchBarMotion.d.ts +69 -0
  265. package/dist/search/padSearchBarMotion.js +73 -0
  266. package/dist/search/padSearchFieldSamples.json +491 -0
  267. package/dist/search/searchMotion.d.ts +1 -1
  268. package/dist/search/searchMotion.js +1 -1
  269. package/dist/search/searchPlacement.d.ts +3 -0
  270. package/dist/search/searchPlacement.js +7 -0
  271. package/dist/search/searchable.d.ts +14 -12
  272. package/dist/search/usePadSearchFieldMotion.d.ts +4 -0
  273. package/dist/search/usePadSearchFieldMotion.js +100 -0
  274. package/dist/search/useSearchPresentation.d.ts +2 -1
  275. package/dist/search/useSearchPresentation.js +24 -6
  276. package/dist/server.d.ts +4 -4
  277. package/dist/server.js +4 -4
  278. package/dist/shapes/corners.d.ts +3 -3
  279. package/dist/shapes/corners.js +2 -3
  280. package/dist/styles.css +8302 -8236
  281. package/dist/sw/vite.d.ts +4 -0
  282. package/dist/sw/vite.js +2 -0
  283. package/dist/symbols/Symbol.d.ts +7 -5
  284. package/dist/symbols/Symbol.js +5 -3
  285. package/dist/symbols/catalogue.d.ts +1 -1
  286. package/dist/symbols/types.d.ts +6 -4
  287. package/dist/tabs/TabSection.d.ts +3 -2
  288. package/dist/tabs/TabSection.js +2 -1
  289. package/dist/tabs/TabView.js +54 -51
  290. package/dist/tasks/useTask.d.ts +5 -4
  291. package/dist/tasks/useTask.js +4 -3
  292. package/dist/testing.d.ts +3 -2
  293. package/dist/testing.js +3 -2
  294. package/dist/text-input/TextEditor.js +7 -3
  295. package/dist/text-input/focusChain.d.ts +4 -3
  296. package/dist/text-input/focusChain.js +3 -2
  297. package/dist/text-input/kinds.d.ts +1 -1
  298. package/dist/web/WebView.d.ts +10 -3
  299. package/dist/web/WebView.js +3 -2
  300. package/dist/web/authentication.d.ts +12 -1
  301. package/dist/web/authentication.js +2 -1
  302. package/dist/web/openURL.d.ts +10 -4
  303. package/dist/web/openURL.js +4 -2
  304. package/dist/web/useWebAuthentication.d.ts +2 -1
  305. package/dist/web/useWebAuthentication.js +2 -1
  306. package/dist/zoom/Zoomable.d.ts +3 -3
  307. package/dist/zoom/Zoomable.js +2 -2
  308. package/package.json +4 -4
  309. package/dist/docs/swiftui-reference.md +0 -1895
@@ -1,19 +1,19 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import type { RowActionsProps } from '../actions/types.js';
3
- /** `EditMode`: whether a screen's lists show their editing controls. */
3
+ /** Whether a screen's lists show their editing controls: `active` or `inactive`. */
4
4
  export type EditMode = 'inactive' | 'active';
5
5
  /** A row's identity in `List` selection: the `ForEach` id. */
6
6
  export type ListItemID = string | number;
7
7
  /**
8
- * Every navigation destination owns one edit mode, as a SwiftUI `NavigationStack` destination does:
8
+ * Every navigation destination owns one edit mode, for its retained entry:
9
9
  * its `EditButton` and its lists read and write the same value, and another screen keeps its own.
10
10
  */
11
11
  export declare function EditModeScope({ children }: {
12
12
  children: ReactNode;
13
13
  }): import("react").JSX.Element;
14
14
  /**
15
- * `@Environment(\.editMode)`: this screen's edit mode and a setter. `EditButton` toggles
16
- * the same value, so a toolbar or bottom bar can follow it.
15
+ * Returns this screen's edit mode and a setter. `EditButton` toggles the same value, so a
16
+ * toolbar or bottom bar can follow it.
17
17
  *
18
18
  * @example
19
19
  * const [editMode] = useEditMode()
@@ -25,14 +25,14 @@ export type ListSelectionModel = Readonly<{
25
25
  /** `single` selects one row (an optional binding); `multiple` collects a set. */
26
26
  mode: 'single' | 'multiple';
27
27
  isSelected(id: ListItemID): boolean;
28
- /** A row tap: replaces a single selection; toggles a set only while editing, as SwiftUI does. */
28
+ /** A row tap: replaces a single selection; toggles a set only while editing. */
29
29
  activate(id: ListItemID, editing: boolean): void;
30
30
  }>;
31
31
  export declare const ListSelectionContext: import("react").Context<Readonly<{
32
32
  /** `single` selects one row (an optional binding); `multiple` collects a set. */
33
33
  mode: 'single' | 'multiple';
34
34
  isSelected(id: ListItemID): boolean;
35
- /** A row tap: replaces a single selection; toggles a set only while editing, as SwiftUI does. */
35
+ /** A row tap: replaces a single selection; toggles a set only while editing. */
36
36
  activate(id: ListItemID, editing: boolean): void;
37
37
  }> | null>;
38
38
  /**
@@ -58,10 +58,9 @@ export type ForEachEditing = Readonly<Pick<ForEachProps<{
58
58
  id: ListItemID;
59
59
  }>, 'onDelete' | 'onMove'>>;
60
60
  /**
61
- * `ForEach`: one row per element of `data`, identified by its `id` (or `id` function). In a
61
+ * Makes one row per element of `data`, identified by its `id` (or an `id` function). In a
62
62
  * `List`, `onDelete` adds swipe-to-delete and the editing delete control; `onMove` adds the
63
- * reorder handle. Both receive offsets into `data`; apply them with `removing` and
64
- * `moving`.
63
+ * reorder handle. Both receive offsets into `data`; apply them with `removing` and `moving`.
65
64
  *
66
65
  * Put `ForEach` directly in a `List` or `Section`: the list reads it to know each row's identity.
67
66
  *
@@ -82,7 +81,7 @@ export declare function forEachRows<T>(props: ForEachProps<T>): ForEachRow[];
82
81
  /** What an editable row needs from its list item: edit state, selection and the item's actions. */
83
82
  export type ListItemState = Readonly<{
84
83
  editing: boolean;
85
- /** While editing with a selection, a row's own press selects it, as a SwiftUI list row does. */
84
+ /** While editing with a selection, a row's own press selects it, as a list row does. */
86
85
  pressSelects: boolean;
87
86
  select(): void;
88
87
  /** Rows that also declare actions hand them to the item, which owns the row's one gesture host. */
@@ -94,7 +93,7 @@ export type RowActionsDelegation = RowActionsProps & Readonly<{
94
93
  }>;
95
94
  export declare const ListItemContext: import("react").Context<Readonly<{
96
95
  editing: boolean;
97
- /** While editing with a selection, a row's own press selects it, as a SwiftUI list row does. */
96
+ /** While editing with a selection, a row's own press selects it, as a list row does. */
98
97
  pressSelects: boolean;
99
98
  select(): void;
100
99
  /** Rows that also declare actions hand them to the item, which owns the row's one gesture host. */
@@ -3,7 +3,7 @@ import { createContext, Fragment, useContext, useMemo, useState } from 'react';
3
3
  const inactiveEverywhere = ['inactive', () => { }];
4
4
  const EditModeContext = createContext(inactiveEverywhere);
5
5
  /**
6
- * Every navigation destination owns one edit mode, as a SwiftUI `NavigationStack` destination does:
6
+ * Every navigation destination owns one edit mode, for its retained entry:
7
7
  * its `EditButton` and its lists read and write the same value, and another screen keeps its own.
8
8
  */
9
9
  export function EditModeScope({ children }) {
@@ -12,8 +12,8 @@ export function EditModeScope({ children }) {
12
12
  return _jsx(EditModeContext, { value: binding, children: children });
13
13
  }
14
14
  /**
15
- * `@Environment(\.editMode)`: this screen's edit mode and a setter. `EditButton` toggles
16
- * the same value, so a toolbar or bottom bar can follow it.
15
+ * Returns this screen's edit mode and a setter. `EditButton` toggles the same value, so a
16
+ * toolbar or bottom bar can follow it.
17
17
  *
18
18
  * @example
19
19
  * const [editMode] = useEditMode()
@@ -24,10 +24,9 @@ export function useEditMode() {
24
24
  }
25
25
  export const ListSelectionContext = createContext(null);
26
26
  /**
27
- * `ForEach`: one row per element of `data`, identified by its `id` (or `id` function). In a
27
+ * Makes one row per element of `data`, identified by its `id` (or an `id` function). In a
28
28
  * `List`, `onDelete` adds swipe-to-delete and the editing delete control; `onMove` adds the
29
- * reorder handle. Both receive offsets into `data`; apply them with `removing` and
30
- * `moving`.
29
+ * reorder handle. Both receive offsets into `data`; apply them with `removing` and `moving`.
31
30
  *
32
31
  * Put `ForEach` directly in a `List` or `Section`: the list reads it to know each row's identity.
33
32
  *
@@ -17,8 +17,8 @@ export declare function moving<T>(items: readonly T[], { fromOffsets, toOffset }
17
17
  toOffset: number;
18
18
  }): T[];
19
19
  /**
20
- * Swift `remove(atOffsets:)`, returning a new array without the elements at `offsets`. Pass it
21
- * exactly what `ForEach`'s `onDelete` reports.
20
+ * Returns a new array without the elements at `offsets`. Pass it exactly what `ForEach`'s
21
+ * `onDelete` reports.
22
22
  *
23
23
  * @example
24
24
  * <ForEach data={todos} onDelete={offsets => setTodos(todos => removing(todos, offsets))}>
@@ -22,8 +22,8 @@ export function moving(items, { fromOffsets, toOffset }) {
22
22
  return kept;
23
23
  }
24
24
  /**
25
- * Swift `remove(atOffsets:)`, returning a new array without the elements at `offsets`. Pass it
26
- * exactly what `ForEach`'s `onDelete` reports.
25
+ * Returns a new array without the elements at `offsets`. Pass it exactly what `ForEach`'s
26
+ * `onDelete` reports.
27
27
  *
28
28
  * @example
29
29
  * <ForEach data={todos} onDelete={offsets => setTodos(todos => removing(todos, offsets))}>
@@ -5,5 +5,6 @@ export declare function MediaPlayerRoot({ children, onActivityChange, }: {
5
5
  children: ReactNode;
6
6
  onActivityChange?: (active: boolean) => void;
7
7
  }): import("react").JSX.Element;
8
- /** Subscribe to the root-owned audio queue and system media commands. Video playback is not supported. */
8
+ /** Returns the app's audio player: its commands and its live state. The system's Lock Screen
9
+ * media controls drive the same player. Audio only; there is no video playback. */
9
10
  export declare function useMediaPlayer(): MediaPlayer;
@@ -17,7 +17,8 @@ export function MediaPlayerRoot({ children, onActivityChange, }) {
17
17
  }, [store]);
18
18
  return _jsx(MediaContext, { value: store, children: children });
19
19
  }
20
- /** Subscribe to the root-owned audio queue and system media commands. Video playback is not supported. */
20
+ /** Returns the app's audio player: its commands and its live state. The system's Lock Screen
21
+ * media controls drive the same player. Audio only; there is no video playback. */
21
22
  export function useMediaPlayer() {
22
23
  const store = useContext(MediaContext);
23
24
  if (!store)
@@ -1,4 +1,5 @@
1
- /** Each occurrence has its own entryId, including repeated songs. */
1
+ /** One item in the audio queue: its source URL, media id and display metadata. Each occurrence
2
+ * has its own `entryId`, so a repeated song appears twice. */
2
3
  export type MediaQueueEntry = Readonly<{
3
4
  entryId: string;
4
5
  mediaId: string;
@@ -22,7 +23,7 @@ export type MediaCommandResult = Readonly<{
22
23
  code: string;
23
24
  cause?: unknown;
24
25
  }>;
25
- /** The queue's repeat mode. */
26
+ /** The queue's repeat mode: `off`, `one` or `all`. */
26
27
  export type MediaRepeat = 'off' | 'one' | 'all';
27
28
  /** Everything the player shows: the queue, the current entry, status, position and modes. */
28
29
  export type MediaSnapshot = Readonly<{
@@ -60,7 +61,9 @@ export type MediaQueueOptions = Readonly<{
60
61
  position?: number;
61
62
  autoplay?: boolean;
62
63
  }>;
63
- /** Queue results acknowledge the transaction. Playback and seek results acknowledge observed completion. */
64
+ /** The audio player's commands: queue editing, transport, seek, repeat and shuffle. Queue
65
+ * commands resolve once the change is made; `play` and `seek` resolve once playback is seen to
66
+ * respond. */
64
67
  export interface MediaController {
65
68
  replaceQueue(entries: readonly MediaQueueEntry[], options?: MediaQueueOptions): Promise<MediaCommandResult>;
66
69
  play(): Promise<MediaCommandResult>;
@@ -1,12 +1,14 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import { Transition } from './transition.js';
3
+ /** Whether the content is visible, the transition to use and the content. */
3
4
  export type TransitionViewProps = Readonly<{
4
5
  visible: boolean;
5
6
  transition?: Transition;
6
7
  children: ReactNode;
7
8
  }>;
8
- /** Keep this boundary mounted; change visible inside withAnimation. Removed content
9
- * stays mounted and inert until its exit finishes. Initial content does not animate.
9
+ /** Shows or hides its content with a transition when `visible` changes inside `withAnimation`.
10
+ * Keep the view itself mounted. Hidden content stays mounted and inert until its exit finishes,
11
+ * and the first render does not animate.
10
12
  * @experimental General transitions still require installed-device motion qualification.
11
13
  */
12
14
  export declare function TransitionView({ visible, transition, children, }: TransitionViewProps): import("react").JSX.Element;
@@ -22,8 +22,9 @@ function frame(pose) {
22
22
  opacity: Math.max(0, Math.min(1, pose.opacity)),
23
23
  };
24
24
  }
25
- /** Keep this boundary mounted; change visible inside withAnimation. Removed content
26
- * stays mounted and inert until its exit finishes. Initial content does not animate.
25
+ /** Shows or hides its content with a transition when `visible` changes inside `withAnimation`.
26
+ * Keep the view itself mounted. Hidden content stays mounted and inert until its exit finishes,
27
+ * and the first render does not animate.
27
28
  * @experimental General transitions still require installed-device motion qualification.
28
29
  */
29
30
  export function TransitionView({ visible, transition = Transition.opacity, children, }) {
@@ -4,14 +4,14 @@ declare const brand: unique symbol;
4
4
  export type Animation = Readonly<{
5
5
  [brand]: true;
6
6
  }>;
7
- /** Duration and bounce options for `Animation.spring`. */
7
+ /** A spring's duration in milliseconds and its bounce, for `Animation.spring`. */
8
8
  export type SpringOptions = Readonly<{
9
9
  /** The perceptual duration in milliseconds. Defaults to 500. */
10
10
  durationMs?: number;
11
11
  /** 0 settles without overshoot. Values are clamped to 0 through 0.99. Defaults to 0. */
12
12
  bounce?: number;
13
13
  }>;
14
- /** SwiftUI's named springs. `default` is the curve `withAnimation` uses with no argument. */
14
+ /** Named spring timing values. `default` is the curve `withAnimation` uses with no argument. */
15
15
  export declare const Animation: Readonly<{
16
16
  spring: (options?: SpringOptions) => Animation;
17
17
  smooth: Animation;
@@ -1,8 +1,8 @@
1
1
  const brand = Symbol('satin.animation');
2
2
  /**
3
- * SwiftUI's `spring(duration:bounce:)` mapping, as Apple documents it: the duration is the
3
+ * Duration is the
4
4
  * period of the undamped spring (omega = 2π / duration), and bounce is 1 − damping ratio for
5
- * bounce ≥ 0. SwiftUI's negative (over-damped) bounces are not offered: the shared spring
5
+ * bounce ≥ 0. Negative, over-damped bounces are not offered: the shared spring
6
6
  * solver (glass/lens/menuSpring.ts) models damping ratios up to 1.
7
7
  */
8
8
  function spring({ durationMs = 500, bounce = 0 } = {}) {
@@ -15,24 +15,23 @@ function spring({ durationMs = 500, bounce = 0 } = {}) {
15
15
  const animation = Object.freeze({ [brand]: true, omega, zeta });
16
16
  return animation;
17
17
  }
18
- /** SwiftUI's named springs. `default` is the curve `withAnimation` uses with no argument. */
18
+ /** Named spring timing values. `default` is the curve `withAnimation` uses with no argument. */
19
19
  export const Animation = Object.freeze({
20
20
  spring,
21
- /** SwiftUI `.smooth`: duration 0.5 s, bounce 0. */
21
+ /** Smooth spring: duration 0.5 s, bounce 0. */
22
22
  smooth: spring({ durationMs: 500, bounce: 0 }),
23
- /** SwiftUI `.snappy`: duration 0.5 s, bounce 0.15. */
23
+ /** Snappy spring: duration 0.5 s, bounce 0.15. */
24
24
  snappy: spring({ durationMs: 500, bounce: 0.15 }),
25
- /** SwiftUI `.bouncy`: duration 0.5 s, bounce 0.3. */
25
+ /** Bouncy spring: duration 0.5 s, bounce 0.3. */
26
26
  bouncy: spring({ durationMs: 500, bounce: 0.3 }),
27
- /** SwiftUI `.default`. The value is the measured fit recorded in the measured reference
27
+ /** Default spring. The value is the measured fit recorded in the measured reference
28
28
  * (matchedGeometryEffect, October 11); see DEFAULT_ANIMATION_DURATION_MS. */
29
29
  get default() {
30
30
  return defaultAnimation;
31
31
  },
32
32
  });
33
- /* The perceptual duration of SwiftUI's `.default` animation on iOS 27, which is a critically
34
- * damped spring. Source: the stock SwiftUI matchedGeometryEffect fixture recorded by the
35
- * matched-geometry implementation (the measured reference, October 11). */
33
+ /* Default perceptual duration for the critically damped animation spring. The measured
34
+ * fit and recording provenance live in the measured reference. */
36
35
  export const DEFAULT_ANIMATION_DURATION_MS = 500;
37
36
  const defaultAnimation = spring({ durationMs: DEFAULT_ANIMATION_DURATION_MS, bounce: 0 });
38
37
  /** The spring with a unit displacement and the given initial velocity (units per second). */
@@ -1,11 +1,12 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import { Animation } from './animationValue.js';
3
3
  declare const namespaceBrand: unique symbol;
4
- /** `Namespace.ID`: the scope `MatchedGeometryEffect` ids are matched within. */
4
+ /** A scope for matched-geometry ids. Two views match only if they share an id and a namespace. */
5
5
  export type NamespaceID = Readonly<{
6
6
  [namespaceBrand]: true;
7
7
  }>;
8
- /** `@Namespace`: a stable id scope for `MatchedGeometryEffect`, one per component. */
8
+ /** Returns a namespace that stays the same for the life of the component. Pass it to
9
+ * `MatchedGeometryEffect` and `MatchedTransitionSource`. */
9
10
  export declare function useNamespace(): NamespaceID;
10
11
  /**
11
12
  * A namespace declared once at module scope, for views that share no parent component: a
@@ -16,7 +17,7 @@ export declare function useNamespace(): NamespaceID;
16
17
  * @experimental Shared by the zoom navigation transition.
17
18
  */
18
19
  export declare function defineNamespace(): NamespaceID;
19
- /** Props of `MatchedGeometryEffect`. */
20
+ /** The effect's id and namespace, whether it is the source, and the one element it wraps. */
20
21
  export type MatchedGeometryEffectProps = Readonly<{
21
22
  /** Views with the same id in the same namespace are one view in two places. */
22
23
  id: string;
@@ -27,26 +28,26 @@ export type MatchedGeometryEffectProps = Readonly<{
27
28
  children: ReactNode;
28
29
  }>;
29
30
  /**
30
- * SwiftUI `matchedGeometryEffect(id:in:isSource:)`: when a `withAnimation` change removes this
31
+ * When a `withAnimation` change removes this
31
32
  * view and inserts another with the same id, the new one moves from the old one's frame to its
32
33
  * own while the two cross-fade. A view that only moves or resizes
33
34
  * animates from where it was. A matched view with no partner fades in or out.
34
35
  *
35
36
  * Wrap one element that has no transform of its own. Changes made outside `withAnimation`
36
- * apply at once, as in SwiftUI.
37
+ * apply at once.
37
38
  * @example
38
39
  * const art = useNamespace()
39
40
  * <MatchedGeometryEffect id="artwork" in={art}><Image src={cover} alt="" /></MatchedGeometryEffect>
40
- * @experimental Frame matching only (SwiftUI's default `properties: .frame`, `anchor: .center`).
41
+ * @experimental Matches the frame around its center only.
41
42
  * A non-source view does not follow its source outside an animation.
42
43
  */
43
44
  export declare function MatchedGeometryEffect({ id, in: namespace, isSource, children, }: MatchedGeometryEffectProps): import("react").JSX.Element;
44
45
  /**
45
- * `withAnimation` applies the state changes in `update`, then animates the
46
+ * Applies the state changes in `update`, then animates the
46
47
  * `MatchedGeometryEffect` views they move, insert or remove. Call it from an event handler.
47
48
  * Keyed List rows also move to their new positions. Other views take their new layout at once.
48
- * Returns the callback result and propagates errors. Only synchronous updates participate.
49
- * Nested calls share the outer List transaction; per-update nested timing is not supported.
49
+ * Returns the callback result and passes errors through. Only synchronous updates take part,
50
+ * and nested calls join the outer one.
50
51
  * @example
51
52
  * <Button onPress={() => withAnimation(() => setShowQueue(!showQueue))}>Playing Next</Button>
52
53
  */
@@ -17,13 +17,13 @@ import { fadeSettleMs, runFrameTimes, sampleChannel, sampleProgress, } from './s
17
17
  *
18
18
  * A view whose id leaves and enters in the same change keeps its identity: the new view starts
19
19
  * from the old one's frame and fades in, and the old view stays on screen as a "ghost" (its own
20
- * detached DOM node, already decoded) that travels with it and fades out. That cross-fade is
21
- * SwiftUI's: a stock iOS 27 fixture shows both views on one frame, with opacities that sum to 1
22
- * on the animation's own spring (the measured reference, October 11).
20
+ * detached DOM node, already decoded) that travels with it and fades out. Their opacities sum to 1
21
+ * throughout the spring-driven cross-fade. Measurement provenance lives in the measured reference.
23
22
  */
24
23
  const namespaceBrand = Symbol('satin.namespace');
25
24
  const entries = new Set();
26
- /** `@Namespace`: a stable id scope for `MatchedGeometryEffect`, one per component. */
25
+ /** Returns a namespace that stays the same for the life of the component. Pass it to
26
+ * `MatchedGeometryEffect` and `MatchedTransitionSource`. */
27
27
  export function useNamespace() {
28
28
  const [namespace] = useState(defineNamespace);
29
29
  return namespace;
@@ -40,17 +40,17 @@ export function defineNamespace() {
40
40
  return Object.freeze({ [namespaceBrand]: true });
41
41
  }
42
42
  /**
43
- * SwiftUI `matchedGeometryEffect(id:in:isSource:)`: when a `withAnimation` change removes this
43
+ * When a `withAnimation` change removes this
44
44
  * view and inserts another with the same id, the new one moves from the old one's frame to its
45
45
  * own while the two cross-fade. A view that only moves or resizes
46
46
  * animates from where it was. A matched view with no partner fades in or out.
47
47
  *
48
48
  * Wrap one element that has no transform of its own. Changes made outside `withAnimation`
49
- * apply at once, as in SwiftUI.
49
+ * apply at once.
50
50
  * @example
51
51
  * const art = useNamespace()
52
52
  * <MatchedGeometryEffect id="artwork" in={art}><Image src={cover} alt="" /></MatchedGeometryEffect>
53
- * @experimental Frame matching only (SwiftUI's default `properties: .frame`, `anchor: .center`).
53
+ * @experimental Matches the frame around its center only.
54
54
  * A non-source view does not follow its source outside an animation.
55
55
  */
56
56
  export function MatchedGeometryEffect({ id, in: namespace, isSource = true, children, }) {
@@ -226,13 +226,13 @@ function moveView(element, key, from, box, animation) {
226
226
  target: box,
227
227
  velocity: from.velocity,
228
228
  animation,
229
- // A new partner fades in (SwiftUI's default .opacity insertion); a view that stays carries
229
+ // A new partner fades in through the default opacity transition; a view that stays carries
230
230
  // on from the opacity it is showing.
231
231
  opacity: { from: stayed ? from.opacity : 0, to: 1 },
232
232
  ghost: false,
233
233
  });
234
234
  }
235
- /** SwiftUI's default `.opacity` transition for a matched view with no partner. */
235
+ /** An opacity transition for a matched view with no partner. */
236
236
  function fadeView(element, key, box, animation, opacity) {
237
237
  startRun({
238
238
  element,
@@ -1,6 +1,5 @@
1
1
  import { type MenuSpring } from '../glass/lens/menuSpring.js';
2
- /** A measured spring: SwiftUI's `.interpolatingSpring(stiffness:damping:)` with unit mass, released
3
- * `delay` ms after the animation starts. */
2
+ /** A unit-mass spring defined by stiffness and damping, released after an optional delay in ms. */
4
3
  export type SpringParameters = Readonly<{
5
4
  stiffness: number;
6
5
  damping: number;
@@ -28,19 +28,22 @@ export function sampledKeyframes(track, frame) {
28
28
  return track.progress.map((progress, index) => ({ ...frame(progress), offset: index / last }));
29
29
  }
30
30
  export function sampledMotionTrack(duration, sample, tolerance = 0.2) {
31
- if (!(duration > 0) || !Number.isFinite(duration) || !(tolerance > 0) || !Number.isFinite(tolerance))
31
+ if (!(duration > 0) ||
32
+ !Number.isFinite(duration) ||
33
+ !(tolerance > 0) ||
34
+ !Number.isFinite(tolerance))
32
35
  throw Error('Motion tracks require a finite positive duration and tolerance');
33
36
  let count = Math.max(1, Math.ceil(duration / (1000 / 120)));
34
37
  // GPU and compositor consumers require even offsets. Refine the whole grid,
35
38
  // rather than giving them independent adaptive sample positions.
36
39
  while (count <= 4096) {
37
- const values = Array.from({ length: count + 1 }, (_, index) => sample(duration * index / count));
40
+ const values = Array.from({ length: count + 1 }, (_, index) => sample((duration * index) / count));
38
41
  if (!values.every(Number.isFinite))
39
42
  throw Error('Motion track contains a non-finite value');
40
43
  let accurate = true;
41
44
  for (let index = 0; accurate && index < count; index++) {
42
45
  for (const fraction of [0.25, 0.5, 0.75]) {
43
- const exact = sample(duration * (index + fraction) / count);
46
+ const exact = sample((duration * (index + fraction)) / count);
44
47
  const linear = values[index] + (values[index + 1] - values[index]) * fraction;
45
48
  if (!Number.isFinite(exact))
46
49
  throw Error('Motion track contains a non-finite value');
@@ -59,11 +62,13 @@ export function sampledMotionTrack(duration, sample, tolerance = 0.2) {
59
62
  /** Read the submitted segment, including its velocity, when a run is interrupted. */
60
63
  export function sampledMotionState(track, milliseconds) {
61
64
  const last = track.values.length - 1;
62
- const position = Math.max(0, Math.min(last, milliseconds / track.duration * last));
65
+ const position = Math.max(0, Math.min(last, (milliseconds / track.duration) * last));
63
66
  const index = Math.min(last - 1, Math.floor(position));
64
67
  const from = track.values[index], to = track.values[index + 1];
65
68
  return {
66
69
  value: from + (to - from) * (position - index),
67
- velocity: milliseconds < 0 || milliseconds >= track.duration ? 0 : (to - from) * last / track.duration * 1000,
70
+ velocity: milliseconds < 0 || milliseconds >= track.duration
71
+ ? 0
72
+ : (((to - from) * last) / track.duration) * 1000,
68
73
  };
69
74
  }
@@ -9,7 +9,8 @@ type Effect = Readonly<{
9
9
  kind: 'move';
10
10
  edge: TransitionEdge;
11
11
  }>;
12
- /** Immutable insertion and removal effects. Timing belongs to withAnimation. */
12
+ /** How a view enters and leaves: opacity, scale and move effects. `withAnimation` sets the
13
+ * timing. */
13
14
  export type Transition = Readonly<{
14
15
  insertion: readonly Effect[];
15
16
  removal: readonly Effect[];
@@ -18,6 +19,8 @@ declare function move(edge: TransitionEdge): Transition;
18
19
  declare function scale(value?: number): Transition;
19
20
  declare function asymmetric(insertion: Transition, removal: Transition): Transition;
20
21
  declare function combined(...transitions: readonly Transition[]): Transition;
22
+ /** Builds transitions: `identity`, `opacity`, `move`, `scale`, `slide`, `push` and their
23
+ * combinations. Each returns a new value. */
21
24
  export declare const Transition: Readonly<{
22
25
  identity: Readonly<{
23
26
  insertion: readonly Effect[];
@@ -19,6 +19,8 @@ function combined(...transitions) {
19
19
  return effects(transitions.flatMap(value => value.insertion), transitions.flatMap(value => value.removal));
20
20
  }
21
21
  const opacity = effects([{ kind: 'opacity' }]);
22
+ /** Builds transitions: `identity`, `opacity`, `move`, `scale`, `slide`, `push` and their
23
+ * combinations. Each returns a new value. */
22
24
  export const Transition = Object.freeze({
23
25
  identity: effects([]),
24
26
  opacity,
@@ -1,5 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
- /** Regular-width grouped detail content beneath NavigatorHost's inline title. */
2
+ /** A grouped list of rows for a split view's detail column at regular width. */
3
3
  export declare function DetailList({ items, }: {
4
4
  items: readonly {
5
5
  id: string;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { ScrollSurface } from '../scroll/ScrollSurface.js';
3
3
  import { Pressable } from '../press/Pressable.js';
4
- /** Regular-width grouped detail content beneath NavigatorHost's inline title. */
4
+ /** A grouped list of rows for a split view's detail column at regular width. */
5
5
  export function DetailList({ items, }) {
6
6
  return (_jsx(ScrollSurface, { id: "detail", axis: "vertical", primary: true, "data-satin-detail-list": "true", children: _jsx("div", { "data-satin-detail-group": "true", children: items.map(item => item.onPress ? (_jsx(Pressable, { feedback: "row", "data-satin-detail-row": "true", onPress: item.onPress, children: item.label }, item.id)) : (_jsx("div", { "data-satin-detail-row": "true", children: item.label }, item.id))) }) }));
7
7
  }
@@ -130,7 +130,7 @@ export function ScreenContainer({ children, entry, interactionBlocked = false, c
130
130
  }), [entry.key, entry.params, entry.transition.phase, isCovered, scrollRegistry, tabActive]);
131
131
  useLayoutEffect(() => navigator[navigatorScrollRuntime].bind(entry.key, scrollRegistry), [entry.key, navigator, scrollRegistry]);
132
132
  // Without a primary scroll view, content is laid out in the safe area below the bar, as a
133
- // SwiftUI VStack is (styles.css). The attribute follows the registry in the same frame.
133
+ // VStack is (styles.css). The attribute follows the registry in the same frame.
134
134
  // The primary's vertical scroll indicator is drawn in the screen frame (scroll/scrollIndicator.ts).
135
135
  const motionLayer = useRef(null);
136
136
  const indicatorTrack = useRef(null);
@@ -1,10 +1,12 @@
1
1
  import { type ReactNode } from 'react';
2
+ /** One sidebar destination: its id, label, optional icon and disabled state. */
2
3
  export type SidebarEntry = Readonly<{
3
4
  id: string;
4
5
  label: string;
5
6
  icon?: ReactNode;
6
7
  disabled?: boolean;
7
8
  }>;
9
+ /** The sidebar's entries, the selection callback and which entry starts selected. */
8
10
  export type SidebarProps = Readonly<{
9
11
  entries: readonly SidebarEntry[];
10
12
  onSelect: (id: string) => void;
@@ -12,5 +14,5 @@ export type SidebarProps = Readonly<{
12
14
  /** First enabled entry by default, false for an empty detail, or an explicit entry id. */
13
15
  initialSelection?: 'first' | false | string;
14
16
  }>;
15
- /** Ordered sidebar destinations, sharing NavigatorHost's canonical detail selection. */
17
+ /** A list of sidebar destinations. Selecting one shows it in the split view's detail column. */
16
18
  export declare function Sidebar({ entries, onSelect, section, initialSelection }: SidebarProps): import("react").JSX.Element;
@@ -4,7 +4,7 @@ import { Pressable } from '../press/Pressable.js';
4
4
  import { ScrollSurface } from '../scroll/ScrollSurface.js';
5
5
  import { SplitContext } from './splitContext.js';
6
6
  import { chooseSidebarInitialEntry } from './sidebarSelection.js';
7
- /** Ordered sidebar destinations, sharing NavigatorHost's canonical detail selection. */
7
+ /** A list of sidebar destinations. Selecting one shows it in the split view's detail column. */
8
8
  export function Sidebar({ entries, onSelect, section, initialSelection = 'first' }) {
9
9
  const split = useContext(SplitContext);
10
10
  useLayoutEffect(() => {
@@ -1,4 +1,5 @@
1
- /** Framework7 Icons (MIT), through the shared SymbolImage renderer. */
1
+ /** Draws the sidebar's `gearshape` or `sidebar.left` icon with `SymbolImage`. The artwork is from
2
+ * Framework7 Icons (MIT). */
2
3
  export declare function SidebarSymbol({ name }: {
3
4
  name: 'gearshape' | 'sidebar.left';
4
5
  }): import("react").JSX.Element;
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { SymbolImage } from '../symbols/Symbol.js';
3
- /** Framework7 Icons (MIT), through the shared SymbolImage renderer. */
3
+ /** Draws the sidebar's `gearshape` or `sidebar.left` icon with `SymbolImage`. The artwork is from
4
+ * Framework7 Icons (MIT). */
4
5
  export function SidebarSymbol({ name }) {
5
6
  return _jsx(SymbolImage, { name: name, "data-satin-sidebar-symbol": name });
6
7
  }
@@ -1,7 +1,7 @@
1
1
  // Measured iOS 27 navigation bar chrome curves (what bar items do while a page moves) and the
2
2
  // keyframe builders that turn them into Web Animations keyframes. Pure data and math: no DOM.
3
3
  /** Incoming bar chrome, measured on the iOS 27.0 Simulator from the presentation layers of stock
4
- * SwiftUI (every display frame,
4
+ * Measured at every display frame,
5
5
  * light and dark agree within 0.04): milliseconds since the page starts moving. A push brings the
6
6
  * destination's glass items in faster than a pop brings the revealed screen's back: a push shows
7
7
  * 0.56 at 100 ms (Reminders-style list → list, back circle and trailing "…" together), a pop 0.30
@@ -17,6 +17,7 @@ export declare function useNavigator<Registry extends ScreenRegistry = ScreenReg
17
17
  export declare function useNavigatorState<Registry extends ScreenRegistry = ScreenRegistry>(): NavigatorState<RegistryScreenEntry<Registry>>;
18
18
  export declare function useParams<Params = unknown>(): Params;
19
19
  export declare function useScreenScrollRegistry(): ScrollSurfaceRegistry;
20
- /** `onAppear` and `onDisappear`: callbacks for a retained navigation entry's visible lifecycle. */
20
+ /** Runs `appear` and `disappear` callbacks as the screen is shown and covered or removed, and
21
+ * returns whether it is covered and its transition phase. */
21
22
  export declare function useScreenLifecycle(callbacks?: ScreenLifecycleCallbacks): ScreenLifecycle;
22
23
  export {};
@@ -44,7 +44,8 @@ export function useScreenScrollRegistry() {
44
44
  }
45
45
  return standalone.current;
46
46
  }
47
- /** `onAppear` and `onDisappear`: callbacks for a retained navigation entry's visible lifecycle. */
47
+ /** Runs `appear` and `disappear` callbacks as the screen is shown and covered or removed, and
48
+ * returns whether it is covered and its transition phase. */
48
49
  export function useScreenLifecycle(callbacks = EMPTY_LIFECYCLE_CALLBACKS) {
49
50
  const screen = useContext(ScreenContext);
50
51
  if (!screen) {
@@ -13,5 +13,6 @@ export declare const SplitContext: import("react").Context<Readonly<{
13
13
  entry: ScreenEntry | undefined;
14
14
  identity: string | undefined;
15
15
  }> | undefined>;
16
- /** Entry identity owns navigation/scroll; identity is the registry's semantic row key. */
16
+ /** Returns the split view's mode and the entry shown in its detail column. It throws outside a
17
+ * split view. */
17
18
  export declare function useSplitSelection(): SplitSelection;
@@ -1,6 +1,7 @@
1
1
  import { createContext, useContext } from 'react';
2
2
  export const SplitContext = createContext(undefined);
3
- /** Entry identity owns navigation/scroll; identity is the registry's semantic row key. */
3
+ /** Returns the split view's mode and the entry shown in its detail column. It throws outside a
4
+ * split view. */
4
5
  export function useSplitSelection() {
5
6
  const selection = useContext(SplitContext);
6
7
  if (!selection)
@@ -1,8 +1,9 @@
1
- /** `ToolbarMinimizationBehavior`: when a toolbar may minimize. */
1
+ /** When the navigation bar minimizes: `onScrollDown`, `onScrollUp` or `never`. */
2
2
  export type ToolbarMinimizationBehavior = 'onScrollDown' | 'onScrollUp' | 'never';
3
- /** The interaction that restores a minimized toolbar. */
3
+ /** What brings back a minimized bar: `automatic`, or only reaching the scroll edge
4
+ * (`atScrollEdge`). */
4
5
  export type ToolbarMinimizationRestoration = 'automatic' | 'atScrollEdge';
5
- /** Whether toolbar minimization changes its reserved content inset. */
6
+ /** Whether the content inset shrinks when the bar minimizes. */
6
7
  export type ToolbarMinimizationSafeAreaAdjustment = 'automatic' | 'enabled' | 'disabled';
7
8
  export declare function nextToolbarMinimization(minimized: boolean, previousOffset: number, offset: number, behavior: ToolbarMinimizationBehavior, restoration?: ToolbarMinimizationRestoration): boolean;
8
9
  /** Bind only an elected primary. Compensate released inset so its content does not jump. */