@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.
- package/NOTICE +2 -2
- package/README.md +2 -3
- package/dist/acknowledgements/inventory.json +5 -5
- package/dist/actions/RowActions.d.ts +4 -4
- package/dist/actions/RowActions.js +93 -27
- package/dist/actions/fullSwipeContact.d.ts +73 -0
- package/dist/actions/fullSwipeContact.js +186 -0
- package/dist/actions/rowScrub.d.ts +7 -4
- package/dist/actions/rowScrub.js +39 -37
- package/dist/actions/types.d.ts +13 -7
- package/dist/app/InstallComponents.d.ts +4 -7
- package/dist/app/InstallComponents.js +7 -7
- package/dist/app/InstallationDiagnostics.d.ts +2 -1
- package/dist/app/InstallationDiagnostics.js +2 -1
- package/dist/app/appearance.d.ts +5 -3
- package/dist/app/appearance.js +5 -3
- package/dist/app/appearanceStore.d.ts +3 -2
- package/dist/app/buildInfo.d.ts +4 -4
- package/dist/app/buildInfo.js +2 -2
- package/dist/app/definition.d.ts +11 -3
- package/dist/app/definition.js +2 -0
- package/dist/app/head.d.ts +2 -1
- package/dist/app/head.js +13 -16
- package/dist/app/inlineCSP.d.ts +6 -0
- package/dist/app/inlineCSP.js +25 -0
- package/dist/app/install.d.ts +1 -0
- package/dist/app/install.js +5 -2
- package/dist/app/installCheck.js +32 -86
- package/dist/app/installContext.d.ts +10 -5
- package/dist/app/installContext.js +2 -0
- package/dist/app/installCustom.js +1 -0
- package/dist/app/installExperience.js +0 -60
- package/dist/app/installationFailure.d.ts +3 -2
- package/dist/app/installationFailure.js +1 -1
- package/dist/app/launchScreen.d.ts +6 -2
- package/dist/app/launchScreen.js +104 -1
- package/dist/app/launchScreenRuntime.d.ts +31 -4
- package/dist/app/launchScreenRuntime.js +150 -22
- package/dist/app/launchWatchdog.js +25 -65
- package/dist/app/platformScripts.js +11 -0
- package/dist/app/styles.d.ts +3 -0
- package/dist/app/styles.js +42 -0
- package/dist/app/viewportValue.d.ts +2 -1
- package/dist/app/vite.d.ts +4 -0
- package/dist/app/vite.js +22 -24
- package/dist/content/content.d.ts +35 -30
- package/dist/content/content.js +19 -16
- package/dist/content/layout.d.ts +10 -2
- package/dist/content/layout.js +4 -2
- package/dist/content/scaledMetric.d.ts +2 -1
- package/dist/content/scaledMetric.js +2 -1
- package/dist/controls/ColorPicker.d.ts +2 -4
- package/dist/controls/ColorPicker.js +2 -4
- package/dist/controls/DatePicker.d.ts +4 -4
- package/dist/controls/DatePicker.js +2 -2
- package/dist/controls/ProgressView.d.ts +4 -4
- package/dist/controls/ProgressView.js +1 -2
- package/dist/controls/civilDate.d.ts +1 -1
- package/dist/controls/civilDate.js +1 -1
- package/dist/data/database.d.ts +9 -8
- package/dist/data/database.js +4 -4
- package/dist/docs/components/file-importer.md +1 -1
- package/dist/docs/components/paste-button.md +1 -1
- package/dist/docs/components/photos-picker.md +1 -1
- package/dist/docs/components/share-link.md +1 -1
- package/dist/docs/limitations.md +1 -1
- package/dist/docs/push.md +3 -3
- package/dist/docs/reference.md +1888 -0
- package/dist/docs/tailwind.md +76 -0
- package/dist/docs/tokens.md +1 -1
- package/dist/gestures/GestureView.d.ts +3 -1
- package/dist/gestures/GestureView.js +2 -1
- package/dist/gestures/gesture.d.ts +22 -2
- package/dist/gestures/gesture.js +7 -2
- package/dist/glass/GlassEffect.d.ts +2 -1
- package/dist/glass/GlassEffect.js +2 -1
- package/dist/glass/GlassPresentation.d.ts +1 -0
- package/dist/glass/GlassPresentation.js +21 -4
- package/dist/glass/TabBar.js +23 -1
- package/dist/glass/errorAlert.js +2 -1
- package/dist/glass/errors.d.ts +3 -1
- package/dist/glass/fallback/runtime.d.ts +1 -0
- package/dist/glass/fallback/runtime.js +8 -1
- package/dist/glass/lens/controlLift.d.ts +1 -1
- package/dist/glass/lens/controlLift.js +1 -1
- package/dist/glass/lens/interactivePress.d.ts +2 -2
- package/dist/glass/lens/interactivePress.js +2 -2
- package/dist/glass/lens/menu-opening-native-fits.json +1 -1
- package/dist/glass/lens/menuContextFit.json +1 -1
- package/dist/glass/lens/menuDropFit.json +1 -1
- package/dist/glass/lens/menuField.d.ts +2 -2
- package/dist/glass/lens/menuField.js +3 -3
- package/dist/glass/lens/menuGlyphDropFit.json +1 -1
- package/dist/glass/lens/menuMorphFit.json +1 -1
- package/dist/glass/lens/menuMorphPhoneFit.json +1 -1
- package/dist/glass/lens/tabAccessoryMotion.d.ts +1 -1
- package/dist/glass/lens/tabSearchMember.d.ts +1 -1
- package/dist/glass/lens/tabSearchMember.js +1 -1
- package/dist/glass/liquidContext.d.ts +2 -0
- package/dist/glass/menuPresenter.d.ts +2 -0
- package/dist/glass/menuPresenter.js +1 -1
- package/dist/glass/regions.d.ts +3 -2
- package/dist/glass/regions.js +1 -1
- package/dist/glass/renderSpecs.d.ts +1 -0
- package/dist/glass/renderSpecs.js +1 -0
- package/dist/glass/shapeTrack.d.ts +1 -1
- package/dist/glass/submenuMotion.d.ts +1 -1
- package/dist/glass/submenuMotion.js +1 -1
- package/dist/glass/webgpu/controlRim.d.ts +29 -0
- package/dist/glass/webgpu/controlRim.js +68 -0
- package/dist/glass/webgpu/entry.worker.js +3 -6
- package/dist/glass/webgpu/frameClock.d.ts +6 -2
- package/dist/glass/webgpu/frameClock.js +9 -2
- package/dist/glass/webgpu/frameProbe.d.ts +1 -1
- package/dist/glass/webgpu/frameProbe.js +3 -3
- package/dist/glass/webgpu/passes.d.ts +2 -2
- package/dist/glass/webgpu/production.d.ts +1 -0
- package/dist/glass/webgpu/production.js +31 -1
- package/dist/glass/webgpu/raster.d.ts +18 -0
- package/dist/glass/webgpu/raster.js +105 -15
- package/dist/glass/webgpu/rasterMaterial.d.ts +4 -0
- package/dist/glass/webgpu/rasterMaterial.js +17 -1
- package/dist/glass/webgpu/rasterUniforms.js +9 -0
- package/dist/glass/webgpu/regionScene.d.ts +4 -1
- package/dist/glass/webgpu/regionScene.js +30 -1
- package/dist/glass/webgpu/renderer.js +23 -7
- package/dist/glass/webgpu/shaders.d.ts +2 -2
- package/dist/glass/webgpu/shaders.js +5 -1
- package/dist/haptics/SensoryButton.d.ts +4 -4
- package/dist/haptics/SensoryButton.js +3 -3
- package/dist/image/Image.d.ts +6 -3
- package/dist/image/Image.js +4 -3
- package/dist/image/asset.d.ts +2 -1
- package/dist/keyboard/adapter.d.ts +3 -4
- package/dist/keyboard/adapter.js +2 -2
- package/dist/keyboard/avoidance.d.ts +1 -1
- package/dist/keyboard/avoidance.js +1 -1
- package/dist/keyboard/geometry.d.ts +1 -1
- package/dist/keyboard/motion.d.ts +1 -1
- package/dist/keyboard/motion.js +1 -1
- package/dist/list-form/ListForm.d.ts +10 -9
- package/dist/list-form/ListForm.js +3 -3
- package/dist/list-form/ListItem.js +1 -1
- package/dist/list-form/RowLabel.d.ts +1 -1
- package/dist/list-form/RowLabel.js +1 -1
- package/dist/list-form/Slider.js +1 -1
- package/dist/list-form/editMotion.js +1 -1
- package/dist/list-form/editing.d.ts +10 -11
- package/dist/list-form/editing.js +5 -6
- package/dist/list-form/offsets.d.ts +2 -2
- package/dist/list-form/offsets.js +2 -2
- package/dist/media/react.d.ts +2 -1
- package/dist/media/react.js +2 -1
- package/dist/media/types.d.ts +6 -3
- package/dist/motion/TransitionView.d.ts +4 -2
- package/dist/motion/TransitionView.js +3 -2
- package/dist/motion/animationValue.d.ts +2 -2
- package/dist/motion/animationValue.js +9 -10
- package/dist/motion/matchedGeometry.d.ts +10 -9
- package/dist/motion/matchedGeometry.js +9 -9
- package/dist/motion/springTrack.d.ts +1 -2
- package/dist/motion/springTrack.js +10 -5
- package/dist/motion/transition.d.ts +4 -1
- package/dist/motion/transition.js +2 -0
- package/dist/navigation/DetailList.d.ts +1 -1
- package/dist/navigation/DetailList.js +1 -1
- package/dist/navigation/ScreenContainer.js +1 -1
- package/dist/navigation/Sidebar.d.ts +3 -1
- package/dist/navigation/Sidebar.js +1 -1
- package/dist/navigation/SidebarSymbol.d.ts +2 -1
- package/dist/navigation/SidebarSymbol.js +2 -1
- package/dist/navigation/chromeCurves.js +1 -1
- package/dist/navigation/navigationContext.d.ts +2 -1
- package/dist/navigation/navigationContext.js +2 -1
- package/dist/navigation/splitContext.d.ts +2 -1
- package/dist/navigation/splitContext.js +2 -1
- package/dist/navigation/toolbarMinimization.d.ts +4 -3
- package/dist/navigation/types.d.ts +8 -6
- package/dist/navigation/zoomGeometry.js +1 -1
- package/dist/navigation/zoomMotion.d.ts +1 -1
- package/dist/navigation/zoomMotion.js +2 -2
- package/dist/navigation/zoomTransition.js +3 -4
- package/dist/presentation/Presentation.d.ts +10 -9
- package/dist/presentation/Presentation.js +4 -3
- package/dist/presentation/model.d.ts +2 -1
- package/dist/presentation/presentationSource.js +1 -1
- package/dist/press/Pressable.d.ts +5 -1
- package/dist/press/Pressable.js +2 -0
- package/dist/press/stateMachine.d.ts +1 -1
- package/dist/public/Label.d.ts +2 -1
- package/dist/public/Label.js +2 -1
- package/dist/public/Screen.d.ts +4 -6
- package/dist/public/actions.d.ts +2 -1
- package/dist/public/actions.js +2 -1
- package/dist/public/buttonBorderShape.d.ts +2 -1
- package/dist/public/colors.d.ts +7 -4
- package/dist/public/colors.js +3 -2
- package/dist/public/controlStyle.d.ts +17 -14
- package/dist/public/controls.d.ts +29 -28
- package/dist/public/controls.js +25 -24
- package/dist/public/deviceActions.d.ts +6 -4
- package/dist/public/deviceActions.js +4 -2
- package/dist/public/environment.d.ts +16 -13
- package/dist/public/environment.js +11 -9
- package/dist/public/filePickers.d.ts +6 -4
- package/dist/public/filePickers.js +3 -2
- package/dist/public/glass.d.ts +8 -6
- package/dist/public/glass.js +2 -2
- package/dist/public/glassValue.d.ts +3 -4
- package/dist/public/glassValue.js +3 -4
- package/dist/public/keyboard.d.ts +4 -1
- package/dist/public/keyboard.js +2 -1
- package/dist/public/navigationTransition.d.ts +6 -6
- package/dist/public/navigationTransition.js +3 -3
- package/dist/public/presentation.d.ts +8 -7
- package/dist/public/presentation.js +5 -5
- package/dist/public/runtime.d.ts +9 -8
- package/dist/public/runtime.js +7 -7
- package/dist/public/scroll.d.ts +6 -3
- package/dist/public/scroll.js +3 -1
- package/dist/public/structure.d.ts +2 -2
- package/dist/public/toolbar.d.ts +15 -11
- package/dist/public/toolbar.js +13 -8
- package/dist/reachability/model.d.ts +4 -3
- package/dist/reachability/react.d.ts +4 -1
- package/dist/reachability/react.js +2 -1
- package/dist/root/SatinRoot.d.ts +3 -3
- package/dist/root/SatinRoot.js +12 -36
- package/dist/root/mountSatin.d.ts +1 -1
- package/dist/root/mountSatin.js +26 -35
- package/dist/root/runtimeContext.d.ts +2 -1
- package/dist/root/runtimeContext.js +2 -1
- package/dist/safe-area/Overlay.d.ts +3 -2
- package/dist/safe-area/Overlay.js +2 -1
- package/dist/safe-area/SafeAreaInset.d.ts +11 -7
- package/dist/safe-area/SafeAreaInset.js +10 -9
- package/dist/safe-area/context.d.ts +3 -3
- package/dist/safe-area/context.js +1 -1
- package/dist/safe-area/displayCorners.d.ts +4 -2
- package/dist/safe-area/displayCorners.js +4 -2
- package/dist/safe-area/modifiers.d.ts +14 -10
- package/dist/safe-area/modifiers.js +10 -6
- package/dist/safe-area/useSafeAreaMetrics.js +2 -2
- package/dist/scroll/ScrollSurface.d.ts +5 -5
- package/dist/scroll/ScrollSurface.js +6 -2
- package/dist/scroll/ScrollTarget.d.ts +1 -1
- package/dist/scroll/ScrollTarget.js +1 -1
- package/dist/scroll/edgePolicy.d.ts +2 -2
- package/dist/scroll/position.d.ts +5 -3
- package/dist/scroll/position.js +1 -1
- package/dist/scroll/screenGeometry.d.ts +1 -1
- package/dist/scroll/screenGeometry.js +1 -1
- package/dist/scroll/types.d.ts +1 -1
- package/dist/search/PadSearchDrawer.d.ts +7 -0
- package/dist/search/PadSearchDrawer.js +8 -0
- package/dist/search/PadSearchPresentationContext.d.ts +6 -0
- package/dist/search/PadSearchPresentationContext.js +4 -0
- package/dist/search/SearchDrawer.d.ts +1 -1
- package/dist/search/SearchDrawer.js +7 -2
- package/dist/search/SearchSuggestionsPopover.d.ts +6 -0
- package/dist/search/SearchSuggestionsPopover.js +42 -0
- package/dist/search/SearchToolbarField.d.ts +2 -1
- package/dist/search/SearchToolbarField.js +28 -7
- package/dist/search/padSearchBarMotion.d.ts +69 -0
- package/dist/search/padSearchBarMotion.js +73 -0
- package/dist/search/padSearchFieldSamples.json +491 -0
- package/dist/search/searchMotion.d.ts +1 -1
- package/dist/search/searchMotion.js +1 -1
- package/dist/search/searchPlacement.d.ts +3 -0
- package/dist/search/searchPlacement.js +7 -0
- package/dist/search/searchable.d.ts +14 -12
- package/dist/search/usePadSearchFieldMotion.d.ts +4 -0
- package/dist/search/usePadSearchFieldMotion.js +100 -0
- package/dist/search/useSearchPresentation.d.ts +2 -1
- package/dist/search/useSearchPresentation.js +24 -6
- package/dist/server.d.ts +4 -4
- package/dist/server.js +4 -4
- package/dist/shapes/corners.d.ts +3 -3
- package/dist/shapes/corners.js +2 -3
- package/dist/styles.css +8302 -8236
- package/dist/sw/vite.d.ts +4 -0
- package/dist/sw/vite.js +2 -0
- package/dist/symbols/Symbol.d.ts +7 -5
- package/dist/symbols/Symbol.js +5 -3
- package/dist/symbols/catalogue.d.ts +1 -1
- package/dist/symbols/types.d.ts +6 -4
- package/dist/tabs/TabSection.d.ts +3 -2
- package/dist/tabs/TabSection.js +2 -1
- package/dist/tabs/TabView.js +54 -51
- package/dist/tasks/useTask.d.ts +5 -4
- package/dist/tasks/useTask.js +4 -3
- package/dist/testing.d.ts +3 -2
- package/dist/testing.js +3 -2
- package/dist/text-input/TextEditor.js +7 -3
- package/dist/text-input/focusChain.d.ts +4 -3
- package/dist/text-input/focusChain.js +3 -2
- package/dist/text-input/kinds.d.ts +1 -1
- package/dist/web/WebView.d.ts +10 -3
- package/dist/web/WebView.js +3 -2
- package/dist/web/authentication.d.ts +12 -1
- package/dist/web/authentication.js +2 -1
- package/dist/web/openURL.d.ts +10 -4
- package/dist/web/openURL.js +4 -2
- package/dist/web/useWebAuthentication.d.ts +2 -1
- package/dist/web/useWebAuthentication.js +2 -1
- package/dist/zoom/Zoomable.d.ts +3 -3
- package/dist/zoom/Zoomable.js +2 -2
- package/package.json +4 -4
- 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
|
-
/**
|
|
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,
|
|
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
|
-
*
|
|
16
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
*
|
|
16
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
21
|
-
*
|
|
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
|
-
*
|
|
26
|
-
*
|
|
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))}>
|
package/dist/media/react.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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;
|
package/dist/media/react.js
CHANGED
|
@@ -17,7 +17,8 @@ export function MediaPlayerRoot({ children, onActivityChange, }) {
|
|
|
17
17
|
}, [store]);
|
|
18
18
|
return _jsx(MediaContext, { value: store, children: children });
|
|
19
19
|
}
|
|
20
|
-
/**
|
|
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)
|
package/dist/media/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
9
|
-
* stays mounted and inert until its exit finishes
|
|
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
|
-
/**
|
|
26
|
-
* stays mounted and inert until its exit finishes
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
3
|
+
* Duration is the
|
|
4
4
|
* period of the undamped spring (omega = 2π / duration), and bounce is 1 − damping ratio for
|
|
5
|
-
* bounce ≥ 0.
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
21
|
+
/** Smooth spring: duration 0.5 s, bounce 0. */
|
|
22
22
|
smooth: spring({ durationMs: 500, bounce: 0 }),
|
|
23
|
-
/**
|
|
23
|
+
/** Snappy spring: duration 0.5 s, bounce 0.15. */
|
|
24
24
|
snappy: spring({ durationMs: 500, bounce: 0.15 }),
|
|
25
|
-
/**
|
|
25
|
+
/** Bouncy spring: duration 0.5 s, bounce 0.3. */
|
|
26
26
|
bouncy: spring({ durationMs: 500, bounce: 0.3 }),
|
|
27
|
-
/**
|
|
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
|
-
/*
|
|
34
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
49
|
-
*
|
|
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.
|
|
21
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
-
/**
|
|
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
|
|
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) ||
|
|
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
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
//
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
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
|
-
/** `
|
|
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
|
-
/** `
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
1
|
+
/** When the navigation bar minimizes: `onScrollDown`, `onScrollUp` or `never`. */
|
|
2
2
|
export type ToolbarMinimizationBehavior = 'onScrollDown' | 'onScrollUp' | 'never';
|
|
3
|
-
/**
|
|
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
|
|
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. */
|