Skip to content
View Markdown

Satin API reference ​

Search by Satin export name. Each entry describes its behavior and limits and links to its exact declaration. Plain-language search terms are included where they help find a control or capability.

Generated from package declarations and reviewed behavior metadata. Run pnpm --filter @satinhq/kit api:write after building. Signature, export and source changes invalidate this reference; changes to behavior descriptions require review.

Coverage: 943 named exports across 9 declaration entry points. 151 exports have reviewed behavior metadata. 792 type and integration declarations are identified separately in the behavior review inventory. CSS is a stylesheet, not a named export.

An API description establishes the supported contract. It does not certify pixels, motion, touch or installed-app lifecycle behavior. Experimental entry points remain experimental. An empty Limits cell means there are no limits beyond what the declaration states.

Core API ​

Module: @satinhq/kit

Components, hooks and types for building the app.

Scroll horizontally to read every column.

Satin exportBehaviorLimitsAlso known as
ActionAn entry in a menu, context menu or swipe action list: a command, a titled section of entries, or a submenu.Actions have accessible names, but they do not appear in the VoiceOver Actions rotor.
ActionItemA single command with an id, a label, an optional symbol and role, and an onPress handler. Menus, swipe actions, alerts and confirmation dialogs all use it.
AdaptiveGridItemOptionsBounds for an adaptive track, which repeats to fit as many columns or rows as the space allows. A grid with an adaptive track can have no other track.
AlertA centred alert with a title, an optional message, up to three actions and an optional text field.Alerts and confirmation dialogs start closed after a relaunch, so a destructive confirmation is never restored open.alert; dialog; popup
AlertPropsAn alert's presentation binding, title, message, actions and optional text field.
AlertTextFieldPropsThe text field inside an alert: its label, controlled text, prompt and keyboard intent.
AnimationAn opaque spring timing value for withAnimation. Use a named value or Animation.spring.Other state and style changes do not animate. There is no null animation, easing curve, repeat, delay, completion callback or per-update timing; use one outer synchronous update. Bounce cannot be negative.
AppCapabilityA capability the app declares so Satin sets up its runtime support: push, badging or background-work.
AppDefinitionA validated app definition, returned by defineApp. Pass it to runApp and to the Vite plugin.
AppDefinitionInputWhat an app declares about itself: identity, install metadata and launch appearance.
AppIconOne generated app icon file: its URL, pixel sizes, image type and purpose.
AppOrientationAn orientation that the app supports.
AsyncImageLoads an image from a URL. It keeps its placeholder if loading fails, never holds up navigation, and reports progress through onPhaseChange.Remote images use the browser's HTTP cache. onPhaseChange reports loading state; it does not swap in other content. There is no Photos library access.remote image; image URL
AsyncImagePhaseThe loading state an AsyncImage reports: empty while loading, then success with the image element or failure with the error.
AsyncImagePropsAn ImageProps whose source is a remote URL.
BuildInfoThe framework version, build id, build time and build kind baked into the running bundle. The build id is unique per build.The build id is not a git revision or a service worker cache hash. Builds made without satinApp report "unavailable". What the server last served says nothing about which cached bundle is running.
BuiltInButtonStyleThe built-in button styles, by their buttonStyle names. automatic picks one for the context.
BuiltInLabelStyleThe built-in label styles: the title, the icon or both. automatic picks for the context.
BuiltInToggleStyleThe built-in toggle styles: switch or button. automatic picks for the context.
ButtonA pressable control that adapts to where it is: a tinted row in a List, a glass button in a toolbar, otherwise the buttonStyle you choose. role="destructive" carries into every context.Only the listed button styles exist. There are no circle or container-concentric borders, and plain and list-row buttons draw no border. A custom ButtonStyle draws the content; Satin keeps the press handling and accessibility.button; tap
ButtonBorderShapeThe outline of a bordered button: automatic, capsule, or a rounded rectangle with a fixed corner radius in points.
ButtonPropsButton's action, label and control properties. An iconOnly button needs an aria-label.
ButtonRoleA button's role. destructive draws it in red; cancel marks the action that backs out.
ButtonStyleA custom look for Button. makeBody returns noninteractive content; Satin still owns the button's press handling and accessibility.
ButtonStyleConfigurationWhat a custom ButtonStyle draws from: the label, the pressed state and the role, plus the shared control values.
ChoiceOne option of a Picker.Only the menu, navigationLink, inline and segmented styles exist.
collectionDeclares a collection of records keyed by one unique string field. The curried form, collection<Note>()({ key, indexes }), infers index names.Data lives in IndexedDB on this device. The browser may evict it, and writes can fail.
CollectionOne collection of a database (db.notes). Once loaded, writes publish to memory at once, so useQuery sees them immediately; the returned promise settles after the durable commit.
CollectionDefinitionA collection's record type, key and indexes, made by collection for defineDatabase.
CollectionIndexesA mapping from declared index names to record properties.
CollectionSchemaThe named collections in a database declaration.
CollectionUpdateMethodsA collection's update method: a partial record to merge, or a function that returns the new record.
ColorPickerA row with a colour well that opens the system colour picker: grid, spectrum, sliders, eyedropper and, with supportsOpacity, opacity.The system picker is titled "Colors", not with the label. Output is sRGB hex; Display P3 choices are converted to sRGB. See controls.md.color picker; color well
ColorPickerPropsColorPicker's label and controlled colour.
ColorSchemeA light or dark appearance.
ConfirmationDialogA titled set of actions, such as Delete and Cancel, shown next to the control that opened it.Alerts and confirmation dialogs start closed after a relaunch, so a destructive confirmation is never restored open.action sheet; delete confirmation
ConfirmationDialogPropsA confirmation dialog's presentation binding, title, message, actions and optional anchor.
ContentAlignmentWhere content sits inside a larger frame. Used by frame and ZStack.
ContentFrameA fixed size or size bounds for a view, in points, and how its content aligns inside. 'infinity' fills the available space.
ContentMarginsSets content margins for every scroll view inside it. A List takes a horizontal margin as its layout margin. The innermost value for each edge wins.placement="scrollIndicators" has no effect: Satin draws the scroll indicator in the screen frame.content inset
ContentMarginsPropsWhich edges get a margin, how much, and whether it applies to content or indicators.
ContentPaddingThe padding prop. true adds the default 16 pt on every edge, a number pads every edge, and an object pads the edges it names.
ContentPropsThe padding, frame and background props shared by text and stacks. Plain HTML attributes, style included, still apply.
ContentUnavailableViewAn empty state: an icon, a title, an optional description and optional action children.Takes an explicit title, icon, description and actions; there is no built-in search variant.empty state; no results
ContentUnavailableViewPropsThe empty state's title, optional description and icon (a tray by default).
ContextMenuOpens a menu of actions when the user long-presses its content, with an optional custom preview. Rows in a List take a contextMenu prop instead.Actions have accessible names, but they do not appear in the VoiceOver Actions rotor.long press menu
ContextMenuConfigurationThe contextMenu prop of a row: a list of actions, or actions with a custom preview.
ControlConfigurationWhat every custom control style receives: enabled state, control size and tint.
ControlSizeA control's size, from mini to extraLarge. regular is the default.
ControlStyleProviderSets control defaults for a subtree through buttonStyle, toggleStyle, labelStyle, controlSize, tint and disabled. A control's own props win over the provider, except that a disabled ancestor cannot be re-enabled by a child.Only the listed button styles exist. There are no circle or container-concentric borders, and plain and list-row buttons draw no border. A custom ButtonStyle draws the content; Satin keeps the press handling and accessibility.
ControlStyleValuesThe control environment a ControlStyleProvider sets for its subtree.
CoreSymbolNameEvery symbol name in the bundled catalogue.
cornerClipPathReturns a CSS clip-path for a shape at an explicit width and height. Radii are in points.You size it yourself outside framework rows. It does not change a glass mask. Continuous corners follow the iOS 27 corner curve.
CornerShapeA shape for cornerClipPath and swipe action faces: a capsule, an ellipse, a rounded rectangle or a custom clip path. Choosing one overrides the framework's default shape.
DatabaseMigrationA schema migration. It runs inside one transaction and may be async.
DatabaseRecordA stored record with named values.
DatePickerA row for picking a date, a time or both. Its grey value capsules open the system date or time picker. Use a civil string selection ('2026-10-14') for a day that must stay the same day in every time zone, such as a due date; use a Date for a moment in time.No graphical or wheel style. WebKit adds Reset and Done buttons to the system picker, centres it instead of anchoring it to the capsule, and does not grey out days outside the range. See controls.md.date picker; time picker; calendar
DatePickerComponentA part of the value a DatePicker edits: the date, or the hourAndMinute.
DatePickerPropsDatePicker's label, controlled selection, range and the components it edits. selection is a Date, or a civil string with no time zone: '2026-10-14' for a date, '09:41' for a time, '2026-10-14T09:41' for both. The callback returns the same kind.
DatePickerRangeA DatePicker's selectable range. Omit a bound for a one-sided range (start... or ...end). Bounds use the same kind of value as the selection.
DatePickerStyleHow a DatePicker draws. Only the compact style exists; automatic is compact.
DefaultToolbarItemPlaces the screen's search field among its bottom toolbar items. The screen must be searchable.Only kind="search". Without a ToolbarSpacer the next item is not merged into the search capsule. iPad keeps the drawer.bottom search bar
DefaultToolbarItemPropsWhich system item to place, and where. Only search exists.
defineAppDeclares app identity, install metadata and capabilities once. Pass the result to runApp and to the @satinhq/kit/vite plugin. Everything not given is defaulted and the whole definition is validated, so a bad id or icon fails at build time rather than after install.One app root per page, for iPhone and iPad WebKit. There are no multiple windows.app manifest; app config
defineDatabaseOpens the app's local database, stored in IndexedDB. Each collection becomes a property of the result. Bump version with a migration whenever the schema changes. Export and import are built in, so offer them to the user.Data lives in IndexedDB on this device. The browser may evict it, and writes can fail.local database; offline storage; IndexedDB
defineNamespaceA namespace declared once at module scope, for views that share no parent component: a MatchedTransitionSource in one route and the screen it zooms into in another. Inside one component, use useNamespace().Pushed screens only; sheets and full-screen covers do not zoom. The source must be on screen, or the push slides. A downward dismiss must start within about 27 degrees of vertical.
defineNavigationDeclares the app's primary tabs or its single stack before anything renders, so every stack and tab id exists (and is typed) from the first frame. Pass the result to runApp; TabView, Tab and NavigationStack then render it. Components may freely wrap those views.One app root per page, for iPhone and iPad WebKit. There are no multiple windows.
defineRoutesDeclares every destination once. The same schema types useNavigation and NavigationLink, validates restored paths and checks notification deep links, so a route id or param is never a free-form string.Navigation does not use browser history. Route params must match the declared schema.router; routes; deep links
defineWebAuthenticationSets up an OAuth authorization-code sign-in with PKCE. The transaction is stored durably, so it survives a redirect or a suspended app. Your server redeems the code.Needs a secure context, local storage, Web Locks, a dedicated uncached callback page and a server exchange. Bridge reads need a private transaction proof. Your server validates tokens and OpenID Connect. Completion in the background is not guaranteed.OAuth; sign in; PKCE
DividerA hairline across its parent stack's axis. It is decorative, so assistive technology skips it.Default spacing and frame differences are listed in content.md. Props apply in a fixed order, not the order you write them.separator; hairline
EdgeA logical edge. leading and trailing follow the layout direction.
EdgeInsetsInsets on each edge in points. leading and trailing follow the layout direction.
EdgeLengthsOptional lengths per logical edge, in points.
EdgeSetOne edge group or a list of them.
EdgeSetMemberA logical edge, an axis pair or all edges.
EditButtonToggles the screen's edit mode. In a toolbar it reads Edit, then becomes a prominent checkmark (Done) while editing.Rows are identified by their ForEach ids. Edit mode belongs to each screen and cannot be set from outside it. Outside edit mode, plain rows cannot be selected with the keyboard.edit mode; Edit and Done
EditModeWhether a screen's lists show their editing controls: active or inactive.
ExportDocumentThe JSON document exportJSON writes and importJSON reads.
FileImporterA button that opens the system file chooser and returns the chosen files. Cancelling keeps the current selection.MIME types are hints, not validation. There is no photo library identifier and no lasting file access, and overlapping choosers cannot always be told apart. Not yet verified in an installed app.file upload; document picker
FileImporterPropsThe importer's label, the selected files and the content types it accepts, as MIME types or extensions.MIME types are hints, not validation. There is no photo library identifier and no lasting file access, and overlapping choosers cannot always be told apart. Not yet verified in an installed app.
FixedGridItemOptionsA fixed track's size in points.
FlexibleGridItemOptionsBounds for a flexible track; the minimum defaults to 10 points.
FocusChainFieldThe parts of a field element that useFocusChain uses to move focus.
FontWeightA font weight, from ultraLight to black.
ForEachMakes one row per element of data, identified by its id (or an id function). In a List, onDelete adds swipe-to-delete and the editing delete control; onMove adds the reorder handle. Both receive offsets into data; apply them with removing and moving. Put ForEach directly in a List or Section: the list reads it to know each row's identity.ForEach must sit directly in a List or Section. Moving a selected group, two-finger selection and VoiceOver move actions are not available.swipe to delete; reorder rows
ForEachPropsThe collection, how to identify each element, the row each element becomes and its editing actions. id may be omitted when the elements have an id field.
FormAn inset grouped List for settings and data entry. Scrolling it dismisses the keyboard at once.A ListRow is always one row: its children sit side by side. Use one ListRow per row. A numeric gap changes the space between sections; header and footer space stays. visible keeps the default background; it does not make a sheet opaque.settings screen; form
FormPropsThe scroll, search and section options Form and List share. style is inline CSS.
FullScreenCoverAn opaque presentation that slides up over the whole screen. It has no interactive dismissal; close it through its binding or useDismiss().Covers cannot be swiped away. They start closed after a relaunch.full screen presentation; modal
FullScreenCoverPropsA full-screen cover's presentation binding and accessible title.
GeometryFrameA rectangle in points: origin x and y plus a size.
GeometryProxyWhat a GeometryReader passes to its children: its size and a way to read its frame.
GeometryReaderFills the space it is offered and calls its children with that size. Its content renders once the first measurement is in.Inside a scroll view, give it a definite height. The proxy reports no safe-area insets.measure size
GeometryReaderPropsA GeometryReader's render function, plus plain div attributes.
GeometrySizeA width and height in points.
GlassThe glass material for a GlassEffect. Start from Glass.regular or Glass.clear and refine it with a tint or interactive(); each call returns a new value.If WebGPU fails for good, release builds fall back to a blur-and-tint material unless strict glass is on; development builds report the failure.
GlassEffectDraws glass behind its content in the given shape, a capsule by default. Inside a GlassEffectContainer, effects with ids morph into one another.If WebGPU fails for good, release builds fall back to a blur-and-tint material unless strict glass is on; development builds report the failure.glass; refraction
GlassEffectContainerGroups nearby glass effects so they render together and blend or morph into one another. spacing, 20 pt by default, sets how close effects must be to merge.If WebGPU fails for good, release builds fall back to a blur-and-tint material unless strict glass is on; development builds report the failure.glass morph; glass group
GlassEffectPropsThe glass material and shape, plus the namespace and id that let effects morph into each other. Plain div attributes also apply.
GlassErrorOne glass renderer failure: its code, message, the stage it happened in and when.
GlassErrorCodeWhy the glass renderer failed, such as gpu-unavailable or device-lost. In a release build a failure can switch glass to the fallback material.
GlassShapeThe outline of a glass effect: capsule, circle or a rounded rectangle with a corner radius in points.
GlassTintA glass tint as red, green, blue and alpha channels from 0 to 1. Glass.tintRGBA rejects values outside that range.
GridItemMakes grid tracks for LazyVGrid and LazyHGrid: fixed, flexible or adaptive. Each call validates its options and throws a RangeError for bad bounds or spacing.Every child renders at once; there is no virtualization. An adaptive track must be the only track, and there is no Grid or GridRow.
GridItemOptionsOptions every grid track takes. spacing is the gap after this track; alignment places content within each cell.
GridItemValueA validated grid track. Make one with GridItem.fixed, .flexible or .adaptive.
HorizontalTextFieldPropsHorizontal TextField's controlled text and keyboard intent.
HStackArranges its children in a row. Add a Spacer to push content to the edges.Default spacing and frame differences are listed in content.md. Props apply in a fixed order, not the order you write them.row; horizontal layout
HStackPropsHStack's vertical alignment and spacing in points.
IgnoresSafeAreaLets content extend through the safe area on the chosen edges, for full-bleed backgrounds and media. The container edges and keyboard avoidance can be ignored separately.Only a view at the start of the screen content extends upward. Content that does not scroll does not extend through the bottom edge.full bleed; edge to edge
IgnoresSafeAreaPropsWhich safe-area regions and edges the content ignores.
ImageShows a bundled or local image. It reserves its size so layout never jumps, and priority loads it ahead of other images. Use alt="" for decoration.Remote images use the browser's HTTP cache. onPhaseChange reports loading state; it does not swap in other content. There is no Photos library access.image; picture
ImageAssetA responsive image with its size, srcSet and a tiny placeholder. The Vite plugin produces one for each import ending in ?satin-image.
ImagePropsAn image's source, required alt text and aspect-ratio content mode.
IndexesOfCollectionThe index names declared by a collection.
JustUpdatedThe previous and current build identifiers after an app update.
KeyboardGeometryHow much the keyboard covers, whether it shows, and the viewport size, in points.
KeyboardMetricsThe keyboard's current geometry in points, plus the software keyboard height to plan for at this window size.
LabelA title with an icon. In a toolbar a label with an icon shows the icon alone; a hidden title stays available to assistive technology.Labels are not interactive, and a custom LabelStyle must return noninteractive content.
LabeledContentA row with a label and a trailing value in secondary text.Labels are not interactive, and a custom LabelStyle must return noninteractive content.value row; detail row
LabeledContentPropsThe row's label and the trailing value it shows.
LabelPropsA label's title (children) and its icon: a symbol name or any icon node.
LabelStyleA custom arrangement of a label's title and icon.
LabelStyleConfigurationWhat a custom LabelStyle draws from: the label's title and icon.
LaunchScreenSlotThe launch screen's icon and optional label. The inline environment paints it before application JavaScript loads, so both must be plain strings.
LayoutModifierPropsThe children and plain div attributes every layout wrapper takes.
LazyHGridA grid with fixed rows that grows sideways. Every child renders at once; use List for long data.Every child renders at once; there is no virtualization. An adaptive track must be the only track, and there is no Grid or GridRow.horizontal grid
LazyHGridPropsThe grid's rows and the spacing between columns. Each row sets the gap after itself.
LazyHStackLays out its children like HStack. Every child mounts at once and keeps its state.Every child renders at once; there is no virtualization.
LazyHStackPropsLazyHStack's layout props. Every child mounts eagerly; use List for long data.
LazyVGridA grid with fixed columns that grows downward. Every child renders at once; use List for long data.Every child renders at once; there is no virtualization. An adaptive track must be the only track, and there is no Grid or GridRow.grid; columns
LazyVGridPropsThe grid's columns and the spacing between rows. Each column sets the gap after itself.
LazyVStackLays out its children like VStack. Every child mounts at once and keeps its state, so use List for long data.Every child renders at once; there is no virtualization.
LazyVStackPropsLazyVStack's layout props. Every child mounts eagerly; use List for long data.
LineLimitA number caps growth; a range also reserves its minimum number of lines.
LinkOpens a URL when pressed, like useOpenURL. A press that turns into a scroll does not open it.You cannot force the external browser. A dispatched URL is not a loaded page. Cross-origin or blocked frames report unverified, and only same-origin frames can be reloaded or stopped.link; open URL
LinkPropsThe link's destination URL, its content and an optional result callback.
ListA scrolling column of rows, inset grouped by default. Controls inside it render as rows. Its id keys scroll restoration, so keep it stable. With selection, rows from a ForEach become selectable; with an EditButton in the screen's toolbar, ForEach's onDelete and onMove add the editing controls.The refresh indicator holds a 60 pt inset while the action runs. A ListRow is always one row: its children sit side by side. Use one ListRow per row. A numeric gap changes the space between sections; header and footer space stays. visible keeps the default background; it does not make a sheet opaque. Rows are identified by their ForEach ids. Edit mode belongs to each screen and cannot be set from outside it. Outside edit mode, plain rows cannot be selected with the keyboard.list; rows; pull to refresh; swipe actions
ListItemIDA row's identity in List selection: the ForEach id.
ListPropsA List takes a Form's options, its listStyle and an optional selection.A numeric gap changes the space between sections; header and footer space stays. visible keeps the default background; it does not make a sheet opaque.
ListRowOne row with custom content or per-row overrides. A ListRow is always one row. Several children share it side by side, laid out as an HStack would (centred, 8 pt apart, a NavigationLink filling the rest); each separate row needs its own ListRow.A ListRow is always one row: its children sit side by side. Use one ListRow per row. Satin still owns row geometry. Do not use raw viewport or safe-area CSS in rows. ForEach must sit directly in a List or Section. Moving a selected group, two-finger selection and VoiceOver move actions are not available. Rows are identified by their ForEach ids. Edit mode belongs to each screen and cannot be set from outside it. Outside edit mode, plain rows cannot be selected with the keyboard.swipe actions; row insets
ListRowPropsOne row's content and its overrides: insets in points, background, separator, swipe actions, context menu and editing opt-outs.
ListSelectionPropsRow selection for a List. An optional id selects one row: tapping a row selects it. A Set selects many: while editing, rows show selection circles and taps toggle them. Rows are identified by their ForEach ids.
ListStyleHow a List draws its rows and sections. insetGrouped is the default.
LocalReachabilityStateThe reachability state of an app that needs no app server. Its status is always local.
MatchedTransitionSourceMarks the view a zoom transition starts from and returns to. A push zooms only while its source is on screen; otherwise it slides as usual.Pushed screens only; sheets and full-screen covers do not zoom. The source must be on screen, or the push slides. A downward dismiss must start within about 27 degrees of vertical.zoom transition
MatchedTransitionSourcePropsThe source's id and namespace, and the one element the screen zooms out of.
MediaCommandResultHow a media command ended. needs-user-activation means WebKit wants a tap first.
MediaControllerThe audio player's commands: queue editing, transport, seek, repeat and shuffle. Queue commands resolve once the change is made; play and seek resolve once playback is seen to respond.
MediaPlayeruseMediaPlayer's result: the commands and the live state.Audio only, with no video player and no background playback beyond what WebKit allows. Playback depends on WebKit codec support and a server that serves byte ranges.
MediaQueueEntryOne item in the audio queue: its source URL, media id and display metadata. Each occurrence has its own entryId, so a repeated song appears twice.
MediaQueueOptionsWhere a replaced queue starts, and whether it plays.
MediaRepeatThe queue's repeat mode: off, one or all.
MediaSnapshotEverything the player shows: the queue, the current entry, status, position and modes.
MenuA button that opens a menu of actions. In a toolbar a symbol label draws an icon button and a text label draws a capsule.Actions have accessible names, but they do not appear in the VoiceOver Actions rotor.dropdown menu; more button
MenuPropsA menu's label and its actions.
MenuTriggerPropsThe props a custom Menu trigger receives. Forward all of them to the element that opens the menu.
movingReturns a new array: the elements at fromOffsets move, in their original order, to just before the element that was at toOffset. Pass it exactly what ForEach's onMove reports. toOffset counts positions in the original array: moving the first of three rows below the second reports toOffset 2, not 1. Use items.length to move to the end.Each returns a new array; store the result in state to update the rows.reorder rows
NamespaceIDA scope for matched-geometry ids. Two views match only if they share an id and a namespace.
NavigationThe actions useNavigation returns: push, replace, pop, popToRoot and showAcknowledgements, typed against the routes.
NavigationArgumentsThe typed parameter tuple accepted by push and replace.
NavigationBackButtonBehaviorWhether a pushed screen shows its back button. automatic shows it; hidden removes it.
NavigationDeclarationAn app's primary navigation: either tabs, each owning a stack, or one stack.
NavigationLinkPushes a declared route. In a List it draws a disclosure row; elsewhere it is a plain pressable.Navigation does not use browser history. Route params must match the declared schema.push; disclosure row
NavigationLinkPropsA destination route and its params (typed against the registered routes), plus the row's label and accessories.
NavigationSplitViewShows the declared root as a sidebar and pushes into a retained detail column. At compact width it collapses to a plain stack. A NavigationStack never splits by itself.It renders an existing declared stack; it takes no modal or ad hoc root.sidebar and detail; split view
NavigationSplitViewPropsSelects which declared primary stack the split view renders; inside a Tab, its own.
NavigationStackRenders an in-memory navigation stack. A primary stack's root comes from defineNavigation, never from JSX. Inside a Sheet, modal with a root makes a stack the sheet owns.Navigation does not use browser history. Route params must match the declared schema.navigation stack; push; back button
NavigationStackPropsEither a declared primary stack (optionally naming its tab), or a modal stack inside a Sheet that declares its own root.
NavigationTransitionHow a pushed screen arrives and leaves: automatic (a slide) or zoom. Give one to Screen's navigationTransition.Pushed screens only; sheets and full-screen covers do not zoom. The source must be on screen, or the push slides. A downward dismiss must start within about 27 degrees of vertical.zoom transition
newIdA new unique record id that sorts by creation time.Data lives in IndexedDB on this device. The browser may evict it, and writes can fail.
NotificationAuthorizationStatusNotification permission, independent of subscription setup and token rotation.
NotificationPermissionExplainerExplains what notifications are for before the user asks for them; its button requests authorization from that gesture.Permission requires the app to be installed on the Home Screen. Local scheduled notifications are unavailable; schedule them from your own authenticated server.notification permission prompt
NotificationPermissionExplainerPropsThe notification permission explanation's title and app-authored content.
OfflinePresentationPropsWhat the offline view shows: why the server is unavailable, how it is presented, and the recheck and back actions.
OpenURLActionThe function useOpenURL returns. It opens a URL and reports the result at once.
OpenURLOptionsHow to open a web page. prefersInApp is a preference; the browser decides how the page is presented.
OpenURLResultWhat happened to an open request: handled in the app, dispatched to the browser, or unavailable with a reason. dispatched does not mean the page loaded.
OrientationFallbackWhat the app shows when the device is in an orientation it does not support: a rotation prompt, a letterboxed layout, a responsive layout, or nothing.
OverlayLayers content over its children without changing their frame. Inside a SafeAreaInset, the overlay keeps to the reduced safe area and moves with the keyboard, like the composer.Only views can be overlaid; there is no shape or style overlay.
OverlayPropsThe layered content and its alignment. The children set the frame.
paramRoute parameter types: string, int, number (finite), boolean and enum, each with .optional(). The same schema validates navigation, restoration and notification deep links.Navigation does not use browser history. Route params must match the declared schema.
ParameterOne route parameter's validator, made by param.
ParameterSchemaA route's parameters by name.
PasteButtonA button that pastes plain text from the clipboard when pressed. It never reads the clipboard before the press. The browser may ask the user to confirm.Plain text only. Dismissal and denial look the same. WebKit may show an extra Paste confirmation. Not yet verified in an installed app.paste; clipboard
PasteButtonPropsThe button content and the callbacks that receive the pasted text or the error.Plain text only. Dismissal and denial look the same. WebKit may show an extra Paste confirmation. Not yet verified in an installed app.
PhotosPickerA button that opens the system photo chooser and returns one photo or video as a File.MIME types are hints, not validation. There is no photo library identifier and no lasting file access, and overlapping choosers cannot always be told apart. Not yet verified in an installed app.photo picker; image upload
PhotosPickerPropsThe picker's label, the selected file and the kind of media it accepts.MIME types are hints, not validation. There is no photo library identifier and no lasting file access, and overlapping choosers cannot always be told apart. Not yet verified in an installed app.
PickerChooses one option. menu (the default) opens a menu from the row, navigationLink pushes a list of options, inline lists them in place and segmented draws a segmented control. An option can carry a symbol (or icon) and a color. Icons draw in colour in an inline or navigationLink list, in the label colour inside the open menu, and not at all when segmented.Only the menu, navigationLink, inline and segmented styles exist.dropdown; select; segmented control
PickerPropsPicker's options, controlled value and pickerStyle.
preferredColorSchemeForces the whole app into light or dark. system or null follows the system again. The override lasts until the page reloads, so store the user's choice with useAppStorage and apply it at launch.The override covers the whole app, presentations included; one view or sheet cannot differ. Persist the choice with useAppStorage and apply it at launch.dark mode; light mode
PreferredColorSchemeAn appearance override for the whole app: light, dark, or system (or null) to follow the system.The override covers the whole app, presentations included; one view or sheet cannot differ. Persist the choice with useAppStorage and apply it at launch.
PresentationDetentA height a sheet can rest at: medium, large, a fixed height in points or a fraction of the available height.
PresentationPropsThe presentation binding, accessible title and dismissal callback shared by presentations.
PressableA plain tap target with no button chrome. It dims while pressed, and a touch that turns into a scroll does not fire onPress. Use it for custom tappable content.An icon-only Pressable needs an aria-label.
PressableOwnedHandlersThe DOM event handlers Pressable owns. Use onPress and onPressStateChange instead.
PressablePropsA pressable's onPress action, content and press feedback. An iconOnly pressable needs an aria-label.
PressStateWhether a press is idle, held down (pressed) or cancelled (deactivated).
ProgressViewA spinning activity indicator, or a linear bar showing value out of total (1 by default).Circular progress always spins; it does not show a value. Indeterminate linear progress draws an empty track. See controls.md.spinner; activity indicator; progress bar; loading
ProgressViewPropsProgressView's optional label and progress; without value it is indeterminate.
ProgressViewStyleHow a ProgressView draws: linear, circular or automatic, which is linear with a value and circular without.
QueryAn immutable query over a collection: index, keyRange, reverse, limit and filter each return a new query. useQuery hands one to its configure callback.Data lives in IndexedDB on this device. The browser may evict it, and writes can fail.
ReachabilityPresentationThe connectivity presentation currently shown to the user.
ReachabilityProbeConfigThe endpoint and deadlines used to probe the app server.
ReachabilityRoutePolicyWhether a destination remains usable without the app server.
ReachabilityStateThe full reachability state: local for apps without a server, or the server probe state.
ReachabilityStateStatusThe server probe result, including an unknown initial state.
ReachabilityStatusWhether the app server answered: reachable, server-unreachable or device-offline.
ReachabilitySurfaceHow Satin shows a failed probe: a banner, a full-screen offline view, or none.
RecordOfCollectionThe record type stored by a collection declaration.
RegisterAugment once in the app to type bare NavigationLink, NavigationStack, TabView and useNavigation without generics.
RegisteredNavigationThe navigation declared through Register, which types bare TabView, Tab and NavigationStack; never when the app has not registered one.
RegisteredRoutesThe routes declared through Register; an empty route set when the app has not registered.
removingReturns a new array without the elements at offsets. Pass it exactly what ForEach's onDelete reports.Each returns a new array; store the result in state to update the rows.delete rows
routeBinds a screen component to its parameter schema and static chrome. Declare the params first, then type the component with RouteParameters<typeof params>; this order avoids inference cycles.Navigation does not use browser history. Route params must match the declared schema.
RouteDefinitionA screen bound to its parameter schema; made by route, collected by defineRoutes.
RouteOptionsA destination's static chrome: what its bar shows from the first frame of the push. Screen overrides any of these once the screen has its data.
RouteParametersThe props a route component receives for a parameter schema; optional params are optional.
RouteParameterValueThe value described by a route parameter declaration.
RoutePropsThe params of one route, as its component receives them.
RoutesEvery destination of an app, made by defineRoutes.
RowActionsPropsRow swipe actions and context-menu commands.
RowIconA Settings-style icon: a white symbol on a rounded colour tile, for a row's leading edge.Labels are not interactive, and a custom LabelStyle must return noninteractive content.settings icon
RowIconPropsThe symbol and its tile colour: a system colour name or any CSS colour.
RowInteractionPropsThe swipeActions and contextMenu props of a row in a List.
RowLabelA row title with a secondary detail line under it. The framework owns its layout.Labels are not interactive, and a custom LabelStyle must return noninteractive content.
RowLabelPropsA row title and its secondary line.
runAppMounts the app into #root. Satin creates every primary stack and restores the scene and its launch route before React's first commit, then owns navigation, restoration, notifications and the app shell. Call it once. Content replaces the default root, usually to add app-wide providers; it renders TabView or NavigationStack itself. Without it Satin renders the declaration directly.One app root per page, for iPhone and iPad WebKit. There are no multiple windows.mount app; entry point
RunAppConfigurationThe app, routes, navigation and optional root content mounted by runApp.
RunAppOptionsApp-wide runtime options for runApp. Every one is optional.
SafeAreaBarA bar on the top or bottom edge that content scrolls under. It is a SafeAreaInset with no spacing and its own scroll-edge blur.The bar uses a CSS backdrop blur, not the navigation bar edge effect, and does not extend the navigation bar.bottom bar; top bar
SafeAreaBarPropsA SafeAreaInset limited to the top or bottom edge, with no spacing.
SafeAreaInsetPins an accessory, such as a composer or a filter bar, to one edge of its content. The accessory takes room from the content's safe area on its edge; a scroll view inside still spans the whole frame and scrolls under it. At the bottom, content scrolls under the accessory and its last item stays clear of it. When the accessory resizes, the scroll inset changes in the same frame (through --satin-inset-accessory-height), so a composer that grows by a line keeps the newest message in view.A top inset under a large title stays at the expanded title edge while the title collapses. On an installed iPhone the status bar area is a flat fill (see top-edge-limitation.md).safe area; accessory; composer bar
SafeAreaInsetEdgeThe edge a SafeAreaInset accessory sits on. leading and trailing follow the layout direction.
SafeAreaInsetPropsThe edge, the accessory (content) and its spacing; children is the content it insets.
SafeAreaPaddingGrows the safe area of the content inside it. Scroll views keep their frame and inset their content; other content is padded. Nested padding adds up.On a scroll view, bottom padding is a spacer at the end of the content. Nested padding adds up.
SafeAreaPaddingPropsWhich edges to pad, and by how much.
ScenePhaseWhether the app is in the foreground with focus (active), without focus (inactive) or hidden (background).
ScreenA route component's navigation chrome: title, toolbar, search and related options, declared by the screen that owns them. Use it when the title or toolbar depends on the screen's data; static chrome belongs in the route's options.Title fonts and sizes follow the system; there is no custom title style. Navigation bar minimization is opt-in; never keeps the bar expanded.navigation bar; title; toolbar
ScreenLifecycleWhether a screen is covered by another, and the phase of its current transition.
ScreenLifecycleCallbacksThe appear and disappear callbacks for useScreenLifecycle.
ScreenPropsA screen's own chrome, overriding its route's static options.
ScrollAnchorWhere a scroll target lines up in the viewport: top, center or bottom.
ScrollAxisThe axis along which a scroll surface accepts scrolling.
ScrollDismissesKeyboardModeWhen scrolling dismisses the keyboard: never; immediately, as soon as a drag on the surface starts; or interactively, when a drag reaches the keyboard. WebKit's keyboard cannot follow the finger, so it then slides away on its own curve and the bottom inset follows it.
ScrollEdgeA logical edge of a scroll view.
ScrollEdgeEffectHiddenWhether to hide scroll edge material, optionally for specific edges.The hard style throws an unsupported error. Only the top edge draws material; other edges draw none.
ScrollEdgeEffectStyleThe material under bars at a scroll view's edge: soft, hard or automatic.The hard style throws an unsupported error. Only the top edge draws material; other edges draw none.
ScrollEdgeEffectStyleSelectionThe scroll edge treatment and the edges to which it applies.
ScrollEdgeSelectionOne or more scroll edges, or all edges.The hard style throws an unsupported error. Only the top edge draws material; other edges draw none.
ScrollOffsetThe scroll position in points along the physical x and y axes.
ScrollPositionBindingA controlled scroll position: the id of the target in view, its anchor and the callback that receives changes.
ScrollPositionOptionsThe scroll view's position options: where it starts, whether it keeps visible content in place, a controlled position and a geometry callback.
ScrollTargetMarks content a vertical ScrollView can scroll to by id.Scroll targets, pull to refresh and scroll geometry work only on the vertical axis.
ScrollToTopOptionsOptions for scrollToTop: whether to animate.
ScrollViewA scrolling region, vertical by default. Inside a screen its id keys scroll restoration, so keep it stable. refreshable adds pull to refresh, and a ref handle scrolls to a ScrollTarget.The refresh indicator holds a 60 pt inset while the action runs. Scroll targets, pull to refresh and scroll geometry work only on the vertical axis. The hard style throws an unsupported error. Only the top edge draws material; other edges draw none.scrolling; pull to refresh; scroll to
ScrollViewHandleA scroll view's ref handle: its current offset, scrollTo a target and scrollToTop.
ScrollViewPropsA scroll view's id, axis, refresh action, keyboard dismissal, edge material and position options. Targets, refresh and geometry work only on the vertical axis.
SearchableA search field for a screen or list: its controlled text, prompt, placement, scopes and suggestions. The bar owns the field: its capsule, magnifier, clear button, close button, scope bar and collapse on scroll. In the bottom toolbar, the presented field rides above the keyboard with a close button, and the bar and title give way. Place <DefaultToolbarItem kind="search" placement="bottomBar" /> to put it beside other bottom bar items.The bottom toolbar field does not animate in yet and draws no scope bar, so scoped fields stay in the drawer. A search tab draws no bottom field; role="search" is metadata only. Do not build your own search bar.search bar; search field
SearchFieldPlacementWhere the search field goes. On iPhone, 'automatic' uses the bottom toolbar outside a TabView when the screen has no other bottom bar items or scopes; otherwise it uses a drawer that scrolls away with the content. On iPad, automatic search belongs to the trailing navigation toolbar, or below the sidebar toolbar in a split view. Explicit toolbar placement stays trailing on iPad, including narrow windows.The bottom toolbar field does not animate in yet and draws no scope bar, so scoped fields stay in the drawer. A search tab draws no bottom field; role="search" is metadata only. Do not build your own search bar.
SearchScopesA controlled scope bar, shown under the search field while search is presented.The bottom toolbar field does not animate in yet and draws no scope bar, so scoped fields stay in the drawer. A search tab draws no bottom field; role="search" is metadata only. Do not build your own search bar.
SearchSuggestionA suggestion shown under the search field. Choosing one replaces the search text; it does not submit.The bottom toolbar field does not animate in yet and draws no scope bar, so scoped fields stay in the drawer. A search tab draws no bottom field; role="search" is metadata only. Do not build your own search bar.
SectionA group of rows in a List or Form, with an optional header and footer.A ListRow is always one row: its children sit side by side. Use one ListRow per row.
SectionPropsA section's rows and its optional header and footer.
SecureFieldPassword entry through secure system input. In a List or Form it becomes the row.Password manager support is limited to autofill.password field
SecureFieldPropsSecureField's controlled text, label and prompt.
SelectableLets the user select and copy the text inside it. App chrome turns text selection off everywhere else, so wrap user-authored content such as notes or messages.Zoomable is the only region that zooms; the page itself never does. There is no general gesture composition.text selection; copy text
SelectablePropsThe wrapped content and plain div attributes.
semanticColorReturns a semantic colour, such as label or systemGroupedBackground, as a CSS colour that follows light and dark appearance. It also resolves inside portals.Values match iOS 27 at normal contrast. Increased contrast and Display P3 are not supported. Semantic label colours and layered secondary or tertiary text can differ slightly from iOS.
SemanticColorNameThe names of the iOS semantic colours for text, fills, backgrounds, separators and tint (label, secondarySystemBackground, …).
SensoryButtonA tap target that plays the system selection tick where the browser supports it. There is no other way to trigger haptics. Use plain content only: links, buttons and other form controls cannot be nested.Only selection or false. Keyboard and assistive activation may not tick.haptics; vibration
SensoryButtonPropsA tap target's action, content and the feedback it plays.
SensoryFeedbackThe feedback a SensoryButton plays. Only selection, the switch tick, exists.
ServerReachabilityConfigThe server probe and presentation policy for an app that requires connectivity.
ServerReachabilityStateThe last server probe, retry and connectivity presentation state.
ShareLinkA button that opens the system share sheet. Prepare file bytes before rendering, because the sheet must open during the press.No drag and drop or file provider integration. Completion means the system took the share, not that anyone received it; AbortError also covers having no suitable target. Not yet verified in an installed app.share sheet; share button
ShareLinkPropsThe text, URL or files to share, the button content and the completion and error callbacks.No drag and drop or file provider integration. Completion means the system took the share, not that anyone received it; AbortError also covers having no suitable target. Not yet verified in an installed app.
SheetA card that slides up over the current screen and can rest at several heights. It can host its own NavigationStack modal. Keep isPresented in plain React state: presentations start closed after a relaunch.Sheets start closed after a relaunch. Persist drafts separately, never the presentation flag.sheet; modal presentation; bottom sheet
SheetPropsA sheet's presentation binding, title, detents and drag behaviour. Supplying selection requires onSelectionChange.
SliderDrags a controlled number between min and max, continuously or in steps. In a List or Form it fills its own 60 pt row.No minimum or maximum value labels and no custom tick marks. The label is for accessibility only, and only the thumb can be dragged.slider; range input
SliderPropsSlider's controlled value, range, step and accessibility label.
SpacerTakes up the free space along its parent stack's axis.Default spacing and frame differences are listed in content.md. Props apply in a fixed order, not the order you write them.flexible space
SpacerPropsSpacer's minimum length in points.
SpringOptionsA spring's duration in milliseconds and its bounce, for Animation.spring.Other state and style changes do not animate. There is no null animation, easing curve, repeat, delay, completion callback or per-update timing; use one outer synchronous update. Bounce cannot be negative.
StackDeclarationA primary stack: its root route and, when that route requires them, the root's params.
StepperIncrements or decrements a controlled number within its bounds. It draws a row in a List and the bare control elsewhere.Controlled only: pass value and onChange.stepper; plus and minus buttons
StepperPropsStepper's controlled value, bounds and step.
storageQuotaThe app's storage quota: estimate() reports usage, and requestPersistence() asks WebKit not to evict the app's data. Request persistence after the user saves something meaningful.Data lives in IndexedDB on this device. The browser may evict it, and writes can fail.
StringPropertyKeyThe property keys whose values are strings.
SubmitLabelThe return key's title: done, go, next, search or send.
SwipeActionAn entry in a row's swipe actions: any menu entry, or a swipe command that shows only a symbol.
SwipeActionItemA swipe action command. It may drop its visible label if it has a symbol or icon and an accessibilityLabel.
SwipeActionsThe swipeActions prop of a row: actions for one edge, or a list with one entry per edge.swipe actions; swipe to delete
SwipeActionsConfigurationThe swipe actions on one row edge, trailing by default. A full swipe runs the first action unless allowsFullSwipe is false.
SymbolGlyphA symbol's artwork: filled SVG paths on a 56-unit grid, with optional layers for hierarchical and palette rendering, and its provenance. No font, HTML or external resource.
SymbolImageDraws a named vector symbol that sizes with the surrounding font and takes its colour. A .fill variant is chosen automatically where the context calls for it, such as a selected tab.The bundled symbols are Framework7 Icons 5.0.5 (MIT) plus clean-room glyphs drawn for Satin, not Apple SF Symbols. Keep their copyright and license notices. Provider glyphs need their own provenance. Only shipped or registered names draw.icon; glyph
SymbolImagePropsThe symbol's name, symbol properties and an optional accessible label.
SymbolNameA symbol name, such as 'plus' or 'trash.fill'. The bundled names autocomplete; any string is accepted for glyphs added through SymbolProvider.
SymbolProviderAdds or replaces symbol glyphs for everything inside it. Paths must be original, or redistributable with their provenance recorded.The bundled symbols are Framework7 Icons 5.0.5 (MIT) plus clean-room glyphs drawn for Satin, not Apple SF Symbols. Keep their copyright and license notices. Provider glyphs need their own provenance. Only shipped or registered names draw.
SymbolRenderingModeHow a symbol's layers are coloured: monochrome in one colour, hierarchical in shades of one colour, or palette with a colour per layer.
SymbolScaleA symbol's size relative to the text around it: small, medium or large.
SymbolSourceGlyphs by symbol name, for SymbolProvider.
SymbolWeightThe weight a symbol is drawn at. It uses the same names as font weights.
systemColorReturns a system colour as a CSS colour that follows light and dark appearance.Values match iOS 27 at normal contrast. Increased contrast and Display P3 are not supported. Semantic label colours and layered secondary or tertiary text can differ slightly from iOS.
SystemColorNameThe names of the iOS system colours. Each has a light and a dark value. Plain CSS colours work too.
TabRenders one declared tab inside a TabView. Its id, label and root stack come from defineNavigation.Only the declared tab styles exist. Desktop browsers are not supported.
TabDeclarationOne tab in defineNavigation: its id, label, symbol or icon, and the root of its stack.
TabIdThe union of a navigation declaration's tab ids.
TabPropsNames the declared tab to render.
TabSectionGroups Tabs under a collapsible header in the TabView sidebar. It adds no navigator of its own.Only sidebarOnly placement exists: no automatic sections in the top bar, no tab customization and no section header actions. Expansion lasts while the TabView is mounted. With no sidebar, a sidebar-only selection shows the first primary tab.
TabSectionPropsA sidebar group's title, optional id and placement, and its Tab children.
TabViewRenders the tabs from defineNavigation. Each tab keeps its own stack, and the selected tab is restored with the scene. Pass selection and onSelectionChange to control it; a controlled tab press only requests the change.Only the declared tab styles exist. Desktop browsers are not supported. There is no minimize behavior or placement hook yet, and the collapse into the tab bar is incomplete.tab bar; tabs
TabViewPropsTabView's selection binding and bar behaviour; its tabs come from defineNavigation.
TaskActionThe work useTask runs: pass signal to fetches and publish state through commit.
TaskCommitPublish synchronous state updates only while this invocation is current.
TaskOptionsOptions for useTask. A change of id cancels the current run and starts a new one.
TaskRunnerCancels the current run and starts the task again; resolves when that run ends.
TextInline text in a system text style. Nested Text inherits its enclosing style unless it sets its own. A lineLimit truncates with an ellipsis.Default spacing and frame differences are listed in content.md. Props apply in a fixed order, not the order you write them.text; font; typography
TextEditorMultiline text entry. In a List or Form it becomes the row; elsewhere it shows three lines by default.Text layout cannot be customized.multiline text; text area
TextEditorPropsTextEditor's controlled text, label and prompt.
TextFieldSingle-line controlled text with a label, an optional prompt and keyboard intent from kind. In a List or Form it becomes the row; elsewhere it draws a standalone field. axis="vertical" grows with its content.textFieldStyle="plain" removes the field chrome. WebKit owns the system keyboard, and text layout cannot be customized.text field; text input
TextFieldKindWhat a field holds, setting its keyboard, autofill and autocorrection together.
TextFieldPropsA single-line field, or with axis="vertical" a field that grows to its lineLimit.
TextFieldStyleHow a text field draws. automatic adapts to its container; plain draws no field chrome.
TextPropsText's font, weight, design, line limit and alignment.
TextStyleThe system text styles, sized as iOS draws them at the default text size.
TitleDisplayModeHow a screen title is drawn: inline in the bar, large below it, inlineLarge large inside the bar row, or none.
ToggleA controlled on/off value. It draws a switch row in a List or Form and a bare switch elsewhere. toggleStyle can make it a button or a custom ToggleStyle.Only the switch and button styles are built in; anything else needs a custom ToggleStyle.switch; checkbox
TogglePropsToggle's controlled value, label and control properties.
ToggleStyleA custom look for Toggle. Satin applies the declared semantics (switch, checkbox or button) to the element it owns; makeBody draws the appearance.
ToggleStyleConfigurationWhat a custom ToggleStyle draws from: the label, the on state and the pressed state, plus the shared control values.
ToolbarItemPlaces one item in the navigation bar or the bottom toolbar. Adjacent actions share a glass capsule; a ToolbarSpacer separates groups.Only the placements in ToolbarItemProps exist.toolbar button; bar button
ToolbarItemGroupGroups several items under one placement. They render as consecutive ToolbarItems and share one glass capsule.Only the placements in ToolbarItemProps exist.
ToolbarItemPropsA toolbar item's placement and content. automatic lets the bar choose; bottomBar puts it in the bottom toolbar.
ToolbarMinimizationBehaviorWhen the navigation bar minimizes: onScrollDown, onScrollUp or never.Navigation bar minimization is opt-in; never keeps the bar expanded.
ToolbarMinimizationRestorationWhat brings back a minimized bar: automatic, or only reaching the scroll edge (atScrollEdge).Navigation bar minimization is opt-in; never keeps the bar expanded.
ToolbarMinimizationSafeAreaAdjustmentWhether the content inset shrinks when the bar minimizes.Navigation bar minimization is opt-in; never keeps the bar expanded.
ToolbarSpacerSplits toolbar items into separate glass capsules. Consecutive items of one placement share one capsule; a spacer between them splits it. Place it directly in toolbar, next to the items.Only the placements in ToolbarItemProps exist.
ToolbarSpacerPropsThe spacer's sizing and placement.
TransactionCollectionA collection as seen inside db.transaction: its writes commit together or not at all.
TransactionCollectionsThe typed collection handles available inside a database transaction.
TransitionPhaseWhere a screen is in a navigation transition: entering, exiting or settled.
UpdateActivationWhen a downloaded update may apply: cold-launch, the default, or cold-launch-or-explicit, which also lets it apply on request, as the development menu does.
useAppStorageA small preference kept in local storage across launches. Every component that reads the same key sees the same value. Values must be JSON-serializable.Stored in the origin's local storage on this device. It does not sync across devices.persistent settings; preferences; local storage
useAppUpdateReports whether this launch applied an app update: justUpdated holds the previous and current build ids after an update, null otherwise (and until launch settles). Release updates apply at launch, before first input after foregrounding, or at a clean suspension.Preview builds may reload on update. Release, the default, applies updates only at safe moments.
useBuildInfoReturns the build that is running, even offline. The values are written by satinApp at build time; it never asks the server for the latest deployment.The build id is not a git revision or a service worker cache hash. Builds made without satinApp report "unavailable". What the server last served says nothing about which cached bundle is running.
useColorSchemeThe appearance Satin is drawing right now, light or dark.Increased contrast is not reported. Size classes are compact or regular only.dark mode
useDismissCloses the screen or presentation that contains the caller. In a pushed screen it pops that screen; at the root of a Sheet or FullScreenCover it dismisses the presentation, even when interactive dismissal is disabled. Elsewhere it does nothing.Covers cannot be swiped away. They start closed after a relaunch.close; go back
useEditModeReturns this screen's edit mode and a setter. EditButton toggles the same value, so a toolbar or bottom bar can follow it.Rows are identified by their ForEach ids. Edit mode belongs to each screen and cannot be set from outside it. Outside edit mode, plain rows cannot be selected with the keyboard.
useFocusChainMoves focus through a form's fields in order. The return key goes to the next field and the last one dismisses the keyboard. Disabled and unmounted fields are skipped. Spread field(key) onto each field.Focus moves only through the fields you register. A custom keyboard is not possible.next field; return key
useGlassErrorsEvery glass renderer error so far, re-rendering when one is added. For diagnostics screens; runApp's onGlassError is the way to report them.Diagnostics show what failed; they do not prove the app looks or behaves right on a device.
useHorizontalSizeClassThe horizontal size class: compact or regular. Inside a presentation it is the presentation's own class; elsewhere, the window's.Increased contrast is not reported. Size classes are compact or regular only.iPad layout; responsive layout
useKeyboardMetricsReturns the keyboard's geometry in points and re-renders as it changes. expectedHeight is the keyboard height to plan for before the keyboard has shown.It reads the keyboard; it cannot change the keyboard or add a separate keyboard lifecycle.keyboard height
useMediaPlayerReturns the app's audio player: its commands and its live state. The system's Lock Screen media controls drive the same player. Audio only; there is no video playback.Audio only, with no video player and no background playback beyond what WebKit allows. Playback depends on WebKit codec support and a server that serves byte ranges.audio player; music player
useNamespaceReturns a namespace that stays the same for the life of the component. Pass it to MatchedGeometryEffect and MatchedTransitionSource.Matches frames only, around the centre. Corner radius scales with the frame during the flight instead of staying fixed. A non-source view does not follow its source outside an animation. Glass does not travel with a removed view.
useNavigationReturns the enclosing stack's navigation actions, typed against the registered routes. A wrong route id or a missing param is a compile error.Navigation does not use browser history. Route params must match the declared schema.
useNotificationsThe app's notification permission and badge. Call requestAuthorization from a user gesture, after explaining why (see NotificationPermissionExplainer). Without runApp's notifications option the status is unsupported.Permission requires the app to be installed on the Home Screen. Local scheduled notifications are unavailable; schedule them from your own authenticated server.push notifications; badge
useOpenURLReturns a function that opens a URL from an action. App URLs that match a registered route navigate inside the app; other URLs go to the browser.You cannot force the external browser. A dispatched URL is not a loaded page. Cross-origin or blocked frames report unverified, and only same-origin frames can be reloaded or stopped.open link; open URL
useQueryReads a collection's records as { data, loading, error } and keeps them live. Local writes show up synchronously, before they persist.Data lives in IndexedDB on this device. The browser may evict it, and writes can fail.live query
useReachabilityThe app server's status and the offline view currently shown, with fetch and recheck helpers that feed the status.It cannot promise that a request will succeed.offline; network status
useRecordOne record by key, kept live; data is undefined while loading and when no record exists.Data lives in IndexedDB on this device. The browser may evict it, and writes can fail.
UserInterfaceSizeClassHow much room there is along one axis: compact or regular.
useSafeAreaInsetsThe live safe-area insets in CSS pixels. Use them instead of env(safe-area-inset-*).A top inset under a large title stays at the expanded title edge while the title collapses. On an installed iPhone the status bar area is a flat fill (see top-edge-limitation.md).safe area insets; notch; home indicator
useScaledMetricScales a dimension with the user's text size, relative to a text style (body by default). Use it for spacing or icon sizes that should grow with text.largeTitle and callout scale by fixed fallbacks, because WebKit has no system font keyword for them.text size scaling
useScenePhaseWhether the app is in use: active in the foreground with focus, inactive without focus, background when hidden.The browser may stop running the app while it is suspended. A screen's lifecycle is separate from the app's foreground state.foreground; background; app state
useSceneStorageState kept with the current navigation entry, so a draft survives a relaunch. Each pushed entry owns its own value. Values must be JSON-serializable. Keep saved records in a collection, not here.Do not store presentation visibility here. A checkpoint can be lost if the browser evicts storage or the process crashes.restorable screen state; draft
useScreenLifecycleRuns appear and disappear callbacks as the screen is shown and covered or removed, and returns whether it is covered and its transition phase.The browser may stop running the app while it is suspended. A screen's lifecycle is separate from the app's foreground state.
useTaskRuns async work while its screen is showing. It cancels the run when the screen is covered, its tab is hidden or the component unmounts, and starts again when it shows. Pass signal to fetch and publish results through commit. An error the task throws reaches the nearest error boundary. The returned runner cancels and replaces the current run.Cancellation is cooperative: state set outside commit cannot be stopped. The work runs in the foreground only; it is not a Web Worker or a background scheduler.cancellable task; data loading
useUnsavedChangesTells Satin the app has unsaved work while unsaved is true, so a pending app update waits instead of reloading over it. Edits in text fields are detected without this hook.It only delays app updates; it does not stop the user from dismissing a sheet.unsaved changes
useVerticalSizeClassThe vertical size class: compact or regular. Inside a presentation it is the presentation's own class; elsewhere, the window's.Increased contrast is not reported. Size classes are compact or regular only.
useWebAuthenticationReturns a sign-in flow's current state and re-renders when it changes. It checks for a finished sign-in on launch and when the app returns to the foreground.Needs a secure context, local storage, Web Locks, a dedicated uncached callback page and a server exchange. Bridge reads need a private transaction proof. Your server validates tokens and OpenID Connect. Completion in the background is not guaranteed.
useWebFrameMakes a controller to pass to a WebView, for reading its state and reloading or stopping it.You cannot force the external browser. A dispatched URL is not a loaded page. Cross-origin or blocked frames report unverified, and only same-origin frames can be reloaded or stopped.
VerticalScrollGeometryVertical scroll geometry: the current viewport and content offset in points.
VerticalTextFieldPropsVertical TextField's controlled text, growth limits and keyboard intent.
ViewportFitPolicyHow the app fits the screen around the notch and home indicator. adaptive picks a fit per device before the app renders.
ViewThatFitsShows the first child whose natural size fits the space, or the last child when none fits. It measures again when the space or a child resizes.Give it a definite height when it checks the vertical axis. Every child stays mounted: hidden children are inert and pause Satin tasks and activity indicators, but their own effects keep running.responsive layout; fallback layout
ViewThatFitsAxisThe axes a ViewThatFits candidate must fit along.
ViewThatFitsPropsThe axes to check, both by default, plus plain div attributes.
VisibilityWhether the navigation bar shows. A hidden bar reserves no row.
VStackArranges its children in a column. Set spacing where it matters: wrappers and custom controls do not pass their children's preferred spacing up to the stack.Default spacing and frame differences are listed in content.md. Props apply in a fixed order, not the order you write them.column; vertical layout
VStackPropsVStack's horizontal alignment and spacing in points.
WebAuthenticationA sign-in flow made by defineWebAuthentication: prepare, start, complete and resume it, or subscribe to its state.
WebAuthenticationCallbackResultThe outcome of complete on the callback page: the URL to return to, or why it was rejected.
WebAuthenticationConfigurationThe OAuth provider, client, callback and app URLs for defineWebAuthentication, and the exchange function that finishes sign-in on your server.
WebAuthenticationExchangeWhat exchange receives: the authorization code, the PKCE verifier and the values your server needs to redeem and check it.
WebAuthenticationRequestA prepared sign-in. Call start from the user's press.
WebAuthenticationStartResultWhether start opened the provider in a popup or a redirect, or why it could not.
WebAuthenticationStateWhere a sign-in stands, from idle through pending and completing to a final status.
WebFrameActionResultWhether a reload or stop request was sent to the frame, or why not.
WebFrameControllerReads a WebView's state and sends it reload and stop. Only same-origin frames expose their current page or accept these commands.
WebFrameStateThe embedded page's load state. A cross-origin page reports unverified, because its contents cannot be read.
WebViewEmbeds a web page in a sandboxed frame. The browser decides whether the page may be framed, and the frame's storage is partitioned from the app's.You cannot force the external browser. A dispatched URL is not a loaded page. Cross-origin or blocked frames report unverified, and only same-origin frames can be reloaded or stopped.iframe; embedded web page
WebViewPropsThe page URL, its accessible title, an optional controller, and what the page may run. Scripts and forms are off by default.
withAnimationApplies the state changes in update, then animates the MatchedGeometryEffect views they move, insert or remove. Call it from an event handler. Keyed List rows also move to their new positions. Other views take their new layout at once. Returns the callback result and passes errors through. Only synchronous updates take part, and nested calls join the outer one.Other state and style changes do not animate. There is no null animation, easing curve, repeat, delay, completion callback or per-update timing; use one outer synchronous update. Bounce cannot be negative.animated state update
WriteFailureA durable write that failed after it was published to memory, reported to db.onError.
ZoomableA region the user can pinch to zoom and pan, such as a photo or a map. The + and - keys zoom about the centre and 0 resets. Give it an accessible label.Zoomable is the only region that zooms; the page itself never does. There is no general gesture composition.pinch to zoom
ZoomablePropsThe maximum zoom (4 by default) and a scale callback. Satin owns the pointer handlers.
ZoomTransitionOptionsThe source identity and namespace for NavigationTransition.zoom.
ZStackLayers its children in one cell, later children on top. Assistive technology reads them in source order.Default spacing and frame differences are listed in content.md. Props apply in a fixed order, not the order you write them.layers; overlay
ZStackPropsHow ZStack aligns its layers.

diagnostics API ​

Module: @satinhq/kit/diagnostics

Readers for installation and appearance records, for an optional diagnostics screen.

Scroll horizontally to read every column.

Satin exportBehaviorLimitsAlso known as
AppearanceEventOne entry in the appearance diagnostics log: what happened and the appearance seen then.
InstallationDiagnosticsShows the app's installation receipts, for an optional diagnostics screen in Settings. Pass the app's scope.
InstallationDiagnosticsPropsThe app scope whose installation receipts are shown.
InstallationFailureAn installation failure recorded before the app launched: the build, the URL, the reason and whether the network failed.
readAppearanceDiagnosticsReturns a short log of appearance changes and lifecycle events, for diagnosing appearance after a resume.
readInstallationFailureReads the last recorded installation failure for an app scope, or null when there is none.

install API ​

Module: @satinhq/kit/install

Building blocks for a custom install page. They work only on the install page that satinApp builds.

Scroll horizontally to read every column.

Satin exportBehaviorLimitsAlso known as
copyInstallLinkCopies the install page's address. Never throws: a refusal is reported with the address.
CopyLinkResultWhether copyInstallLink copied the address, and the address itself.
InstallAppThe app being installed: its name, icon, tint and install page address.
InstallBrowserThe browser the install page is open in. in-app is a browser inside another app, which cannot add to the Home Screen.
InstallContextWhat a custom install page knows about where it is open: device, browser, Safari version, standalone mode and the app. A Safari tab cannot tell whether the app is already on the Home Screen.
InstallDeviceThe device the install page is open on: iphone, ipad or other.
InstallStepsThe three install steps for this device, browser and Safari layout, worded as on Satin's own install page.
InstallTipThe tip at Safari's real control ("Page Menu, then Share" or "Share"), in Satin's glass. Shown only in Safari 27 on an iPhone or iPad, where the control's place was measured; renders nothing anywhere else. Its glass takes the page's background colour.
readInstallContextReads the install context from the browser. It throws outside the install page that satinApp builds.
useInstallContextReturns the install context, read once when the page opens. It throws outside the install page.

server API ​

Module: @satinhq/kit/server

Node helpers for serving a built app. Keep them out of the browser bundle.

Scroll horizontally to read every column.

Satin exportBehaviorLimitsAlso known as
serveStaticFileServes a built app's static files from Node. It streams GET and HEAD requests and supports single byte ranges, with no caching or compression. The fallback file answers only missing extensionless routes; other methods are left to the caller. The root and every file, symlink targets included, must resolve inside the same real directory.

testing API ​

Module: @satinhq/kit/testing

Helpers for app tests. They do not prove real touches or notification delivery.

Scroll horizontally to read every column.

Satin exportBehaviorLimitsAlso known as
assertNavigationThrows unless the visible screen in container is the route screen. For app tests.
sendTestNotificationSends a test notification through a push relay and returns how many devices accepted it. The token is requested when called and never stored.

unstable API ​

Module: @satinhq/kit/unstable

Experimental API. Its contract may change between beta releases.

Scroll horizontally to read every column.

Satin exportBehaviorLimitsAlso known as
AnimationAn opaque spring timing value for withAnimation. Use a named value or Animation.spring.
concentricRadiusThe corner radius for a shape inset evenly inside a rounded container, so the two corners stay concentric. The result never goes below 0; a negative or non-finite argument throws.
DetailListA grouped list of rows for a split view's detail column at regular width.
DragGestureA drag that starts after the finger moves minimumDistance along the accepted axis.
DragGestureOptionsA drag's callbacks and state, the distance it must travel before it starts (10 by default) and the axis it accepts.
DragGestureValueA drag's current and start locations, its translation and its velocity.
GestureA gesture made by DragGesture, LongPressGesture, TapGesture or MagnifyGesture, for a GestureView.
GesturePointA point in CSS pixels.
GestureStateThe binding useGestureState returns. A gesture updates it while active and resets it when it ends.
GestureViewA region that recognizes custom gestures on its children. Scrolling and the back swipe still win the touches they own.
GestureViewPropsThe gestures a GestureView recognizes: a normal, a simultaneous and a high-priority gesture.
LongPressGestureA press held for minimumDurationMs without moving more than maximumDistance.
LongPressGestureOptionsA long press's callbacks and state, how long it must be held (500 ms by default) and how far the finger may move (10 by default).
MagnifyGestureA two-finger pinch that starts once the scale changes by minimumScaleDelta.
MagnifyGestureOptionsA pinch's callbacks and state, and how far the scale must change before it starts (0.01 by default).
MagnifyGestureValueA pinch's scale relative to its start, and the point it started around.
MatchedGeometryEffectWhen a withAnimation change removes this view and inserts another with the same id, the new one moves from the old one's frame to its own while the two cross-fade. A view that only moves or resizes animates from where it was. A matched view with no partner fades in or out. Wrap one element that has no transform of its own. Changes made outside withAnimation apply at once.
MatchedGeometryEffectPropsThe effect's id and namespace, whether it is the source, and the one element it wraps.
SidebarA list of sidebar destinations. Selecting one shows it in the split view's detail column.
SidebarEntryOne sidebar destination: its id, label, optional icon and disabled state.
SidebarPropsThe sidebar's entries, the selection callback and which entry starts selected.
SidebarSymbolDraws the sidebar's gearshape or sidebar.left icon with SymbolImage. The artwork is from Framework7 Icons (MIT).
SpringOptionsA spring's duration in milliseconds and its bounce, for Animation.spring.
TapGestureA tap, or count taps, that ends without moving more than maximumDistance. It reports where the finger lifted.
TapGestureOptionsA tap's callbacks and state, the number of taps (1 by default) and how far the finger may move (10 by default).
TransitionHow a view enters and leaves: opacity, scale and move effects. withAnimation sets the timing.
TransitionEdgeThe edge a view moves through, resolved against its own layout direction.
TransitionViewShows or hides its content with a transition when visible changes inside withAnimation. Keep the view itself mounted. Hidden content stays mounted and inert until its exit finishes, and the first render does not animate.
TransitionViewPropsWhether the content is visible, the transition to use and the content.
useDisplayCornerRadiusThe corner radius of the device screen in points, or 0 when the model is unknown. It updates after rotation, window moves and pixel-ratio changes that fire a resize.
useGestureStateReturns a value that a gesture drives, and the binding to pass as the gesture's state. The value goes back to initialValue when the gesture ends or is cancelled.
useSplitSelectionReturns the split view's mode and the entry shown in its detail column. It throws outside a split view.
withAnimationApplies the state changes in update, then animates the MatchedGeometryEffect views they move, insert or remove. Call it from an event handler. Keyed List rows also move to their new positions. Other views take their new layout at once. Returns the callback result and passes errors through. Only synchronous updates take part, and nested calls join the outer one.animated state update

vite API ​

Module: @satinhq/kit/vite

The Vite plugin that builds the app, its install page and its service worker.

Scroll horizontally to read every column.

Satin exportBehaviorLimitsAlso known as
defineAppDeclares app identity, install metadata and capabilities once. Pass the result to runApp and to the @satinhq/kit/vite plugin. Everything not given is defaulted and the whole definition is validated, so a bad id or icon fails at build time rather than after install.app manifest; app config
satinAppGenerates the app shell and loads framework CSS once, before app styles. The stylesheet participates in Vite CSS HMR and builds; pre-launch paints independently.
SatinAppOptionsBuild options for satinApp: a custom install page, strict glass, the development menu and a media probe.

Unsupported capabilities ​

These capabilities have no public export. The listed alternatives describe supported compositions, not additional props or controls.

Scroll horizontally to read every column.

CapabilitySupported alternativeLimits
custom hit shapesUse Pressable, which responds across its rectangle.Unsupported. Hit areas are rectangles.
custom toolbar backgroundsNavigation bars keep their standard background.Unsupported. There is no toolbar background or material override.
custom container backgroundsNavigation stacks and sheets keep their standard backgrounds.Unsupported. Their backgrounds belong to the containers.
multiple-date selectionNo multiple-date selection control is shipped.DatePicker selects one date.
collapsible disclosure groupsKeep sections visible until the framework expander is implemented.Unsupported. No disclosure expander is exported.
video playback and audio route selectionUse MediaPlayer only for the supported audio queue.No video, AirPlay route picker, fullscreen or Picture-in-Picture support yet.
gauge indicatorsUse ProgressView for linear or circular progress.No gauge styles are shipped.
custom title sizingUse the Screen title and subtitle and the toolbar title placements.Title sizes are fixed; there is no custom title font.
background work and scheduled local notificationsUse an authenticated server scheduler and Web Push for scheduled reminders.A suspended web app cannot run timers or background work.
additional reactive state primitivesUse React state, props and the exported framework providers and hooks.Arbitrary environment keys are unsupported; use React context.
arbitrary transitions and gesture modifiersUse withAnimation with MatchedGeometryEffect, or the motion already built into navigation, controls and presentations.No general transition, implicit animation or gesture modifier. Framework springs keep their measured values.

See application recipes, local data, geometry tokens and messaging scroll for supported compositions.

Entry draft and editor visibility ​

Render this component within a retained navigation screen. The draft checkpoints independently; the editor starts closed after relaunch.

tsx
import { useState } from 'react'
import { Button, Sheet, TextField, useSceneStorage } from '@satinhq/kit'

export function DraftEditor() {
  const [draft, setDraft] = useSceneStorage('draft', '')
  const [open, setOpen] = useState(false)
  return (
    <>
      <Button onPress={() => setOpen(true)}>Edit draft</Button>
      <Sheet title="Draft" isPresented={open} onPresentedChange={setOpen}>
        <TextField label="Draft" value={draft} onChange={setDraft} />
      </Sheet>
    </>
  )
}

Behavior review inventory ​

The declarations below have no dedicated reviewed behavior metadata. Type-only declarations are compile-time contracts; integration exports should be used with their module documentation. Adding a stable root value requires a reviewed behavior and limitation before generation can pass.

  • @satinhq/kit:ActionItem (Type)
  • @satinhq/kit:AdaptiveGridItemOptions (Type)
  • @satinhq/kit:AlertProps (Type)
  • @satinhq/kit:AlertTextFieldProps (Type)
  • @satinhq/kit:AppCapability (Type)
  • @satinhq/kit:AppDefinition (Type)
  • @satinhq/kit:AppDefinitionInput (Type)
  • @satinhq/kit:AppIcon (Type)
  • @satinhq/kit:AppOrientation (Type)
  • @satinhq/kit:AsyncImagePhase (Type)
  • @satinhq/kit:AsyncImageProps (Type)
  • @satinhq/kit:BuiltInButtonStyle (Type)
  • @satinhq/kit:BuiltInLabelStyle (Type)
  • @satinhq/kit:BuiltInToggleStyle (Type)
  • @satinhq/kit:ButtonBorderShape (Type)
  • @satinhq/kit:ButtonProps (Type)
  • @satinhq/kit:ButtonRole (Type)
  • @satinhq/kit:ButtonStyle (Type)
  • @satinhq/kit:ButtonStyleConfiguration (Type)
  • @satinhq/kit:Collection (Type)
  • @satinhq/kit:CollectionDefinition (Type)
  • @satinhq/kit:CollectionIndexes (Type)
  • @satinhq/kit:CollectionSchema (Type)
  • @satinhq/kit:CollectionUpdateMethods (Type)
  • @satinhq/kit:ColorPickerProps (Type)
  • @satinhq/kit:ColorScheme (Type)
  • @satinhq/kit:ConfirmationDialogProps (Type)
  • @satinhq/kit:ContentAlignment (Type)
  • @satinhq/kit:ContentFrame (Type)
  • @satinhq/kit:ContentMarginsProps (Type)
  • @satinhq/kit:ContentPadding (Type)
  • @satinhq/kit:ContentProps (Type)
  • @satinhq/kit:ContentUnavailableViewProps (Type)
  • @satinhq/kit:ContextMenuConfiguration (Type)
  • @satinhq/kit:ControlConfiguration (Type)
  • @satinhq/kit:ControlSize (Type)
  • @satinhq/kit:ControlStyleValues (Type)
  • @satinhq/kit:CoreSymbolName (Type)
  • @satinhq/kit:CornerShape (Type)
  • @satinhq/kit:DatabaseMigration (Type)
  • @satinhq/kit:DatabaseRecord (Type)
  • @satinhq/kit:DatePickerComponent (Type)
  • @satinhq/kit:DatePickerProps (Type)
  • @satinhq/kit:DatePickerRange (Type)
  • @satinhq/kit:DatePickerStyle (Type)
  • @satinhq/kit:DefaultToolbarItemProps (Type)
  • @satinhq/kit:Edge (Type)
  • @satinhq/kit:EdgeInsets (Type)
  • @satinhq/kit:EdgeLengths (Type)
  • @satinhq/kit:EdgeSet (Type)
  • @satinhq/kit:EdgeSetMember (Type)
  • @satinhq/kit:EditMode (Type)
  • @satinhq/kit:ExportDocument (Type)
  • @satinhq/kit:FixedGridItemOptions (Type)
  • @satinhq/kit:FlexibleGridItemOptions (Type)
  • @satinhq/kit:FocusChainField (Type)
  • @satinhq/kit:FontWeight (Type)
  • @satinhq/kit:ForEachProps (Type)
  • @satinhq/kit:FormProps (Type)
  • @satinhq/kit:FullScreenCoverProps (Type)
  • @satinhq/kit:GeometryFrame (Type)
  • @satinhq/kit:GeometryProxy (Type)
  • @satinhq/kit:GeometryReaderProps (Type)
  • @satinhq/kit:GeometrySize (Type)
  • @satinhq/kit:GlassEffectProps (Type)
  • @satinhq/kit:GlassError (Type)
  • @satinhq/kit:GlassErrorCode (Type)
  • @satinhq/kit:GlassShape (Type)
  • @satinhq/kit:GlassTint (Type)
  • @satinhq/kit:GridItemOptions (Type)
  • @satinhq/kit:GridItemValue (Type)
  • @satinhq/kit:HorizontalTextFieldProps (Type)
  • @satinhq/kit:HStackProps (Type)
  • @satinhq/kit:IgnoresSafeAreaProps (Type)
  • @satinhq/kit:ImageAsset (Type)
  • @satinhq/kit:ImageProps (Type)
  • @satinhq/kit:IndexesOfCollection (Type)
  • @satinhq/kit:JustUpdated (Type)
  • @satinhq/kit:KeyboardGeometry (Type)
  • @satinhq/kit:KeyboardMetrics (Type)
  • @satinhq/kit:LabeledContentProps (Type)
  • @satinhq/kit:LabelProps (Type)
  • @satinhq/kit:LabelStyle (Type)
  • @satinhq/kit:LabelStyleConfiguration (Type)
  • @satinhq/kit:LaunchScreenSlot (Type)
  • @satinhq/kit:LayoutModifierProps (Type)
  • @satinhq/kit:LazyHGridProps (Type)
  • @satinhq/kit:LazyHStackProps (Type)
  • @satinhq/kit:LazyVGridProps (Type)
  • @satinhq/kit:LazyVStackProps (Type)
  • @satinhq/kit:LineLimit (Type)
  • @satinhq/kit:LinkProps (Type)
  • @satinhq/kit:ListItemID (Type)
  • @satinhq/kit:ListRowProps (Type)
  • @satinhq/kit:ListSelectionProps (Type)
  • @satinhq/kit:ListStyle (Type)
  • @satinhq/kit:LocalReachabilityState (Type)
  • @satinhq/kit:MatchedTransitionSourceProps (Type)
  • @satinhq/kit:MediaCommandResult (Type)
  • @satinhq/kit:MediaController (Type)
  • @satinhq/kit:MediaQueueEntry (Type)
  • @satinhq/kit:MediaQueueOptions (Type)
  • @satinhq/kit:MediaRepeat (Type)
  • @satinhq/kit:MediaSnapshot (Type)
  • @satinhq/kit:MenuProps (Type)
  • @satinhq/kit:MenuTriggerProps (Type)
  • @satinhq/kit:NamespaceID (Type)
  • @satinhq/kit:Navigation (Type)
  • @satinhq/kit:NavigationArguments (Type)
  • @satinhq/kit:NavigationBackButtonBehavior (Type)
  • @satinhq/kit:NavigationDeclaration (Type)
  • @satinhq/kit:NavigationLinkProps (Type)
  • @satinhq/kit:NavigationSplitViewProps (Type)
  • @satinhq/kit:NavigationStackProps (Type)
  • @satinhq/kit:NotificationAuthorizationStatus (Type)
  • @satinhq/kit:NotificationPermissionExplainerProps (Type)
  • @satinhq/kit:OfflinePresentationProps (Type)
  • @satinhq/kit:OpenURLAction (Type)
  • @satinhq/kit:OpenURLOptions (Type)
  • @satinhq/kit:OpenURLResult (Type)
  • @satinhq/kit:OrientationFallback (Type)
  • @satinhq/kit:OverlayProps (Type)
  • @satinhq/kit:Parameter (Type)
  • @satinhq/kit:ParameterSchema (Type)
  • @satinhq/kit:PickerProps (Type)
  • @satinhq/kit:PresentationDetent (Type)
  • @satinhq/kit:PresentationProps (Type)
  • @satinhq/kit:PressableOwnedHandlers (Type)
  • @satinhq/kit:PressableProps (Type)
  • @satinhq/kit:PressState (Type)
  • @satinhq/kit:ProgressViewProps (Type)
  • @satinhq/kit:ProgressViewStyle (Type)
  • @satinhq/kit:ReachabilityPresentation (Type)
  • @satinhq/kit:ReachabilityProbeConfig (Type)
  • @satinhq/kit:ReachabilityRoutePolicy (Type)
  • @satinhq/kit:ReachabilityState (Type)
  • @satinhq/kit:ReachabilityStateStatus (Type)
  • @satinhq/kit:ReachabilityStatus (Type)
  • @satinhq/kit:ReachabilitySurface (Type)
  • @satinhq/kit:RecordOfCollection (Type)
  • @satinhq/kit:Register (Type)
  • @satinhq/kit:RegisteredNavigation (Type)
  • @satinhq/kit:RegisteredRoutes (Type)
  • @satinhq/kit:RouteDefinition (Type)
  • @satinhq/kit:RouteOptions (Type)
  • @satinhq/kit:RouteParameters (Type)
  • @satinhq/kit:RouteParameterValue (Type)
  • @satinhq/kit:RouteProps (Type)
  • @satinhq/kit:Routes (Type)
  • @satinhq/kit:RowActionsProps (Type)
  • @satinhq/kit:RowIconProps (Type)
  • @satinhq/kit:RowInteractionProps (Type)
  • @satinhq/kit:RowLabelProps (Type)
  • @satinhq/kit:RunAppConfiguration (Type)
  • @satinhq/kit:RunAppOptions (Type)
  • @satinhq/kit:SafeAreaBarProps (Type)
  • @satinhq/kit:SafeAreaInsetEdge (Type)
  • @satinhq/kit:SafeAreaInsetProps (Type)
  • @satinhq/kit:SafeAreaPaddingProps (Type)
  • @satinhq/kit:ScenePhase (Type)
  • @satinhq/kit:ScreenLifecycle (Type)
  • @satinhq/kit:ScreenLifecycleCallbacks (Type)
  • @satinhq/kit:ScreenProps (Type)
  • @satinhq/kit:ScrollAnchor (Type)
  • @satinhq/kit:ScrollAxis (Type)
  • @satinhq/kit:ScrollDismissesKeyboardMode (Type)
  • @satinhq/kit:ScrollEdge (Type)
  • @satinhq/kit:ScrollEdgeEffectStyleSelection (Type)
  • @satinhq/kit:ScrollOffset (Type)
  • @satinhq/kit:ScrollPositionBinding (Type)
  • @satinhq/kit:ScrollPositionOptions (Type)
  • @satinhq/kit:ScrollToTopOptions (Type)
  • @satinhq/kit:ScrollViewHandle (Type)
  • @satinhq/kit:ScrollViewProps (Type)
  • @satinhq/kit:SectionProps (Type)
  • @satinhq/kit:SecureFieldProps (Type)
  • @satinhq/kit:SelectableProps (Type)
  • @satinhq/kit:SemanticColorName (Type)
  • @satinhq/kit:SensoryButtonProps (Type)
  • @satinhq/kit:SensoryFeedback (Type)
  • @satinhq/kit:ServerReachabilityConfig (Type)
  • @satinhq/kit:ServerReachabilityState (Type)
  • @satinhq/kit:SheetProps (Type)
  • @satinhq/kit:SliderProps (Type)
  • @satinhq/kit:SpacerProps (Type)
  • @satinhq/kit:StackDeclaration (Type)
  • @satinhq/kit:StepperProps (Type)
  • @satinhq/kit:StringPropertyKey (Type)
  • @satinhq/kit:SubmitLabel (Type)
  • @satinhq/kit:SwipeAction (Type)
  • @satinhq/kit:SwipeActionItem (Type)
  • @satinhq/kit:SwipeActions (Type)
  • @satinhq/kit:SwipeActionsConfiguration (Type)
  • @satinhq/kit:SymbolGlyph (Type)
  • @satinhq/kit:SymbolImageProps (Type)
  • @satinhq/kit:SymbolName (Type)
  • @satinhq/kit:SymbolRenderingMode (Type)
  • @satinhq/kit:SymbolScale (Type)
  • @satinhq/kit:SymbolSource (Type)
  • @satinhq/kit:SymbolWeight (Type)
  • @satinhq/kit:SystemColorName (Type)
  • @satinhq/kit:TabDeclaration (Type)
  • @satinhq/kit:TabId (Type)
  • @satinhq/kit:TabProps (Type)
  • @satinhq/kit:TabSectionProps (Type)
  • @satinhq/kit:TabViewProps (Type)
  • @satinhq/kit:TaskAction (Type)
  • @satinhq/kit:TaskCommit (Type)
  • @satinhq/kit:TaskOptions (Type)
  • @satinhq/kit:TaskRunner (Type)
  • @satinhq/kit:TextEditorProps (Type)
  • @satinhq/kit:TextFieldKind (Type)
  • @satinhq/kit:TextFieldProps (Type)
  • @satinhq/kit:TextFieldStyle (Type)
  • @satinhq/kit:TextProps (Type)
  • @satinhq/kit:TextStyle (Type)
  • @satinhq/kit:TitleDisplayMode (Type)
  • @satinhq/kit:ToggleProps (Type)
  • @satinhq/kit:ToggleStyle (Type)
  • @satinhq/kit:ToggleStyleConfiguration (Type)
  • @satinhq/kit:ToolbarItemProps (Type)
  • @satinhq/kit:ToolbarSpacerProps (Type)
  • @satinhq/kit:TransactionCollection (Type)
  • @satinhq/kit:TransactionCollections (Type)
  • @satinhq/kit:TransitionPhase (Type)
  • @satinhq/kit:UpdateActivation (Type)
  • @satinhq/kit:UserInterfaceSizeClass (Type)
  • @satinhq/kit:VerticalScrollGeometry (Type)
  • @satinhq/kit:VerticalTextFieldProps (Type)
  • @satinhq/kit:ViewportFitPolicy (Type)
  • @satinhq/kit:ViewThatFitsAxis (Type)
  • @satinhq/kit:ViewThatFitsProps (Type)
  • @satinhq/kit:Visibility (Type)
  • @satinhq/kit:VStackProps (Type)
  • @satinhq/kit:WebAuthentication (Type)
  • @satinhq/kit:WebAuthenticationCallbackResult (Type)
  • @satinhq/kit:WebAuthenticationConfiguration (Type)
  • @satinhq/kit:WebAuthenticationExchange (Type)
  • @satinhq/kit:WebAuthenticationRequest (Type)
  • @satinhq/kit:WebAuthenticationStartResult (Type)
  • @satinhq/kit:WebAuthenticationState (Type)
  • @satinhq/kit:WebFrameActionResult (Type)
  • @satinhq/kit:WebFrameController (Type)
  • @satinhq/kit:WebFrameState (Type)
  • @satinhq/kit:WebViewProps (Type)
  • @satinhq/kit:WriteFailure (Type)
  • @satinhq/kit:ZoomableProps (Type)
  • @satinhq/kit:ZoomTransitionOptions (Type)
  • @satinhq/kit:ZStackProps (Type)
  • @satinhq/kit/diagnostics:AppearanceEvent (Type)
  • @satinhq/kit/diagnostics:InstallationDiagnostics (Value)
  • @satinhq/kit/diagnostics:InstallationDiagnosticsProps (Type)
  • @satinhq/kit/diagnostics:InstallationFailure (Type)
  • @satinhq/kit/diagnostics:readAppearanceDiagnostics (Value)
  • @satinhq/kit/diagnostics:readInstallationFailure (Value)
  • @satinhq/kit/install:copyInstallLink (Value)
  • @satinhq/kit/install:CopyLinkResult (Type)
  • @satinhq/kit/install:InstallApp (Type)
  • @satinhq/kit/install:InstallBrowser (Type)
  • @satinhq/kit/install:InstallContext (Type)
  • @satinhq/kit/install:InstallDevice (Type)
  • @satinhq/kit/install:InstallSteps (Value)
  • @satinhq/kit/install:InstallTip (Value)
  • @satinhq/kit/install:readInstallContext (Value)
  • @satinhq/kit/install:useInstallContext (Value)
  • @satinhq/kit/internal/vite:AppFixture (Type)
  • @satinhq/kit/internal/vite:defineApp (Value)
  • @satinhq/kit/internal/vite:defineAppFixture (Value)
  • @satinhq/kit/internal/vite:satinApp (Value)
  • @satinhq/kit/internal/vite:satinAppFixtures (Value)
  • @satinhq/kit/internal/vite:SatinAppOptions (Type)
  • @satinhq/kit/internal/vite:satinAppShell (Value)
  • @satinhq/kit/internal/vite:SatinAppShellPluginOptions (Type)
  • @satinhq/kit/server:serveStaticFile (Value)
  • @satinhq/kit/testing:assertNavigation (Value)
  • @satinhq/kit/testing:sendTestNotification (Value)
  • @satinhq/kit/unstable:Animation (Value)
  • @satinhq/kit/unstable:concentricRadius (Value)
  • @satinhq/kit/unstable:DetailList (Value)
  • @satinhq/kit/unstable:DragGesture (Value)
  • @satinhq/kit/unstable:DragGestureOptions (Type)
  • @satinhq/kit/unstable:DragGestureValue (Type)
  • @satinhq/kit/unstable:Gesture (Type)
  • @satinhq/kit/unstable:GesturePoint (Type)
  • @satinhq/kit/unstable:GestureState (Type)
  • @satinhq/kit/unstable:GestureView (Value)
  • @satinhq/kit/unstable:GestureViewProps (Type)
  • @satinhq/kit/unstable:LongPressGesture (Value)
  • @satinhq/kit/unstable:LongPressGestureOptions (Type)
  • @satinhq/kit/unstable:MagnifyGesture (Value)
  • @satinhq/kit/unstable:MagnifyGestureOptions (Type)
  • @satinhq/kit/unstable:MagnifyGestureValue (Type)
  • @satinhq/kit/unstable:MatchedGeometryEffect (Value)
  • @satinhq/kit/unstable:MatchedGeometryEffectProps (Type)
  • @satinhq/kit/unstable:Sidebar (Value)
  • @satinhq/kit/unstable:SidebarEntry (Type)
  • @satinhq/kit/unstable:SidebarProps (Type)
  • @satinhq/kit/unstable:SidebarSymbol (Value)
  • @satinhq/kit/unstable:SpringOptions (Type)
  • @satinhq/kit/unstable:TapGesture (Value)
  • @satinhq/kit/unstable:TapGestureOptions (Type)
  • @satinhq/kit/unstable:Transition (Value)
  • @satinhq/kit/unstable:TransitionEdge (Type)
  • @satinhq/kit/unstable:TransitionView (Value)
  • @satinhq/kit/unstable:TransitionViewProps (Type)
  • @satinhq/kit/unstable:useDisplayCornerRadius (Value)
  • @satinhq/kit/unstable:useGestureState (Value)
  • @satinhq/kit/unstable:useSplitSelection (Value)
  • @satinhq/kit/unstable:withAnimation (Value)
  • @satinhq/kit/vite:defineApp (Value)
  • @satinhq/kit/vite:satinApp (Value)
  • @satinhq/kit/vite:SatinAppOptions (Type)

Declaration graph fingerprints ​

  • @satinhq/kit:d5c16db4336f11629ef6dac166c27e17b2dde108eaeb7fe86f1b383d0ae76c4c
  • @satinhq/kit/vite:aae491af836b19471a7306a4f2fec9e5eb8cd68184ce26ec6aeea033e593a15e
  • @satinhq/kit/install:e080a0874c9490077cf9cbb117e03d5d58252226e9424d84101be7ee4454a422
  • @satinhq/kit/unstable:59f001f3090a2b56ad18df3b0ef8b7d4546c5c7ccbbfc4f793da98d1ad27bf34
  • @satinhq/kit/server:7d2b996d9541bd82fd0936e0482554f3182ffe004be56928e590ad4c4c8c79bd
  • @satinhq/kit/testing:04a86ddf0741e53228777bd599cbd00ff503b9e216a1f86a9791fdbee1bd5e12
  • @satinhq/kit/diagnostics:05327eaa9f5a55ab73834d5abaeaeffd98cfc6294fa5af5d3ba03a8609463eac
  • @satinhq/kit/internal/vite:127e9845619cf9939e4200986696109e5412492394afa432c1ae9c9cde98121b

Framework source fingerprint ​

SHA-256 of sorted TS/TSX/CSS source paths and bytes, excluding tests: bfe908b1d153b9ef38d049a46fd3934d97e5b9ffe942f4d75c406e5579fc97af

Satin runs on the Lumen rendering engine and is open source under the MIT License.