@swiftbrowser/react 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/environment.ts","../src/host/reconciler.ts","../src/host/instance.ts","../src/host/tree.ts","../src/host/root.ts","../src/mount.ts","../src/navigation-context.ts","../src/bridge.ts","../src/island.tsx","../src/binding.ts","../src/host/sb.ts","../src/coordinateSpace.tsx","../src/dragDrop.tsx","../src/values.ts","../src/scrollEnvironment.tsx","../src/components/row.tsx","../src/scrollReader.tsx","../src/lazy.tsx","../src/components/stacks.tsx","../src/components/text.tsx","../src/components/navigation.tsx","../src/components/split.tsx","../src/presentation.tsx","../src/inspector.tsx","../src/lifecycle.tsx","../src/pointer.tsx","../src/modifiers.tsx","../src/components/geometry.tsx","../src/visualEffect.tsx","../src/path.ts","../src/components/controls.tsx","../src/components/lists.tsx","../src/components/tabs.tsx","../src/components/shapes.tsx","../src/components/host.tsx","../src/components/menus.tsx","../src/components/images.tsx","../src/components/charts.tsx","../src/components/containers.tsx","../src/components/table.tsx","../src/components/system.tsx","../src/components/canvas.tsx","../src/components/media.tsx","../src/components/animators.tsx"],"sourcesContent":["/**\n * Environment values: what a modifier on a container passes to the views\n * below it (`.buttonStyle`, `.controlSize`…), and the device environment the\n * page sets (color scheme, Dynamic Type size).\n */\n\nimport type { ButtonStyle, ColorScheme, DynamicTypeSize, PickerStyle } from '@swiftbrowser/web/src/protocol';\nimport { createContext, createElement, useContext, type ReactNode } from 'react';\n\nexport type ControlSize = 'mini' | 'small' | 'regular' | 'large' | 'extraLarge';\n\nexport interface ViewEnvironment {\n buttonStyle?: ButtonStyle;\n controlSize?: ControlSize;\n pickerStyle?: PickerStyle;\n labelsHidden?: boolean;\n /** `.refreshable`: the nearest `List` or `ScrollView` below runs it on a pull. */\n refresh?: () => unknown;\n /** `.submitLabel`: the return key's label of the text fields below. */\n submitLabel?: string;\n /** `.labelStyle`: how the `Label`s below draw. */\n labelStyle?: 'automatic' | 'titleAndIcon' | 'titleOnly' | 'iconOnly';\n /** `.redacted(reason: .placeholder)`: text and images below draw as placeholder shapes. */\n redacted?: boolean;\n /** `.textCase(_:)` for the texts below. */\n textCase?: 'uppercase' | 'lowercase' | null;\n /** Inside an alert's actions: tapping a button also dismisses the alert. */\n dismissAlert?: () => void;\n}\n\nexport const ViewEnvironmentContext = createContext<ViewEnvironment>({});\n\nexport function useViewEnvironment(): ViewEnvironment {\n return useContext(ViewEnvironmentContext);\n}\n\n/** Wrap `children` in an environment with `values` added. */\nexport function withEnvironment(values: ViewEnvironment, children: ReactNode): ReactNode {\n return createElement(EnvironmentExtender, { values }, children);\n}\n\nfunction EnvironmentExtender({ values, children }: { values: ViewEnvironment; children?: ReactNode }): ReactNode {\n const parent = useContext(ViewEnvironmentContext);\n return createElement(ViewEnvironmentContext.Provider, { value: { ...parent, ...values } }, children);\n}\n\nexport type HorizontalSizeClass = 'compact' | 'regular';\n\nexport interface Environment {\n colorScheme: ColorScheme;\n dynamicTypeSize: DynamicTypeSize;\n /** `compact` below 700 points of width (an iPhone), `regular` from it (an iPad, a desktop window). */\n horizontalSizeClass: HorizontalSizeClass;\n}\n\nexport const EnvironmentContext = createContext<Environment>({\n colorScheme: 'light',\n dynamicTypeSize: 'large',\n horizontalSizeClass: 'compact',\n});\n\nexport function EnvironmentProvider({ value, children }: { value: Environment; children?: ReactNode }): ReactNode {\n return createElement(EnvironmentContext.Provider, { value }, children);\n}\n\n/** `@Environment(\\.colorScheme)` */\nexport function useColorScheme(): ColorScheme {\n return useContext(EnvironmentContext).colorScheme;\n}\n\n/** `@Environment(\\.dynamicTypeSize)` */\nexport function useDynamicTypeSize(): DynamicTypeSize {\n return useContext(EnvironmentContext).dynamicTypeSize;\n}\n\n/** `@Environment(\\.dismiss)`: set by sheets and pushed screens. */\nexport const DismissContext = createContext<(() => void) | null>(null);\n\nexport function useDismiss(): () => void {\n const dismiss = useContext(DismissContext);\n return dismiss ?? (() => {});\n}\n\n/** `@Environment(\\.horizontalSizeClass)` */\nexport function useHorizontalSizeClass(): HorizontalSizeClass {\n return useContext(EnvironmentContext).horizontalSizeClass;\n}\n\n/** `@Environment(\\.redactionReasons)`: whether the views below are placeholders. */\nexport function useRedacted(): boolean {\n return useContext(ViewEnvironmentContext).redacted === true;\n}\n","/**\n * The react-reconciler host config: React mutates `Instance` trees, and\n * `resetAfterCommit` asks the `HostTree` for the ops of the pass.\n */\n\nimport { createContext } from 'react';\nimport Reconciler from 'react-reconciler';\nimport { DefaultEventPriority } from 'react-reconciler/constants';\nimport type { HostProps, Instance } from './instance';\nimport type { HostTree } from './tree';\n\ntype HostContext = Record<string, never>;\n\nlet currentUpdatePriority = 0;\n\nfunction detach(parent: { children: Instance[] }, child: Instance): void {\n const at = parent.children.indexOf(child);\n if (at >= 0) parent.children.splice(at, 1);\n}\n\ntype Config = Reconciler.HostConfig<\n string, // Type\n HostProps, // Props\n HostTree, // Container\n Instance, // Instance\n never, // TextInstance\n never, // ActivityInstance\n never, // SuspenseInstance\n never, // HydratableInstance\n never, // FormInstance\n Instance, // PublicInstance\n HostContext, // HostContext\n never, // ChildSet\n ReturnType<typeof setTimeout>, // TimeoutHandle\n -1, // NoTimeout\n null, // TransitionStatus\n null, // SuspendedState\n null, // RendererInspectionConfig\n never, // FormStateMarkerInstance\n never, // HoistableRoot\n never // Resource\n>;\n\nconst hostConfig: Config = {\n supportsMutation: true,\n supportsPersistence: false,\n supportsHydration: false,\n isPrimaryRenderer: true,\n noTimeout: -1,\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n supportsMicrotasks: true,\n scheduleMicrotask: queueMicrotask,\n\n getRootHostContext: () => ({}),\n getChildHostContext: (parent) => parent,\n getPublicInstance: (instance) => instance,\n prepareForCommit: () => null,\n resetAfterCommit: (tree) => tree.commit(),\n preparePortalMount: () => {},\n shouldSetTextContent: () => false,\n\n createInstance: (type, props, tree) => {\n if (type !== 'sb') throw new Error(`Unknown host element <${type}>: only SwiftUI components render here.`);\n return tree.createInstance(props);\n },\n createTextInstance: (text) => {\n throw new Error(`Text strings must be rendered within a <Text> component (got ${JSON.stringify(text)}).`);\n },\n appendInitialChild: (parent, child) => parent.children.push(child),\n finalizeInitialChildren: () => false,\n commitMount: () => {},\n commitUpdate: (instance, _type, _prev, next, handle) => {\n const tree = treeOf(handle);\n if (tree) tree.updateInstance(instance, next);\n else {\n instance.props = next.props ?? {};\n instance.on = next.on;\n instance.target = next.target;\n }\n },\n\n appendChild: (parent, child) => {\n detach(parent, child);\n parent.children.push(child);\n },\n appendChildToContainer: (tree, child) => {\n detach(tree.root, child);\n tree.root.children.push(child);\n },\n insertBefore: (parent, child, before) => {\n detach(parent, child);\n const at = parent.children.indexOf(before);\n parent.children.splice(at < 0 ? parent.children.length : at, 0, child);\n },\n insertInContainerBefore: (tree, child, before) => {\n detach(tree.root, child);\n const at = tree.root.children.indexOf(before);\n tree.root.children.splice(at < 0 ? tree.root.children.length : at, 0, child);\n },\n removeChild: (parent, child) => detach(parent, child),\n removeChildFromContainer: (tree, child) => detach(tree.root, child),\n clearContainer: (tree) => {\n tree.root.children = [];\n },\n resetTextContent: () => {},\n commitTextUpdate: () => {},\n hideInstance: (instance) => {\n instance.hidden = true;\n },\n unhideInstance: (instance) => {\n instance.hidden = false;\n },\n hideTextInstance: () => {},\n unhideTextInstance: () => {},\n detachDeletedInstance: () => {},\n\n getInstanceFromNode: () => null,\n beforeActiveInstanceBlur: () => {},\n afterActiveInstanceBlur: () => {},\n prepareScopeUpdate: () => {},\n getInstanceFromScope: () => null,\n setCurrentUpdatePriority: (priority) => {\n currentUpdatePriority = priority;\n },\n getCurrentUpdatePriority: () => currentUpdatePriority,\n resolveUpdatePriority: () => (currentUpdatePriority !== 0 ? currentUpdatePriority : DefaultEventPriority),\n resetFormInstance: () => {},\n requestPostPaintCallback: () => {},\n shouldAttemptEagerTransition: () => false,\n trackSchedulerEvent: () => {},\n resolveEventType: () => null,\n resolveEventTimeStamp: () => -1.1,\n maySuspendCommit: () => false,\n maySuspendCommitOnUpdate: () => false,\n maySuspendCommitInSyncRender: () => false,\n suspendOnActiveViewTransition: () => {},\n getSuspendedCommitReason: () => null,\n bindToConsole: (methodName, args) => () => (console as unknown as Record<string, (...a: unknown[]) => unknown>)[methodName]?.(...args),\n preloadInstance: () => true,\n startSuspendingCommit: () => null,\n suspendInstance: () => {},\n waitForCommitToBeReady: () => null,\n NotPendingTransition: null,\n HostTransitionContext: createContext<null>(null) as unknown as Config['HostTransitionContext'],\n rendererVersion: '0.3.1',\n rendererPackageName: '@swiftbrowser/react',\n extraDevToolsConfig: null,\n};\n\n/**\n * The fiber's root container: `commitUpdate` needs the tree to retire an\n * element whose kind changed. React hands the fiber as the opaque handle.\n */\nfunction treeOf(handle: unknown): HostTree | null {\n let fiber = handle as { return: unknown; stateNode: unknown; tag: number } | null;\n while (fiber) {\n // HostRoot fibers (tag 3) hold the FiberRoot, whose containerInfo is our tree.\n if (fiber.tag === 3) return (fiber.stateNode as { containerInfo: HostTree }).containerInfo;\n fiber = fiber.return as typeof fiber;\n }\n return null;\n}\n\nexport const reconciler = Reconciler(hostConfig);\n","/**\n * The host tree the reconciler mutates: one `Instance` per host element. A\n * host element is always the intrinsic type `sb` with a `kind` (an element\n * kind of the ops protocol, or one of the two virtual kinds below) and the\n * element's `props`; the React components in ../components render nothing\n * else.\n */\n\nimport type { RendererEvent } from '@swiftbrowser/web/src/protocol';\nimport type { ReactNode } from 'react';\n\nexport type EventType = RendererEvent['type'];\nexport type EventOf<K extends EventType> = Extract<RendererEvent, { type: K }>;\n/** The renderer's events an element answers, by type. */\nexport type EventHandlers = { [K in EventType]?: (event: EventOf<K>) => void };\n\n/**\n * Where a virtual element acts: the nearest enclosing `navscreen` or `sheet`\n * element, or the root container.\n */\nexport type HoistTarget = 'navscreen' | 'sheet' | 'root';\n\n/**\n * A preference: not an element itself; its `props` are merged into the\n * target's props (`.navigationTitle` sets the enclosing screen's `title`,\n * `.presentationDetents` the enclosing sheet's `detents`).\n */\nexport const PREF_KIND = '$pref';\n/**\n * A hoist: not an element itself; its children become children of the target\n * after the target's own (`.toolbar` items join the screen, `.sheet` content\n * becomes a root-level `sheet` element).\n */\nexport const HOIST_KIND = '$hoist';\n\nexport interface HostProps {\n kind: string;\n props?: Record<string, unknown>;\n on?: EventHandlers;\n target?: HoistTarget;\n children?: ReactNode;\n}\n\nexport interface Instance {\n /** The element id in the ops protocol; stable for the instance's life. */\n id: number;\n kind: string;\n props: Record<string, unknown>;\n on: EventHandlers | undefined;\n target: HoistTarget | undefined;\n /** The children as React currently has them (virtual kinds included). */\n children: Instance[];\n /** Hidden by Suspense: left out of the emitted tree. */\n hidden: boolean;\n /** Whether a `create` op was emitted for the current id. */\n created: boolean;\n committedProps: Record<string, unknown> | null;\n committedParent: TreeNode | null;\n committedChildren: Instance[];\n}\n\n/** The root container, element id 0. */\nexport interface RootNode {\n id: 0;\n kind: 'root';\n children: Instance[];\n committedChildren: Instance[];\n}\n\nexport type TreeNode = Instance | RootNode;\n","/**\n * Turns the host tree into ops. The reconciler mutates `Instance.children`\n * freely during a React commit; `flush` then resolves the virtual kinds\n * (preferences and hoists), diffs the result against what was emitted last\n * time and produces one render pass: creates and updates, inserts (parents\n * before children, as the Swift core orders them), removes, `commit`.\n */\n\nimport type { Animation, Op, RendererEvent } from '@swiftbrowser/web/src/protocol';\nimport { HOIST_KIND, PREF_KIND, type HostProps, type Instance, type RootNode, type TreeNode } from './instance';\n\nexport type OpsSink = (ops: Op[]) => void;\n\ninterface Effective {\n props: Record<string, unknown>;\n children: Instance[];\n /** Children hoisted here from inside the subtree, appended after `children`. */\n hoisted: Instance[];\n}\n\ninterface Context {\n navscreen?: Instance;\n sheet?: Instance;\n}\n\nexport class HostTree {\n readonly root: RootNode = { id: 0, kind: 'root', children: [], committedChildren: [] };\n private nextId = 1;\n /** Emitted elements by id, for event dispatch. */\n private readonly live = new Map<number, Instance>();\n private committedLive = new Set<Instance>();\n /** Ids whose element changed kind: removed at the end of the next flush. */\n private retired: number[] = [];\n /** `withAnimation`: stamped on the next `commit`. */\n pendingAnimation: Animation | undefined;\n /** The root's `colorScheme` last sent (`.preferredColorScheme`); undefined while none was. */\n private committedColorScheme: 'light' | 'dark' | null | undefined;\n\n constructor(private readonly sink: OpsSink) {}\n\n createInstance(props: HostProps): Instance {\n return {\n id: this.nextId++,\n kind: props.kind,\n props: props.props ?? {},\n on: props.on,\n target: props.target,\n children: [],\n hidden: false,\n created: false,\n committedProps: null,\n committedParent: null,\n committedChildren: [],\n };\n }\n\n updateInstance(instance: Instance, next: HostProps): void {\n if (next.kind !== instance.kind) {\n // An element cannot change kind: the old one goes, a new id takes its\n // place and the children move over.\n if (instance.created) {\n this.retired.push(instance.id);\n this.live.delete(instance.id);\n }\n instance.id = this.nextId++;\n instance.kind = next.kind;\n instance.created = false;\n instance.committedProps = null;\n instance.committedParent = null;\n instance.committedChildren = [];\n }\n instance.props = next.props ?? {};\n instance.on = next.on;\n instance.target = next.target;\n }\n\n /** Emit the ops for everything that changed since the last commit. */\n commit(): void {\n const ops = this.flush();\n if (ops.length > 0) this.sink(ops);\n }\n\n flush(): Op[] {\n const animation = this.pendingAnimation;\n this.pendingAnimation = undefined;\n\n // Phase 1: the effective tree (virtual kinds resolved).\n const effective = new Map<TreeNode, Effective>();\n const rootEffective: Effective = { props: {}, children: [], hoisted: [] };\n effective.set(this.root, rootEffective);\n const visit = (child: Instance, sink: Instance[], ctx: Context): void => {\n if (child.hidden) return;\n if (child.kind === PREF_KIND) {\n const target = child.target === 'root' || child.target === undefined ? this.root : ctx[child.target];\n const entry = target ? effective.get(target) : undefined;\n if (entry) Object.assign(entry.props, child.props);\n return;\n }\n if (child.kind === HOIST_KIND) {\n const target = (child.target && child.target !== 'root' ? ctx[child.target] : undefined) ?? this.root;\n const entry = effective.get(target)!;\n for (const grandchild of child.children) visit(grandchild, entry.hoisted, ctx);\n return;\n }\n const entry: Effective = { props: { ...child.props }, children: [], hoisted: [] };\n effective.set(child, entry);\n sink.push(child);\n const next: Context =\n child.kind === 'navscreen' ? { ...ctx, navscreen: child } : child.kind === 'sheet' ? { ...ctx, sheet: child } : ctx;\n for (const grandchild of child.children) visit(grandchild, entry.children, next);\n };\n for (const child of this.root.children) visit(child, rootEffective.children, {});\n for (const entry of effective.values()) {\n if (entry.hoisted.length > 0) entry.children.push(...entry.hoisted);\n }\n\n // Phase 2: the diff.\n const live = new Set<Instance>();\n const parentOf = new Map<Instance, TreeNode>();\n for (const [node, entry] of effective) {\n for (const child of entry.children) {\n live.add(child);\n parentOf.set(child, node);\n }\n }\n\n const ops: Op[] = [];\n // Removed subtrees first, so sibling indices below are exact.\n const dead = new Set<Instance>();\n for (const instance of this.committedLive) if (!live.has(instance)) dead.add(instance);\n for (const instance of dead) {\n const parent = instance.committedParent;\n // The top of a removed subtree only: removing it removes the rest.\n if (parent && parent !== this.root && dead.has(parent as Instance)) continue;\n ops.push({ op: 'remove', id: instance.id });\n }\n for (const instance of dead) {\n this.live.delete(instance.id);\n instance.created = false;\n instance.committedProps = null;\n instance.committedParent = null;\n instance.committedChildren = [];\n }\n\n const emit = (parent: TreeNode, entry: Effective): void => {\n const current = parent.committedChildren.filter((child) => live.has(child) && parentOf.get(child) === parent);\n entry.children.forEach((child, index) => {\n const childEntry = effective.get(child)!;\n if (!child.created) {\n ops.push({ op: 'create', id: child.id, kind: child.kind, props: childEntry.props } as Op);\n child.created = true;\n this.live.set(child.id, child);\n } else if (!deepEqual(childEntry.props, child.committedProps)) {\n ops.push({ op: 'update', id: child.id, props: childEntry.props } as Op);\n }\n child.committedProps = childEntry.props;\n // A child that changed kind is the same instance under a new id: it\n // must be inserted again even where it already sits.\n if (current[index] !== child || child.committedParent !== parent) {\n ops.push({ op: 'insert', parent: parent.id, id: child.id, index });\n const at = current.indexOf(child);\n if (at >= 0) current.splice(at, 1);\n current.splice(index, 0, child);\n }\n child.committedParent = parent;\n emit(child, childEntry);\n });\n parent.committedChildren = entry.children;\n };\n emit(this.root, rootEffective);\n\n for (const id of this.retired) ops.push({ op: 'remove', id });\n this.retired = [];\n this.committedLive = live;\n\n // `.preferredColorScheme`: the only prop the root takes; `null` hands the\n // appearance back to the page once a preference is gone.\n const scheme = rootEffective.props['colorScheme'] as 'light' | 'dark' | null | undefined;\n const next = scheme === undefined ? (this.committedColorScheme === undefined ? undefined : null) : scheme;\n if (next !== undefined && next !== this.committedColorScheme) {\n ops.push({ op: 'update', id: 0, props: { colorScheme: next } } as Op);\n this.committedColorScheme = next === null ? undefined : next;\n }\n\n if (ops.length === 0) return ops;\n ops.push(animation ? { op: 'commit', animation } : { op: 'commit' });\n return ops;\n }\n\n /** Hand a renderer event to the element's handler for its type. */\n dispatch(event: RendererEvent): void {\n if (event.type === 'batch') {\n for (const each of event.events) this.dispatch(each);\n return;\n }\n if (!('id' in event)) return;\n const instance = this.live.get(event.id);\n const handler = instance?.on?.[event.type] as ((event: RendererEvent) => void) | undefined;\n handler?.(event);\n }\n}\n\n/** Structural equality of JSON-like values. */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a)) {\n const other = b as unknown[];\n return a.length === other.length && a.every((value, index) => deepEqual(value, other[index]));\n }\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n const keys = Object.keys(left);\n if (keys.length !== Object.keys(right).length) return false;\n return keys.every((key) => key in right && deepEqual(left[key], right[key]));\n}\n","/**\n * A SwiftUI root: renders a React element tree into a stream of render ops.\n * The page gives the ops to a `Renderer` (@swiftbrowser/web) and feeds the\n * renderer's events back through `dispatch`; headless code (tests) records\n * the ops instead.\n */\n\nimport type { Animation, ColorScheme, DynamicTypeSize, Op, RendererEvent } from '@swiftbrowser/web/src/protocol';\nimport { createElement, type ReactNode } from 'react';\nimport { ConcurrentRoot } from 'react-reconciler/constants';\nimport { EnvironmentProvider, type Environment } from '../environment';\nimport { reconciler } from './reconciler';\nimport { HostTree, type OpsSink } from './tree';\n\nexport interface SwiftUIRoot {\n /** Render (or re-render) the tree; the ops of the pass reach the sink before this returns. */\n render(element: ReactNode): void;\n unmount(): void;\n /** A renderer event (a tap, a toggle…) for the element it names. */\n dispatch(event: RendererEvent): void;\n /** The device environment the tree reads through `useColorScheme` and friends. */\n setEnvironment(environment: Partial<Environment>): void;\n}\n\nconst DEFAULT_ENVIRONMENT: Environment = { colorScheme: 'light', dynamicTypeSize: 'large', horizontalSizeClass: 'compact' };\n\nconst roots = new Set<HostTree>();\n\nexport function createSwiftUIRoot(sink: OpsSink): SwiftUIRoot {\n const tree = new HostTree(sink);\n roots.add(tree);\n // The tenth argument is `onDefaultTransitionIndicator` from react-reconciler\n // 0.33 (React 19.2) and `transitionCallbacks` before it (an object the\n // stable build never reads): a no-op function serves both, and the\n // eleventh is ignored by every version the package supports.\n const container = reconciler.createContainer(\n tree,\n ConcurrentRoot,\n null,\n false,\n null,\n '',\n (error) => {\n throw error;\n },\n (error) => console.error(error),\n (error) => console.warn(error),\n () => {},\n null,\n );\n let environment = DEFAULT_ENVIRONMENT;\n let current: ReactNode = null;\n const update = (): void => {\n reconciler.updateContainerSync(createElement(EnvironmentProvider, { value: environment }, current), container, null, null);\n reconciler.flushSyncWork();\n };\n return {\n render(element) {\n current = element;\n update();\n },\n unmount() {\n reconciler.updateContainerSync(null, container, null, null);\n reconciler.flushSyncWork();\n roots.delete(tree);\n },\n dispatch(event) {\n // Updates the handler makes flush before this returns, like the Swift\n // core answers an event with the ops of its render pass.\n reconciler.flushSyncFromReconciler(() => tree.dispatch(event));\n },\n setEnvironment(next) {\n environment = { ...environment, ...next };\n update();\n },\n };\n}\n\nexport type { ColorScheme, DynamicTypeSize, Op };\n\n/**\n * `withAnimation { }`: the state changes `body` makes render in one pass whose\n * `commit` carries the animation, so the renderer animates every frame and\n * style change of the pass.\n */\nexport function withAnimation<T>(animation: Animation | undefined, body: () => T): T;\nexport function withAnimation<T>(body: () => T): T;\nexport function withAnimation<T>(first: Animation | undefined | (() => T), second?: () => T): T {\n const animation: Animation = typeof first === 'function' ? { type: 'default' } : (first ?? { type: 'default' });\n const body = (typeof first === 'function' ? first : second) as () => T;\n for (const tree of roots) tree.pendingAnimation = animation;\n try {\n return reconciler.flushSyncFromReconciler(body);\n } finally {\n for (const tree of roots) tree.pendingAnimation = undefined;\n }\n}\n","/**\n * `mount(screen, element)`: the renderer of @swiftbrowser/web in `screen`\n * (the root container, element id 0, inside the device frame or full screen)\n * drawing a SwiftUI root. The page keeps the device chrome (theme, text size)\n * and tells both sides through `setEnvironment`.\n */\n\nimport { horizontalSizeClassFor, type ColorScheme, type DynamicTypeSize } from '@swiftbrowser/web/src/protocol';\nimport type { AssetCatalog } from '@swiftbrowser/web/src/assets';\nimport { Renderer } from '@swiftbrowser/web/src/renderer';\nimport type { ReactNode } from 'react';\nimport { createSwiftUIRoot, type SwiftUIRoot } from './host/root';\n\nexport interface MountOptions {\n colorScheme?: ColorScheme;\n dynamicTypeSize?: DynamicTypeSize;\n /** Device mode: the real safe-area insets (frame mode has the iPhone's). */\n safeArea?: { top: number; leading: number; bottom: number; trailing: number } | null;\n /** The root is as tall as its content (an island in a page), not as the screen. */\n contentHeight?: boolean;\n /**\n * The asset catalog manifest `Image(name:)` and catalog colors resolve\n * against (the `/catalog/<App>.json` the SwiftBrowser build writes, or one\n * of your own: `{ images: { name: { src, width, height, scale, kind } }, colors: {} }`).\n */\n assets?: AssetCatalog;\n}\n\nexport interface Mounted {\n root: SwiftUIRoot;\n renderer: Renderer;\n setEnvironment(environment: { colorScheme?: ColorScheme; dynamicTypeSize?: DynamicTypeSize }): void;\n unmount(): void;\n}\n\nexport function mount(screen: HTMLElement, element: ReactNode, options: MountOptions = {}): Mounted {\n let renderer: Renderer | null = null;\n const root = createSwiftUIRoot((ops) => renderer?.applyOps(ops));\n renderer = new Renderer(screen, (event) => root.dispatch(event));\n // The page's appearance; `.preferredColorScheme` overrides it while set.\n let pageScheme: ColorScheme = options.colorScheme ?? 'light';\n let preferred: ColorScheme | null = null;\n const environment = {\n colorScheme: pageScheme,\n dynamicTypeSize: options.dynamicTypeSize ?? 'large',\n horizontalSizeClass: horizontalSizeClassFor(screen.clientWidth || 393),\n };\n renderer.contentHeight = options.contentHeight ?? false;\n if (options.assets) renderer.setAssetCatalog(options.assets);\n renderer.setEnvironment({ colorScheme: environment.colorScheme, dynamicTypeSize: environment.dynamicTypeSize });\n if (options.safeArea !== undefined) renderer.setSafeArea(options.safeArea);\n root.setEnvironment(environment);\n\n const applyScheme = (): void => {\n const scheme = preferred ?? pageScheme;\n const device = screen.closest<HTMLElement>('.device');\n if (device) device.dataset['theme'] = scheme;\n renderer?.setEnvironment({ colorScheme: scheme });\n root.setEnvironment({ colorScheme: scheme });\n };\n const onPreferredScheme = (event: Event): void => {\n const scheme = (event as CustomEvent<{ colorScheme: ColorScheme | null }>).detail.colorScheme;\n preferred = scheme;\n // Outside the commit that asked for it.\n queueMicrotask(applyScheme);\n };\n screen.addEventListener('sb:color-scheme', onPreferredScheme);\n\n // The size class follows the root's width (700 points and up is regular).\n let sizeClass = environment.horizontalSizeClass;\n const observer =\n typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => {\n const next = horizontalSizeClassFor(screen.clientWidth);\n if (next === sizeClass) return;\n sizeClass = next;\n root.setEnvironment({ horizontalSizeClass: next });\n })\n : null;\n observer?.observe(screen);\n\n root.render(element);\n const mounted: Mounted = {\n root,\n renderer,\n setEnvironment(next) {\n if (next.colorScheme !== undefined) pageScheme = next.colorScheme;\n const scheme = preferred ?? pageScheme;\n renderer?.setEnvironment({ ...next, colorScheme: scheme });\n root.setEnvironment({ ...next, colorScheme: scheme });\n },\n unmount() {\n observer?.disconnect();\n screen.removeEventListener('sb:color-scheme', onPreferredScheme);\n root.unmount();\n renderer?.dispose();\n },\n };\n return mounted;\n}\n","import { createContext, useContext, type ReactNode } from 'react';\n\n/** What a `NavigationStack` offers the views inside it. */\nexport interface NavigationContextValue {\n push(value: unknown): void;\n pop(): void;\n /** `.navigationDestination(for:)`: how a pushed value becomes a screen. */\n registerDestination(destination: (value: unknown) => ReactNode): void;\n}\n\nexport const NavigationContext = createContext<NavigationContextValue | null>(null);\n\nexport function useNavigation(): NavigationContextValue | null {\n return useContext(NavigationContext);\n}\n\n/** Rendered by the `navigationDestination` modifier: registers the builder with the enclosing stack. */\nexport function RegisterDestination({ destination }: { destination: (value: never) => ReactNode }): null {\n const navigation = useContext(NavigationContext);\n navigation?.registerDestination(destination as (value: unknown) => ReactNode);\n return null;\n}\n","/**\n * React context does not cross a root boundary, and a `Host` (a react-dom\n * root inside the SwiftUI tree) or a `SwiftUIView` (a SwiftUI root inside a\n * react-dom tree) is one. The bridge reads the contexts on the outer side and\n * provides them again on the inner side. This package's own contexts always\n * travel; a component names any others it needs.\n */\n\nimport { createElement, useContext, type Context, type ReactNode } from 'react';\nimport { DismissContext, EnvironmentContext, ViewEnvironmentContext } from './environment';\nimport { NavigationContext } from './navigation-context';\n\nconst OWN: readonly Context<unknown>[] = [\n EnvironmentContext as Context<unknown>,\n ViewEnvironmentContext as Context<unknown>,\n NavigationContext as Context<unknown>,\n DismissContext as Context<unknown>,\n];\n\n/**\n * Returns a function that wraps `children` in providers of the current\n * values of this package's contexts and of `contexts`. The list of contexts\n * must not change between renders (each is read with a hook).\n */\nexport function useContextBridge(\n contexts: readonly Context<unknown>[] = [],\n options: { environment?: boolean } = {},\n): (children: ReactNode) => ReactNode {\n // An island is the source of its own device environment (its root\n // provides it), so it bridges everything but that.\n const own = options.environment === false ? OWN.filter((context) => context !== (EnvironmentContext as Context<unknown>)) : OWN;\n const all = [...own, ...contexts];\n // One hook per context, in a stable order: the list is fixed per call site.\n const values = all.map((context) => useContext(context));\n return (children) =>\n all.reduceRight<ReactNode>((inner, context, index) => createElement(context.Provider, { value: values[index] }, inner), children);\n}\n","/**\n * `SwiftUIView`: a SwiftUI tree inside a react-dom app. The element carries\n * the device's design tokens (the `device` class, without its frame) and the\n * renderer draws the tree in it. `fit=\"fill\"` draws in the box the page\n * gives it (give it a height); `fit=\"content\"` makes the island as tall as\n * its content. Navigation stacks and tab views fill the box, so they want\n * `fill`.\n */\n\nimport type { AssetCatalog } from '@swiftbrowser/web/src/assets';\nimport type { ColorScheme, DynamicTypeSize } from '@swiftbrowser/web/src/protocol';\nimport { applyTypeSizeVariables } from '@swiftbrowser/web/src/typography';\nimport { useLayoutEffect, useRef, type CSSProperties, type Context, type ReactNode } from 'react';\nimport { useContextBridge } from './bridge';\nimport { mount, type Mounted } from './mount';\n\nexport interface SwiftUIViewProps {\n children?: ReactNode;\n fit?: 'fill' | 'content';\n colorScheme?: ColorScheme;\n dynamicTypeSize?: DynamicTypeSize;\n /** Contexts of the page the SwiftUI tree reads (this package's own are not needed). */\n contexts?: readonly Context<unknown>[];\n /** The asset catalog manifest for `Image(name:)` and catalog colors (see `mount`). */\n assets?: AssetCatalog;\n className?: string;\n style?: CSSProperties;\n}\n\nconst NO_SAFE_AREA = { top: 0, leading: 0, bottom: 0, trailing: 0 };\n\nexport function SwiftUIView({\n children,\n fit = 'fill',\n colorScheme = 'light',\n dynamicTypeSize = 'large',\n contexts,\n assets,\n className,\n style,\n}: SwiftUIViewProps): ReactNode {\n const device = useRef<HTMLDivElement>(null);\n const screen = useRef<HTMLDivElement>(null);\n const mounted = useRef<Mounted | null>(null);\n const bridge = useContextBridge(contexts, { environment: false });\n const tree = bridge(children);\n const latest = useRef(tree);\n latest.current = tree;\n\n useLayoutEffect(() => {\n if (!screen.current) return;\n const instance = mount(screen.current, latest.current, {\n colorScheme,\n dynamicTypeSize,\n safeArea: NO_SAFE_AREA,\n contentHeight: fit === 'content',\n ...(assets ? { assets } : {}),\n });\n mounted.current = instance;\n return () => {\n mounted.current = null;\n instance.unmount();\n };\n // The environment is updated below; a change of fit re-mounts.\n }, [fit]);\n\n useLayoutEffect(() => {\n mounted.current?.root.render(tree);\n });\n\n useLayoutEffect(() => {\n if (device.current) applyTypeSizeVariables(device.current, dynamicTypeSize);\n mounted.current?.setEnvironment({ colorScheme, dynamicTypeSize });\n }, [colorScheme, dynamicTypeSize]);\n\n const classes = ['device', 'sb-island', className].filter(Boolean).join(' ');\n return (\n <div ref={device} className={classes} data-theme={colorScheme} data-type-size={dynamicTypeSize} data-state=\"ready\" data-sb-fit={fit} style={style}>\n <div className=\"device-screen\">\n <div ref={screen} className=\"screen\" />\n </div>\n </div>\n );\n}\n","/**\n * A `Binding<T>`: a `useState` pair, so `isOn={[downloads, setDownloads]}`\n * reads like `isOn: $downloads`. A plain value with an `onChange` handler is\n * accepted everywhere a binding is.\n */\nexport type Binding<T> = readonly [T, (value: T) => void];\n\nexport type BindingValue<T> = Binding<T> | T;\n\nexport function readBinding<T>(value: BindingValue<T>, onChange?: (value: T) => void): [T, (next: T) => void] {\n if (Array.isArray(value) && value.length === 2 && typeof value[1] === 'function') {\n const [current, set] = value as Binding<T>;\n return [current, set];\n }\n return [value as T, onChange ?? (() => {})];\n}\n","import { createElement, type ReactElement, type ReactNode } from 'react';\nimport type { EventHandlers, HoistTarget, HostProps } from './instance';\n\n/** A host element: the intrinsic `sb` with a protocol kind and props. */\nexport function sb(\n kind: string,\n props?: Record<string, unknown>,\n on?: EventHandlers,\n children?: ReactNode,\n target?: HoistTarget,\n): ReactElement {\n const hostProps: HostProps = { kind };\n if (props) hostProps.props = props;\n if (on) hostProps.on = on;\n if (target) hostProps.target = target;\n return children === undefined ? createElement('sb', hostProps) : createElement('sb', hostProps, children);\n}\n","/**\n * Named coordinate spaces: `.coordinateSpace(name:)` reports where its view\n * is on screen (a layout-transparent `zstack` with `reportsFrame`), and a\n * `GeometryReader` inside answers `frame({ named })` relative to it.\n */\n\nimport { createContext, useContext, useState, type ReactNode } from 'react';\nimport { sb } from './host/sb';\n\nexport interface SpaceFrame {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** The named spaces around a view: their frames on screen (null until reported). */\nexport const CoordinateSpacesContext = createContext<Readonly<Record<string, SpaceFrame | null>>>({});\n\nexport function useCoordinateSpaces(): Readonly<Record<string, SpaceFrame | null>> {\n return useContext(CoordinateSpacesContext);\n}\n\nexport function CoordinateSpace({ name, children }: { name: string; children?: ReactNode }): ReactNode {\n const spaces = useContext(CoordinateSpacesContext);\n const [frame, setFrame] = useState<SpaceFrame | null>(null);\n return (\n <CoordinateSpacesContext.Provider value={{ ...spaces, [name]: frame }}>\n {sb(\n 'zstack',\n { alignment: 'center', reportsSize: true, reportsFrame: true },\n {\n geometry: (event) => {\n const next = { x: event.x ?? 0, y: event.y ?? 0, width: event.width, height: event.height };\n if (!frame || frame.x !== next.x || frame.y !== next.y || frame.width !== next.width || frame.height !== next.height) setFrame(next);\n },\n },\n children,\n )}\n </CoordinateSpacesContext.Provider>\n );\n}\n","/**\n * `.draggable` and `.dropDestination`. What is dragged stays in React: a\n * lift (`dragstart`) remembers the payload, a drop naming its source hands\n * it to the destination, and `dragend` forgets it. Drops from outside the\n * page arrive as text and files.\n */\n\nimport type { DropItem } from '@swiftbrowser/web/src/protocol';\nimport type { ReactNode } from 'react';\nimport { sb } from './host/sb';\nimport type { DropDestinationModifier } from './modifiers';\n\nlet active: { id: number; payload: unknown } | null = null;\n\nexport function Draggable({ payload, children }: { payload: unknown; children?: ReactNode }): ReactNode {\n return sb(\n 'draggable',\n {},\n {\n dragstart: (event) => {\n active = { id: event.id, payload };\n },\n dragend: (event) => {\n if (active?.id === event.id) active = null;\n },\n },\n children,\n );\n}\n\n/** Text as a string, a link as a `URL`, a file as a `File`. */\nfunction itemValue(item: DropItem): unknown {\n if (item.text !== undefined) {\n if (item.type === 'text/uri-list') {\n try {\n return new URL(item.text.split(/\\r?\\n/)[0]!.trim());\n } catch {\n return item.text;\n }\n }\n return item.text;\n }\n const binary = atob(item.data ?? '');\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return typeof File !== 'undefined' ? new File([bytes], item.name ?? 'file', { type: item.type }) : bytes;\n}\n\nexport function DropDestination({ action, isTargeted, accepts, children }: DropDestinationModifier & { children?: ReactNode }): ReactNode {\n return sb(\n 'dropdestination',\n { accepts: accepts ?? [] },\n {\n drop: (event) => {\n if (event.phase === 'entered') {\n isTargeted?.(true);\n return;\n }\n isTargeted?.(false);\n if (event.phase !== 'performed') return;\n let items: unknown[];\n if (event.source !== undefined) items = active && active.id === event.source ? [active.payload] : [];\n else items = (event.items ?? []).map(itemValue);\n if (items.length > 0) action(items, { x: event.x, y: event.y });\n },\n },\n children,\n );\n}\n","/**\n * Value types of the SwiftUI API as plain data: colors and shape styles,\n * fonts, frames, insets and gradients, encoded as the ops protocol wants them.\n */\n\nimport type {\n Color as ProtocolColor,\n EdgeInsets,\n Font as ProtocolFont,\n FontDesign,\n FontWeight,\n Frame,\n FrameAlignment,\n GradientStop,\n NamedColor,\n RGBAColor,\n SemanticColorName,\n ShapeStyle,\n TextStyle,\n UnitPoint,\n} from '@swiftbrowser/web/src/protocol';\n\nexport type { EdgeInsets, FontDesign, FontWeight, Frame, FrameAlignment, ShapeStyle, TextStyle, UnitPoint };\n/** The protocol's color value (the `Color` export is the view, with the color helpers as members). */\nexport type ColorType = ProtocolColor;\n/** The protocol's font value (the `Font` export is the helper object). */\nexport type FontType = ProtocolFont;\n\n// ---------------------------------------------------------------------------\n// Colors and shape styles\n// ---------------------------------------------------------------------------\n\n/** `.primary` … `.quaternary` as foreground styles (the label colors) or fills. */\nexport type HierarchyName = 'primary' | 'secondary' | 'tertiary' | 'quaternary';\n\n/**\n * A style as a prop: a protocol value, or a name. A hierarchy name\n * (`\"secondary\"`) is the hierarchical style, as `.foregroundStyle(.secondary)`\n * is; a palette or UIKit name (`\"red\"`, `\"secondarySystemBackground\"`) is that\n * semantic color; `\"white\"`, `\"black\"` and `\"#rrggbb[aa]\"` are explicit colors.\n */\nexport type StyleValue = ShapeStyle | HierarchyName | SemanticColorName | 'white' | 'black' | `#${string}`;\n\nconst HIERARCHY: Record<HierarchyName, 1 | 2 | 3 | 4> = { primary: 1, secondary: 2, tertiary: 3, quaternary: 4 };\n\nexport function rgb(r: number, g: number, b: number, a = 1): RGBAColor {\n return { r, g, b, a };\n}\n\nexport function hex(value: string): RGBAColor {\n const digits = value.replace('#', '');\n const wide = digits.length === 3 || digits.length === 4 ? [...digits].map((d) => d + d).join('') : digits;\n const n = (at: number): number => parseInt(wide.slice(at, at + 2), 16) / 255;\n return { r: n(0), g: n(2), b: n(4), a: wide.length >= 8 ? n(6) : 1 };\n}\n\nexport function shapeStyle(value: StyleValue): ShapeStyle {\n if (typeof value !== 'string') return value;\n if (value in HIERARCHY) return { hierarchical: HIERARCHY[value as HierarchyName] };\n if (value === 'white') return rgb(1, 1, 1);\n if (value === 'black') return rgb(0, 0, 0);\n if (value.startsWith('#')) return hex(value);\n return { name: value as SemanticColorName };\n}\n\n/** A color as a prop: a protocol color or a name (hierarchy names are not colors). */\nexport type ColorValue = ProtocolColor | SemanticColorName | 'white' | 'black' | `#${string}`;\n\nexport function color(value: ColorValue): ProtocolColor {\n return shapeStyle(value as StyleValue) as ProtocolColor;\n}\n\n/** `color.opacity(a)` */\nexport function opacity(value: ColorValue, a: number): ProtocolColor;\nexport function opacity(value: StyleValue, a: number): ShapeStyle;\nexport function opacity(value: StyleValue, a: number): ShapeStyle {\n const style = shapeStyle(value);\n if ('r' in style) return { ...style, a: style.a * a };\n if ('name' in style) return { ...style, a: ((style as NamedColor).a ?? 1) * a };\n if ('named' in style) return { ...style, opacity: style.opacity * a };\n return { ...style, opacity: ((style as { opacity?: number }).opacity ?? 1) * a };\n}\n\n/** `color.gradient`: the subtle vertical gradient iOS derives from a color. */\nexport function gradient(value: ColorValue): ShapeStyle {\n return { colorGradient: color(value) };\n}\n\n/** `Color.red`, `Color.white`, `Color(.secondarySystemBackground)`… (`Color` itself, a view, carries these as members). */\nexport const ColorValues = {\n red: { name: 'red' } as ProtocolColor,\n orange: { name: 'orange' } as ProtocolColor,\n yellow: { name: 'yellow' } as ProtocolColor,\n green: { name: 'green' } as ProtocolColor,\n mint: { name: 'mint' } as ProtocolColor,\n teal: { name: 'teal' } as ProtocolColor,\n cyan: { name: 'cyan' } as ProtocolColor,\n blue: { name: 'blue' } as ProtocolColor,\n indigo: { name: 'indigo' } as ProtocolColor,\n purple: { name: 'purple' } as ProtocolColor,\n pink: { name: 'pink' } as ProtocolColor,\n brown: { name: 'brown' } as ProtocolColor,\n gray: { name: 'gray' } as ProtocolColor,\n white: rgb(1, 1, 1) as ProtocolColor,\n black: rgb(0, 0, 0) as ProtocolColor,\n clear: { name: 'clear' } as ProtocolColor,\n primary: { name: 'primary' } as ProtocolColor,\n secondary: { name: 'secondary' } as ProtocolColor,\n accent: { name: 'accent' } as ProtocolColor,\n /** `Color(uiColor:)` / `Color(.name)`: a UIKit semantic color by its iOS name. */\n system: (name: SemanticColorName): ProtocolColor => ({ name }),\n rgb,\n hex,\n opacity,\n gradient,\n};\n\n// ---------------------------------------------------------------------------\n// Unit points and gradients\n// ---------------------------------------------------------------------------\n\nexport type UnitPointName =\n | 'center'\n | 'top'\n | 'bottom'\n | 'leading'\n | 'trailing'\n | 'topLeading'\n | 'topTrailing'\n | 'bottomLeading'\n | 'bottomTrailing';\nexport type UnitPointValue = UnitPoint | UnitPointName;\n\nconst UNIT_POINTS: Record<UnitPointName, UnitPoint> = {\n center: { x: 0.5, y: 0.5 },\n top: { x: 0.5, y: 0 },\n bottom: { x: 0.5, y: 1 },\n leading: { x: 0, y: 0.5 },\n trailing: { x: 1, y: 0.5 },\n topLeading: { x: 0, y: 0 },\n topTrailing: { x: 1, y: 0 },\n bottomLeading: { x: 0, y: 1 },\n bottomTrailing: { x: 1, y: 1 },\n};\n\nexport function unitPoint(value: UnitPointValue): UnitPoint {\n return typeof value === 'string' ? UNIT_POINTS[value] : value;\n}\n\nexport interface GradientColors {\n /** Evenly spaced colors, or explicit stops. */\n colors?: ColorValue[];\n stops?: { color: ColorValue; location: number }[];\n}\n\nfunction stops(spec: GradientColors): GradientStop[] {\n if (spec.stops) return spec.stops.map((stop) => ({ color: color(stop.color), location: stop.location }));\n const colors = spec.colors ?? [];\n const last = Math.max(colors.length - 1, 1);\n return colors.map((value, index) => ({ color: color(value), location: index / last }));\n}\n\nexport function LinearGradient(spec: GradientColors & { startPoint: UnitPointValue; endPoint: UnitPointValue }): ShapeStyle {\n return { linearGradient: { stops: stops(spec), start: unitPoint(spec.startPoint), end: unitPoint(spec.endPoint) } };\n}\n\nexport function RadialGradient(\n spec: GradientColors & { center: UnitPointValue; startRadius: number; endRadius: number },\n): ShapeStyle {\n return {\n radialGradient: { stops: stops(spec), center: unitPoint(spec.center), startRadius: spec.startRadius, endRadius: spec.endRadius },\n };\n}\n\nexport function AngularGradient(\n spec: GradientColors & { center: UnitPointValue; startAngle?: number; endAngle?: number },\n): ShapeStyle {\n return {\n angularGradient: {\n stops: stops(spec),\n center: unitPoint(spec.center),\n startAngle: spec.startAngle ?? 0,\n endAngle: spec.endAngle ?? 360,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Fonts\n// ---------------------------------------------------------------------------\n\n/** A font as a prop: a text style name (`\"headline\"`) or a `Font` object. */\nexport type FontValue = TextStyle | ProtocolFont;\n\nexport function font(value: FontValue): ProtocolFont {\n return typeof value === 'string' ? { textStyle: value } : value;\n}\n\n/** `Font.system(size:weight:design:)` */\nexport function system(size: number, weight?: FontWeight, design?: FontDesign): ProtocolFont;\n/** `Font.system(.body, design:weight:)` */\nexport function system(textStyle: TextStyle, design?: FontDesign, weight?: FontWeight): ProtocolFont;\nexport function system(first: number | TextStyle, second?: FontWeight | FontDesign, third?: FontDesign | FontWeight): ProtocolFont {\n const result: ProtocolFont = typeof first === 'number' ? { size: first } : { textStyle: first };\n const weight = typeof first === 'number' ? (second as FontWeight | undefined) : (third as FontWeight | undefined);\n const design = typeof first === 'number' ? (third as FontDesign | undefined) : (second as FontDesign | undefined);\n if (weight) result.weight = weight;\n if (design) result.design = design;\n return result;\n}\n\n/** `.font(.title2.bold())`, `.font(.subheadline.weight(.semibold))` */\nexport function weighted(value: FontValue, weight: FontWeight): ProtocolFont {\n return { ...font(value), weight };\n}\n\nexport const Font = { system, weighted, bold: (value: FontValue): ProtocolFont => weighted(value, 'bold') };\n\n// ---------------------------------------------------------------------------\n// Frames and insets\n// ---------------------------------------------------------------------------\n\n/** `Infinity` stands for `.infinity`. */\nexport interface FrameValue {\n width?: number;\n height?: number;\n minWidth?: number;\n maxWidth?: number;\n minHeight?: number;\n maxHeight?: number;\n alignment?: FrameAlignment;\n}\n\nexport function frame(value: FrameValue): Frame {\n const dimension = (n: number | undefined): number | 'infinity' | undefined =>\n n === undefined ? undefined : n === Infinity ? 'infinity' : n;\n const result: Frame = { alignment: value.alignment ?? 'center' };\n if (value.width !== undefined) result.width = value.width;\n if (value.height !== undefined) result.height = value.height;\n const minWidth = dimension(value.minWidth);\n const maxWidth = dimension(value.maxWidth);\n const minHeight = dimension(value.minHeight);\n const maxHeight = dimension(value.maxHeight);\n if (minWidth !== undefined) result.minWidth = minWidth;\n if (maxWidth !== undefined) result.maxWidth = maxWidth;\n if (minHeight !== undefined) result.minHeight = minHeight;\n if (maxHeight !== undefined) result.maxHeight = maxHeight;\n return result;\n}\n\nexport type EdgeName = 'top' | 'bottom' | 'leading' | 'trailing' | 'horizontal' | 'vertical' | 'all';\n/**\n * `.padding()` (`true`), `.padding(12)`, `.padding(.vertical, 6)` (`[\"vertical\", 6]`),\n * `.padding([.top, .leading], 8)`, or explicit insets.\n */\nexport type PaddingValue = true | number | EdgeInsets | [EdgeName | EdgeName[], number?];\n\nexport const DEFAULT_PADDING = 16;\n\nexport function padding(value: PaddingValue): EdgeInsets {\n if (value === true) return insets(['all'], DEFAULT_PADDING);\n if (typeof value === 'number') return insets(['all'], value);\n if (Array.isArray(value)) {\n const [edges, amount] = value;\n return insets(Array.isArray(edges) ? edges : [edges], amount ?? DEFAULT_PADDING);\n }\n return value;\n}\n\nexport function insets(edges: EdgeName[], amount: number): EdgeInsets {\n const result: EdgeInsets = {};\n for (const edge of edges) {\n if (edge === 'all' || edge === 'vertical' || edge === 'top') result.top = amount;\n if (edge === 'all' || edge === 'vertical' || edge === 'bottom') result.bottom = amount;\n if (edge === 'all' || edge === 'horizontal' || edge === 'leading') result.leading = amount;\n if (edge === 'all' || edge === 'horizontal' || edge === 'trailing') result.trailing = amount;\n }\n return result;\n}\n","/**\n * The scroll modifiers that pass down to the scroll views below, as SwiftUI's\n * environment does: `.scrollEdgeEffectStyle(_:for:)`,\n * `.scrollEdgeEffectHidden(_:for:)` and `.contentMargins(_:_:for:)`. A\n * `ScrollView` or `List` reads them from above and from its own props, the\n * closer setting winning edge by edge.\n */\n\nimport type { EdgeEffectProps, EdgeInsets } from '@swiftbrowser/web/src/protocol';\nimport { Children, createContext, createElement, useContext, type ReactNode } from 'react';\nimport { sb } from './host/sb';\nimport { padding, type PaddingValue } from './values';\n\nexport type ScrollEdgeEffectStyle = 'automatic' | 'hard' | 'soft';\n/** The vertical edges a scroll edge effect sits on. */\nexport type ScrollEdges = 'top' | 'bottom' | 'all' | 'vertical' | ('top' | 'bottom')[];\n\n/**\n * `.scrollEdgeEffectStyle(.hard, for: .top)` is `[\"hard\", \"top\"]`; a bare\n * style applies to both edges.\n */\nexport type ScrollEdgeEffectStyleValue = ScrollEdgeEffectStyle | [ScrollEdgeEffectStyle, ScrollEdges];\n/** `.scrollEdgeEffectHidden()` is `true`; `.scrollEdgeEffectHidden(true, for: .bottom)` is `[true, \"bottom\"]`. */\nexport type ScrollEdgeEffectHiddenValue = boolean | [boolean, ScrollEdges];\n\n/** The scroll settings in force at a point of the tree. */\nexport interface ScrollSettings {\n /** Per edge: a style (`hard`, `soft`; absent is automatic) or hidden. */\n topStyle?: 'hard' | 'soft';\n bottomStyle?: 'hard' | 'soft';\n topHidden?: boolean;\n bottomHidden?: boolean;\n /** `.contentMargins`: padding inside the scroll views below. */\n margins?: EdgeInsets;\n}\n\nconst ScrollSettingsContext = createContext<ScrollSettings>({});\n\nfunction edgesOf(edges: ScrollEdges): { top: boolean; bottom: boolean } {\n const list = Array.isArray(edges) ? edges : [edges];\n const all = list.some((edge) => edge === 'all' || edge === 'vertical');\n return { top: all || list.includes('top'), bottom: all || list.includes('bottom') };\n}\n\n/** The settings one modifier adds. */\nexport function edgeStyleSettings(value: ScrollEdgeEffectStyleValue): ScrollSettings {\n const [style, edges] = Array.isArray(value) ? value : [value, 'all' as const];\n const on = edgesOf(edges);\n const name = style === 'automatic' ? undefined : style;\n const result: ScrollSettings = {};\n // `automatic` clears what an outer modifier set, so the key is kept.\n if (on.top) result.topStyle = name;\n if (on.bottom) result.bottomStyle = name;\n return result;\n}\n\nexport function edgeHiddenSettings(value: ScrollEdgeEffectHiddenValue): ScrollSettings {\n const [hidden, edges] = Array.isArray(value) ? value : [value, 'all' as const];\n const on = edgesOf(edges);\n const result: ScrollSettings = {};\n if (on.top) result.topHidden = hidden;\n if (on.bottom) result.bottomHidden = hidden;\n return result;\n}\n\n/** `contentMargins={12}`, `{[\"horizontal\", 20]}` or insets; `true` is the default 16. */\nexport type ContentMarginsValue = PaddingValue;\n\nexport function marginSettings(value: ContentMarginsValue): ScrollSettings {\n return { margins: padding(value) };\n}\n\n/** `inner` over `outer`, edge by edge. */\nexport function mergeScrollSettings(outer: ScrollSettings, inner: ScrollSettings): ScrollSettings {\n const result: ScrollSettings = { ...outer };\n for (const key of ['topStyle', 'bottomStyle', 'topHidden', 'bottomHidden'] as const) {\n if (key in inner) (result as Record<string, unknown>)[key] = inner[key];\n }\n if (inner.margins) result.margins = { ...outer.margins, ...inner.margins };\n return result;\n}\n\n/** The views below see `settings` added to the ones around them. */\nexport function withScrollSettings(settings: ScrollSettings, children: ReactNode): ReactNode {\n return createElement(ScrollSettingsExtender, { settings }, children);\n}\n\nfunction ScrollSettingsExtender({ settings, children }: { settings: ScrollSettings; children?: ReactNode }): ReactNode {\n const outer = useContext(ScrollSettingsContext);\n return createElement(ScrollSettingsContext.Provider, { value: mergeScrollSettings(outer, settings) }, children);\n}\n\n/** The settings in force here, with a scroll view's own modifiers applied over them. */\nexport function useScrollSettings(own: ScrollSettings): ScrollSettings {\n return mergeScrollSettings(useContext(ScrollSettingsContext), own);\n}\n\n/** The `edgeEffect` prop of a `list` or `scrollview`, absent when both edges are automatic. */\nexport function edgeEffectProp(settings: ScrollSettings): EdgeEffectProps | undefined {\n const edges: EdgeEffectProps = {};\n const top = settings.topHidden ? 'hidden' : settings.topStyle;\n const bottom = settings.bottomHidden ? 'hidden' : settings.bottomStyle;\n if (top) edges.top = top;\n if (bottom) edges.bottom = bottom;\n return top || bottom ? edges : undefined;\n}\n\n/**\n * A scroll view's content with its content margins as padding inside it\n * (several children first become the stack the scroll view would make).\n */\nexport function marginedContent(children: ReactNode, margins: EdgeInsets | undefined, axis: 'horizontal' | 'vertical'): ReactNode {\n if (!margins || Object.values(margins).every((value) => !value)) return children;\n const list = Children.toArray(children);\n const content = list.length === 1 ? list[0] : sb(axis === 'horizontal' ? 'hstack' : 'vstack', { spacing: null, alignment: 'center' }, undefined, children);\n return sb('styled', { style: { padding: margins } }, undefined, content);\n}\n\n","/**\n * List rows that can be selected or deleted are wrapped in a `listrow`\n * (docs/ops-protocol.md, \"Edit mode and list selection\"). `ForEach`'s\n * `onDelete` and a `List`'s `selection` both end in this component; a row\n * that is neither selectable nor deletable renders bare.\n */\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\n\nexport interface ListSelection {\n isSelected(tag: unknown): boolean;\n select(tag: unknown): void;\n editing: boolean;\n}\n\nexport const ListSelectionContext = createContext<ListSelection | null>(null);\n\nexport interface RowProps {\n /** The row's tag (`.tag`, a `NavigationLink` value or a `ForEach` id). */\n tag?: unknown;\n /** `ForEach` with `onDelete`: what a swipe or the edit-mode minus does. */\n onDelete?: () => void;\n deletable?: boolean;\n /**\n * `ForEach` with `onMove`: called with the destination offset in the\n * `ForEach`'s data (as `move(fromOffsets:toOffset:)` takes it) when the\n * row was dragged to a new place.\n */\n onMove?: (to: number) => void;\n movable?: boolean;\n /** The row's offset in its `ForEach`. */\n index?: number;\n /** The row's index among its container's children (set by `List` / `Section`), for mapping `move`. */\n containerIndex?: number;\n children?: ReactNode;\n}\n\nexport function Row({ tag, onDelete, deletable, onMove, movable, index, containerIndex, children }: RowProps): ReactNode {\n const selection = useContext(ListSelectionContext);\n const selectable = selection !== null && tag !== undefined;\n const canDelete = onDelete !== undefined && deletable !== false;\n const canMove = onMove !== undefined && movable !== false;\n if (!selectable && !canDelete && !canMove) return children;\n const props: Record<string, unknown> = {};\n if (selectable) {\n props['selectable'] = true;\n props['selected'] = selection.isSelected(tag);\n }\n if (canDelete) props['deletable'] = true;\n if (canMove) props['movable'] = true;\n return sb(\n 'listrow',\n props,\n {\n tap: () => selectable && selection.select(tag),\n delete: () => onDelete?.(),\n move: (event) => {\n // `to` counts the container's children; the ForEach's first row is\n // `containerIndex - index` children in.\n const start = (containerIndex ?? index ?? 0) - (index ?? 0);\n onMove?.(Math.max(0, event.to - start));\n },\n },\n children,\n );\n}\n","/**\n * `ScrollViewReader` and `.id` (the `scrollID` modifier): `proxy.scrollTo(id)`\n * marks the view with that id with a `scrollTo` command whose serial is new,\n * and the page scrolls every scrolling ancestor to it after the pass.\n */\n\nimport type { UnitPoint } from '@swiftbrowser/web/src/protocol';\nimport { createContext, useContext, useState, type ReactNode } from 'react';\nimport { styled } from './modifiers';\nimport { unitPoint, type UnitPointValue } from './values';\n\ninterface ScrollRequest {\n id: string | number;\n anchor: UnitPoint | null;\n serial: number;\n}\n\nexport const ScrollRequestContext = createContext<ScrollRequest | null>(null);\nlet nextSerial = 1;\n\nexport interface ScrollViewProxy {\n /** Scroll so `anchor` of the view with that `scrollID` meets the same point of the visible area; no anchor: as little as shows it. */\n scrollTo(id: string | number, anchor?: UnitPointValue): void;\n}\n\nexport function ScrollViewReader({ children }: { children: (proxy: ScrollViewProxy) => ReactNode }): ReactNode {\n const [request, setRequest] = useState<ScrollRequest | null>(null);\n const proxy: ScrollViewProxy = {\n scrollTo: (id, anchor) => setRequest({ id, anchor: anchor === undefined ? null : unitPoint(anchor), serial: nextSerial++ }),\n };\n return <ScrollRequestContext.Provider value={request}>{children(proxy)}</ScrollRequestContext.Provider>;\n}\n\nexport function ScrollTarget({ id, children }: { id: string | number; children?: ReactNode }): ReactNode {\n const request = useContext(ScrollRequestContext);\n if (request && request.id === id) return styled({ scrollID: true, scrollTo: { anchor: request.anchor, serial: request.serial } }, children);\n return styled({ scrollID: true }, children);\n}\n","/**\n * Lazy rows (docs/ops-protocol.md, \"Lazy rows\"): inside a `List`,\n * `LazyVStack` or `LazyHStack`, a `ForEach` of more rows than a batch mounts\n * the first batch and a `lazyspacer`; the page reports the spacer when it\n * nears the visible area (`lazy`), and the next batch mounts, with a new\n * spacer after it.\n */\n\nimport { createContext, createElement, isValidElement, useContext, useEffect, useState, type ReactElement, type ReactNode } from 'react';\nimport { ScrollRequestContext } from './scrollReader';\nimport { sb } from './host/sb';\n\nexport const LAZY_BATCH = 12;\n\nexport const LazyContext = createContext<'vertical' | 'horizontal' | null>(null);\n\nexport interface LazyGroupProps {\n rows: ReactElement[];\n /** Set by a list: the group's first row's index among the container's children. */\n start?: number;\n /** Set by a list: wraps each row (selection tags) given its index among the container's children. */\n wrap?: (row: ReactElement, containerIndex: number) => ReactNode;\n}\n\nexport function LazyGroup({ rows, start = 0, wrap }: LazyGroupProps): ReactNode {\n const axis = useContext(LazyContext);\n const request = useContext(ScrollRequestContext);\n const [count, setCount] = useState(LAZY_BATCH);\n // A `scrollTo` whose target is a row not built yet builds the rows up to it\n // first, as SwiftUI does, so the target is on the page when it scrolls.\n const target = request ? rows.findIndex((row) => rowMatches(row, request.id)) : -1;\n const needed = target >= 0 ? Math.ceil((target + 1) / LAZY_BATCH) * LAZY_BATCH : 0;\n useEffect(() => {\n if (needed > count) setCount(needed);\n }, [needed, count]);\n const visible = Math.max(count, needed);\n const shown = axis === null ? rows : rows.slice(0, visible);\n const built = shown.map((row, index) => (wrap ? wrap(row, start + index) : row));\n if (axis === null || shown.length >= rows.length) return built;\n return [\n ...built,\n createElement(\n LazySpacer,\n { key: `lazy-${visible}`, axis, remaining: rows.length - shown.length, more: () => setCount(visible + LAZY_BATCH) },\n ),\n ];\n}\n\nfunction LazySpacer({ axis, remaining, more }: { axis: 'vertical' | 'horizontal'; remaining: number; more: () => void }): ReactNode {\n return sb('lazyspacer', { axis, remaining }, { lazy: more });\n}\n\n/** Whether a row is a scroll target's: its key (a `ForEach` id), or a `scrollID` on the row's view. */\nfunction rowMatches(row: ReactElement, id: string | number): boolean {\n if (row.key !== null && row.key === String(id)) return true;\n let element: ReactElement | null = row;\n for (let depth = 0; element && depth < 3; depth++) {\n const props = element.props as { scrollID?: unknown; children?: unknown };\n if (props.scrollID === id) return true;\n element = isValidElement(props.children) ? (props.children as ReactElement) : null;\n }\n return false;\n}\n","import type { FrameAlignment, GridItem as GridItemProps, GridRowAlignment, HStackAlignment, ScrollAxes, VStackAlignment } from '@swiftbrowser/web/src/protocol';\nimport { Children, Fragment, createElement, isValidElement, useState, type Key, type ReactElement, type ReactNode } from 'react';\nimport { useViewEnvironment } from '../environment';\nimport type { EventHandlers } from '../host/instance';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, takeModifier, type ModifierEntry, type ViewModifiers } from '../modifiers';\nimport {\n edgeEffectProp,\n edgeHiddenSettings,\n edgeStyleSettings,\n marginSettings,\n marginedContent,\n mergeScrollSettings,\n useScrollSettings,\n withScrollSettings,\n type ContentMarginsValue,\n type ScrollEdgeEffectHiddenValue,\n type ScrollEdgeEffectStyleValue,\n type ScrollSettings,\n} from '../scrollEnvironment';\nimport { Row, type RowProps } from './row';\nimport { LAZY_BATCH, LazyGroup, type LazyGroupProps } from '../lazy';\n\nexport interface VStackProps extends ViewModifiers {\n alignment?: VStackAlignment;\n spacing?: number | null;\n /** `.scrollTargetLayout()`: the children are the enclosing scroll view's snap points. */\n scrollTargetLayout?: boolean;\n children?: ReactNode;\n}\n\nexport function VStack(props: VStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const stack: Record<string, unknown> = { spacing: own.spacing ?? null, alignment: own.alignment ?? 'center' };\n if (own.scrollTargetLayout) stack['scrollTarget'] = true;\n return applyModifiers(sb('vstack', stack, undefined, own.children), modifiers);\n}\n\nexport interface HStackProps extends ViewModifiers {\n alignment?: HStackAlignment | 'firstTextBaseline' | 'lastTextBaseline';\n spacing?: number | null;\n scrollTargetLayout?: boolean;\n children?: ReactNode;\n}\n\nexport function HStack(props: HStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const stack: Record<string, unknown> = { spacing: own.spacing ?? null, alignment: own.alignment ?? 'center' };\n if (own.scrollTargetLayout) stack['scrollTarget'] = true;\n return applyModifiers(sb('hstack', stack, undefined, own.children), modifiers);\n}\n\nexport interface ZStackProps extends ViewModifiers {\n alignment?: FrameAlignment;\n children?: ReactNode;\n}\n\nexport function ZStack(props: ZStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('zstack', { alignment: own.alignment ?? 'center' }, undefined, own.children), modifiers);\n}\n\nexport interface SpacerProps extends ViewModifiers {\n minLength?: number | null;\n}\n\nexport function Spacer(props: SpacerProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('spacer', { minLength: own.minLength ?? null }), modifiers);\n}\n\nexport function Divider(props: ViewModifiers): ReactNode {\n const { modifiers } = splitProps(props);\n return applyModifiers(sb('divider', {}), modifiers);\n}\n\nexport interface ScrollViewProps extends ViewModifiers {\n axes?: ScrollAxes;\n /** `.scrollTargetBehavior(_:)`: snap to the `scrollTargetLayout` children, or a page at a time. */\n scrollTargetBehavior?: 'viewAligned' | 'paging';\n /** `.scrollDismissesKeyboard(.immediately)` */\n scrollDismissesKeyboard?: boolean;\n children?: ReactNode;\n}\n\nexport function ScrollView(props: ScrollViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const refresh = useRefreshable(takeModifier(modifiers, 'refreshable'));\n const ownSettings = takeScrollSettings(modifiers);\n const settings = useScrollSettings(ownSettings);\n const axes = own.axes ?? 'vertical';\n const scroll: Record<string, unknown> = { axes, ...refresh.props };\n if (own.scrollTargetBehavior) scroll['snap'] = own.scrollTargetBehavior;\n if (own.scrollDismissesKeyboard) scroll['dismissesKeyboard'] = true;\n const edgeEffect = edgeEffectProp(settings);\n if (edgeEffect) scroll['edgeEffect'] = edgeEffect;\n const content = marginedContent(own.children, settings.margins, axes === 'horizontal' ? 'horizontal' : 'vertical');\n return applyModifiers(sb('scrollview', scroll, refresh.handlers, providingScrollSettings(ownSettings, content)), modifiers);\n}\n\n/**\n * The scroll modifiers written on a `ScrollView` or `List` itself: they apply\n * to it, and pass on to the scroll views inside as from above.\n */\nexport function takeScrollSettings(modifiers: ModifierEntry[]): ScrollSettings {\n let settings: ScrollSettings = {};\n // Each sets different fields, so their order does not matter.\n const own: ScrollSettings[] = [];\n for (const key of ['scrollEdgeEffectStyle', 'scrollEdgeEffectHidden', 'contentMargins'] as const) {\n const value = takeModifier(modifiers, key);\n if (value === undefined) continue;\n if (key === 'scrollEdgeEffectStyle') own.push(edgeStyleSettings(value as ScrollEdgeEffectStyleValue));\n else if (key === 'scrollEdgeEffectHidden') own.push(edgeHiddenSettings(value as ScrollEdgeEffectHiddenValue));\n else own.push(marginSettings(value as ContentMarginsValue));\n }\n for (const each of own) settings = mergeScrollSettings(settings, each);\n return settings;\n}\n\n/** `children` under the settings a scroll view was given itself (when there are any). */\nexport function providingScrollSettings(settings: ScrollSettings, children: ReactNode): ReactNode {\n return Object.keys(settings).length > 0 ? withScrollSettings(settings, children) : children;\n}\n\n/**\n * `.refreshable` above a `List` or `ScrollView`: its props (`refreshable`,\n * `refreshing` while the action runs) and the `refresh` handler.\n */\nexport function useRefreshable(own?: () => unknown): { props: Record<string, unknown>; handlers?: EventHandlers } {\n // `.refreshable` on the list or scroll view itself, else from above it.\n const environment = useViewEnvironment();\n const refresh = own ?? environment.refresh;\n const [refreshing, setRefreshing] = useState(false);\n if (!refresh) return { props: {} };\n return {\n props: { refreshable: true, refreshing },\n handlers: {\n refresh: () => {\n if (refreshing) return;\n setRefreshing(true);\n Promise.resolve()\n .then(refresh)\n .catch((error: unknown) => console.error(error))\n .finally(() => setRefreshing(false));\n },\n },\n };\n}\n\nexport interface GroupProps extends ViewModifiers {\n children?: ReactNode;\n}\n\n/** `Group { }`: the modifiers apply to each child. */\nexport function Group(props: GroupProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n if (modifiers.length === 0) return own.children;\n return Children.map(own.children, (child) => applyModifiers(child, modifiers));\n}\n\nexport interface ForEachProps<T> extends ViewModifiers {\n data: readonly T[];\n /** The identity of each element (`id: \\.self` by default, or `.id` when the element has one). */\n id?: (element: T, index: number) => Key;\n /** `.onDelete`: the rows become deletable (a swipe, or edit mode's minus); called with the offsets to remove. */\n onDelete?: (offsets: number[]) => void;\n /** `.deleteDisabled`, per element. */\n deleteDisabled?: (element: T, index: number) => boolean;\n /**\n * `.onMove`: the rows become movable (a grip in edit mode, a long press\n * otherwise); called like `move(fromOffsets:toOffset:)`, with the offsets\n * moved and the offset they go before, counted before the move\n * (`moveItems` applies it to an array).\n */\n onMove?: (offsets: number[], to: number) => void;\n /** `.moveDisabled`, per element. */\n moveDisabled?: (element: T, index: number) => boolean;\n children: (element: T, index: number) => ReactNode;\n}\n\n/** `Array.move(fromOffsets:toOffset:)`: the array with `offsets` moved before `to` (counted before the move). */\nexport function moveItems<T>(items: readonly T[], offsets: readonly number[], to: number): T[] {\n const moving = new Set(offsets);\n const picked = items.filter((_, index) => moving.has(index));\n const rest = items.filter((_, index) => !moving.has(index));\n const before = offsets.filter((offset) => offset < to).length;\n const at = to - before;\n return [...rest.slice(0, at), ...picked, ...rest.slice(at)];\n}\n\n/** `ForEach(data, id:) { }`: one keyed child per element. */\nexport function ForEach<T>(props: ForEachProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const rows = own.data.map((element, index): ReactElement => {\n const key = own.id ? own.id(element, index) : keyOf(element, index);\n const content = applyModifiers(own.children(element, index), modifiers);\n if (!own.onDelete && !own.onMove) return createElement(Fragment, { key }, content);\n const { onDelete, onMove } = own;\n const row: RowProps = { tag: key, index };\n if (onDelete) {\n row.onDelete = () => onDelete([index]);\n row.deletable = !own.deleteDisabled?.(element, index);\n }\n if (onMove) {\n row.onMove = (to) => onMove([index], to);\n row.movable = !own.moveDisabled?.(element, index);\n }\n return createElement(Row, { key, ...row }, content);\n });\n // A long group builds its rows lazily inside a list or a lazy stack.\n return rows.length > LAZY_BATCH ? createElement(LazyGroup, { rows }) : rows;\n}\n\nfunction keyOf(element: unknown, index: number): Key {\n if (typeof element === 'string' || typeof element === 'number') return element;\n if (typeof element === 'object' && element !== null && 'id' in element) {\n const id = (element as { id: unknown }).id;\n if (typeof id === 'string' || typeof id === 'number') return id;\n }\n return index;\n}\n\n/**\n * The elements of `children`, through fragments, arrays and `ForEach`, so\n * `Picker` and `TabView` can read their options and tabs.\n */\nexport function flattenChildren(children: ReactNode, options: { keepLazy?: boolean } = {}): ReactElement[] {\n const result: ReactElement[] = [];\n const visit = (node: ReactNode): void => {\n if (node === null || node === undefined || typeof node === 'boolean') return;\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (!isValidElement(node)) return;\n const element = node as ReactElement<Record<string, unknown>>;\n if (element.type === Fragment) {\n const inner = element.props['children'] as ReactNode;\n // A keyed fragment around one view (a `ForEach` row) hands its key on,\n // so the row keeps its identity when the rows reorder.\n if (element.key !== null && isValidElement(inner) && inner.key === null && inner.type !== Fragment) {\n visit({ ...inner, key: element.key });\n return;\n }\n visit(inner);\n return;\n }\n if (element.type === ForEach) {\n // Expand it as it would render (keys, modifiers and `onDelete` rows included).\n visit(ForEach(element.props as unknown as ForEachProps<unknown>));\n return;\n }\n if (element.type === LazyGroup && !options.keepLazy) {\n visit((element.props as unknown as LazyGroupProps).rows);\n return;\n }\n result.push(element);\n };\n visit(children);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Grids\n// ---------------------------------------------------------------------------\n\nexport interface GridItemSpec {\n size?: { fixed: number } | { flexible: { minimum?: number; maximum?: number } } | { adaptive: { minimum: number; maximum?: number } };\n spacing?: number | null;\n alignment?: FrameAlignment | null;\n}\n\n/** `GridItem(.flexible(), spacing: 8)`; `GridItem.flexible()` for short. */\nexport function GridItem(spec: GridItemSpec = {}): GridItemProps {\n const dimension = (n: number | undefined): number | 'infinity' => (n === undefined || n === Infinity ? 'infinity' : n);\n let size: GridItemProps['size'];\n if (spec.size && 'fixed' in spec.size) size = { kind: 'fixed', value: spec.size.fixed };\n else if (spec.size && 'adaptive' in spec.size) {\n size = { kind: 'adaptive', minimum: spec.size.adaptive.minimum, maximum: dimension(spec.size.adaptive.maximum) };\n } else {\n const flexible = spec.size && 'flexible' in spec.size ? spec.size.flexible : {};\n size = { kind: 'flexible', minimum: flexible.minimum ?? 10, maximum: dimension(flexible.maximum) };\n }\n return { size, spacing: spec.spacing ?? null, alignment: spec.alignment ?? null };\n}\nGridItem.flexible = (options: { minimum?: number; maximum?: number; spacing?: number; alignment?: FrameAlignment } = {}): GridItemProps =>\n GridItem({ size: { flexible: options }, spacing: options.spacing, alignment: options.alignment });\nGridItem.fixed = (value: number, options: { spacing?: number; alignment?: FrameAlignment } = {}): GridItemProps =>\n GridItem({ size: { fixed: value }, spacing: options.spacing, alignment: options.alignment });\nGridItem.adaptive = (options: { minimum: number; maximum?: number; spacing?: number; alignment?: FrameAlignment }): GridItemProps =>\n GridItem({ size: { adaptive: options }, spacing: options.spacing, alignment: options.alignment });\n\nexport interface LazyVGridProps extends ViewModifiers {\n columns: GridItemProps[];\n alignment?: FrameAlignment;\n spacing?: number | null;\n children?: ReactNode;\n}\n\nexport function LazyVGrid(props: LazyVGridProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(\n sb('lazyvgrid', { columns: own.columns, spacing: own.spacing ?? null, alignment: own.alignment ?? 'center' }, undefined, own.children),\n modifiers,\n );\n}\n\nexport interface LazyHGridProps extends ViewModifiers {\n rows: GridItemProps[];\n /** How each cell sits in its slot: `top`, `center` (the default) or `bottom`. */\n alignment?: 'top' | 'center' | 'bottom' | 'firstTextBaseline' | 'lastTextBaseline';\n /** Between the columns (8 by default). */\n spacing?: number | null;\n children?: ReactNode;\n}\n\n/**\n * `LazyHGrid(rows:)`: the rows share the height it is proposed and the cells\n * fill them column by column, usually inside a horizontal `ScrollView`.\n */\nexport function LazyHGrid(props: LazyHGridProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(\n sb('lazyhgrid', { rows: own.rows, spacing: own.spacing ?? null, alignment: (own.alignment ?? 'center') as FrameAlignment }, undefined, own.children),\n modifiers,\n );\n}\n\nexport interface GridProps extends ViewModifiers {\n alignment?: FrameAlignment;\n horizontalSpacing?: number | null;\n verticalSpacing?: number | null;\n children?: ReactNode;\n}\n\nexport function Grid(props: GridProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(\n sb(\n 'grid',\n { horizontalSpacing: own.horizontalSpacing ?? null, verticalSpacing: own.verticalSpacing ?? null, alignment: own.alignment ?? 'center' },\n undefined,\n own.children,\n ),\n modifiers,\n );\n}\n\nexport interface GridRowProps extends ViewModifiers {\n alignment?: GridRowAlignment | null;\n children?: ReactNode;\n}\n\nexport function GridRow(props: GridRowProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('gridrow', { alignment: own.alignment ?? null }, undefined, own.children), modifiers);\n}\n","import type { Font, ShapeStyle, TextRun } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, isValidElement, type ReactElement, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, styled, takeModifier, type ViewModifiers } from '../modifiers';\nimport { useViewEnvironment } from '../environment';\nimport { color, font, shapeStyle, type ColorValue, type FontValue, type StyleValue } from '../values';\nimport { HStack } from './stacks';\n\nexport interface TextProps extends ViewModifiers {\n /** Strings and numbers, nested `<Text>`s (`Text + Text`) and inline `<Image>`s. */\n children?: ReactNode;\n italic?: boolean;\n underline?: boolean | { color?: ColorValue };\n strikethrough?: boolean | { color?: ColorValue };\n /** Points between characters (`.tracking` / `.kerning`). */\n tracking?: number;\n kerning?: number;\n baselineOffset?: number;\n /** A tap on the text opens this URL. */\n link?: string;\n}\n\n/** The run-level style of one `Text` (nested texts inherit the outer one). */\ninterface RunStyle {\n italic?: boolean;\n underline?: { color?: unknown };\n strikethrough?: { color?: unknown };\n kerning?: number;\n baselineOffset?: number;\n link?: string;\n font?: Font;\n foreground?: ShapeStyle;\n}\n\ntype Segment = { text: string; style: RunStyle } | { image: Record<string, unknown>; style: RunStyle };\n\nfunction runStyleOf(props: TextProps, inherited: RunStyle, nested: boolean): RunStyle {\n const style: RunStyle = { ...inherited };\n if (props.italic) style.italic = true;\n if (props.underline) style.underline = typeof props.underline === 'object' && props.underline.color ? { color: color(props.underline.color) } : {};\n if (props.strikethrough) {\n style.strikethrough = typeof props.strikethrough === 'object' && props.strikethrough.color ? { color: color(props.strikethrough.color) } : {};\n }\n const kerning = props.tracking ?? props.kerning;\n if (kerning !== undefined) style.kerning = kerning;\n if (props.baselineOffset !== undefined) style.baselineOffset = props.baselineOffset;\n if (props.link) style.link = props.link;\n if (nested) {\n // A nested text's font and color modifiers style its run; the outer\n // text's wrap the whole element (as `styled`), like the shim.\n let runFont: Font | undefined = props.font !== undefined ? font(props.font as FontValue) : undefined;\n if (props.bold) runFont = { ...(runFont ?? {}), weight: 'bold' };\n if (props.fontWeight) runFont = { ...(runFont ?? {}), weight: props.fontWeight };\n if (runFont) style.font = { ...(style.font ?? {}), ...runFont };\n if (props.foregroundStyle !== undefined) style.foreground = shapeStyle(props.foregroundStyle as StyleValue);\n }\n return style;\n}\n\n/** The segments of a text: raw strings merge into one; nested texts and images are their own. */\nfunction segmentsOf(children: ReactNode, style: RunStyle, into: Segment[]): void {\n const visit = (node: ReactNode): void => {\n if (node === null || node === undefined || typeof node === 'boolean') return;\n if (typeof node === 'string' || typeof node === 'number') {\n const last = into[into.length - 1];\n if (last && 'text' in last && last.style === style) last.text += String(node);\n else into.push({ text: String(node), style });\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (!isValidElement(node)) return;\n const element = node as ReactElement<Record<string, unknown>>;\n if (element.type === Fragment) {\n visit(element.props['children'] as ReactNode);\n return;\n }\n if (element.type === Text) {\n const props = element.props as TextProps;\n segmentsOf(props.children, runStyleOf(props, style, true), into);\n return;\n }\n if (element.type === Image) {\n const props = element.props as ImageProps;\n into.push({ image: imageProps(props), style });\n return;\n }\n };\n visit(children);\n}\n\nfunction isPlainStyle(style: RunStyle): boolean {\n return Object.keys(style).length === 0;\n}\n\nexport function Text(props: TextProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const style = runStyleOf(props, {}, false);\n const segments: Segment[] = [];\n segmentsOf(own.children, style, segments);\n const textCase = takeModifier(modifiers, 'textCase') ?? environment.textCase;\n if (textCase) {\n for (const segment of segments) {\n if ('text' in segment) segment.text = textCase === 'uppercase' ? segment.text.toUpperCase() : segment.text.toLowerCase();\n }\n }\n const redacted = takeModifier(modifiers, 'redacted') ?? environment.redacted;\n const content = segments.map((segment) => ('text' in segment ? segment.text : '')).join('');\n const plain = segments.length <= 1 && (segments.length === 0 || ('text' in segments[0]! && isPlainStyle(segments[0]!.style)));\n if (plain) return applyModifiers(placeholder(sb('text', { text: content }), redacted), modifiers);\n const runs: TextRun[] = segments.map((segment) => {\n const run: Record<string, unknown> = { ...segment.style };\n if ('text' in segment) run['text'] = segment.text;\n else run['image'] = segment.image;\n return run as TextRun;\n });\n const hasLinks = segments.some((segment) => segment.style.link);\n const handlers = hasLinks ? { link: (event: { value: string }) => openURL(event.value) } : undefined;\n return applyModifiers(placeholder(sb('text', { text: content, runs }, handlers), redacted), modifiers);\n}\n\n/**\n * `.redacted(reason: .placeholder)`: the view keeps its size and draws as a\n * rounded block of the tertiary fill, as iOS draws placeholder content.\n */\nexport function placeholder(node: ReactNode, redacted: boolean | undefined): ReactNode {\n if (!redacted) return node;\n return styled({ background: { hierarchical: 3 }, backgroundCornerRadius: 4 }, styled({ foreground: { name: 'clear' } }, node));\n}\n\nexport function openURL(url: string): void {\n if (typeof window !== 'undefined') window.open(url, '_blank', 'noopener');\n}\n\n// ---------------------------------------------------------------------------\n// Image\n// ---------------------------------------------------------------------------\n\nexport interface ImageProps extends ViewModifiers {\n /** An SF Symbol name. */\n systemName?: string;\n /** An asset-catalog image name (the renderer needs the catalog manifest). */\n name?: string;\n /** A remote image whose pixel size is known; `AsyncImage` loads one to learn it. */\n url?: string;\n width?: number;\n height?: number;\n resizable?: boolean;\n}\n\nfunction imageProps(props: ImageProps): Record<string, unknown> {\n if (props.systemName !== undefined) return { systemName: props.systemName };\n if (props.url !== undefined) return { url: props.url, resizable: props.resizable ?? false, width: props.width ?? 0, height: props.height ?? 0 };\n return { name: props.name ?? '', resizable: props.resizable ?? false };\n}\n\nexport function Image(props: ImageProps): ReactNode {\n const { modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const redacted = takeModifier(modifiers, 'redacted') ?? environment.redacted;\n return applyModifiers(placeholder(sb('image', imageProps(props)), redacted), modifiers);\n}\n\n// ---------------------------------------------------------------------------\n// Label, LabeledContent, Link\n// ---------------------------------------------------------------------------\n\nexport interface LabelProps extends ViewModifiers {\n title: ReactNode;\n systemImage?: string;\n image?: string;\n /** A custom icon view instead of a symbol. */\n icon?: ReactNode;\n}\n\n/** `Label(\"Favorites\", systemImage: \"heart.fill\")`: an 8pt-spaced `HStack` of icon and title. */\nexport function Label(props: LabelProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const style = takeModifier(modifiers, 'labelStyle') ?? environment.labelStyle ?? 'automatic';\n const icon = own.icon ?? (own.systemImage !== undefined ? <Image systemName={own.systemImage} /> : own.image !== undefined ? <Image name={own.image} /> : null);\n const title = typeof own.title === 'string' || typeof own.title === 'number' ? <Text>{own.title}</Text> : own.title;\n if (style === 'iconOnly') return applyModifiers(icon, modifiers);\n if (style === 'titleOnly') return applyModifiers(title, modifiers);\n return applyModifiers(\n <HStack spacing={8}>\n {styled({ labelIcon: true }, icon)}\n {title}\n </HStack>,\n modifiers,\n );\n}\n\nexport interface LabeledContentProps extends ViewModifiers {\n label: ReactNode;\n value?: ReactNode;\n children?: ReactNode;\n}\n\n/** `LabeledContent(\"Storage\", value: \"2.4 GB\")`: the label, a spacer, the value in the secondary color. */\nexport function LabeledContent(props: LabeledContentProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const label = typeof own.label === 'string' || typeof own.label === 'number' ? <Text>{own.label}</Text> : own.label;\n const content = own.children ?? own.value;\n const value = typeof content === 'string' || typeof content === 'number' ? <Text>{content}</Text> : content;\n return applyModifiers(\n <HStack>\n {label}\n {sb('spacer', { minLength: null })}\n {styled({ foreground: { hierarchical: 2 } }, value)}\n </HStack>,\n modifiers,\n );\n}\n\nexport interface LinkProps extends ViewModifiers {\n destination: string;\n title?: string;\n children?: ReactNode;\n}\n\n/** `Link(\"Visit the website\", destination:)`: a plain button that opens the URL. */\nexport function Link(props: LinkProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n return applyModifiers(sb('button', { role: null, style: 'automatic' }, { tap: () => openURL(own.destination) }, label), modifiers);\n}\n","import { Fragment, useRef, useState, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { DismissContext } from '../environment';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { NavigationContext, RegisterDestination, useNavigation, type NavigationContextValue } from '../navigation-context';\nimport { Text } from './text';\n\nexport interface NavigationStackProps extends ViewModifiers {\n /** `NavigationStack(path:)`: the pushed values. */\n path?: BindingValue<readonly unknown[]>;\n onPathChange?: (path: readonly unknown[]) => void;\n /** `.navigationDestination(for:)`, for every pushed value. */\n destination?: (value: never) => ReactNode;\n children?: ReactNode;\n}\n\n/** A pushed destination view (`NavigationLink(destination:)`), kept in the path. */\ninterface PushedView {\n view: ReactNode;\n}\n\nconst isPushedView = (value: unknown): value is PushedView =>\n typeof value === 'object' && value !== null && 'view' in value && Object.keys(value).length === 1;\n\nexport function NavigationStack(props: NavigationStackProps): ReactNode {\n const enclosing = useNavigation();\n // A stack inside another stack's screen is flattened, as SwiftUI does: its\n // content renders in place and its links push onto the enclosing stack.\n if (enclosing) return <FlattenedStack {...props} />;\n return <OwnStack {...props} />;\n}\n\nfunction FlattenedStack(props: NavigationStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(\n <>\n {own.destination && <RegisterDestination destination={own.destination} />}\n {own.children}\n </>,\n modifiers,\n );\n}\n\nfunction OwnStack(props: NavigationStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [internalPath, setInternalPath] = useState<readonly unknown[]>([]);\n const [path, setPath] = own.path !== undefined ? readBinding(own.path, own.onPathChange) : [internalPath, setInternalPath];\n const destination = useRef<((value: unknown) => ReactNode) | null>(null);\n destination.current = (own.destination as ((value: unknown) => ReactNode) | undefined) ?? null;\n const context: NavigationContextValue = {\n push: (value) => setPath([...path, value]),\n pop: () => setPath(path.slice(0, -1)),\n registerDestination: (builder) => {\n destination.current = builder;\n },\n };\n const screens: ReactNode[] = [\n <Fragment key=\"root\">\n {sb('navscreen', { title: '', displayMode: 'automatic', depth: 0 }, { tap: context.pop }, own.children)}\n </Fragment>,\n ];\n path.forEach((value, index) => {\n const pop = (): void => setPath(path.slice(0, index));\n screens.push(\n <Fragment key={index + 1}>\n {sb(\n 'navscreen',\n { title: '', displayMode: 'automatic', depth: index + 1 },\n { tap: pop },\n <DismissContext.Provider value={pop}>\n <PathScreen value={value} destination={destination} />\n </DismissContext.Provider>,\n )}\n </Fragment>,\n );\n });\n return applyModifiers(\n sb('navstack', {}, undefined, <NavigationContext.Provider value={context}>{screens}</NavigationContext.Provider>),\n modifiers,\n );\n}\n\n/** Rendered after the root screen, so a destination the root registered is known. */\nfunction PathScreen({ value, destination }: { value: unknown; destination: { current: ((value: unknown) => ReactNode) | null } }): ReactNode {\n if (isPushedView(value)) return value.view;\n return destination.current ? destination.current(value) : null;\n}\n\nexport interface NavigationLinkProps extends ViewModifiers {\n title?: string;\n /** The value to push (`navigationDestination` builds the screen). */\n value?: unknown;\n /** The screen to push. */\n destination?: ReactNode;\n children?: ReactNode;\n}\n\nexport function NavigationLink(props: NavigationLinkProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const navigation = useNavigation();\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n const tap = (): void => {\n if (!navigation) return;\n if (own.destination !== undefined) navigation.push({ view: own.destination } satisfies PushedView);\n else navigation.push(own.value);\n };\n return applyModifiers(sb('navlink', {}, { tap }, label), modifiers);\n}\n","/**\n * `NavigationSplitView`: in a regular width a `navsplit` of two columns (the\n * sidebar's stack and the detail's), the sidebar toggled by the bar button;\n * in a compact width one stack rooted at the sidebar that pushes the detail\n * while the sidebar's list has a selection, as on iOS.\n */\n\nimport { createContext, isValidElement, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { useHorizontalSizeClass } from '../environment';\nimport { withAnimation } from '../host/root';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { NavigationContext } from '../navigation-context';\nimport { NavigationStack } from './navigation';\n\nexport type NavigationSplitViewVisibility = 'automatic' | 'all' | 'doubleColumn' | 'detailOnly';\n\n/**\n * What the sidebar's `List(selection:)`s tell their split view: whether\n * each has something selected, and how to clear it. Each list reports under\n * its own key and retracts when it unmounts; the split pushes the detail in\n * a compact width while any of them has a selection.\n */\nexport interface SplitSelection {\n report(key: object, selected: boolean, clear: () => void): void;\n retract(key: object): void;\n}\n\nexport const SplitSelectionContext = createContext<SplitSelection | null>(null);\n\nexport interface NavigationSplitViewProps extends ViewModifiers {\n sidebar: ReactNode;\n detail: ReactNode;\n columnVisibility?: BindingValue<NavigationSplitViewVisibility>;\n onColumnVisibilityChange?: (visibility: NavigationSplitViewVisibility) => void;\n}\n\nexport function NavigationSplitView(props: NavigationSplitViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const sizeClass = useHorizontalSizeClass();\n const [selected, setSelected] = useState(false);\n // Each sidebar list's selection and its latest way to clear it (a new\n // closure each render; not state). The split follows whether any has one,\n // so two lists settle instead of overruling each other.\n // One object for the split's life: the lists key their reports by it, and\n // a new one each render would retract and re-report them every pass.\n const reporters = useRef(new Map<object, { selected: boolean; clear: () => void }>());\n const [report] = useState<SplitSelection>(() => {\n // `setSelected` with an unchanged value is a no-op, so the lists settle.\n const settle = (): void => setSelected([...reporters.current.values()].some((entry) => entry.selected));\n return {\n report: (key, nowSelected, clear) => {\n reporters.current.set(key, { selected: nowSelected, clear });\n settle();\n },\n retract: (key) => {\n if (reporters.current.delete(key)) settle();\n },\n };\n });\n const clear = (): void => {\n for (const entry of reporters.current.values()) if (entry.selected) entry.clear();\n };\n const [internal, setInternal] = useState<NavigationSplitViewVisibility>('automatic');\n const [visibility, setVisibility] =\n own.columnVisibility !== undefined ? readBinding(own.columnVisibility, own.onColumnVisibilityChange) : [internal, setInternal];\n\n if (sizeClass === 'compact') {\n return applyModifiers(\n <SplitSelectionContext.Provider value={report}>\n <CompactSplit sidebar={own.sidebar} detail={own.detail} selected={selected} clear={clear} />\n </SplitSelectionContext.Provider>,\n modifiers,\n );\n }\n\n const sidebarVisible = visibility !== 'detailOnly';\n const toggle = (): void => withAnimation(() => setVisibility(sidebarVisible ? 'detailOnly' : 'all'));\n const detail = isValidElement(own.detail) && own.detail.type === NavigationStack ? own.detail : <NavigationStack>{own.detail}</NavigationStack>;\n return applyModifiers(\n sb('navsplit', { sidebarVisible }, { tap: toggle }, [\n <SplitColumn key=\"sidebar\" report={report}>\n <NavigationStack>{own.sidebar}</NavigationStack>\n </SplitColumn>,\n <SplitColumn key=\"detail\" report={null}>\n {detail}\n </SplitColumn>,\n ]),\n modifiers,\n );\n}\n\n/** A column: its own navigation scope (no enclosing stack), and the sidebar's selection reporting. */\nfunction SplitColumn({ report, children }: { report: SplitSelection | null; children?: ReactNode }): ReactNode {\n return (\n <NavigationContext.Provider value={null}>\n <SplitSelectionContext.Provider value={report}>{children}</SplitSelectionContext.Provider>\n </NavigationContext.Provider>\n );\n}\n\nfunction CompactSplit({ sidebar, detail, selected, clear }: { sidebar: ReactNode; detail: ReactNode; selected: boolean; clear: () => void }): ReactNode {\n // Pushes made from the detail, after it.\n const [extra, setExtra] = useState<readonly unknown[]>([]);\n const base = selected ? [{ view: <DetailScope>{detail}</DetailScope> }] : [];\n const path = [...base, ...extra];\n const setPath = (next: readonly unknown[]): void => {\n if (selected && next.length === 0) {\n setExtra([]);\n clear();\n return;\n }\n setExtra(next.slice(base.length));\n };\n return (\n <NavigationContext.Provider value={null}>\n <NavigationStack path={[path, setPath]}>{sidebar}</NavigationStack>\n </NavigationContext.Provider>\n );\n}\n\n/** The detail pushed in a compact split: its list selections do not drive the split. */\nfunction DetailScope({ children }: { children?: ReactNode }): ReactNode {\n return <SplitSelectionContext.Provider value={null}>{children}</SplitSelectionContext.Provider>;\n}\n\n/**\n * Used by `List(selection:)`: tells the enclosing split view whether the\n * sidebar has a selection. A list without a selection binding (a `Form`, a\n * plain list) passes `active: false` and says nothing.\n */\nexport function useReportSplitSelection(split: SplitSelection | null, selected: boolean, clear: () => void, active = true): void {\n const key = useRef({}).current;\n useLayoutEffect(() => {\n if (active) split?.report(key, selected, clear);\n else split?.retract(key);\n });\n useLayoutEffect(() => () => split?.retract(key), [split, key]);\n}\n\n/** Presented content (a sheet, a popover, an inspector) is outside its presenter's split column. */\nexport function OutsideSplit({ children }: { children?: ReactNode }): ReactNode {\n return <SplitSelectionContext.Provider value={null}>{children}</SplitSelectionContext.Provider>;\n}\n","/**\n * Sheets and alerts: presented content becomes a root-level `sheet` / `alert`\n * element after the app's tree, as the Swift core emits them.\n */\n\nimport type { Detent } from '@swiftbrowser/web/src/protocol';\nimport { useEffect, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from './binding';\nimport { DismissContext, withEnvironment } from './environment';\nimport { HOIST_KIND, PREF_KIND } from './host/instance';\nimport { NavigationContext } from './navigation-context';\nimport { OutsideSplit } from './components/split';\nimport { sb } from './host/sb';\n\nexport interface SheetModifier {\n isPresented: BindingValue<boolean>;\n onDismiss?: () => void;\n content: ReactNode;\n /** `.fullScreenCover` */\n fullScreen?: boolean;\n}\n\nexport function SheetPresenter({ isPresented, onDismiss, content, fullScreen }: SheetModifier): ReactNode {\n const [presented, setPresented] = readBinding(isPresented);\n if (!presented) return null;\n const dismiss = (): void => {\n setPresented(false);\n onDismiss?.();\n };\n const detents: Detent[] = fullScreen ? ['full'] : ['large'];\n return sb(\n HOIST_KIND,\n undefined,\n undefined,\n sb(\n 'sheet',\n { detents },\n { tap: dismiss },\n <NavigationContext.Provider value={null}>\n <OutsideSplit>\n <DismissContext.Provider value={dismiss}>{content}</DismissContext.Provider>\n </OutsideSplit>\n </NavigationContext.Provider>,\n ),\n 'root',\n );\n}\n\n/** `.presentationDetents([.medium])`, inside a sheet's content. */\nexport type DetentValue = Detent | { height: number } | { fraction: number };\n\nexport function presentationDetents(detents: DetentValue[]): ReactNode {\n const encoded = detents.map(\n (detent): Detent => (typeof detent === 'string' ? detent : 'height' in detent ? `height:${detent.height}` : `fraction:${detent.fraction}`),\n );\n return sb(PREF_KIND, { detents: encoded }, undefined, undefined, 'sheet');\n}\n\nexport interface AlertModifier {\n title: string;\n isPresented: BindingValue<boolean>;\n message?: string;\n /** The buttons; each dismisses the alert when tapped. */\n actions?: ReactNode;\n /** `.confirmationDialog` */\n style?: 'alert' | 'dialog';\n}\n\nexport function AlertPresenter({ title, isPresented, message, actions, style }: AlertModifier): ReactNode {\n const [presented, setPresented] = readBinding(isPresented);\n if (!presented) return null;\n const dismiss = (): void => setPresented(false);\n return sb(\n HOIST_KIND,\n undefined,\n undefined,\n sb(\n 'alert',\n { title, message: message ?? null, style: style ?? 'alert' },\n { tap: dismiss },\n withEnvironment({ dismissAlert: dismiss }, actions),\n ),\n 'root',\n );\n}\n\n/** `.onAppear` / `.onDisappear` */\nexport function Lifecycle({ onAppear, onDisappear }: { onAppear?: () => void; onDisappear?: () => void }): null {\n useEffect(() => {\n onAppear?.();\n return () => onDisappear?.();\n // Once per mount, like SwiftUI.\n }, []);\n return null;\n}\n","/**\n * `.inspector(isPresented:)`: in a regular width an `inspector` element, the\n * view and a trailing `inspectorpanel` the renderer slides in and out; in a\n * compact width a sheet with the inspector's content.\n */\n\nimport type { ReactNode } from 'react';\nimport { readBinding } from './binding';\nimport { useHorizontalSizeClass } from './environment';\nimport { sb } from './host/sb';\nimport type { InspectorModifier } from './modifiers';\nimport { SheetPresenter } from './presentation';\nimport { OutsideSplit } from './components/split';\n\nexport function Inspector({ isPresented, content, columnWidth, children }: InspectorModifier & { children?: ReactNode }): ReactNode {\n const sizeClass = useHorizontalSizeClass();\n const [presented, setPresented] = readBinding(isPresented);\n if (sizeClass === 'compact') {\n return (\n <>\n {children}\n <SheetPresenter isPresented={[presented, setPresented]} content={content} />\n </>\n );\n }\n // The panel is beside the content, not part of its split column.\n const outside = <OutsideSplit>{content}</OutsideSplit>;\n const panelContent = columnWidth !== undefined ? sb('styled', { style: { inspectorColumnWidth: columnWidth } }, undefined, outside) : outside;\n return sb('inspector', { presented }, undefined, [\n <InspectorPart key=\"content\">{children}</InspectorPart>,\n <InspectorPart key=\"panel\">{sb('inspectorpanel', {}, undefined, panelContent)}</InspectorPart>,\n ]);\n}\n\nfunction InspectorPart({ children }: { children?: ReactNode }): ReactNode {\n return children;\n}\n","/** `.task` and `.onChange(of:)`, as components the modifiers place beside the view. */\n\nimport { useEffect, useRef } from 'react';\n\nexport function Task({ id, action }: { id: unknown; action: (signal: AbortSignal) => unknown }): null {\n const latest = useRef(action);\n latest.current = action;\n useEffect(() => {\n const controller = new AbortController();\n Promise.resolve()\n .then(() => latest.current(controller.signal))\n .catch((error: unknown) => {\n // A cancelled task's rejection is expected, as Swift's CancellationError is.\n if (!controller.signal.aborted) console.error(error);\n });\n return () => controller.abort();\n }, [id]);\n return null;\n}\n\nexport function OnChange({\n value,\n action,\n initial,\n}: {\n value: unknown;\n action: (oldValue: unknown, newValue: unknown) => void;\n initial?: boolean;\n}): null {\n const previous = useRef<{ value: unknown } | null>(null);\n const latest = useRef(action);\n latest.current = action;\n useEffect(() => {\n const last = previous.current;\n previous.current = { value };\n if (last === null) {\n if (initial) latest.current(value, value);\n return;\n }\n if (!Object.is(last.value, value)) latest.current(last.value, value);\n }, [value, initial]);\n return null;\n}\n","/**\n * Modifiers for a page with a mouse and a keyboard, and the effects the\n * renderer draws for them: hover, tooltips, cursors, keyboard shortcuts,\n * key presses, symbol effects, matched geometry, haptics.\n */\n\nimport type { SymbolEffectStyle } from '@swiftbrowser/web/src/protocol';\nimport { useEffect, useId, useRef, type ReactNode } from 'react';\nimport { sb } from './host/sb';\nimport { styled } from './modifiers';\n\nexport function Hover({ action, children }: { action: (hovering: boolean) => void; children?: ReactNode }): ReactNode {\n return sb('styled', { style: { hover: true } }, { hover: (event) => action(event.value) }, children);\n}\n\nconst CURSORS: Record<string, string> = {\n link: 'pointer',\n automatic: 'auto',\n default: 'default',\n text: 'text',\n verticalText: 'vertical-text',\n grabIdle: 'grab',\n grabActive: 'grabbing',\n rectSelection: 'crosshair',\n columnResize: 'col-resize',\n rowResize: 'row-resize',\n};\n\nexport function cursorFor(style: string): string {\n return CURSORS[style] ?? style;\n}\n\n// ---------------------------------------------------------------------------\n// Symbol effects\n// ---------------------------------------------------------------------------\n\nexport interface SymbolEffectModifier {\n effect: SymbolEffectStyle['effect'];\n direction?: 'up' | 'down';\n speed?: number;\n repeat?: number | 'forever';\n /** `.symbolEffect(_:isActive:)`: the effect runs while true (true by default). */\n isActive?: boolean;\n /** `.symbolEffect(_:value:)`: the effect plays once each time this changes. */\n value?: unknown;\n}\n\nexport function SymbolEffect({ spec, children }: { spec: SymbolEffectModifier; children?: ReactNode }): ReactNode {\n const serial = useRef<{ value: unknown; count: number } | null>(null);\n const discrete = 'value' in spec;\n if (discrete) {\n if (!serial.current) serial.current = { value: spec.value, count: 0 };\n else if (!Object.is(serial.current.value, spec.value)) serial.current = { value: spec.value, count: serial.current.count + 1 };\n }\n if (!discrete && spec.isActive === false) return children;\n const effect: SymbolEffectStyle = { effect: spec.effect };\n if (spec.direction) effect.direction = spec.direction;\n if (spec.speed !== undefined) effect.speed = spec.speed;\n if (spec.repeat !== undefined) effect.repeat = spec.repeat;\n if (discrete) effect.trigger = serial.current!.count;\n return styled({ symbolEffect: effect }, children);\n}\n\n// ---------------------------------------------------------------------------\n// Matched geometry\n// ---------------------------------------------------------------------------\n\n/** `@Namespace`: a namespace for `matchedGeometryEffect` ids. */\nexport function useNamespace(): string {\n return useId();\n}\n\n// ---------------------------------------------------------------------------\n// Keyboard\n// ---------------------------------------------------------------------------\n\nexport type KeyEquivalent = 'return' | 'escape' | 'delete' | 'tab' | 'space' | 'upArrow' | 'downArrow' | 'leftArrow' | 'rightArrow' | (string & {});\nexport type EventModifier = 'command' | 'shift' | 'option' | 'control';\n\nexport interface KeyboardShortcut {\n key: KeyEquivalent;\n /** `command` by default, as SwiftUI's; `[]` for none. `command` is Ctrl off Apple platforms. */\n modifiers?: EventModifier[];\n}\n\nconst KEY_NAMES: Record<string, string> = {\n return: 'Enter',\n escape: 'Escape',\n delete: 'Backspace',\n tab: 'Tab',\n space: ' ',\n upArrow: 'ArrowUp',\n downArrow: 'ArrowDown',\n leftArrow: 'ArrowLeft',\n rightArrow: 'ArrowRight',\n};\n\nconst isApple = (): boolean => typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent);\n\nexport function matchesKey(event: KeyboardEvent, key: KeyEquivalent): boolean {\n const name = KEY_NAMES[key] ?? key;\n return name.length === 1 ? event.key.toLowerCase() === name.toLowerCase() : event.key === name;\n}\n\nfunction matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n if (!matchesKey(event, shortcut.key)) return false;\n const wanted = new Set(shortcut.modifiers ?? ['command']);\n const command = isApple() ? event.metaKey : event.ctrlKey;\n const control = isApple() ? event.ctrlKey : false;\n return (\n command === wanted.has('command') &&\n event.shiftKey === wanted.has('shift') &&\n event.altKey === wanted.has('option') &&\n control === (isApple() && wanted.has('control'))\n );\n}\n\n/** A shortcut that runs `action` while the component is mounted. */\nexport function useKeyboardShortcut(shortcut: KeyboardShortcut | undefined, action: () => void): void {\n const latest = useRef(action);\n latest.current = action;\n const key = shortcut ? `${shortcut.key}:${(shortcut.modifiers ?? ['command']).join('+')}` : '';\n useEffect(() => {\n if (!shortcut || typeof document === 'undefined') return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.defaultPrevented || !matchesShortcut(event, shortcut)) return;\n event.preventDefault();\n latest.current();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [key]);\n}\n\nexport interface KeyPress {\n key: string;\n characters: string;\n modifiers: EventModifier[];\n phase: 'down' | 'repeat';\n}\n\nexport interface OnKeyPressModifier {\n /** Only these keys (`KeyEquivalent`s or characters); every key when absent. */\n keys?: KeyEquivalent[];\n /** Return `'handled'` to stop the key there. */\n action: (press: KeyPress) => 'handled' | 'ignored' | void;\n}\n\n/**\n * `.onKeyPress`: keys pressed while the view is on screen and no text field\n * has the focus (the page has no focus for a plain view, so the screen\n * stands in for it).\n */\nexport function KeyPressListener({ spec }: { spec: OnKeyPressModifier }): null {\n const latest = useRef(spec);\n latest.current = spec;\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const onKey = (event: KeyboardEvent): void => {\n const target = event.target as HTMLElement | null;\n if (event.defaultPrevented || target?.closest('input, textarea, [contenteditable]')) return;\n const { keys, action } = latest.current;\n if (keys && !keys.some((key) => matchesKey(event, key))) return;\n const modifiers: EventModifier[] = [];\n if (event.metaKey) modifiers.push('command');\n if (event.shiftKey) modifiers.push('shift');\n if (event.altKey) modifiers.push('option');\n if (event.ctrlKey) modifiers.push('control');\n const result = action({ key: event.key, characters: event.key.length === 1 ? event.key : '', modifiers, phase: event.repeat ? 'repeat' : 'down' });\n if (result === 'handled') event.preventDefault();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Sensory feedback\n// ---------------------------------------------------------------------------\n\nexport type SensoryFeedback = 'success' | 'warning' | 'error' | 'selection' | 'increase' | 'decrease' | 'start' | 'stop' | 'alignment' | 'levelChange' | 'impact';\n\nconst PATTERNS: Record<SensoryFeedback, number | number[]> = {\n success: [12, 60, 18],\n warning: [18, 80, 18],\n error: [24, 50, 24, 50, 24],\n selection: 8,\n increase: 10,\n decrease: 10,\n start: 14,\n stop: 14,\n alignment: 6,\n levelChange: 10,\n impact: 16,\n};\n\n/** `.sensoryFeedback(_:trigger:)`: a vibration where the browser and device have one (Android), nothing elsewhere. */\nexport function SensoryFeedbackPlayer({ feedback, trigger }: { feedback: SensoryFeedback; trigger: unknown }): null {\n const first = useRef(true);\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n if (typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function') navigator.vibrate(PATTERNS[feedback]);\n }, [trigger, feedback]);\n return null;\n}\n","/**\n * View modifiers as props. Every component accepts them, and applies them in\n * the order they are written, innermost first, exactly like a SwiftUI\n * modifier chain reads: `<Text padding background=\"red\" />` is\n * `Text().padding().background(.red)`. Each modifier that changes layout or\n * style wraps the view in a `styled` element, as the Swift shim does; the\n * environment ones wrap it in a context; the navigation and presentation ones\n * attach preferences and hoisted elements beside it.\n */\n\nimport type {\n Animation,\n ButtonStyle,\n EdgeInsets,\n FixedSize,\n FontWeight,\n FrameAlignment,\n ImageScale,\n PickerStyle,\n Style,\n TextAlignment,\n ToolbarPlacement,\n Transition,\n} from '@swiftbrowser/web/src/protocol';\nimport { Children, Fragment, cloneElement, createElement, isValidElement, useRef, type ReactElement, type ReactNode } from 'react';\nimport type { BindingValue } from './binding';\nimport { readBinding } from './binding';\nimport { withEnvironment, type ControlSize, type ViewEnvironment } from './environment';\nimport { Draggable, DropDestination } from './dragDrop';\nimport { Inspector } from './inspector';\nimport { OnChange, Task } from './lifecycle';\nimport { ScrollTarget } from './scrollReader';\nimport { CoordinateSpace } from './coordinateSpace';\nimport {\n edgeHiddenSettings,\n edgeStyleSettings,\n marginSettings,\n withScrollSettings,\n type ContentMarginsValue,\n type ScrollEdgeEffectHiddenValue,\n type ScrollEdgeEffectStyleValue,\n} from './scrollEnvironment';\nimport { ScrollTransitionView, VisualEffectView, type ScrollTransitionClosure, type ScrollTransitionSpec, type VisualEffectClosure } from './visualEffect';\nimport {\n Hover,\n KeyPressListener,\n SensoryFeedbackPlayer,\n SymbolEffect,\n cursorFor,\n type KeyEquivalent,\n type KeyboardShortcut,\n type OnKeyPressModifier,\n type SensoryFeedback,\n type SymbolEffectModifier,\n} from './pointer';\nimport { HOIST_KIND, PREF_KIND } from './host/instance';\nimport { sb } from './host/sb';\nimport { RegisterDestination } from './navigation-context';\nimport {\n AlertPresenter,\n Lifecycle,\n SheetPresenter,\n presentationDetents,\n type AlertModifier,\n type DetentValue,\n type SheetModifier,\n} from './presentation';\nimport {\n color,\n font,\n frame,\n padding,\n rgb,\n shapeStyle,\n unitPoint,\n type ColorValue,\n type UnitPointValue,\n type FontValue,\n type FrameValue,\n type PaddingValue,\n type StyleValue,\n} from './values';\n\n/** A shape component carries its protocol kind; `RoundedRectangle` reads the radius from its props. */\nexport interface ShapeSpec {\n kind: string;\n cornerRadius: number | null;\n}\n\n/** `.background(style, in: shape)` */\nexport interface BackgroundInShape {\n fill: StyleValue;\n in: ReactElement;\n}\n\nexport type BackgroundValue = StyleValue | BackgroundInShape | ReactElement;\n\nexport interface SearchableModifier {\n text: BindingValue<string>;\n onChange?: (text: string) => void;\n prompt?: string;\n}\n\n/** `DragGesture.Value`: the renderer's drag event, in the element's own coordinates. */\nexport interface DragValue {\n translation: { width: number; height: number };\n location: { x: number; y: number };\n startLocation: { x: number; y: number };\n velocity: { width: number; height: number };\n}\n\nexport interface DragGestureModifier {\n minimumDistance?: number;\n onChanged?: (value: DragValue) => void;\n onEnded?: (value: DragValue) => void;\n}\n\nexport interface SwipeActionsModifier {\n edge?: 'leading' | 'trailing';\n allowsFullSwipe?: boolean;\n /** The actions: `Button`s (a `tint` colors one, a `destructive` role makes it red). */\n children: ReactNode;\n}\n\nexport type ToolbarItemPlacementName =\n | 'automatic'\n | 'topBarLeading'\n | 'topBarTrailing'\n | 'navigationBarLeading'\n | 'navigationBarTrailing'\n | 'cancellationAction'\n | 'confirmationAction'\n | 'destructiveAction'\n | 'primaryAction'\n | 'navigation'\n | 'principal'\n | 'bottomBar'\n | 'secondaryAction';\n\n/** `.toolbarRole(_:)`: `editor` shows a regular-width screen's secondary actions in its bar. */\nexport type ToolbarRole = 'automatic' | 'navigationStack' | 'browser' | 'editor';\n\nexport function toolbarPlacement(name: ToolbarItemPlacementName | undefined): ToolbarPlacement {\n switch (name) {\n case 'topBarLeading':\n case 'navigationBarLeading':\n case 'cancellationAction':\n case 'navigation':\n return 'leading';\n case 'principal':\n return 'principal';\n case 'bottomBar':\n return 'bottom';\n case 'secondaryAction':\n // Collapsed into the bar's More menu (inline for an editor role in a regular width).\n return 'secondary';\n default:\n return 'trailing';\n }\n}\n\nexport interface ViewModifiers {\n padding?: PaddingValue;\n font?: FontValue;\n fontWeight?: FontWeight;\n bold?: boolean;\n foregroundStyle?: StyleValue;\n background?: BackgroundValue;\n overlay?: ReactElement | { content: ReactElement; alignment?: FrameAlignment };\n frame?: FrameValue;\n cornerRadius?: number;\n clipShape?: ReactElement;\n clipped?: boolean;\n opacity?: number;\n disabled?: boolean;\n hidden?: boolean;\n layoutPriority?: number;\n /** A count, `null` to lift a limit, or a range `[min, max]` (`.lineLimit(2...4)`; `max` null for `2...`). */\n lineLimit?: number | null | readonly [number, number | null];\n multilineTextAlignment?: TextAlignment;\n fixedSize?: boolean | FixedSize;\n offset?: { x?: number; y?: number };\n /** Degrees, clockwise; `{ degrees, anchor }` turns around another point. */\n rotationEffect?: number | { degrees: number; anchor?: UnitPointValue };\n scaleEffect?: number | { x: number; y: number; anchor?: UnitPointValue };\n shadow?: { color?: ColorValue; radius: number; x?: number; y?: number };\n tint?: ColorValue;\n badge?: string | number | null;\n listRowInsets?: EdgeInsets;\n imageScale?: ImageScale;\n transition?: Transition;\n /** `.animation(_:value:)`: animate this subtree's changes whenever `value` changes. */\n animation?: { animation?: Animation; value: unknown };\n gridColumnAlignment?: 'leading' | 'center' | 'trailing';\n gridCellColumns?: number;\n // Environment\n buttonStyle?: ButtonStyle | 'borderless';\n controlSize?: ControlSize;\n pickerStyle?: PickerStyle;\n labelsHidden?: boolean;\n // Navigation and presentation\n navigationTitle?: string;\n navigationBarTitleDisplayMode?: 'automatic' | 'inline' | 'large';\n /** `.toolbarRole(.editor)`: the screen's secondary actions show inline in a regular width. */\n toolbarRole?: ToolbarRole;\n /** `ToolbarItem` elements. */\n toolbar?: ReactNode;\n searchable?: SearchableModifier;\n navigationDestination?: (value: never) => ReactNode;\n sheet?: SheetModifier;\n fullScreenCover?: SheetModifier;\n alert?: AlertModifier;\n confirmationDialog?: AlertModifier;\n presentationDetents?: DetentValue[];\n // Gestures and lifecycle\n onTapGesture?: () => void;\n /** `.gesture(DragGesture().onChanged { }.onEnded { })` */\n dragGesture?: DragGestureModifier;\n /** `.onLongPressGesture { }` */\n onLongPressGesture?: (() => void) | { minimumDuration?: number; action: () => void };\n /** `.contextMenu { items }`: a long press or right click opens the items. */\n contextMenu?: ReactNode;\n /** `.swipeActions(edge:allowsFullSwipe:) { buttons }`, on a list row. */\n swipeActions?: SwipeActionsModifier | SwipeActionsModifier[];\n onAppear?: () => void;\n onDisappear?: () => void;\n /** `.tag(_:)`: read by `Picker` options and `TabView` tabs. */\n tag?: unknown;\n /** Extra modifiers in order, for one that must apply twice (`.padding().background().padding()`). */\n modifiers?: ViewModifiers[];\n // Visual effects\n /** `.aspectRatio(_:contentMode:)`: a ratio (width / height), or `{ ratio, contentMode }`; `ratio: null` keeps the view's own. */\n aspectRatio?: number | { ratio?: number | null; contentMode?: 'fit' | 'fill' };\n scaledToFit?: boolean;\n scaledToFill?: boolean;\n blur?: number;\n brightness?: number;\n contrast?: number;\n saturation?: number;\n grayscale?: number;\n /** Degrees. */\n hueRotation?: number;\n colorInvert?: boolean;\n colorMultiply?: ColorValue;\n /** A CSS `mix-blend-mode` name (`multiply`, `screen`, `overlay`…), as `.blendMode` maps them. */\n blendMode?: string;\n /** `.mask(_:)` with a style: the view shows through its alpha (a gradient fades it). */\n mask?: StyleValue;\n /** `.position(x:y:)` */\n position?: { x: number; y: number };\n zIndex?: number;\n /** `.allowsHitTesting(false)` lets taps through to what is under the view. */\n allowsHitTesting?: boolean;\n /** `.ignoresSafeArea()` (`true`), or the edges. */\n ignoresSafeArea?: true | ('top' | 'bottom' | 'leading' | 'trailing')[];\n /** `.rotation3DEffect(_:axis:anchor:perspective:)`, the angle in degrees. */\n rotation3DEffect?: { angle: number; axis: { x: number; y: number; z: number }; anchor?: UnitPointValue; perspective?: number };\n /** `.gridCellAnchor(_:)` */\n gridCellAnchor?: UnitPointValue;\n /**\n * `.alignmentGuide(_:computeValue:)`: moves the view's guide. `value` gets\n * the view's dimensions; it is sampled at three sizes, so it must be linear\n * in them (`d.width + 4`, `d.height / 2`, a constant), as the shim requires.\n */\n alignmentGuide?: { guide: AlignmentGuideName; value: (d: { width: number; height: number }) => number };\n /** `.preferredColorScheme(_:)`: asks the page for that appearance (`null`: the viewer's). */\n preferredColorScheme?: 'light' | 'dark' | null;\n /** `.refreshable { }`: the nearest `List` or `ScrollView` below shows pull to refresh. */\n refreshable?: () => unknown;\n /** `.submitLabel(_:)` for the text fields below: `done`, `go`, `send`, `search`, `next`… */\n submitLabel?: string;\n /** `.labelStyle(_:)` for the `Label`s below. */\n labelStyle?: 'automatic' | 'titleAndIcon' | 'titleOnly' | 'iconOnly';\n /**\n * `.task { }`: runs when the view appears, cancelled (the signal aborts)\n * when it disappears. `{ id, action }` restarts it when `id` changes.\n */\n task?: ((signal: AbortSignal) => unknown) | { id: unknown; action: (signal: AbortSignal) => unknown };\n /** `.onChange(of:initial:) { old, new in }` */\n onChangeOf?: { value: unknown; action: (oldValue: unknown, newValue: unknown) => void; initial?: boolean };\n /** `.id(_:)` inside a `ScrollViewReader`: the target `proxy.scrollTo` scrolls to. */\n scrollID?: string | number;\n /** `.draggable(_:)`: a long press or a 10 pt drag lifts the view, carrying `payload`. */\n draggable?: unknown;\n /** `.dropDestination(for:)`: takes what is dropped on the view. */\n dropDestination?: DropDestinationModifier;\n /** `.inspector(isPresented:)`: a trailing panel in a regular width, a sheet in a compact one. */\n inspector?: InspectorModifier;\n /** `.onHover { hovering in }`: a mouse entering and leaving the view. */\n onHover?: (hovering: boolean) => void;\n /** `.help(_:)`: a tooltip. */\n help?: string;\n /** `.pointerStyle(_:)`: `link`, `text`, `grabIdle`, `grabActive`… or any CSS cursor. */\n pointerStyle?: string;\n /** `.symbolEffect(_:options:isActive:)` / `.symbolEffect(_:options:value:)` */\n symbolEffect?: SymbolEffectModifier;\n /** `.matchedGeometryEffect(id:in:)`: `namespace` from `useNamespace()`. */\n matchedGeometryEffect?: { id: string | number; namespace?: string };\n /** `.layoutValue(key:value:)`: values a custom `Layout` reads from this subview. */\n layoutValue?: Record<string, unknown>;\n /** `.safeAreaInset(edge:spacing:) { content }`: content beside the view, which the view makes room for. */\n safeAreaInset?: { edge: 'top' | 'bottom' | 'leading' | 'trailing'; spacing?: number; alignment?: 'leading' | 'center' | 'trailing' | 'top' | 'bottom'; content: ReactNode };\n /** `.popover(isPresented:)`: presented as a sheet, as on an iPhone. */\n popover?: SheetModifier;\n /** `.redacted(reason: .placeholder)` (`true`) and `.unredacted()` (`false`). */\n redacted?: boolean;\n /** `.keyboardShortcut(_:modifiers:)` on a `Button`: the shortcut runs its action. */\n keyboardShortcut?: KeyboardShortcut | KeyEquivalent;\n /** `.onKeyPress(keys:action:)` */\n onKeyPress?: OnKeyPressModifier;\n /** `.sensoryFeedback(_:trigger:)` */\n sensoryFeedback?: { feedback: SensoryFeedback; trigger: unknown };\n /** `.textCase(_:)` */\n textCase?: 'uppercase' | 'lowercase' | null;\n /** `.coordinateSpace(name:)`: readers inside answer `frame({ named })` relative to this view. */\n coordinateSpace?: string;\n /**\n * `.contentTransition(_:)`: how the texts below change in an animated pass\n * (`numericText` rolls them up, or down when the new number is smaller;\n * `{ numericText: { countsDown } }` fixes the direction; `opacity` and\n * `interpolate` crossfade; `identity` swaps).\n */\n contentTransition?: 'numericText' | 'opacity' | 'interpolate' | 'identity' | { numericText: { countsDown?: boolean } };\n /**\n * `.scrollEdgeEffectStyle(_:for:)` for the scroll views and lists below\n * (and this one): `hard`, `soft` or `automatic` on both edges, or\n * `[\"hard\", \"top\"]` for some.\n */\n scrollEdgeEffectStyle?: ScrollEdgeEffectStyleValue;\n /** `.scrollEdgeEffectHidden(_:for:)`: `true` for both edges, or `[true, \"bottom\"]`. */\n scrollEdgeEffectHidden?: ScrollEdgeEffectHiddenValue;\n /**\n * `.contentMargins(_:_:)`: padding inside the scroll views below (and this\n * one), which their content scrolls under. Takes what `padding` takes.\n */\n contentMargins?: ContentMarginsValue;\n /**\n * `.containerRelativeFrame(_:)`: the view's size along `axes` follows the\n * nearest container (the scroll view's visible area, else the screen):\n * the whole of it, `span` of `count` columns `spacing` apart, or what\n * `length(containerLength, axis)` answers (a linear function of it).\n */\n containerRelativeFrame?: ContainerRelativeFrameValue;\n /**\n * `.visualEffect { content, proxy in … }`: effects (offset, scale,\n * rotation, opacity, blur, color adjustments) computed from the view's\n * geometry, without changing its layout. `proxy.frame('global')` and\n * `proxy.bounds('scrollView')` stay current as the page scrolls.\n */\n visualEffect?: VisualEffectClosure;\n /**\n * `.scrollTransition { content, phase in … }`: effects as the view goes out\n * of its scroll view's visible area and comes back. A closure, or\n * `{ transition, configuration, axis }`.\n */\n scrollTransition?: ScrollTransitionClosure | ScrollTransitionSpec;\n}\n\n/** The axes `containerRelativeFrame` sizes. */\nexport type ContainerAxes = 'horizontal' | 'vertical' | 'both';\n\nexport type ContainerRelativeFrameValue =\n | ContainerAxes\n | {\n axes: ContainerAxes;\n /** `count:span:spacing:`: `span` of `count` equal columns separated by `spacing`. */\n count?: number;\n span?: number;\n spacing?: number;\n /** The closure form: the length for a container length (sampled as a linear function). */\n length?: (containerLength: number, axis: 'horizontal' | 'vertical') => number;\n alignment?: FrameAlignment;\n };\n\n/** The `containerRelativeFrame` style hint for a modifier value. */\nexport function containerRelativeFrame(value: ContainerRelativeFrameValue): NonNullable<Style['containerRelativeFrame']> {\n const spec = typeof value === 'string' ? { axes: value } : value;\n const horizontal = spec.axes !== 'vertical';\n const vertical = spec.axes !== 'horizontal';\n let a = 1;\n let b = 0;\n if (spec.length) {\n const axis = horizontal ? 'horizontal' : 'vertical';\n b = spec.length(0, axis);\n a = (spec.length(1000, axis) - b) / 1000;\n } else if (spec.count !== undefined) {\n // SwiftUI: (container − spacing × (count − 1)) × span / count + spacing × (span − 1).\n const n = Math.max(spec.count, 1);\n const span = Math.max(spec.span ?? 1, 1);\n const spacing = spec.spacing ?? 0;\n a = span / n;\n b = (-spacing * (n - 1) * span) / n + spacing * (span - 1);\n }\n return { ...(horizontal ? { horizontal: true } : {}), ...(vertical ? { vertical: true } : {}), a, b, alignment: spec.alignment ?? 'center' };\n}\n\nexport type AlignmentGuideName =\n | 'leading'\n | 'trailing'\n | 'horizontalCenter'\n | 'top'\n | 'bottom'\n | 'verticalCenter'\n | 'firstTextBaseline'\n | 'lastTextBaseline'\n | 'listRowSeparatorLeading'\n | 'listRowSeparatorTrailing';\n\nexport interface DropDestinationModifier {\n /**\n * Called on a drop: the payloads of an in-app drag (what `draggable` carried),\n * or the items dragged in from outside the page. Return false to refuse.\n */\n action: (items: unknown[], location: { x: number; y: number }) => boolean | void;\n /** While a drag is over the view. */\n isTargeted?: (targeted: boolean) => void;\n /** The MIME patterns taken from outside the page (`text/plain`, `image/*`…); none by default. */\n accepts?: string[];\n}\n\nexport interface InspectorModifier {\n isPresented: BindingValue<boolean>;\n content: ReactNode;\n /** `.inspectorColumnWidth(_:)` */\n columnWidth?: number;\n}\n\nexport type ModifierKey = keyof ViewModifiers;\nexport type ModifierEntry = [ModifierKey, unknown];\n\nconst MODIFIER_KEYS: ReadonlySet<string> = new Set<ModifierKey>([\n 'padding',\n 'font',\n 'fontWeight',\n 'bold',\n 'foregroundStyle',\n 'background',\n 'overlay',\n 'frame',\n 'cornerRadius',\n 'clipShape',\n 'clipped',\n 'opacity',\n 'disabled',\n 'hidden',\n 'layoutPriority',\n 'lineLimit',\n 'multilineTextAlignment',\n 'fixedSize',\n 'offset',\n 'rotationEffect',\n 'scaleEffect',\n 'shadow',\n 'tint',\n 'badge',\n 'listRowInsets',\n 'imageScale',\n 'transition',\n 'animation',\n 'gridColumnAlignment',\n 'gridCellColumns',\n 'buttonStyle',\n 'controlSize',\n 'pickerStyle',\n 'labelsHidden',\n 'navigationTitle',\n 'navigationBarTitleDisplayMode',\n 'toolbarRole',\n 'toolbar',\n 'searchable',\n 'navigationDestination',\n 'sheet',\n 'fullScreenCover',\n 'alert',\n 'confirmationDialog',\n 'presentationDetents',\n 'onTapGesture',\n 'dragGesture',\n 'onLongPressGesture',\n 'contextMenu',\n 'swipeActions',\n 'onAppear',\n 'onDisappear',\n 'tag',\n 'modifiers',\n 'aspectRatio',\n 'scaledToFit',\n 'scaledToFill',\n 'blur',\n 'brightness',\n 'contrast',\n 'saturation',\n 'grayscale',\n 'hueRotation',\n 'colorInvert',\n 'colorMultiply',\n 'blendMode',\n 'mask',\n 'position',\n 'zIndex',\n 'allowsHitTesting',\n 'ignoresSafeArea',\n 'rotation3DEffect',\n 'gridCellAnchor',\n 'alignmentGuide',\n 'preferredColorScheme',\n 'refreshable',\n 'submitLabel',\n 'labelStyle',\n 'task',\n 'onChangeOf',\n 'scrollID',\n 'draggable',\n 'dropDestination',\n 'inspector',\n 'onHover',\n 'help',\n 'pointerStyle',\n 'symbolEffect',\n 'matchedGeometryEffect',\n 'layoutValue',\n 'safeAreaInset',\n 'popover',\n 'redacted',\n 'keyboardShortcut',\n 'onKeyPress',\n 'sensoryFeedback',\n 'textCase',\n 'coordinateSpace',\n 'contentTransition',\n 'scrollEdgeEffectStyle',\n 'scrollEdgeEffectHidden',\n 'contentMargins',\n 'containerRelativeFrame',\n 'visualEffect',\n 'scrollTransition',\n]);\n\n/**\n * Separate a component's own props from the modifiers, keeping the modifiers\n * in the order they were written (object keys keep insertion order).\n */\nexport function splitProps<P extends object>(props: P): { own: Omit<P, ModifierKey>; modifiers: ModifierEntry[] } {\n const own: Record<string, unknown> = {};\n const modifiers: ModifierEntry[] = [];\n for (const [key, value] of Object.entries(props)) {\n if (MODIFIER_KEYS.has(key)) modifiers.push([key as ModifierKey, value]);\n else own[key] = value;\n }\n return { own: own as Omit<P, ModifierKey>, modifiers };\n}\n\n/** Remove and return one modifier a component handles itself. */\nexport function takeModifier<K extends ModifierKey>(modifiers: ModifierEntry[], key: K): ViewModifiers[K] | undefined {\n const at = modifiers.findIndex(([name]) => name === key);\n if (at < 0) return undefined;\n const [, value] = modifiers[at]!;\n modifiers.splice(at, 1);\n return value as ViewModifiers[K];\n}\n\nexport function styled(style: Style, child: ReactNode): ReactElement {\n return sb('styled', { style }, undefined, child);\n}\n\nfunction decorated(role: 'background' | 'overlay', alignment: FrameAlignment, content: ReactNode, decoration: ReactNode): ReactElement {\n return sb('decorated', { role, alignment }, undefined, [\n createElement(Fragment, { key: 'content' }, content),\n createElement(Fragment, { key: 'decoration' }, decoration),\n ]);\n}\n\nexport function shapeSpecOf(element: ReactElement): ShapeSpec | null {\n const spec = (element.type as { shape?: ShapeSpec }).shape;\n if (!spec) return null;\n const radius = (element.props as { cornerRadius?: number }).cornerRadius;\n return { kind: spec.kind, cornerRadius: spec.cornerRadius ?? radius ?? 0 };\n}\n\n/** `.animation(_:value:)`: a token that changes with the value. */\nfunction AnimatedStyle({ animation, value, children }: { animation: Animation; value: unknown; children?: ReactNode }): ReactElement {\n const last = useRef<{ value: unknown; token: number }>({ value, token: 0 });\n if (!Object.is(last.current.value, value)) last.current = { value, token: last.current.token + 1 };\n return styled({ animation, animationToken: last.current.token }, children);\n}\n\nfunction Searchable({ text, onChange, prompt }: SearchableModifier): ReactElement {\n const [value, setValue] = readBinding(text, onChange);\n return sb('searchfield', { text: value, placeholder: prompt ?? 'Search' }, { text: (event) => setValue(event.value) });\n}\n\n/**\n * Apply `modifiers` to `element`, in order. Styled wrappers nest around the\n * element; preferences, hoisted elements and lifecycle components come after\n * it, in a fragment.\n */\nexport function applyModifiers(element: ReactNode, modifiers: readonly ModifierEntry[]): ReactNode {\n const sides: ReactNode[] = [];\n const node = wrap(element, modifiers, sides);\n if (sides.length === 0) return node;\n return createElement(Fragment, null, node, ...sides);\n}\n\nfunction wrap(element: ReactNode, modifiers: readonly ModifierEntry[], sides: ReactNode[]): ReactNode {\n let node = element;\n for (const [key, value] of modifiers) {\n if (value === undefined) continue;\n if (value === null && key !== 'lineLimit' && key !== 'badge') continue;\n node = apply(key, value, node, sides);\n }\n return node;\n}\n\nfunction apply(key: ModifierKey, value: unknown, node: ReactNode, sides: ReactNode[]): ReactNode {\n switch (key) {\n case 'padding':\n return styled({ padding: padding(value as PaddingValue) }, node);\n case 'font':\n return styled({ font: font(value as FontValue) }, node);\n case 'fontWeight':\n return styled({ font: { weight: value as FontWeight } }, node);\n case 'bold':\n return value ? styled({ font: { weight: 'bold' } }, node) : node;\n case 'foregroundStyle':\n return styled({ foreground: shapeStyle(value as StyleValue) }, node);\n case 'background': {\n if (isValidElement(value)) return decorated('background', 'center', node, value);\n const inShape = value as BackgroundInShape;\n if (typeof inShape === 'object' && inShape !== null && 'in' in inShape && isValidElement(inShape.in)) {\n return decorated('background', 'center', node, cloneElement(inShape.in, { fill: inShape.fill } as object));\n }\n return styled({ background: shapeStyle(value as StyleValue) }, node);\n }\n case 'overlay': {\n if (isValidElement(value)) return decorated('overlay', 'center', node, value);\n const spec = value as { content: ReactElement; alignment?: FrameAlignment };\n return decorated('overlay', spec.alignment ?? 'center', node, spec.content);\n }\n case 'frame':\n return styled({ frame: frame(value as FrameValue) }, node);\n case 'cornerRadius':\n return styled({ cornerRadius: value as number }, node);\n case 'clipShape': {\n const spec = isValidElement(value) ? shapeSpecOf(value) : null;\n return styled({ cornerRadius: spec?.cornerRadius ?? 0 }, node);\n }\n case 'clipped':\n return value ? styled({ clipped: true }, node) : node;\n case 'opacity':\n return styled({ opacity: value as number }, node);\n case 'disabled':\n return value ? styled({ disabled: true }, node) : node;\n case 'hidden':\n return value ? styled({ hidden: true }, node) : node;\n case 'layoutPriority':\n return styled({ layoutPriority: value as number }, node);\n case 'lineLimit': {\n if (Array.isArray(value)) {\n const [min, max] = value as [number, number | null];\n return styled({ lineLimit: max, lineLimitMin: min }, node);\n }\n return styled({ lineLimit: value as number | null }, node);\n }\n case 'multilineTextAlignment':\n return styled({ multilineTextAlignment: value as TextAlignment }, node);\n case 'fixedSize':\n return value ? styled({ fixedSize: value === true ? { horizontal: true, vertical: true } : (value as FixedSize) }, node) : node;\n case 'offset': {\n const offset = value as { x?: number; y?: number };\n return styled({ offset: { x: offset.x ?? 0, y: offset.y ?? 0 } }, node);\n }\n case 'rotationEffect': {\n if (typeof value === 'number') return styled({ rotation: value }, node);\n const spec = value as { degrees: number; anchor?: UnitPointValue };\n const style: Style = { rotation: spec.degrees };\n if (spec.anchor !== undefined) style.rotationAnchor = unitPoint(spec.anchor);\n return styled(style, node);\n }\n case 'scaleEffect': {\n if (typeof value === 'number') return styled({ scale: { x: value, y: value } }, node);\n const spec = value as { x: number; y: number; anchor?: UnitPointValue };\n const style: Style = { scale: { x: spec.x, y: spec.y } };\n if (spec.anchor !== undefined) style.scaleAnchor = unitPoint(spec.anchor);\n return styled(style, node);\n }\n case 'shadow': {\n const shadow = value as { color?: ColorValue; radius: number; x?: number; y?: number };\n return styled(\n { shadow: { color: shadow.color ? color(shadow.color) : rgb(0, 0, 0, 0.33), radius: shadow.radius, x: shadow.x ?? 0, y: shadow.y ?? 0 } },\n node,\n );\n }\n case 'tint':\n return styled({ tint: color(value as ColorValue) }, node);\n case 'badge':\n return styled({ badge: value === null ? null : String(value) }, node);\n case 'listRowInsets':\n return styled({ listRowInsets: value as EdgeInsets }, node);\n case 'imageScale':\n return styled({ imageScale: value as ImageScale }, node);\n case 'transition':\n return styled({ transition: value as Transition }, node);\n case 'animation': {\n const spec = value as { animation?: Animation; value: unknown };\n return createElement(AnimatedStyle, { animation: spec.animation ?? { type: 'default' }, value: spec.value }, node);\n }\n case 'gridColumnAlignment':\n return styled({ gridColumnAlignment: value } as Style, node);\n case 'gridCellColumns':\n return styled({ gridCellColumns: value as number }, node);\n case 'buttonStyle':\n return withEnvironment({ buttonStyle: value === 'borderless' ? 'plain' : (value as ButtonStyle) }, node);\n case 'controlSize':\n return withEnvironment({ controlSize: value as ControlSize }, node);\n case 'pickerStyle':\n return withEnvironment({ pickerStyle: value as PickerStyle }, node);\n case 'labelsHidden':\n return withEnvironment({ labelsHidden: Boolean(value) }, node);\n case 'navigationTitle':\n sides.push(sb(PREF_KIND, { title: value as string }, undefined, undefined, 'navscreen'));\n return node;\n case 'navigationBarTitleDisplayMode':\n sides.push(sb(PREF_KIND, { displayMode: value as string }, undefined, undefined, 'navscreen'));\n return node;\n case 'toolbarRole':\n sides.push(sb(PREF_KIND, { toolbarRole: value as string }, undefined, undefined, 'navscreen'));\n return node;\n case 'toolbar':\n sides.push(sb(HOIST_KIND, undefined, undefined, value as ReactNode, 'navscreen'));\n return node;\n case 'searchable':\n sides.push(sb(HOIST_KIND, undefined, undefined, createElement(Searchable, value as SearchableModifier), 'navscreen'));\n return node;\n case 'navigationDestination':\n sides.push(createElement(RegisterDestination, { destination: value as (value: never) => ReactNode }));\n return node;\n case 'sheet':\n sides.push(createElement(SheetPresenter, value as SheetModifier));\n return node;\n case 'fullScreenCover':\n sides.push(createElement(SheetPresenter, { ...(value as SheetModifier), fullScreen: true }));\n return node;\n case 'alert':\n sides.push(createElement(AlertPresenter, value as AlertModifier));\n return node;\n case 'confirmationDialog':\n sides.push(createElement(AlertPresenter, { ...(value as AlertModifier), style: 'dialog' }));\n return node;\n case 'presentationDetents':\n sides.push(presentationDetents(value as DetentValue[]));\n return node;\n case 'onTapGesture':\n return sb('tapgesture', {}, { tap: value as () => void }, node);\n case 'dragGesture': {\n const drag = value as DragGestureModifier;\n return sb(\n 'gesture',\n { drag: true, longPress: false, minimumDistance: drag.minimumDistance ?? 10, minimumDuration: 0.5 },\n {\n drag: (event) => {\n const dragValue: DragValue = {\n translation: event.translation,\n location: event.location,\n startLocation: event.startLocation,\n velocity: event.velocity,\n };\n if (event.phase === 'ended' || event.phase === 'cancelled') drag.onEnded?.(dragValue);\n else drag.onChanged?.(dragValue);\n },\n },\n node,\n );\n }\n case 'onLongPressGesture': {\n const spec = typeof value === 'function' ? { action: value as () => void } : (value as { minimumDuration?: number; action: () => void });\n return sb(\n 'gesture',\n { drag: false, longPress: true, minimumDistance: 10, minimumDuration: spec.minimumDuration ?? 0.5 },\n { longpress: () => spec.action() },\n node,\n );\n }\n case 'contextMenu':\n return sb('contextmenu', {}, undefined, [createElement(Fragment, { key: 'content' }, node), createElement(Fragment, { key: 'items' }, value as ReactNode)]);\n case 'swipeActions': {\n const specs = Array.isArray(value) ? (value as SwipeActionsModifier[]) : [value as SwipeActionsModifier];\n const trailing: ReactNode[] = [];\n const leading: ReactNode[] = [];\n let fullSwipeTrailing = true;\n let fullSwipeLeading = true;\n for (const spec of specs) {\n const actions = Children.toArray(spec.children);\n if (spec.edge === 'leading') {\n leading.push(...actions);\n fullSwipeLeading = spec.allowsFullSwipe ?? true;\n } else {\n trailing.push(...actions);\n fullSwipeTrailing = spec.allowsFullSwipe ?? true;\n }\n }\n return sb(\n 'swipeactions',\n { trailing: trailing.length, leading: leading.length, fullSwipeTrailing, fullSwipeLeading },\n undefined,\n [createElement(Fragment, { key: 'content' }, node), ...trailing, ...leading],\n );\n }\n case 'onAppear':\n sides.push(createElement(Lifecycle, { onAppear: value as () => void }));\n return node;\n case 'onDisappear':\n sides.push(createElement(Lifecycle, { onDisappear: value as () => void }));\n return node;\n case 'tag':\n return node;\n case 'aspectRatio': {\n const spec = typeof value === 'number' ? { ratio: value } : (value as { ratio?: number | null; contentMode?: 'fit' | 'fill' });\n return styled({ aspectRatio: { ratio: spec.ratio ?? null, contentMode: spec.contentMode ?? 'fit' } }, node);\n }\n case 'scaledToFit':\n return value ? styled({ aspectRatio: { ratio: null, contentMode: 'fit' } }, node) : node;\n case 'scaledToFill':\n return value ? styled({ aspectRatio: { ratio: null, contentMode: 'fill' } }, node) : node;\n case 'blur':\n return styled({ blur: value as number }, node);\n case 'brightness':\n return styled({ brightness: value as number }, node);\n case 'contrast':\n return styled({ contrast: value as number }, node);\n case 'saturation':\n return styled({ saturation: value as number }, node);\n case 'grayscale':\n return styled({ grayscale: value as number }, node);\n case 'hueRotation':\n return styled({ hueRotation: value as number }, node);\n case 'colorInvert':\n return value ? styled({ colorInvert: true }, node) : node;\n case 'colorMultiply':\n return styled({ colorMultiply: color(value as ColorValue) }, node);\n case 'blendMode':\n return styled({ blendMode: value as string }, node);\n case 'mask':\n return styled({ mask: shapeStyle(value as StyleValue) }, node);\n case 'position':\n return styled({ position: value as { x: number; y: number } }, node);\n case 'zIndex':\n return styled({ zIndex: value as number }, node);\n case 'allowsHitTesting':\n return value === false ? styled({ hitTesting: false }, node) : node;\n case 'ignoresSafeArea':\n return styled({ ignoresSafeArea: value === true ? 'all' : (value as ('top' | 'bottom' | 'leading' | 'trailing')[]) }, node);\n case 'rotation3DEffect': {\n const spec = value as { angle: number; axis: { x: number; y: number; z: number }; anchor?: UnitPointValue; perspective?: number };\n const rotation: Style['rotation3D'] = { angle: spec.angle, axis: spec.axis };\n if (spec.anchor !== undefined) rotation!.anchor = unitPoint(spec.anchor);\n if (spec.perspective !== undefined) rotation!.perspective = spec.perspective;\n return styled({ rotation3D: rotation }, node);\n }\n case 'gridCellAnchor':\n return styled({ gridCellAnchor: unitPoint(value as UnitPointValue) }, node);\n case 'alignmentGuide': {\n const spec = value as { guide: AlignmentGuideName; value: (d: { width: number; height: number }) => number };\n const at = (width: number, height: number): number => spec.value({ width, height });\n const a = at(0, 0);\n const round = (n: number): number => Math.round(n * 1e6) / 1e6;\n const vertical = ['top', 'bottom', 'verticalCenter', 'firstTextBaseline', 'lastTextBaseline'].includes(spec.guide);\n const name = spec.guide === 'horizontalCenter' || spec.guide === 'verticalCenter' ? 'center' : spec.guide;\n return styled(\n {\n alignmentGuide: {\n axis: vertical ? 'vertical' : 'horizontal',\n name,\n value: [round(a), round((at(100, 0) - a) / 100), round((at(0, 100) - a) / 100)],\n },\n },\n node,\n );\n }\n case 'preferredColorScheme':\n sides.push(sb(PREF_KIND, { colorScheme: value as 'light' | 'dark' | null }, undefined, undefined, 'root'));\n return node;\n case 'refreshable':\n return withEnvironment({ refresh: value as () => unknown }, node);\n case 'submitLabel':\n return withEnvironment({ submitLabel: value as string }, node);\n case 'labelStyle':\n return withEnvironment({ labelStyle: value as ViewEnvironment['labelStyle'] }, node);\n case 'task': {\n const spec = typeof value === 'function' ? { id: undefined, action: value as (signal: AbortSignal) => unknown } : (value as { id: unknown; action: (signal: AbortSignal) => unknown });\n sides.push(createElement(Task, spec));\n return node;\n }\n case 'onChangeOf':\n sides.push(createElement(OnChange, value as { value: unknown; action: (oldValue: unknown, newValue: unknown) => void; initial?: boolean }));\n return node;\n case 'scrollID':\n return createElement(ScrollTarget, { id: value as string | number }, node);\n case 'draggable':\n return createElement(Draggable, { payload: value }, node);\n case 'dropDestination':\n return createElement(DropDestination, value as DropDestinationModifier, node);\n case 'inspector':\n return createElement(Inspector, value as InspectorModifier, node);\n case 'onHover':\n return createElement(Hover, { action: value as (hovering: boolean) => void }, node);\n case 'help':\n return styled({ help: value as string }, node);\n case 'pointerStyle':\n return styled({ pointerStyle: cursorFor(value as string) }, node);\n case 'symbolEffect':\n return createElement(SymbolEffect, { spec: value as SymbolEffectModifier }, node);\n case 'matchedGeometryEffect': {\n const spec = value as { id: string | number; namespace?: string };\n return styled({ matchedGeometry: `${spec.namespace ?? ''}:${spec.id}` }, node);\n }\n case 'layoutValue':\n // Read by the enclosing `Layout` from the subview's props; nothing to draw.\n return node;\n case 'safeAreaInset': {\n const spec = value as { edge: 'top' | 'bottom' | 'leading' | 'trailing'; spacing?: number; alignment?: string; content: ReactNode };\n const vertical = spec.edge === 'top' || spec.edge === 'bottom';\n const before = spec.edge === 'top' || spec.edge === 'leading';\n const children = before\n ? [createElement(Fragment, { key: 'inset' }, spec.content), createElement(Fragment, { key: 'content' }, node)]\n : [createElement(Fragment, { key: 'content' }, node), createElement(Fragment, { key: 'inset' }, spec.content)];\n return vertical\n ? sb('vstack', { spacing: spec.spacing ?? 0, alignment: spec.alignment ?? 'center' }, undefined, children)\n : sb('hstack', { spacing: spec.spacing ?? 0, alignment: spec.alignment ?? 'center' }, undefined, children);\n }\n case 'popover':\n sides.push(createElement(SheetPresenter, value as SheetModifier));\n return node;\n case 'redacted':\n return withEnvironment({ redacted: Boolean(value) }, node);\n case 'keyboardShortcut':\n // A `Button` takes its own shortcut; elsewhere it has no action to run.\n return node;\n case 'onKeyPress':\n sides.push(createElement(KeyPressListener, { spec: value as OnKeyPressModifier }));\n return node;\n case 'sensoryFeedback': {\n const spec = value as { feedback: SensoryFeedback; trigger: unknown };\n sides.push(createElement(SensoryFeedbackPlayer, spec));\n return node;\n }\n case 'textCase':\n return withEnvironment({ textCase: value as 'uppercase' | 'lowercase' | null }, node);\n case 'coordinateSpace':\n return createElement(CoordinateSpace, { name: value as string }, node);\n case 'scrollEdgeEffectStyle':\n return withScrollSettings(edgeStyleSettings(value as ScrollEdgeEffectStyleValue), node);\n case 'scrollEdgeEffectHidden':\n return withScrollSettings(edgeHiddenSettings(value as ScrollEdgeEffectHiddenValue), node);\n case 'contentMargins':\n return withScrollSettings(marginSettings(value as ContentMarginsValue), node);\n case 'containerRelativeFrame':\n return styled({ containerRelativeFrame: containerRelativeFrame(value as ContainerRelativeFrameValue) }, node);\n case 'visualEffect':\n return createElement(VisualEffectView, { effect: value as VisualEffectClosure }, node);\n case 'scrollTransition': {\n const spec = typeof value === 'function' ? { transition: value as ScrollTransitionClosure } : (value as ScrollTransitionSpec);\n return createElement(ScrollTransitionView, { spec }, node);\n }\n case 'contentTransition': {\n if (value === 'identity') return node;\n if (typeof value === 'object') {\n const countsDown = (value as { numericText: { countsDown?: boolean } }).numericText.countsDown;\n return styled({ contentTransition: { kind: 'numericText', ...(countsDown !== undefined ? { countsDown } : {}) } }, node);\n }\n return styled({ contentTransition: { kind: value as 'numericText' | 'opacity' | 'interpolate' } }, node);\n }\n case 'modifiers': {\n let result = node;\n for (const extra of value as ViewModifiers[]) {\n result = wrap(result, Object.entries(extra) as ModifierEntry[], sides);\n }\n return result;\n }\n default: {\n const unknown: never = key;\n throw new Error(`Unknown modifier ${String(unknown)}`);\n }\n }\n}\n","/**\n * `GeometryReader` and custom `Layout`: both are round trips with the\n * renderer. The engine lays the element out and reports what it found (a\n * `geometry` event with the size, a `layout` event with the children's\n * measurements); the component answers by rendering again.\n */\n\nimport type { Dimension, GeometryEvent, LayoutChildMeasurement, LayoutProposal as ProtocolProposal } from '@swiftbrowser/web/src/protocol';\nimport { useEffect, useState, type ReactElement, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ModifierKey, type ViewModifiers } from '../modifiers';\nimport { unitPoint, type UnitPointValue } from '../values';\nimport { flattenChildren } from './stacks';\nimport { useCoordinateSpaces } from '../coordinateSpace';\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface Rect extends Size {\n x: number;\n y: number;\n}\n\n/** A reader's safe-area insets, every edge given. */\nexport interface SafeAreaInsets {\n top: number;\n leading: number;\n bottom: number;\n trailing: number;\n}\n\n/** `GeometryProxy`: what the reader's content is told. */\nexport interface GeometryProxy {\n size: Size;\n /**\n * The reader's frame: in its own space (`local`, the default), on the\n * root's screen (`global`), or relative to an enclosing view marked\n * `coordinateSpace=\"name\"` (`{ named: 'name' }`), scrolling included, kept\n * current as the views around it scroll.\n */\n frame(space?: 'local' | 'global' | { named: string }): Rect;\n /**\n * `bounds(of: .scrollView)`: the visible part of the scroll view (or list)\n * the reader is in, in the reader's own coordinates; null outside one.\n */\n bounds(of: 'scrollView'): Rect | null;\n /** How far the device's safe area (the status bar, the home indicator) reaches into the reader. */\n safeAreaInsets: SafeAreaInsets;\n}\n\nexport interface GeometryReaderProps extends ViewModifiers {\n children: (proxy: GeometryProxy) => ReactNode;\n}\n\n/** What the page last reported about a reader. */\nexport interface ReportedGeometry {\n size: Size;\n origin: { x: number; y: number } | null;\n safeArea: SafeAreaInsets;\n /** The enclosing scroll view's visible rectangle on screen, and its axis. */\n scrollView: (Rect & { axis: 'horizontal' | 'vertical' }) | null;\n}\n\nconst NO_INSETS: SafeAreaInsets = { top: 0, leading: 0, bottom: 0, trailing: 0 };\n\nexport const NO_GEOMETRY: ReportedGeometry = { size: { width: 0, height: 0 }, origin: null, safeArea: NO_INSETS, scrollView: null };\n\n/** The reader's record after a `geometry` event. */\nexport function nextGeometry(event: GeometryEvent, reported: ReportedGeometry): ReportedGeometry {\n const hasOrigin = event.x !== undefined && event.y !== undefined;\n return {\n size: { width: event.width, height: event.height },\n origin: hasOrigin ? { x: event.x!, y: event.y! } : reported.origin,\n safeArea: event.safeArea ?? reported.safeArea,\n // A frame report without a scroll view means the reader is in none.\n scrollView: hasOrigin ? (event.scrollView ?? null) : reported.scrollView,\n };\n}\n\n/**\n * The proxy over a reader's record. `onReadFrame` is called when the content\n * reads anything that needs the reader's place on screen.\n */\nexport function geometryProxy(reported: ReportedGeometry, spaces: Readonly<Record<string, { x: number; y: number } | null>>, onReadFrame: () => void): GeometryProxy {\n return {\n size: reported.size,\n frame: (space = 'local') => {\n if (space === 'local') return { x: 0, y: 0, ...reported.size };\n onReadFrame();\n const origin = reported.origin ?? { x: 0, y: 0 };\n if (space === 'global') return { ...origin, ...reported.size };\n const named = spaces[space.named];\n return { x: origin.x - (named?.x ?? 0), y: origin.y - (named?.y ?? 0), ...reported.size };\n },\n bounds: () => {\n onReadFrame();\n const view = reported.scrollView;\n if (!view || !reported.origin) return null;\n return { x: view.x - reported.origin.x, y: view.y - reported.origin.y, width: view.width, height: view.height };\n },\n get safeAreaInsets() {\n onReadFrame();\n return reported.safeArea;\n },\n };\n}\n\n/**\n * `GeometryReader { proxy in }`: fills its proposal and reports its size.\n * The content renders with a zero size first and again with the real one in\n * the same event cycle, before the page paints. A content that reads the\n * global frame, the scroll view's bounds or the safe-area insets asks the\n * page for them from then on.\n */\nexport function GeometryReader(props: GeometryReaderProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [reported, setReported] = useState<ReportedGeometry>(NO_GEOMETRY);\n const [needsFrame, setNeedsFrame] = useState(false);\n let readFrame = false;\n const proxy = geometryProxy(reported, useCoordinateSpaces(), () => {\n readFrame = true;\n });\n const content = own.children(proxy);\n useEffect(() => {\n if (readFrame && !needsFrame) setNeedsFrame(true);\n });\n return applyModifiers(\n sb(\n 'geometry',\n needsFrame ? { reportsFrame: true } : {},\n {\n geometry: (event) => {\n const next = nextGeometry(event, reported);\n if (JSON.stringify(next) !== JSON.stringify(reported)) setReported(next);\n },\n },\n content,\n ),\n modifiers,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Custom layouts\n// ---------------------------------------------------------------------------\n\n/** A proposal axis: points, `Infinity`, or `null` (unspecified). */\nexport interface LayoutProposal {\n width: number | null;\n height: number | null;\n}\n\nexport interface LayoutSubview {\n /** The engine's answers for a zero, unspecified and infinite proposal. */\n min: Size;\n ideal: Size;\n max: Size;\n /** `.layoutPriority` of the subview (0 by default). */\n priority: number;\n /** `.layoutValue(key:value:)`s of the subview (`subview[Key.self]`). */\n values: Readonly<Record<string, unknown>>;\n /** `ViewSpacing`: the space the subview wants beside another, iOS's default 8 between views. */\n spacing: ViewSpacing;\n /** The size for a proposal: `ideal` on an unspecified axis, else clamped to min…max. */\n sizeThatFits(proposal: LayoutProposal): Size;\n /** Place the subview: `at` is the point `anchor` (default top leading) lands on, in the layout's bounds. */\n place(options: { x: number; y: number; anchor?: UnitPointValue; proposal?: LayoutProposal }): void;\n}\n\n/** `ViewSpacing`: what a subview wants between itself and a neighbor. */\nexport interface ViewSpacing {\n /** `distance(to:along:)`: the space between this subview and `next` on an axis. */\n distance(next: ViewSpacing, axis: 'horizontal' | 'vertical'): number;\n}\n\n/** iOS's default space between two views, the renderer's stack spacing when none is given. */\nexport const DEFAULT_VIEW_SPACING: ViewSpacing = { distance: () => 8 };\n\nexport type LayoutGuide = 'leading' | 'horizontalCenter' | 'trailing' | 'top' | 'verticalCenter' | 'bottom' | 'firstTextBaseline' | 'lastTextBaseline';\n\n/** SwiftUI's `Layout` protocol: the two methods, an optional cache shared by them, and explicit alignment guides. */\nexport interface CustomLayout<Cache = unknown> {\n sizeThatFits(proposal: LayoutProposal, subviews: readonly LayoutSubview[], cache: Cache): Size;\n placeSubviews(bounds: Rect, proposal: LayoutProposal, subviews: readonly LayoutSubview[], cache: Cache): void;\n /** `makeCache(subviews:)`: computed once for the subviews, before sizing and placing. */\n makeCache?(subviews: readonly LayoutSubview[]): Cache;\n /**\n * `explicitAlignment(of:in:proposal:subviews:cache:)`: where the layout\n * puts a guide, in its bounds (null: the guide's default). A stack, frame\n * or overlay aligning the layout by that guide uses it.\n */\n explicitAlignment?(guide: LayoutGuide, bounds: Rect, proposal: LayoutProposal, subviews: readonly LayoutSubview[], cache: Cache): number | null;\n /** `spacing(subviews:cache:)`: accepted; the engine spaces the layout like any view (8 by default). */\n spacing?(subviews: readonly LayoutSubview[], cache: Cache): ViewSpacing;\n}\n\n/** What `Layout` reads from each subview's element besides the engine's measurements. */\nexport interface SubviewTraits {\n priority: number;\n values: Record<string, unknown>;\n}\n\nexport interface LayoutProps<Cache = unknown> extends ViewModifiers {\n layout: CustomLayout<Cache>;\n children?: ReactNode;\n}\n\n/** Each subview's `layoutPriority` and `layoutValue`s, read from its element's props. */\nfunction subviewTraits(children: ReactNode): SubviewTraits[] {\n return flattenChildren(children).map((element: ReactElement) => {\n const props = element.props as { layoutPriority?: number; layoutValue?: Record<string, unknown> };\n return { priority: props.layoutPriority ?? 0, values: props.layoutValue ?? {} };\n });\n}\n\ninterface LayoutRecord {\n proposal: LayoutProposal;\n children: LayoutChildMeasurement[];\n}\n\nconst fromDimension = (value: Dimension | null): number | null => (value === 'infinity' ? Infinity : value);\nconst toDimension = (value: number): Dimension => (Number.isFinite(value) ? Math.round(value * 100) / 100 : 'infinity');\nconst toSize = (size: { width: Dimension; height: Dimension }): Size => ({\n width: fromDimension(size.width) ?? 0,\n height: fromDimension(size.height) ?? 0,\n});\n\nconst GUIDES: readonly LayoutGuide[] = ['leading', 'horizontalCenter', 'trailing', 'top', 'verticalCenter', 'bottom', 'firstTextBaseline', 'lastTextBaseline'];\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/** Run the layout for a record: the size, the frames and the min/ideal/max sizes. */\nexport function answerLayout<Cache>(\n layout: CustomLayout<Cache>,\n record: LayoutRecord,\n traits: readonly SubviewTraits[] = [],\n): { size: Size; frames: Rect[]; sizes: { min: Size; ideal: Size; max: Size }; guides: Partial<Record<LayoutGuide, number>> } {\n const frames: (Rect | null)[] = record.children.map(() => null);\n const subviews: LayoutSubview[] = record.children.map((measurement, index) => {\n const min = toSize(measurement.min);\n const ideal = toSize(measurement.ideal);\n const max = toSize(measurement.max);\n const sizeThatFits = (proposal: LayoutProposal): Size => ({\n width: proposal.width === null ? ideal.width : clamp(proposal.width, min.width, max.width),\n height: proposal.height === null ? ideal.height : clamp(proposal.height, min.height, max.height),\n });\n return {\n min,\n ideal,\n max,\n priority: traits[index]?.priority ?? 0,\n values: traits[index]?.values ?? {},\n spacing: DEFAULT_VIEW_SPACING,\n sizeThatFits,\n place: ({ x, y, anchor, proposal }) => {\n const size = sizeThatFits(proposal ?? { width: null, height: null });\n const point = unitPoint(anchor ?? 'topLeading');\n frames[index] = { x: x - point.x * size.width, y: y - point.y * size.height, ...size };\n },\n };\n });\n const cache = (layout.makeCache ? layout.makeCache(subviews) : undefined) as Cache;\n const measure = (proposal: LayoutProposal): Size => layout.sizeThatFits(proposal, subviews, cache);\n const size = measure(record.proposal);\n layout.placeSubviews({ x: 0, y: 0, ...size }, record.proposal, subviews, cache);\n const placed = frames.map((frame, index) => {\n if (frame) return frame;\n // An unplaced subview sits centered, as in SwiftUI.\n const own = subviews[index]!.sizeThatFits({ width: size.width, height: size.height });\n return { x: (size.width - own.width) / 2, y: (size.height - own.height) / 2, ...own };\n });\n const guides: Partial<Record<LayoutGuide, number>> = {};\n if (layout.explicitAlignment) {\n const bounds = { x: 0, y: 0, ...size };\n for (const guide of GUIDES) {\n const value = layout.explicitAlignment(guide, bounds, record.proposal, subviews, cache);\n if (value !== null && value !== undefined && Number.isFinite(value)) guides[guide] = value;\n }\n }\n return {\n size,\n frames: placed,\n guides,\n sizes: {\n min: measure({ width: 0, height: 0 }),\n ideal: measure({ width: null, height: null }),\n max: measure({ width: Infinity, height: Infinity }),\n },\n };\n}\n\n/**\n * `Layout`: a custom layout the engine asks for sizes and frames. Until the\n * first answer the element fills its proposal; then it answers from the\n * layout's own `sizeThatFits` and `placeSubviews`.\n */\nexport function Layout<Cache = unknown>(props: LayoutProps<Cache>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [record, setRecord] = useState<LayoutRecord | null>(null);\n let layoutProps: Record<string, unknown> = { proposal: null, size: null, frames: null };\n // The explicit guides the last answer gave, as alignment guides of the layout's box.\n const guideModifiers: [ModifierKey, unknown][] = [];\n if (record) {\n const answer = answerLayout(own.layout, record, subviewTraits(own.children));\n for (const [guide, value] of Object.entries(answer.guides)) guideModifiers.push(['alignmentGuide', { guide, value: () => value }]);\n const encode = (size: Size): { width: Dimension; height: Dimension } => ({ width: toDimension(size.width), height: toDimension(size.height) });\n const round = (value: number): number => Math.round(value * 100) / 100;\n layoutProps = {\n proposal: {\n width: record.proposal.width === null ? null : toDimension(record.proposal.width),\n height: record.proposal.height === null ? null : toDimension(record.proposal.height),\n },\n size: { width: round(answer.size.width), height: round(answer.size.height) },\n frames: answer.frames.map((frame) => ({ x: round(frame.x), y: round(frame.y), width: round(frame.width), height: round(frame.height) })),\n sizes: { min: encode(answer.sizes.min), ideal: encode(answer.sizes.ideal), max: encode(answer.sizes.max) },\n };\n }\n return applyModifiers(\n sb(\n 'layout',\n layoutProps,\n {\n layout: (event) => {\n const proposal: ProtocolProposal = event.proposal;\n setRecord({\n proposal: { width: fromDimension(proposal.width), height: fromDimension(proposal.height) },\n children: event.children,\n });\n },\n },\n own.children,\n ),\n [...guideModifiers, ...modifiers],\n );\n}\n","/**\n * `.visualEffect { content, proxy in … }` and `.scrollTransition { content, phase in … }`.\n *\n * Both draw effects that depend on where the view is, without changing its\n * layout. The view is wrapped in a layout-transparent box that reports its\n * frame on screen (and the visible rectangle of the scroll view it is in),\n * kept current as the page scrolls; the effects apply inside that box, so\n * they never move what is measured.\n */\n\nimport type { Rotation3D, Style } from '@swiftbrowser/web/src/protocol';\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { useCoordinateSpaces } from './coordinateSpace';\nimport { geometryProxy, nextGeometry, NO_GEOMETRY, type GeometryProxy, type ReportedGeometry } from './components/geometry';\nimport { sb } from './host/sb';\nimport { unitPoint, type UnitPoint, type UnitPointValue } from './values';\n\ninterface EffectValues {\n offsetX: number;\n offsetY: number;\n scaleX: number;\n scaleY: number;\n scaleAnchor?: UnitPoint;\n rotation: number;\n rotationAnchor?: UnitPoint;\n rotation3D?: Rotation3D;\n opacity: number;\n blur: number;\n brightness: number;\n contrast: number;\n saturation: number;\n grayscale: number;\n hueRotation: number;\n}\n\nconst IDENTITY: EffectValues = {\n offsetX: 0,\n offsetY: 0,\n scaleX: 1,\n scaleY: 1,\n rotation: 0,\n opacity: 1,\n blur: 0,\n brightness: 0,\n contrast: 1,\n saturation: 1,\n grayscale: 0,\n hueRotation: 0,\n};\n\n/**\n * SwiftUI's `VisualEffect`: the effects a `visualEffect` or `scrollTransition`\n * closure returns, chained from the `effect` it is handed\n * (`effect.offset({ y: 20 }).opacity(0.5)`). Chained effects compose:\n * offsets and rotations add, scales and opacities multiply.\n */\nexport class VisualEffect {\n /** @internal */\n constructor(readonly values: EffectValues = IDENTITY) {}\n\n private with(patch: Partial<EffectValues>): VisualEffect {\n return new VisualEffect({ ...this.values, ...patch });\n }\n\n offset(offset: { x?: number; y?: number }): VisualEffect {\n return this.with({ offsetX: this.values.offsetX + (offset.x ?? 0), offsetY: this.values.offsetY + (offset.y ?? 0) });\n }\n\n scaleEffect(scale: number | { x?: number; y?: number }, anchor?: UnitPointValue): VisualEffect {\n const x = typeof scale === 'number' ? scale : (scale.x ?? 1);\n const y = typeof scale === 'number' ? scale : (scale.y ?? 1);\n return this.with({ scaleX: this.values.scaleX * x, scaleY: this.values.scaleY * y, ...(anchor !== undefined ? { scaleAnchor: unitPoint(anchor) } : {}) });\n }\n\n /** Degrees. */\n rotationEffect(degrees: number, anchor?: UnitPointValue): VisualEffect {\n return this.with({ rotation: this.values.rotation + degrees, ...(anchor !== undefined ? { rotationAnchor: unitPoint(anchor) } : {}) });\n }\n\n rotation3DEffect(spec: { angle: number; axis: { x: number; y: number; z: number }; anchor?: UnitPointValue; perspective?: number }): VisualEffect {\n const rotation: Rotation3D = { angle: spec.angle, axis: spec.axis };\n if (spec.anchor !== undefined) rotation.anchor = unitPoint(spec.anchor);\n if (spec.perspective !== undefined) rotation.perspective = spec.perspective;\n return this.with({ rotation3D: rotation });\n }\n\n opacity(opacity: number): VisualEffect {\n return this.with({ opacity: this.values.opacity * opacity });\n }\n\n blur(radius: number): VisualEffect {\n return this.with({ blur: this.values.blur + radius });\n }\n\n brightness(amount: number): VisualEffect {\n return this.with({ brightness: this.values.brightness + amount });\n }\n\n contrast(amount: number): VisualEffect {\n return this.with({ contrast: this.values.contrast * amount });\n }\n\n saturation(amount: number): VisualEffect {\n return this.with({ saturation: this.values.saturation * amount });\n }\n\n grayscale(amount: number): VisualEffect {\n return this.with({ grayscale: Math.min(1, this.values.grayscale + amount) });\n }\n\n /** Degrees. */\n hueRotation(degrees: number): VisualEffect {\n return this.with({ hueRotation: this.values.hueRotation + degrees });\n }\n}\n\n/** The effect a closure starts from. */\nexport const EMPTY_EFFECT = new VisualEffect();\n\nconst round = (value: number): number => Math.round(value * 1000) / 1000;\n\n/** The `styled` style that draws `values` (identity fields left out). */\nexport function effectStyle(values: EffectValues): Style {\n const style: Style = {};\n if (values.offsetX !== 0 || values.offsetY !== 0) style.offset = { x: round(values.offsetX), y: round(values.offsetY) };\n if (values.scaleX !== 1 || values.scaleY !== 1) {\n style.scale = { x: round(values.scaleX), y: round(values.scaleY) };\n if (values.scaleAnchor) style.scaleAnchor = values.scaleAnchor;\n }\n if (values.rotation !== 0) {\n style.rotation = round(values.rotation);\n if (values.rotationAnchor) style.rotationAnchor = values.rotationAnchor;\n }\n if (values.rotation3D && values.rotation3D.angle !== 0) style.rotation3D = { ...values.rotation3D, angle: round(values.rotation3D.angle) };\n if (values.opacity !== 1) style.opacity = round(values.opacity);\n if (values.blur !== 0) style.blur = round(values.blur);\n if (values.brightness !== 0) style.brightness = round(values.brightness);\n if (values.contrast !== 1) style.contrast = round(values.contrast);\n if (values.saturation !== 1) style.saturation = round(values.saturation);\n if (values.grayscale !== 0) style.grayscale = round(values.grayscale);\n if (values.hueRotation !== 0) style.hueRotation = round(values.hueRotation);\n return style;\n}\n\n/** `from` → `to` by `t` (0…1), field by field; anchors and 3-D axes come from the side that sets them. */\nexport function interpolateEffects(from: EffectValues, to: EffectValues, t: number): EffectValues {\n const mix = (a: number, b: number): number => a + (b - a) * t;\n const result: EffectValues = {\n offsetX: mix(from.offsetX, to.offsetX),\n offsetY: mix(from.offsetY, to.offsetY),\n scaleX: mix(from.scaleX, to.scaleX),\n scaleY: mix(from.scaleY, to.scaleY),\n rotation: mix(from.rotation, to.rotation),\n opacity: mix(from.opacity, to.opacity),\n blur: mix(from.blur, to.blur),\n brightness: mix(from.brightness, to.brightness),\n contrast: mix(from.contrast, to.contrast),\n saturation: mix(from.saturation, to.saturation),\n grayscale: mix(from.grayscale, to.grayscale),\n hueRotation: mix(from.hueRotation, to.hueRotation),\n };\n const scaleAnchor = to.scaleAnchor ?? from.scaleAnchor;\n if (scaleAnchor) result.scaleAnchor = scaleAnchor;\n const rotationAnchor = to.rotationAnchor ?? from.rotationAnchor;\n if (rotationAnchor) result.rotationAnchor = rotationAnchor;\n const rotation3D = to.rotation3D ?? from.rotation3D;\n if (rotation3D) result.rotation3D = { ...rotation3D, angle: mix(from.rotation3D?.angle ?? 0, to.rotation3D?.angle ?? 0) };\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// The measured box\n// ---------------------------------------------------------------------------\n\n/**\n * Renders `children` styled by `style(reported, markRead)` inside a box that\n * reports its geometry; the frame on screen is asked for once `markRead` is\n * called (always, with `alwaysFrame`).\n */\nfunction EffectBox({\n render,\n alwaysFrame,\n animationToken,\n children,\n}: {\n render: (reported: ReportedGeometry, markRead: () => void) => Style;\n alwaysFrame: boolean;\n /** When given, a change of the number animates the effect (as `.animation(.default, value:)`). */\n animationToken?: (reported: ReportedGeometry) => number;\n children?: ReactNode;\n}): ReactNode {\n const [reported, setReported] = useState<ReportedGeometry>(NO_GEOMETRY);\n const [needsFrame, setNeedsFrame] = useState(alwaysFrame);\n let readFrame = false;\n const style = render(reported, () => {\n readFrame = true;\n });\n useEffect(() => {\n if (readFrame && !needsFrame) setNeedsFrame(true);\n });\n let content = Object.keys(style).length > 0 ? sb('styled', { style }, undefined, children) : children;\n if (animationToken) content = sb('styled', { style: { animation: { type: 'default' }, animationToken: animationToken(reported) } }, undefined, content);\n return sb(\n 'zstack',\n { alignment: 'center', reportsSize: true, ...(needsFrame ? { reportsFrame: true } : {}) },\n {\n geometry: (event) => {\n const next = nextGeometry(event, reported);\n if (JSON.stringify(next) !== JSON.stringify(reported)) setReported(next);\n },\n },\n content,\n );\n}\n\nexport type VisualEffectClosure = (effect: VisualEffect, proxy: GeometryProxy) => VisualEffect;\n\n/** `.visualEffect { content, proxy in … }`. */\nexport function VisualEffectView({ effect, children }: { effect: VisualEffectClosure; children?: ReactNode }): ReactNode {\n const spaces = useCoordinateSpaces();\n return (\n <EffectBox alwaysFrame={false} render={(reported, markRead) => effectStyle(effect(EMPTY_EFFECT, geometryProxy(reported, spaces, markRead)).values)}>\n {children}\n </EffectBox>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Scroll transitions\n// ---------------------------------------------------------------------------\n\n/**\n * Where a view is in its scroll view: `topLeading` (going out past the top or\n * leading edge), `identity` (in view) or `bottomTrailing`, with `value` -1, 0\n * or 1. An `interactive` transition draws the effect partway between phases\n * as the view crosses the edge.\n */\nexport interface ScrollTransitionPhase {\n phase: 'topLeading' | 'identity' | 'bottomTrailing';\n value: -1 | 0 | 1;\n isIdentity: boolean;\n}\n\nconst PHASES = {\n topLeading: { phase: 'topLeading', value: -1, isIdentity: false },\n identity: { phase: 'identity', value: 0, isIdentity: true },\n bottomTrailing: { phase: 'bottomTrailing', value: 1, isIdentity: false },\n} as const satisfies Record<string, ScrollTransitionPhase>;\n\nexport type ScrollTransitionClosure = (effect: VisualEffect, phase: ScrollTransitionPhase) => VisualEffect;\n\nexport interface ScrollTransitionSpec {\n transition: ScrollTransitionClosure;\n /**\n * `interactive` (the default) follows the scrolling, drawing the effect\n * partway as the view crosses the edge; `animated` switches phases once the\n * view is partly out; `identity` never leaves the identity phase.\n */\n configuration?: 'interactive' | 'animated' | 'identity';\n /** The axis to follow; the scroll view's own by default. */\n axis?: 'horizontal' | 'vertical';\n}\n\n/**\n * How far the view has gone out of its scroll view's visible rectangle:\n * negative past the top or leading edge, positive past the bottom or\n * trailing one, as a fraction of its own length (0 while wholly in view).\n */\nexport function scrollProgress(reported: ReportedGeometry, axis?: 'horizontal' | 'vertical'): number {\n const view = reported.scrollView;\n const origin = reported.origin;\n if (!view || !origin) return 0;\n const horizontal = (axis ?? view.axis) === 'horizontal';\n const start = horizontal ? origin.x : origin.y;\n const length = horizontal ? reported.size.width : reported.size.height;\n const viewStart = horizontal ? view.x : view.y;\n const viewEnd = viewStart + (horizontal ? view.width : view.height);\n if (length <= 0) return 0;\n if (start < viewStart) return -Math.min(1, (viewStart - start) / length);\n if (start + length > viewEnd) return Math.min(1, (start + length - viewEnd) / length);\n return 0;\n}\n\n/** The effect values a scroll transition draws at `progress` (see `scrollProgress`). */\nexport function scrollTransitionValues(spec: ScrollTransitionSpec, progress: number): EffectValues {\n const identity = spec.transition(EMPTY_EFFECT, PHASES.identity).values;\n const configuration = spec.configuration ?? 'interactive';\n if (configuration === 'identity' || progress === 0) return identity;\n const edge = spec.transition(EMPTY_EFFECT, progress < 0 ? PHASES.topLeading : PHASES.bottomTrailing).values;\n if (configuration === 'animated') return edge;\n return interpolateEffects(identity, edge, Math.abs(progress));\n}\n\n/** `.scrollTransition { content, phase in … }`. */\nexport function ScrollTransitionView({ spec, children }: { spec: ScrollTransitionSpec; children?: ReactNode }): ReactNode {\n return (\n <EffectBox\n alwaysFrame\n render={(reported) => effectStyle(scrollTransitionValues(spec, scrollProgress(reported, spec.axis)))}\n {...(spec.configuration === 'animated' ? { animationToken: (reported: ReportedGeometry) => Math.sign(scrollProgress(reported, spec.axis)) + 1 } : {})}\n >\n {children}\n </EffectBox>\n );\n}\n","/**\n * `Path`: a builder for SVG path data, in SwiftUI's vocabulary. Custom\n * shapes (`Shape` with a `path` function) and `Canvas` drawing take one.\n * Points are rounded to hundredths, as the Swift shim rounds them.\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface CGRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst r = (n: number): string => {\n const v = Math.round(n * 100) / 100;\n return Object.is(v, -0) ? '0' : String(v);\n};\n\nexport class Path {\n private readonly parts: string[] = [];\n private current: Point | null = null;\n private start: Point | null = null;\n\n constructor(build?: (path: Path) => void) {\n build?.(this);\n }\n\n /** `Path(rect)` */\n static rect(rect: CGRect): Path {\n return new Path().addRect(rect);\n }\n /** `Path(roundedRect:cornerRadius:)` */\n static roundedRect(rect: CGRect, cornerRadius: number): Path {\n return new Path().addRoundedRect(rect, cornerRadius);\n }\n /** `Path(ellipseIn:)` */\n static ellipse(rect: CGRect): Path {\n return new Path().addEllipse(rect);\n }\n\n move(to: Point): this {\n this.parts.push(`M${r(to.x)} ${r(to.y)}`);\n this.current = to;\n this.start = to;\n return this;\n }\n\n addLine(to: Point): this {\n if (!this.current) return this.move(to);\n this.parts.push(`L${r(to.x)} ${r(to.y)}`);\n this.current = to;\n return this;\n }\n\n addLines(points: readonly Point[]): this {\n points.forEach((point, index) => (index === 0 ? this.move(point) : this.addLine(point)));\n return this;\n }\n\n addQuadCurve(to: Point, control: Point): this {\n if (!this.current) this.move(control);\n this.parts.push(`Q${r(control.x)} ${r(control.y)} ${r(to.x)} ${r(to.y)}`);\n this.current = to;\n return this;\n }\n\n addCurve(to: Point, control1: Point, control2: Point): this {\n if (!this.current) this.move(control1);\n this.parts.push(`C${r(control1.x)} ${r(control1.y)} ${r(control2.x)} ${r(control2.y)} ${r(to.x)} ${r(to.y)}`);\n this.current = to;\n return this;\n }\n\n /**\n * `addArc(center:radius:startAngle:endAngle:clockwise:)`, angles in\n * degrees. As in SwiftUI's flipped coordinates, `clockwise: false` draws\n * clockwise on screen.\n */\n addArc(center: Point, radius: number, startAngle: number, endAngle: number, clockwise: boolean): this {\n const rad = (deg: number): number => (deg * Math.PI) / 180;\n const point = (deg: number): Point => ({ x: center.x + radius * Math.cos(rad(deg)), y: center.y + radius * Math.sin(rad(deg)) });\n const from = point(startAngle);\n if (this.current) this.addLine(from);\n else this.move(from);\n // On screen (y down), SwiftUI's `clockwise: false` sweeps with increasing angles.\n const sweepPositive = !clockwise;\n let delta = endAngle - startAngle;\n if (sweepPositive) while (delta < 0) delta += 360;\n else while (delta > 0) delta -= 360;\n if (Math.abs(delta) >= 360) {\n // A full circle: two half arcs.\n const half = point(startAngle + (sweepPositive ? 180 : -180));\n const flag = sweepPositive ? 1 : 0;\n this.parts.push(`A${r(radius)} ${r(radius)} 0 0 ${flag} ${r(half.x)} ${r(half.y)}`);\n this.parts.push(`A${r(radius)} ${r(radius)} 0 0 ${flag} ${r(from.x)} ${r(from.y)}`);\n this.current = from;\n return this;\n }\n const to = point(startAngle + delta);\n const large = Math.abs(delta) > 180 ? 1 : 0;\n this.parts.push(`A${r(radius)} ${r(radius)} 0 ${large} ${sweepPositive ? 1 : 0} ${r(to.x)} ${r(to.y)}`);\n this.current = to;\n return this;\n }\n\n addRect(rect: CGRect): this {\n this.move({ x: rect.x, y: rect.y });\n this.addLine({ x: rect.x + rect.width, y: rect.y });\n this.addLine({ x: rect.x + rect.width, y: rect.y + rect.height });\n this.addLine({ x: rect.x, y: rect.y + rect.height });\n return this.closeSubpath();\n }\n\n addRoundedRect(rect: CGRect, cornerRadius: number): this {\n const c = Math.max(0, Math.min(cornerRadius, rect.width / 2, rect.height / 2));\n if (c === 0) return this.addRect(rect);\n const { x, y, width: w, height: h } = rect;\n this.move({ x: x + c, y });\n this.addLine({ x: x + w - c, y });\n this.parts.push(`A${r(c)} ${r(c)} 0 0 1 ${r(x + w)} ${r(y + c)}`);\n this.current = { x: x + w, y: y + c };\n this.addLine({ x: x + w, y: y + h - c });\n this.parts.push(`A${r(c)} ${r(c)} 0 0 1 ${r(x + w - c)} ${r(y + h)}`);\n this.current = { x: x + w - c, y: y + h };\n this.addLine({ x: x + c, y: y + h });\n this.parts.push(`A${r(c)} ${r(c)} 0 0 1 ${r(x)} ${r(y + h - c)}`);\n this.current = { x, y: y + h - c };\n this.addLine({ x, y: y + c });\n this.parts.push(`A${r(c)} ${r(c)} 0 0 1 ${r(x + c)} ${r(y)}`);\n this.current = { x: x + c, y };\n return this.closeSubpath();\n }\n\n addEllipse(rect: CGRect): this {\n const rx = rect.width / 2;\n const ry = rect.height / 2;\n const cx = rect.x + rx;\n const cy = rect.y + ry;\n this.move({ x: cx + rx, y: cy });\n this.parts.push(`A${r(rx)} ${r(ry)} 0 0 1 ${r(cx - rx)} ${r(cy)}`);\n this.parts.push(`A${r(rx)} ${r(ry)} 0 0 1 ${r(cx + rx)} ${r(cy)}`);\n this.current = { x: cx + rx, y: cy };\n return this.closeSubpath();\n }\n\n addPath(path: Path): this {\n this.parts.push(path.svg());\n return this;\n }\n\n closeSubpath(): this {\n this.parts.push('Z');\n this.current = this.start;\n return this;\n }\n\n get isEmpty(): boolean {\n return this.parts.length === 0;\n }\n\n /** The SVG path data. */\n svg(): string {\n return this.parts.join('');\n }\n\n toString(): string {\n return this.svg();\n }\n}\n","import type { ButtonRole, ButtonStyle, PickerStyle, SliderLabel, TextFieldStyle } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, type ReactElement, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { useViewEnvironment, type ControlSize } from '../environment';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, styled, takeModifier, toolbarPlacement, type ToolbarItemPlacementName, type ViewModifiers } from '../modifiers';\nimport { flattenChildren } from './stacks';\nimport { useKeyboardShortcut } from '../pointer';\nimport { Image, Text, type TextProps } from './text';\n\n// ---------------------------------------------------------------------------\n// Button\n// ---------------------------------------------------------------------------\n\nexport interface ButtonProps extends ViewModifiers {\n title?: string;\n role?: 'destructive' | 'cancel';\n action?: () => void;\n /** The label, when there is no `title`. */\n children?: ReactNode;\n}\n\nexport function Button(props: ButtonProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const ownStyle = takeModifier(modifiers, 'buttonStyle');\n const ownSize = takeModifier(modifiers, 'controlSize');\n const style: ButtonStyle = ownStyle === 'borderless' ? 'plain' : (ownStyle ?? environment.buttonStyle ?? 'automatic');\n const controlSize: ControlSize | undefined = ownSize ?? environment.controlSize;\n const buttonProps: Record<string, unknown> = { role: (own.role ?? null) as ButtonRole, style };\n if (controlSize !== undefined && controlSize !== 'regular') buttonProps['controlSize'] = controlSize;\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n const tap = (): void => {\n own.action?.();\n environment.dismissAlert?.();\n };\n const shortcut = takeModifier(modifiers, 'keyboardShortcut');\n useKeyboardShortcut(typeof shortcut === 'string' ? { key: shortcut } : shortcut, () => {\n if (!buttonDisabled(modifiers)) tap();\n });\n return applyModifiers(sb('button', buttonProps, { tap }, label), modifiers);\n}\n\n// ---------------------------------------------------------------------------\n// Toggle\n// ---------------------------------------------------------------------------\n\nexport interface ToggleProps extends ViewModifiers {\n isOn: BindingValue<boolean>;\n onChange?: (isOn: boolean) => void;\n title?: string;\n children?: ReactNode;\n}\n\nexport function Toggle(props: ToggleProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [isOn, setOn] = readBinding(own.isOn, own.onChange);\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n return applyModifiers(sb('toggle', { isOn }, { toggle: (event) => setOn(event.value) }, label), modifiers);\n}\n\n// ---------------------------------------------------------------------------\n// Picker\n// ---------------------------------------------------------------------------\n\nexport interface PickerOption<T> {\n label: string;\n tag: T;\n}\n\nexport interface PickerProps<T> extends ViewModifiers {\n label: string;\n selection: BindingValue<T>;\n onChange?: (value: T) => void;\n /** The options, or `<Text tag={…}>` children (a `Text` without a tag is tagged with its string). */\n options?: readonly (T | PickerOption<T>)[];\n children?: ReactNode;\n}\n\nexport function Picker<T>(props: PickerProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const ownStyle = takeModifier(modifiers, 'pickerStyle');\n const style: PickerStyle = ownStyle ?? environment.pickerStyle ?? 'menu';\n const [selection, setSelection] = readBinding(own.selection, own.onChange);\n const options = pickerOptions<T>(own.options, own.children);\n const selected = Math.max(\n 0,\n options.findIndex((option) => Object.is(option.tag, selection)),\n );\n return applyModifiers(\n sb(\n 'picker',\n { style, label: own.label, options: options.map((option) => option.label), selected },\n { select: (event) => options[event.value] && setSelection(options[event.value]!.tag) },\n ),\n modifiers,\n );\n}\n\nfunction pickerOptions<T>(options: readonly (T | PickerOption<T>)[] | undefined, children: ReactNode): PickerOption<T>[] {\n if (options) {\n return options.map((option) =>\n typeof option === 'object' && option !== null && 'label' in option && 'tag' in option\n ? (option as PickerOption<T>)\n : { label: String(option), tag: option as T },\n );\n }\n return flattenChildren(children).map((element) => {\n const label = plainText(element);\n const tag = (element.props as { tag?: T }).tag;\n return { label, tag: (tag !== undefined ? tag : label) as T };\n });\n}\n\n/** The string of a `<Text>` element (other elements read as their title, else \"\"). */\nexport function plainText(element: ReactElement): string {\n const props = element.props as TextProps & { title?: unknown };\n if (element.type === Text) return collectText(props.children);\n if (typeof props.title === 'string') return props.title;\n return '';\n}\n\nfunction collectText(node: ReactNode): string {\n if (node === null || node === undefined || typeof node === 'boolean') return '';\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(collectText).join('');\n if (typeof node === 'object' && 'props' in node) {\n const element = node as ReactElement<{ children?: ReactNode }>;\n if (element.type === Fragment || element.type === Text) return collectText(element.props.children);\n }\n return '';\n}\n\n// ---------------------------------------------------------------------------\n// Slider, Stepper\n// ---------------------------------------------------------------------------\n\nexport interface SliderProps extends ViewModifiers {\n value: BindingValue<number>;\n onChange?: (value: number) => void;\n /** `in: 0...1` */\n range?: readonly [number, number];\n step?: number;\n label?: ReactNode;\n minimumValueLabel?: ReactNode;\n maximumValueLabel?: ReactNode;\n}\n\nexport function Slider(props: SliderProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const [value, setValue] = readBinding(own.value, own.onChange);\n const [min, max] = own.range ?? [0, 1];\n const labels: SliderLabel[] = [];\n const children: ReactNode[] = [];\n if (own.label !== undefined && !environment.labelsHidden) {\n labels.push('label');\n children.push(<Fragment key=\"label\">{own.label}</Fragment>);\n }\n if (own.minimumValueLabel !== undefined || own.maximumValueLabel !== undefined) {\n labels.push('min', 'max');\n children.push(<Fragment key=\"min\">{own.minimumValueLabel}</Fragment>, <Fragment key=\"max\">{own.maximumValueLabel}</Fragment>);\n }\n return applyModifiers(\n sb('slider', { value, min, max, step: own.step ?? null, labels }, { slide: (event) => setValue(event.value) }, children.length ? children : undefined),\n modifiers,\n );\n}\n\nexport interface StepperProps extends ViewModifiers {\n value: BindingValue<number>;\n onChange?: (value: number) => void;\n /** `in: 1...10` */\n range?: readonly [number, number];\n step?: number;\n title?: string;\n children?: ReactNode;\n}\n\nexport function Stepper(props: StepperProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [value, setValue] = readBinding(own.value, own.onChange);\n const step = own.step ?? 1;\n const [min, max] = own.range ?? [-Infinity, Infinity];\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n return applyModifiers(\n sb(\n 'stepper',\n { canIncrement: value < max, canDecrement: value > min },\n { step: (event) => setValue(Math.min(max, Math.max(min, value + Math.sign(event.value) * step))) },\n label,\n ),\n modifiers,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Text fields\n// ---------------------------------------------------------------------------\n\nexport interface TextFieldProps extends ViewModifiers {\n /** The placeholder (SwiftUI's title). */\n placeholder?: string;\n text: BindingValue<string>;\n onChange?: (text: string) => void;\n onSubmit?: () => void;\n textFieldStyle?: TextFieldStyle;\n secure?: boolean;\n axis?: 'vertical';\n /** `.focused($isFocused)`: the field takes the focus while true, and sets it as the viewer focuses or leaves it. */\n focused?: BindingValue<boolean>;\n}\n\nexport function TextField(props: TextFieldProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const ownSubmitLabel = takeModifier(modifiers, 'submitLabel');\n const [text, setText] = readBinding(own.text, own.onChange);\n const fieldProps: Record<string, unknown> = {\n text,\n placeholder: own.placeholder ?? '',\n style: own.textFieldStyle ?? 'plain',\n secure: own.secure ?? false,\n };\n if (own.onSubmit) fieldProps['submit'] = true;\n if (own.axis) fieldProps['axis'] = own.axis;\n const submitLabel = ownSubmitLabel ?? environment.submitLabel;\n if (submitLabel) fieldProps['submitLabel'] = submitLabel;\n const focus = own.focused !== undefined ? readBinding(own.focused) : null;\n if (focus) fieldProps['focused'] = focus[0];\n return applyModifiers(\n sb('textfield', fieldProps, {\n text: (event) => setText(event.value),\n submit: () => own.onSubmit?.(),\n focus: (event) => focus?.[1](event.value),\n }),\n modifiers,\n );\n}\n\nexport function SecureField(props: Omit<TextFieldProps, 'secure'>): ReactNode {\n return <TextField {...props} secure />;\n}\n\n// ---------------------------------------------------------------------------\n// ProgressView\n// ---------------------------------------------------------------------------\n\nexport interface ProgressViewProps extends ViewModifiers {\n /** Determinate progress (`value / total`); absent: the spinning indicator. */\n value?: number;\n total?: number;\n label?: ReactNode;\n currentValueLabel?: ReactNode;\n /** The label, as children. */\n children?: ReactNode;\n}\n\nexport function ProgressView(props: ProgressViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n if (own.value === undefined) {\n return applyModifiers(\n styled({ foreground: { hierarchical: 2 } }, styled({ font: { size: 20 } }, <Image systemName=\"progress.indicator\" />)),\n modifiers,\n );\n }\n const label = own.label ?? own.children;\n const children: ReactNode[] = [];\n if (label !== undefined && label !== null) children.push(<Fragment key=\"label\">{label}</Fragment>);\n if (own.currentValueLabel !== undefined && own.currentValueLabel !== null) {\n children.push(<Fragment key=\"current\">{styled({ foreground: { hierarchical: 2 } }, own.currentValueLabel)}</Fragment>);\n }\n return applyModifiers(\n sb(\n 'gauge',\n { value: own.value / (own.total ?? 1), style: 'progress', hasLabel: true, hasCurrentValueLabel: true },\n undefined,\n children.length ? children : undefined,\n ),\n modifiers,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar\n// ---------------------------------------------------------------------------\n\nexport interface ToolbarItemProps {\n placement?: ToolbarItemPlacementName;\n children?: ReactNode;\n}\n\n/** `ToolbarItem(placement:) { }`, inside a `toolbar` modifier. */\nexport function ToolbarItem(props: ToolbarItemProps): ReactNode {\n return sb('toolbar', { placement: toolbarPlacement(props.placement) }, undefined, props.children);\n}\n\nexport const ToolbarItemGroup = ToolbarItem;\n\nexport interface ToolbarSpacerProps {\n /**\n * `flexible` (the default) shares the room the groups leave, pushing them\n * apart; `fixed` is a standard 8 gap and keeps the row centered.\n */\n sizing?: 'flexible' | 'fixed';\n placement?: ToolbarItemPlacementName;\n}\n\n/**\n * `ToolbarSpacer(_:placement:)` (iOS 26), inside a `toolbar` modifier: ends\n * the glass group of the items before it, so a bottom bar's items float in\n * separate capsules. Between navigation bar groups it only separates them.\n */\nexport function ToolbarSpacer(props: ToolbarSpacerProps): ReactNode {\n return sb('toolbar', { placement: toolbarPlacement(props.placement), spacer: props.sizing ?? 'flexible' });\n}\n\n// ---------------------------------------------------------------------------\n// DatePicker, TextEditor\n// ---------------------------------------------------------------------------\n\nexport type DatePickerComponents = 'date' | 'hourAndMinute' | 'dateAndTime';\n\nexport interface DatePickerProps extends ViewModifiers {\n label?: string;\n selection: BindingValue<Date>;\n onChange?: (date: Date) => void;\n /** `displayedComponents:`; `date` by default. */\n displayedComponents?: DatePickerComponents;\n /** `in:` bounds. */\n range?: readonly [Date | null, Date | null];\n}\n\n/** `DatePicker(\"Date\", selection:)`: the compact style, with the browser's native pickers. */\nexport function DatePicker(props: DatePickerProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const [date, setDate] = readBinding(own.selection, own.onChange);\n const labelsHidden = takeModifier(modifiers, 'labelsHidden') ?? environment.labelsHidden ?? false;\n const seconds = (value: Date | null | undefined): number | null => (value ? Math.floor(value.getTime() / 1000) : null);\n const pickerProps: Record<string, unknown> = {\n seconds: seconds(date) ?? 0,\n components: own.displayedComponents ?? 'date',\n min: seconds(own.range?.[0]),\n max: seconds(own.range?.[1]),\n };\n if (labelsHidden) pickerProps['labelsHidden'] = true;\n const label = labelsHidden || own.label === undefined ? undefined : <Text>{own.label}</Text>;\n return applyModifiers(sb('datepicker', pickerProps, { date: (event) => setDate(new Date(event.value * 1000)) }, label), modifiers);\n}\n\nexport interface TextEditorProps extends ViewModifiers {\n text: BindingValue<string>;\n onChange?: (text: string) => void;\n focused?: BindingValue<boolean>;\n}\n\n/** `TextEditor(text:)`: a multi-line field filling its proposal. */\nexport function TextEditor(props: TextEditorProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [text, setText] = readBinding(own.text, own.onChange);\n const focus = own.focused !== undefined ? readBinding(own.focused) : null;\n const editor: Record<string, unknown> = { text };\n if (focus) editor['focused'] = focus[0];\n return applyModifiers(\n sb('texteditor', editor, { text: (event) => setText(event.value), focus: (event) => focus?.[1](event.value) }),\n modifiers,\n );\n}\n\n/** A `disabled` modifier on the button itself turns its shortcut off too. */\nfunction buttonDisabled(modifiers: readonly [string, unknown][]): boolean {\n return modifiers.some(([key, value]) => key === 'disabled' && value === true);\n}\n","import type { ListStyle } from '@swiftbrowser/web/src/protocol';\nimport { isValidElement, useContext, type ReactElement, type ReactNode } from 'react';\nimport { SplitSelectionContext, useReportSplitSelection } from './split';\nimport { readBinding, type BindingValue } from '../binding';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, takeModifier, type ViewModifiers } from '../modifiers';\nimport { plainText } from './controls';\nimport { NavigationLink } from './navigation';\nimport { ListSelectionContext, Row, type ListSelection, type RowProps } from './row';\nimport { flattenChildren, providingScrollSettings, takeScrollSettings, useRefreshable } from './stacks';\nimport { edgeEffectProp, useScrollSettings } from '../scrollEnvironment';\nimport { LazyContext, LazyGroup, type LazyGroupProps } from '../lazy';\nimport { Text } from './text';\n\nconst NO_CLEAR = (): void => {};\n\n/** A selection: one value (or `null`), or a `Set` of values. */\nexport type Selection<T> = T | null | Set<T>;\n\nexport interface ListProps<T = unknown> extends ViewModifiers {\n listStyle?: ListStyle;\n /** Edit mode (`EditButton`). */\n editing?: BindingValue<boolean>;\n /** `List(selection:)`: rows with a `tag` (or a `NavigationLink` value) become selectable; a `Set` selects several. */\n selection?: BindingValue<Set<T>> | BindingValue<T | null>;\n onSelectionChange?: (selection: Selection<T>) => void;\n children?: ReactNode;\n}\n\nexport function List<T = unknown>(props: ListProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [editing] = own.editing !== undefined ? readBinding(own.editing) : [false];\n const listProps: Record<string, unknown> = { style: own.listStyle ?? 'insetGrouped' };\n if (editing) listProps['editing'] = true;\n let selection: ListSelection | null = null;\n const split = useContext(SplitSelectionContext);\n let selected = false;\n let clearSelection = NO_CLEAR;\n if (own.selection !== undefined) {\n const [value, setValue] = readBinding(own.selection as BindingValue<Selection<T>>, own.onSelectionChange);\n selected = value instanceof Set ? value.size > 0 : value !== null && value !== undefined;\n clearSelection = () => setValue(value instanceof Set ? new Set<T>() : null);\n selection = {\n editing,\n isSelected: (tag) => (value instanceof Set ? value.has(tag as T) : value !== null && Object.is(value, tag)),\n select: (tag) => {\n if (value instanceof Set) {\n const next = new Set(value);\n if (next.has(tag as T)) next.delete(tag as T);\n else next.add(tag as T);\n setValue(next);\n } else {\n setValue(editing && Object.is(value, tag) ? null : (tag as T));\n }\n },\n };\n }\n useReportSplitSelection(split, selected, clearSelection, own.selection !== undefined);\n const refresh = useRefreshable(takeModifier(modifiers, 'refreshable'));\n Object.assign(listProps, refresh.props);\n // `.scrollEdgeEffectStyle` / `.scrollEdgeEffectHidden` (content margins are a scroll view's).\n const ownSettings = takeScrollSettings(modifiers);\n const edgeEffect = edgeEffectProp(useScrollSettings(ownSettings));\n if (edgeEffect) listProps['edgeEffect'] = edgeEffect;\n const element = (\n <LazyContext.Provider value=\"vertical\">\n {sb('list', listProps, refresh.handlers, providingScrollSettings(ownSettings, wrapRows(own.children)))}\n </LazyContext.Provider>\n );\n return applyModifiers(\n selection ? <ListSelectionContext.Provider value={selection}>{element}</ListSelectionContext.Provider> : element,\n modifiers,\n );\n}\n\n/** `Form { }`: an inset grouped list, as the shim draws it. */\nexport function Form(props: Omit<ListProps, 'listStyle' | 'selection' | 'onSelectionChange'>): ReactNode {\n return <List {...props} />;\n}\n\nexport interface SectionProps extends ViewModifiers {\n /** A string or a `<Text>` becomes the section's header text; any other view is a view header. */\n header?: ReactNode;\n footer?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Section(props: SectionProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const header = supplement(own.header);\n const footer = supplement(own.footer);\n const children: ReactNode[] = [];\n if (header.view) children.push(sb('sectionheader', {}, undefined, header.view));\n if (own.children !== undefined) children.push(wrapRows(own.children));\n if (footer.view) children.push(sb('sectionfooter', {}, undefined, footer.view));\n return applyModifiers(sb('section', { header: header.text, footer: footer.text }, undefined, children), modifiers);\n}\n\n/**\n * Rows with a tag (`.tag`, or a `NavigationLink` value) become `Row`s, so a\n * `List(selection:)` can select them; a `Row` from `ForEach`'s `onDelete`\n * keeps its own. Sections pass through (they wrap their own rows).\n */\nfunction wrapRows(children: ReactNode): ReactNode {\n // Lazy groups stay groups (they build their rows as they scroll in); the\n // rows before one count it as one child, the rows after as its rows.\n let offset = 0;\n return flattenChildren(children, { keepLazy: true }).map((element, index) => {\n const at = index + offset;\n if (element.type === LazyGroup) {\n const group = element.props as LazyGroupProps;\n offset += group.rows.length - 1;\n return { ...withKey(element, index), props: { ...group, start: at, wrap: wrapRow } };\n }\n return wrapRow(withKey(element, index), at);\n });\n}\n\n/** A row as its container holds it: a `Row` knows its index; a tagged view becomes a selectable `Row`. */\nfunction wrapRow(element: ReactElement, containerIndex: number): ReactElement {\n if (element.type === Section) return element;\n if (element.type === Row) return { ...element, props: { ...(element.props as RowProps), containerIndex } };\n const props = element.props as { tag?: unknown; value?: unknown };\n const tag = props.tag !== undefined ? props.tag : element.type === NavigationLink ? props.value : undefined;\n if (tag === undefined) return element;\n return (\n <Row key={element.key ?? containerIndex} tag={tag} containerIndex={containerIndex}>\n {element}\n </Row>\n );\n}\n\nfunction withKey(element: ReactElement, index: number): ReactElement {\n return element.key !== null ? element : { ...element, key: String(index) };\n}\n\nfunction supplement(node: ReactNode): { text: string | null; view: ReactElement | null } {\n if (node === undefined || node === null || node === false) return { text: null, view: null };\n if (typeof node === 'string' || typeof node === 'number') return { text: String(node), view: null };\n if (isValidElement(node) && node.type === Text) {\n const props = node.props as { children?: ReactNode };\n const only = Object.keys(props).every((key) => key === 'children');\n if (only) return { text: plainText(node), view: null };\n }\n return { text: null, view: isValidElement(node) ? node : null };\n}\n","import { useState, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, takeModifier, type ViewModifiers } from '../modifiers';\nimport { flattenChildren } from './stacks';\n\nexport interface TabViewProps<T> extends ViewModifiers {\n selection?: BindingValue<T>;\n onChange?: (value: T) => void;\n /** `<Tab>` children. */\n children?: ReactNode;\n}\n\nexport function TabView<T = number>(props: TabViewProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const tabs = flattenChildren(own.children);\n const tags = tabs.map((tab, index) => {\n const tag = (tab.props as { tag?: T }).tag;\n return (tag !== undefined ? tag : index) as T;\n });\n const [internal, setInternal] = useState<T>(tags[0] as T);\n const [selection, setSelection] = own.selection !== undefined ? readBinding(own.selection, own.onChange) : [internal, setInternal];\n const selected = Math.max(\n 0,\n tags.findIndex((tag) => Object.is(tag, selection)),\n );\n return applyModifiers(\n sb('tabview', { selected }, { select: (event) => tags[event.value] !== undefined && setSelection(tags[event.value] as T) }, tabs),\n modifiers,\n );\n}\n\nexport interface TabProps<T> extends ViewModifiers {\n title: string;\n systemImage?: string;\n role?: 'search';\n tag?: T;\n children?: ReactNode;\n}\n\n/** `Tab(\"Library\", systemImage: \"books.vertical\") { }` */\nexport function Tab<T>(props: TabProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const badge = takeModifier(modifiers, 'badge');\n const tabProps: Record<string, unknown> = { title: own.title, systemImage: own.systemImage ?? null };\n if (badge !== undefined && badge !== null) tabProps['badge'] = String(badge);\n if (own.role) tabProps['role'] = own.role;\n return applyModifiers(sb('tab', tabProps, undefined, own.children), modifiers);\n}\n","import type { ShapeKind, Stroke } from '@swiftbrowser/web/src/protocol';\nimport { useState, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ShapeSpec, type ViewModifiers } from '../modifiers';\nimport { Path, type CGRect } from '../path';\nimport { ColorValues, color, shapeStyle, type ColorValue, type StyleValue } from '../values';\n\nexport interface StrokeSpec {\n style?: StyleValue;\n lineWidth?: number;\n dash?: number[];\n dashPhase?: number;\n lineCap?: 'butt' | 'round' | 'square';\n lineJoin?: 'miter' | 'round' | 'bevel';\n miterLimit?: number;\n}\n\nexport type StrokeValue = StyleValue | StrokeSpec;\n\nexport interface ShapeProps extends ViewModifiers {\n /** `.fill(_:)`; without a fill or stroke the shape draws in the foreground color. */\n fill?: StyleValue;\n /** `.stroke(_:lineWidth:)` */\n stroke?: StrokeValue;\n /** `.strokeBorder(_:style:)`: the stroke inside the bounds. */\n strokeBorder?: StrokeValue;\n trim?: { from: number; to: number };\n}\n\nconst STYLE_KEYS = ['r', 'name', 'named', 'hierarchical', 'linearGradient', 'radialGradient', 'angularGradient', 'colorGradient', 'material'];\n\nfunction strokeOf(value: StrokeValue | undefined, inset: boolean): Stroke | null {\n if (value === undefined) return null;\n const isSpec = typeof value === 'object' && value !== null && !STYLE_KEYS.some((key) => key in value);\n const spec: StrokeSpec = isSpec ? (value as StrokeSpec) : { style: value as StyleValue };\n const stroke: Stroke = { color: shapeStyle(spec.style ?? 'primary'), lineWidth: spec.lineWidth ?? 1 };\n if (inset) stroke.inset = true;\n if (spec.dash) stroke.dash = spec.dash;\n if (spec.dashPhase !== undefined) stroke.dashPhase = spec.dashPhase;\n if (spec.lineCap) stroke.lineCap = spec.lineCap;\n if (spec.lineJoin) stroke.lineJoin = spec.lineJoin;\n if (spec.miterLimit !== undefined) stroke.miterLimit = spec.miterLimit;\n return stroke;\n}\n\nfunction shape(kind: ShapeKind, cornerRadius: number, props: ShapeProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const shapeProps: Record<string, unknown> = {\n shape: kind,\n cornerRadius,\n fill: own.fill !== undefined ? shapeStyle(own.fill) : null,\n stroke: strokeOf(own.strokeBorder, true) ?? strokeOf(own.stroke, false),\n };\n if (own.trim) shapeProps['trim'] = own.trim;\n return applyModifiers(sb('shape', shapeProps), modifiers);\n}\n\n/** Capsules, circles and ellipses carry this radius, like the shim. */\nconst ROUND = 9999;\n\nexport function Rectangle(props: ShapeProps): ReactNode {\n return shape('rectangle', 0, props);\n}\nRectangle.shape = { kind: 'rectangle', cornerRadius: 0 } satisfies ShapeSpec;\n\nexport interface RoundedRectangleProps extends ShapeProps {\n cornerRadius: number;\n}\n\nexport function RoundedRectangle(props: RoundedRectangleProps): ReactNode {\n const { cornerRadius, ...rest } = props;\n return shape('roundedRectangle', cornerRadius, rest);\n}\nRoundedRectangle.shape = { kind: 'roundedRectangle', cornerRadius: null } satisfies ShapeSpec;\n\nexport function Circle(props: ShapeProps): ReactNode {\n return shape('circle', ROUND, props);\n}\nCircle.shape = { kind: 'circle', cornerRadius: ROUND } satisfies ShapeSpec;\n\nexport function Capsule(props: ShapeProps): ReactNode {\n return shape('capsule', ROUND, props);\n}\nCapsule.shape = { kind: 'capsule', cornerRadius: ROUND } satisfies ShapeSpec;\n\nexport function Ellipse(props: ShapeProps): ReactNode {\n return shape('ellipse', ROUND, props);\n}\nEllipse.shape = { kind: 'ellipse', cornerRadius: ROUND } satisfies ShapeSpec;\n\nexport interface ContainerRelativeShapeProps extends ShapeProps {\n /** The container's corner radius (a widget's, a card's). */\n cornerRadius?: number;\n}\n\n/** `ContainerRelativeShape`: a rounded rectangle with its container's corners. */\nexport function ContainerRelativeShape(props: ContainerRelativeShapeProps): ReactNode {\n const { cornerRadius, ...rest } = props;\n return shape('containerRelative', cornerRadius ?? 0, rest);\n}\nContainerRelativeShape.shape = { kind: 'containerRelative', cornerRadius: null } satisfies ShapeSpec;\n\n// ---------------------------------------------------------------------------\n// Custom shapes\n// ---------------------------------------------------------------------------\n\nexport interface CustomShapeProps extends Omit<ShapeProps, 'trim'> {\n /** `path(in:)`: the shape's path for a rectangle of the size it is laid out at. */\n path: (rect: CGRect) => Path;\n /** `FillStyle(eoFill: true)` */\n evenOdd?: boolean;\n}\n\n/**\n * A custom `Shape`: the element reports its laid-out size, and the shape\n * draws `path(in:)` for that size, as the Swift shim does.\n */\nexport function Shape(props: CustomShapeProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [size, setSize] = useState<{ width: number; height: number } | null>(null);\n const shapeProps: Record<string, unknown> = {\n shape: 'path',\n cornerRadius: 0,\n fill: own.fill !== undefined ? shapeStyle(own.fill) : null,\n // A custom shape's border is its path stroked as is (the shim insets an InsettableShape first).\n stroke: strokeOf(own.strokeBorder ?? own.stroke, false),\n reportsSize: true,\n path: size ? own.path({ x: 0, y: 0, width: size.width, height: size.height }).svg() : '',\n size: size ?? { width: 0, height: 0 },\n };\n if (own.evenOdd) shapeProps['fillRule'] = 'evenodd';\n return applyModifiers(\n sb('shape', shapeProps, {\n geometry: (event) => {\n if (!size || size.width !== event.width || size.height !== event.height) setSize({ width: event.width, height: event.height });\n },\n }),\n modifiers,\n );\n}\n\nexport interface UnevenRoundedRectangleProps extends ShapeProps {\n topLeadingRadius?: number;\n bottomLeadingRadius?: number;\n bottomTrailingRadius?: number;\n topTrailingRadius?: number;\n}\n\n/** `UnevenRoundedRectangle`: a custom shape with a radius per corner. */\nexport function UnevenRoundedRectangle(props: UnevenRoundedRectangleProps): ReactNode {\n const { topLeadingRadius = 0, bottomLeadingRadius = 0, bottomTrailingRadius = 0, topTrailingRadius = 0, trim: _trim, ...rest } = props;\n const path = (rect: CGRect): Path => {\n const clamp = (radius: number): number => Math.max(0, Math.min(radius, rect.width / 2, rect.height / 2));\n const tl = clamp(topLeadingRadius);\n const tr = clamp(topTrailingRadius);\n const br = clamp(bottomTrailingRadius);\n const bl = clamp(bottomLeadingRadius);\n const { width: w, height: h } = rect;\n const p = new Path().move({ x: tl, y: 0 }).addLine({ x: w - tr, y: 0 });\n if (tr) p.addArc({ x: w - tr, y: tr }, tr, -90, 0, false);\n p.addLine({ x: w, y: h - br });\n if (br) p.addArc({ x: w - br, y: h - br }, br, 0, 90, false);\n p.addLine({ x: bl, y: h });\n if (bl) p.addArc({ x: bl, y: h - bl }, bl, 90, 180, false);\n p.addLine({ x: 0, y: tl });\n if (tl) p.addArc({ x: tl, y: tl }, tl, 180, 270, false);\n return p.closeSubpath();\n };\n return <Shape {...rest} path={path} />;\n}\n\n// ---------------------------------------------------------------------------\n// Color as a view\n// ---------------------------------------------------------------------------\n\nexport interface ColorViewProps extends ViewModifiers {\n color: ColorValue;\n}\n\n/** `Color.red` as a view: a box of the color that fills its proposal. */\nfunction ColorView(props: ColorViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('color', { color: color(own.color) }), modifiers);\n}\n\n/**\n * `Color`: as a view, `<Color color=\"red\" />`; as values, `Color.red`,\n * `Color.opacity('black', 0.2)`, `Color.gradient('teal')`, `Color.hex('#336699')`.\n */\nexport const Color: typeof ColorView & typeof ColorValues = Object.assign(ColorView, ColorValues);\n","/**\n * `Host`: ordinary React DOM inside a SwiftUI tree. The children render in a\n * react-dom root of their own, inside a `host` element the layout engine\n * sizes (docs/ops-protocol.md, \"Host elements\"): by its content, like text,\n * or filling its proposal. The DOM content sees this package's contexts\n * (`useDismiss`, `useNavigation`, the environment) and any it names.\n */\n\nimport { notifyHostContentChange, registerHostContent, unregisterHostContent } from '@swiftbrowser/web/src/hostContent';\nimport { useEffect, useId, useLayoutEffect, useRef, useState, type CSSProperties, type Context, type ReactNode } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { flushSync } from 'react-dom';\nimport { useContextBridge } from '../bridge';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\n\nexport interface HostProps extends ViewModifiers {\n /**\n * `content` (the default): the box is as wide as the content wants, at most\n * the proposed width, and as tall as the content at that width. `fill`:\n * the box takes the proposal (combine with `frame`); the content fills it.\n */\n sizing?: 'fill' | 'content';\n /** Contexts of the SwiftUI tree the DOM content reads (this package's own always cross). */\n contexts?: readonly Context<unknown>[];\n className?: string;\n style?: CSSProperties;\n children?: ReactNode;\n}\n\nexport function Host(props: HostProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const key = useId();\n // The content element, one per mount. It is registered from the effects\n // below, not here: StrictMode runs this initializer twice and keeps one\n // result, and a registration made here would name the other.\n const [content] = useState<HTMLElement | null>(() => {\n if (typeof document === 'undefined') return null;\n const element = document.createElement('div');\n element.className = 'sb-host-content';\n return element;\n });\n const bridge = useContextBridge(own.contexts);\n const root = useRef<Root | null>(null);\n const mounted = useRef(false);\n // In `fill` sizing the wrapper is as tall as the box, so percentage\n // heights in the content (`height: 100%`) reach it.\n const sizing = own.sizing ?? 'content';\n const style: CSSProperties | undefined = sizing === 'fill' ? { height: '100%', ...own.style } : own.style;\n const tree = bridge(\n <div className={own.className} style={style}>\n {own.children}\n </div>,\n );\n\n useLayoutEffect(() => {\n if (!content) return;\n mounted.current = true;\n // After the commit that created the `host` element: the renderer adopts a\n // content registered late at the change notice below. Registered again\n // after StrictMode's simulated unmount, which unregistered it.\n registerHostContent(key, content);\n root.current ??= createRoot(content);\n const current = root.current;\n // In a microtask: still before the browser paints, but outside any commit\n // react-dom may be in the middle of (a `SwiftUIView` is one of its\n // components). The synchronous render lets the engine measure the new\n // content right away, and the tree is laid out again around it.\n queueMicrotask(() => {\n if (root.current !== current) return;\n flushSync(() => current.render(tree));\n notifyHostContentChange(key);\n });\n });\n\n useEffect(\n () => () => {\n mounted.current = false;\n unregisterHostContent(key);\n // Not inside the SwiftUI root's commit; and not at all when the host\n // mounted again meanwhile (StrictMode's simulated remount keeps the root).\n queueMicrotask(() => {\n if (mounted.current) return;\n const current = root.current;\n root.current = null;\n current?.unmount();\n });\n },\n [key],\n );\n\n return applyModifiers(sb('host', { content: key, sizing }), modifiers);\n}\n","import { Fragment, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { Button } from './controls';\nimport { Text } from './text';\n\nexport interface MenuProps extends ViewModifiers {\n /** The label: a title, or any view. */\n title?: string;\n label?: ReactNode;\n /** The items: buttons, pickers, dividers, sections, texts, nested menus. */\n children?: ReactNode;\n}\n\n/** `Menu(\"Sort\") { … }`: the label opens a popover of the items. */\nexport function Menu(props: MenuProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.label;\n return applyModifiers(\n sb('menu', {}, undefined, [\n <Fragment key=\"label\">{sb('zstack', { alignment: 'center' }, undefined, label)}</Fragment>,\n <Fragment key=\"items\">{own.children}</Fragment>,\n ]),\n modifiers,\n );\n}\n\nexport interface EditButtonProps extends ViewModifiers {\n /** The list's edit mode (`List editing={…}`). */\n editMode: BindingValue<boolean>;\n onChange?: (editing: boolean) => void;\n}\n\n/** `EditButton()`: \"Edit\" / \"Done\", flipping the edit mode it is given. */\nexport function EditButton(props: EditButtonProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [editing, setEditing] = readBinding(own.editMode, own.onChange);\n return applyModifiers(<Button title={editing ? 'Done' : 'Edit'} action={() => setEditing(!editing)} />, modifiers);\n}\n","import { useEffect, useState, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\n\nexport interface AsyncImageProps extends ViewModifiers {\n url: string;\n /** `.resizable()` on the loaded image. */\n resizable?: boolean;\n /** Shown until the image loaded (nothing by default). */\n placeholder?: ReactNode;\n /** Shown when the image failed to load (the placeholder by default). */\n failure?: ReactNode;\n}\n\ninterface Loaded {\n url: string;\n width: number;\n height: number;\n}\n\nconst loaded = new Map<string, Loaded | 'failed'>();\n\n/**\n * `AsyncImage(url:)`: the page loads the image to learn its size (the\n * engine lays a remote image out by its pixel size, as the Swift core does\n * after its `image` request), then shows it.\n */\nexport function AsyncImage(props: AsyncImageProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [state, setState] = useState<Loaded | 'failed' | null>(() => loaded.get(own.url) ?? null);\n useEffect(() => {\n const cached = loaded.get(own.url);\n if (cached) {\n setState(cached);\n return;\n }\n if (typeof Image === 'undefined') return;\n let live = true;\n const image = new Image();\n image.onload = () => {\n const result: Loaded = { url: own.url, width: image.naturalWidth, height: image.naturalHeight };\n loaded.set(own.url, result);\n if (live) setState(result);\n };\n image.onerror = () => {\n loaded.set(own.url, 'failed');\n if (live) setState('failed');\n };\n image.src = own.url;\n return () => {\n live = false;\n };\n }, [own.url]);\n if (state === null) return own.placeholder ?? null;\n if (state === 'failed') return own.failure ?? own.placeholder ?? null;\n return applyModifiers(\n sb('image', { url: state.url, resizable: own.resizable ?? false, width: state.width, height: state.height }),\n modifiers,\n );\n}\n","/**\n * Swift Charts: `Chart` with bar, line, area, point and rule marks. The\n * marks are declarations; `Chart` reads them, builds the scales (bands for\n * categories, \"nice\" numeric domains, calendar strides for dates), turns\n * every value into the protocol's unit coordinates and emits one `chart`\n * element with its axes and legend, as Sources/SwiftUI/Charts does.\n */\n\nimport type {\n ChartAxis,\n ChartInterpolation,\n ChartLegend,\n ChartMark,\n ChartSymbol,\n FrameAlignment,\n ShapeStyle,\n} from '@swiftbrowser/web/src/protocol';\nimport { Fragment, type ReactElement, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { shapeStyle, type StyleValue } from '../values';\nimport { flattenChildren } from './stacks';\n\nexport type ChartValue = number | Date | string;\n\nexport interface AnnotationSpec {\n position?: 'top' | 'bottom' | 'leading' | 'trailing' | 'overlay';\n alignment?: FrameAlignment;\n spacing?: number;\n content: ReactNode;\n}\n\ninterface MarkCommon {\n foregroundStyle?: StyleValue;\n /** `.foregroundStyle(by:)`: a series name; the palette colors it and the legend lists it. */\n foregroundStyleBy?: string;\n opacity?: number;\n /** `.annotation(position:alignment:spacing:) { }` */\n annotation?: AnnotationSpec;\n}\n\nexport interface BarMarkProps extends MarkCommon {\n x: ChartValue;\n y: ChartValue;\n /** `yStart:` (0 by default). */\n yStart?: number;\n cornerRadius?: number;\n /** `width: .fixed(points)` */\n width?: number;\n}\nexport interface LineMarkProps extends MarkCommon {\n x: ChartValue;\n y: number;\n series?: string;\n interpolation?: ChartInterpolation;\n lineWidth?: number;\n symbol?: ChartSymbol;\n symbolSize?: number;\n}\nexport interface AreaMarkProps extends MarkCommon {\n x: ChartValue;\n y: number;\n yStart?: number;\n series?: string;\n interpolation?: ChartInterpolation;\n}\nexport interface PointMarkProps extends MarkCommon {\n x: ChartValue;\n y: number;\n symbol?: ChartSymbol;\n symbolSize?: number;\n}\nexport interface RuleMarkProps extends MarkCommon {\n /** A vertical rule at `x`, or a horizontal one at `y`. */\n x?: ChartValue;\n y?: number;\n xStart?: ChartValue;\n xEnd?: ChartValue;\n yStart?: number;\n yEnd?: number;\n lineWidth?: number;\n}\n\n/** The marks render nothing themselves; `Chart` reads them. */\nexport function BarMark(_props: BarMarkProps): null {\n return null;\n}\nexport function LineMark(_props: LineMarkProps): null {\n return null;\n}\nexport function AreaMark(_props: AreaMarkProps): null {\n return null;\n}\nexport function PointMark(_props: PointMarkProps): null {\n return null;\n}\nexport function RuleMark(_props: RuleMarkProps): null {\n return null;\n}\n\nexport interface ChartProps extends ViewModifiers {\n /** `.chartXAxis(.hidden)` is `null`; the position otherwise. */\n xAxis?: 'bottom' | 'top' | null;\n yAxis?: 'trailing' | 'leading' | null;\n /** `.chartLegend`: the position, or `null` to hide it. Shown at the top when a series exists. */\n legend?: 'top' | 'bottom' | 'leading' | 'trailing' | null;\n /** `.chartXScale(domain:)`: numbers, dates or the categories in order. */\n xScale?: { domain?: readonly [ChartValue, ChartValue] | readonly string[] };\n /** `.chartYScale(domain:)`; `includesZero` is true by default, as in Swift Charts. */\n yScale?: { domain?: readonly [number, number]; includesZero?: boolean };\n children?: ReactNode;\n}\n\nconst PALETTE = ['blue', 'green', 'orange', 'purple', 'red', 'teal', 'yellow', 'pink', 'indigo', 'mint', 'cyan', 'brown'] as const;\nconst SYMBOLS: ChartSymbol[] = ['circle', 'square', 'triangle', 'diamond', 'cross', 'plus', 'asterisk'];\n\ntype MarkKind = 'bar' | 'line' | 'area' | 'point' | 'rule';\ninterface Declared {\n kind: MarkKind;\n props: BarMarkProps & LineMarkProps & AreaMarkProps & PointMarkProps & RuleMarkProps;\n}\n\nfunction declaredMarks(children: ReactNode): Declared[] {\n const kinds = new Map<unknown, MarkKind>([\n [BarMark, 'bar'],\n [LineMark, 'line'],\n [AreaMark, 'area'],\n [PointMark, 'point'],\n [RuleMark, 'rule'],\n ]);\n const result: Declared[] = [];\n for (const element of flattenChildren(children)) {\n const kind = kinds.get(element.type);\n if (kind) result.push({ kind, props: element.props as Declared['props'] });\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Scales\n// ---------------------------------------------------------------------------\n\ninterface Scale {\n /** Unit position of a value along the axis (0 → 1 left to right / bottom to top). */\n unit(value: ChartValue): number;\n /** The band of a category, or the band around a continuous center. */\n band(value: ChartValue): [number, number];\n ticks: number[];\n gridLines: number[];\n labels: { at: number; text: string; anchor?: 'leading' }[];\n domain: [number, number];\n kind: 'band' | 'number' | 'time';\n}\n\nconst asNumber = (value: ChartValue): number => (value instanceof Date ? value.getTime() : typeof value === 'number' ? value : NaN);\n\nfunction bandScale(categories: string[]): Scale {\n const n = Math.max(categories.length, 1);\n const index = new Map(categories.map((c, i) => [c, i]));\n const center = (value: ChartValue): number => ((index.get(String(value)) ?? 0) + 0.5) / n;\n return {\n kind: 'band',\n unit: center,\n band: (value) => {\n const i = index.get(String(value)) ?? 0;\n return [i / n, (i + 1) / n];\n },\n ticks: categories.map((_, i) => (i + 0.5) / n),\n gridLines: [],\n labels: categories.map((text, i) => ({ at: (i + 0.5) / n, text })),\n domain: [0, n],\n };\n}\n\n/** Steps of 1, 2, 2.5, 5 × 10ᵏ, the one nearest `span / (desired − 1)`. */\nexport function niceStep(span: number, desired = 5): number {\n if (!(span > 0)) return 1;\n const raw = span / Math.max(desired - 1, 1);\n const magnitude = 10 ** Math.floor(Math.log10(raw));\n let best = magnitude;\n // A tie goes to the larger step (fewer ticks).\n for (const candidate of [1, 2, 2.5, 5, 10].map((m) => m * magnitude)) {\n if (Math.abs(candidate - raw) <= Math.abs(best - raw)) best = candidate;\n }\n return best;\n}\n\nfunction decimalsOf(step: number): number {\n const text = step.toString();\n const dot = text.indexOf('.');\n return dot < 0 ? 0 : text.length - dot - 1;\n}\n\nfunction numberScale(values: number[], options: { includesZero?: boolean; domain?: readonly [number, number] } = {}): Scale {\n let min = Math.min(...values);\n let max = Math.max(...values);\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n min = 0;\n max = 1;\n }\n if (options.includesZero) {\n min = Math.min(min, 0);\n max = Math.max(max, 0);\n }\n if (min === max) {\n if (min === 0) max = 1;\n else {\n min = Math.min(min, 0);\n max = Math.max(max, 0);\n if (min === max) max = min + 1;\n }\n }\n const step = niceStep(max - min);\n let lo: number;\n let hi: number;\n if (options.domain) [lo, hi] = options.domain;\n else {\n lo = Math.floor(min / step + 1e-9) * step;\n hi = Math.ceil(max / step - 1e-9) * step;\n }\n const ticks: number[] = [];\n const first = Math.ceil(lo / step - 1e-9) * step;\n for (let value = first; value <= hi + 1e-9; value += step) ticks.push(Number(value.toFixed(10)));\n const decimals = decimalsOf(step);\n const unit = (value: ChartValue): number => (asNumber(value) - lo) / (hi - lo || 1);\n const format = new Intl.NumberFormat('en-US', { maximumFractionDigits: decimals });\n return {\n kind: 'number',\n unit,\n band: (value) => [unit(value), unit(value)],\n ticks: ticks.map(unit),\n gridLines: ticks.map(unit),\n labels: ticks.map((value) => ({ at: unit(value), text: format.format(value) })),\n domain: [lo, hi],\n };\n}\n\nconst HOUR = 3_600_000;\nconst DAY = 24 * HOUR;\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/** Calendar ticks in UTC, with the stride that gives at most `desired + 1` intervals. */\nexport function timeTicks(min: number, max: number, desired = 8): { ticks: number[]; format: (ms: number) => string } {\n const span = Math.max(max - min, 1);\n const pick = (strides: number[], unit: number): number => strides.find((s) => span / (s * unit) <= desired + 1) ?? strides[strides.length - 1]!;\n const ticks: number[] = [];\n if (span <= 3 * DAY) {\n const hours = pick([1, 3, 6, 12], HOUR);\n const start = Math.floor(min / (hours * HOUR)) * hours * HOUR;\n for (let t = start; t <= max; t += hours * HOUR) if (t >= min) ticks.push(t);\n return {\n ticks,\n format: (ms) => {\n const h = new Date(ms).getUTCHours();\n const minute = new Date(ms).getUTCMinutes();\n const suffix = h < 12 ? 'AM' : 'PM';\n const hour12 = h % 12 === 0 ? 12 : h % 12;\n return minute === 0 ? `${hour12} ${suffix}` : `${hour12}:${String(minute).padStart(2, '0')} ${suffix}`;\n },\n };\n }\n if (span <= 45 * DAY) {\n const days = pick([1, 2, 7, 14], DAY);\n const start = Math.floor(min / DAY) * DAY;\n for (let t = start; t <= max; t += days * DAY) if (t >= min) ticks.push(t);\n return { ticks, format: (ms) => `${MONTHS[new Date(ms).getUTCMonth()]} ${new Date(ms).getUTCDate()}` };\n }\n const months = span / (30.4 * DAY);\n if (months <= 6 * (desired + 1)) {\n const stride = pick([1, 2, 3, 6], 30.4 * DAY);\n const first = new Date(min);\n let year = first.getUTCFullYear();\n let month = Math.floor(first.getUTCMonth() / stride) * stride;\n for (;;) {\n const t = Date.UTC(year, month, 1);\n if (t > max) break;\n if (t >= min) ticks.push(t);\n month += stride;\n if (month >= 12) {\n month -= 12;\n year += 1;\n }\n }\n const years = new Set(ticks.map((t) => new Date(t).getUTCFullYear()));\n return {\n ticks,\n format: (ms) => {\n const d = new Date(ms);\n return years.size > 1 ? `${MONTHS[d.getUTCMonth()]} ${d.getUTCFullYear()}` : MONTHS[d.getUTCMonth()]!;\n },\n };\n }\n const stride = pick([1, 2, 5, 10], 365.25 * DAY);\n const startYear = Math.floor(new Date(min).getUTCFullYear() / stride) * stride;\n for (let year = startYear; ; year += stride) {\n const t = Date.UTC(year, 0, 1);\n if (t > max) break;\n if (t >= min) ticks.push(t);\n }\n return { ticks, format: (ms) => String(new Date(ms).getUTCFullYear()) };\n}\n\nfunction timeScale(values: number[], domain?: readonly [ChartValue, ChartValue]): Scale {\n let lo = domain ? asNumber(domain[0]) : Math.min(...values);\n let hi = domain ? asNumber(domain[1]) : Math.max(...values);\n if (!Number.isFinite(lo) || !Number.isFinite(hi)) {\n lo = 0;\n hi = DAY;\n }\n if (lo === hi) hi = lo + DAY;\n const { ticks, format } = timeTicks(lo, hi);\n const unit = (value: ChartValue): number => (asNumber(value) - lo) / (hi - lo);\n return {\n kind: 'time',\n unit,\n band: (value) => [unit(value), unit(value)],\n ticks: ticks.map(unit),\n gridLines: ticks.map(unit),\n labels: ticks.map((t) => ({ at: unit(t), text: format(t), anchor: 'leading' as const })),\n domain: [lo, hi],\n };\n}\n\nfunction scaleFor(values: ChartValue[], options: { includesZero?: boolean; domain?: ChartProps['xScale'] extends infer S ? (S extends { domain?: infer D } ? D : never) : never }): Scale {\n const domain = options.domain;\n if (domain && domain.length > 2) return bandScale([...(domain as readonly string[])]);\n if (domain && domain.length === 2 && typeof domain[0] === 'string') return bandScale([...(domain as readonly string[])]);\n if (values.some((v) => typeof v === 'string')) {\n const categories: string[] = [];\n for (const v of values) if (!categories.includes(String(v))) categories.push(String(v));\n return bandScale(categories);\n }\n if (values.some((v) => v instanceof Date)) return timeScale(values.map(asNumber), domain as readonly [ChartValue, ChartValue] | undefined);\n return numberScale(values.map(asNumber), { includesZero: options.includesZero, domain: domain as readonly [number, number] | undefined });\n}\n\n// ---------------------------------------------------------------------------\n// Chart\n// ---------------------------------------------------------------------------\n\nexport function Chart(props: ChartProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const marks = declaredMarks(own.children);\n\n // Series, in first-seen order, colored from the palette.\n const series: string[] = [];\n for (const mark of marks) {\n const key = mark.props.foregroundStyleBy;\n if (key !== undefined && !series.includes(key)) series.push(key);\n }\n const styleOf = (mark: Declared): ShapeStyle => {\n if (mark.props.foregroundStyle !== undefined) return shapeStyle(mark.props.foregroundStyle);\n const key = mark.props.foregroundStyleBy;\n if (key !== undefined) return { name: PALETTE[series.indexOf(key) % PALETTE.length]! };\n return { name: 'blue' };\n };\n\n // Scales from every value a mark touches.\n const xValues: ChartValue[] = [];\n const yValues: ChartValue[] = [];\n for (const { kind, props: p } of marks) {\n if (p.x !== undefined) xValues.push(p.x);\n if (p.xStart !== undefined) xValues.push(p.xStart);\n if (p.xEnd !== undefined) xValues.push(p.xEnd);\n if (p.y !== undefined) yValues.push(p.y);\n if (p.yStart !== undefined) yValues.push(p.yStart);\n if (p.yEnd !== undefined) yValues.push(p.yEnd);\n if (kind === 'bar' || kind === 'area') yValues.push(p.yStart ?? 0);\n }\n const xScale = scaleFor(xValues, { domain: own.xScale?.domain });\n const yScale = scaleFor(yValues, { includesZero: own.yScale?.includesZero ?? true, domain: own.yScale?.domain });\n // Unit coordinates, rounded so equal values compare equal.\n const round = (n: number): number => Math.round(n * 1e6) / 1e6;\n const ux = (v: ChartValue): number => round(xScale.unit(v));\n const uy = (v: ChartValue): number => round(1 - yScale.unit(v));\n\n // Bars on a continuous x axis: the band is the smallest gap between centers.\n let continuousBand = 1;\n if (xScale.kind !== 'band') {\n const centers = [...new Set(marks.filter((m) => m.kind === 'bar').map((m) => ux(m.props.x)))].sort((a, b) => a - b);\n for (let i = 1; i < centers.length; i++) continuousBand = Math.min(continuousBand, centers[i]! - centers[i - 1]!);\n }\n\n const encoded: ChartMark[] = [];\n const items: ReactElement[] = [];\n const annotate = (mark: Declared, rect: { x0: number; x1: number; y0: number; y1: number }): void => {\n const annotation = mark.props.annotation;\n if (!annotation) return;\n items.push(\n <Fragment key={items.length}>\n {sb(\n 'chartitem',\n {\n role: 'annotation',\n ...rect,\n position: annotation.position ?? 'top',\n alignment: annotation.alignment ?? 'center',\n spacing: annotation.spacing ?? 4,\n },\n undefined,\n annotation.content,\n )}\n </Fragment>,\n );\n };\n const common = (mark: Declared): { style: ShapeStyle; opacity?: number } => {\n const base: { style: ShapeStyle; opacity?: number } = { style: styleOf(mark) };\n if (mark.props.opacity !== undefined) base.opacity = mark.props.opacity;\n return base;\n };\n\n // Lines and areas group by series key, in first-seen order, points in x order.\n const groups = new Map<string, Declared[]>();\n for (const mark of marks) {\n if (mark.kind !== 'line' && mark.kind !== 'area') continue;\n const key = `${mark.kind}:${mark.props.series ?? mark.props.foregroundStyleBy ?? ''}`;\n const group = groups.get(key);\n if (group) group.push(mark);\n else groups.set(key, [mark]);\n }\n const emittedGroups = new Set<string>();\n\n for (const mark of marks) {\n const p = mark.props;\n switch (mark.kind) {\n case 'bar': {\n const style = common(mark);\n const [b0, b1] = xScale.kind === 'band' ? xScale.band(p.x) : [ux(p.x) - continuousBand / 2, ux(p.x) + continuousBand / 2];\n const center = round((b0 + b1) / 2);\n const half = round(((b1 - b0) * 0.8) / 2);\n const top = uy(Math.max(asNumber(p.y), p.yStart ?? 0));\n const bottom = uy(Math.min(asNumber(p.y), p.yStart ?? 0));\n const rect: ChartMark = {\n kind: 'rect',\n ...style,\n x0: p.width !== undefined ? center : round(center - half),\n x1: p.width !== undefined ? center : round(center + half),\n y0: top,\n y1: bottom,\n cornerRadius: p.cornerRadius ?? 0,\n fixedWidth: p.width ?? null,\n };\n encoded.push(rect);\n annotate(mark, { x0: rect.x0, x1: rect.x1, y0: top, y1: bottom });\n break;\n }\n case 'line':\n case 'area': {\n const key = `${mark.kind}:${p.series ?? p.foregroundStyleBy ?? ''}`;\n if (emittedGroups.has(key)) {\n annotate(mark, { x0: ux(p.x), x1: ux(p.x), y0: uy(p.y), y1: uy(p.y) });\n break;\n }\n emittedGroups.add(key);\n const group = [...groups.get(key)!].sort((a, b) => ux(a.props.x) - ux(b.props.x));\n const first = group[0]!;\n if (mark.kind === 'line') {\n const line: ChartMark = {\n kind: 'line',\n ...common(first),\n points: group.map((m) => ({ x: ux(m.props.x), y: uy(m.props.y) })),\n lineWidth: first.props.lineWidth ?? 2,\n interpolation: first.props.interpolation ?? 'linear',\n symbol: first.props.symbol ?? (first.props.foregroundStyleBy !== undefined && marks.some((m) => m.props.symbol) ? SYMBOLS[series.indexOf(first.props.foregroundStyleBy) % SYMBOLS.length]! : null),\n symbolSize: first.props.symbolSize ?? 8,\n };\n encoded.push(line);\n } else {\n const area: ChartMark = {\n kind: 'area',\n ...common(first),\n points: group.map((m) => ({\n x: ux(m.props.x),\n y0: uy(Math.max(m.props.y, m.props.yStart ?? 0)),\n y1: uy(Math.min(m.props.y, m.props.yStart ?? 0)),\n })),\n interpolation: first.props.interpolation ?? 'linear',\n };\n encoded.push(area);\n }\n annotate(mark, { x0: ux(p.x), x1: ux(p.x), y0: uy(p.y), y1: uy(p.y) });\n break;\n }\n case 'point': {\n const point: ChartMark = { kind: 'point', ...common(mark), x: ux(p.x), y: uy(p.y), symbol: p.symbol ?? 'circle', symbolSize: p.symbolSize ?? 8 };\n encoded.push(point);\n annotate(mark, { x0: point.x, x1: point.x, y0: point.y, y1: point.y });\n break;\n }\n case 'rule': {\n const vertical = p.x !== undefined;\n const rule: ChartMark = {\n kind: 'rule',\n ...common(mark),\n x0: vertical ? ux(p.x!) : p.xStart !== undefined ? ux(p.xStart) : 0,\n x1: vertical ? ux(p.x!) : p.xEnd !== undefined ? ux(p.xEnd) : 1,\n y0: vertical ? (p.yEnd !== undefined ? uy(p.yEnd) : 0) : uy(p.y ?? 0),\n y1: vertical ? (p.yStart !== undefined ? uy(p.yStart) : 1) : uy(p.y ?? 0),\n lineWidth: p.lineWidth ?? 1,\n };\n encoded.push(rule);\n annotate(mark, { x0: rule.x0, x1: rule.x1, y0: rule.y0, y1: rule.y1 });\n break;\n }\n default:\n break;\n }\n }\n\n const axis = (scale: Scale, position: ChartAxis['position'], flipY: boolean): ChartAxis => {\n const flip = (u: number): number => round(flipY ? 1 - u : u);\n return {\n position,\n gridLines: scale.gridLines.map(flip),\n ticks: scale.ticks.map(flip),\n labels: scale.labels.map((label) => ({ ...label, at: flip(label.at) })),\n };\n };\n const chartProps = {\n marks: encoded,\n xAxis: own.xAxis === null ? null : axis(xScale, own.xAxis ?? 'bottom', false),\n yAxis: own.yAxis === null ? null : axis(yScale, own.yAxis ?? 'trailing', true),\n legend:\n own.legend === null || series.length === 0\n ? null\n : ({\n position: own.legend ?? 'top',\n items: series.map((label, index) => ({ label, style: { name: PALETTE[index % PALETTE.length]! }, symbol: null })),\n } satisfies ChartLegend),\n };\n return applyModifiers(sb('chart', chartProps, undefined, items.length ? items : undefined), modifiers);\n}\n","/**\n * Gauges, `ViewThatFits`, lazy stacks, and the composite containers the\n * shim builds from other views: `ContentUnavailableView`, `GroupBox`,\n * `ControlGroup`, `DisclosureGroup`.\n */\n\nimport type { GaugeStyle, HStackAlignment, VStackAlignment } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, useState, type ReactNode } from 'react';\nimport { LazyContext } from '../lazy';\nimport { readBinding, type BindingValue } from '../binding';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, styled, type ViewModifiers } from '../modifiers';\nimport { withAnimation } from '../host/root';\nimport { Button } from './controls';\nimport { RoundedRectangle } from './shapes';\nimport { HStack, Spacer, VStack } from './stacks';\nimport { Image, Text } from './text';\n\n// ---------------------------------------------------------------------------\n// Gauge\n// ---------------------------------------------------------------------------\n\nexport interface GaugeProps extends ViewModifiers {\n value: number;\n /** `in: 0...1` */\n range?: readonly [number, number];\n label?: ReactNode;\n currentValueLabel?: ReactNode;\n gaugeStyle?: Exclude<GaugeStyle, 'progress'>;\n}\n\n/** `Gauge(value:in:) { label } currentValueLabel: { }` */\nexport function Gauge(props: GaugeProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [min, max] = own.range ?? [0, 1];\n const value = (own.value - min) / (max - min || 1);\n const children: ReactNode[] = [];\n const asView = (node: ReactNode): ReactNode => (typeof node === 'string' || typeof node === 'number' ? <Text>{node}</Text> : node);\n if (own.label !== undefined) children.push(<Fragment key=\"label\">{asView(own.label)}</Fragment>);\n if (own.currentValueLabel !== undefined) children.push(<Fragment key=\"current\">{asView(own.currentValueLabel)}</Fragment>);\n return applyModifiers(\n sb(\n 'gauge',\n {\n value: Math.min(1, Math.max(0, value)),\n style: own.gaugeStyle ?? 'automatic',\n hasLabel: own.label !== undefined,\n hasCurrentValueLabel: own.currentValueLabel !== undefined,\n },\n undefined,\n children.length ? children : undefined,\n ),\n modifiers,\n );\n}\n\n// ---------------------------------------------------------------------------\n// ViewThatFits\n// ---------------------------------------------------------------------------\n\nexport interface ViewThatFitsProps extends ViewModifiers {\n /** The axes a candidate must fit on (`in:`); both by default. */\n axes?: 'horizontal' | 'vertical' | 'both';\n /** The candidates, preferred first. */\n children?: ReactNode;\n}\n\n/** `ViewThatFits`: the first child whose ideal size fits, else the last. */\nexport function ViewThatFits(props: ViewThatFitsProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('viewthatfits', { axes: own.axes ?? 'both' }, undefined, own.children), modifiers);\n}\n\n// ---------------------------------------------------------------------------\n// Lazy stacks\n// ---------------------------------------------------------------------------\n\n\nexport interface LazyVStackProps extends ViewModifiers {\n alignment?: VStackAlignment;\n spacing?: number | null;\n /** `.scrollTargetLayout()`: the children are the scroll view's snap points. */\n scrollTargetLayout?: boolean;\n children?: ReactNode;\n}\n\n/** `LazyVStack`: a `VStack` whose long `ForEach`es build their rows as they scroll into view. */\nexport function LazyVStack(props: LazyVStackProps): ReactNode {\n return (\n <LazyContext.Provider value=\"vertical\">\n <VStack {...props} />\n </LazyContext.Provider>\n );\n}\n\nexport interface LazyHStackProps extends ViewModifiers {\n alignment?: HStackAlignment;\n spacing?: number | null;\n scrollTargetLayout?: boolean;\n children?: ReactNode;\n}\n\nexport function LazyHStack(props: LazyHStackProps): ReactNode {\n return (\n <LazyContext.Provider value=\"horizontal\">\n <HStack {...props} />\n </LazyContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Composites\n// ---------------------------------------------------------------------------\n\nexport interface ContentUnavailableViewProps extends ViewModifiers {\n title: ReactNode;\n systemImage?: string;\n /** A string or a view. */\n description?: ReactNode;\n actions?: ReactNode;\n}\n\n/** `ContentUnavailableView(_:systemImage:description:)`: the empty state iOS shows, filling its space. */\nexport function ContentUnavailableView(props: ContentUnavailableViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const title = typeof own.title === 'string' ? <Text>{own.title}</Text> : own.title;\n const description = typeof own.description === 'string' ? <Text>{own.description}</Text> : own.description;\n return applyModifiers(\n <VStack spacing={16} padding={['horizontal', 32]} frame={{ maxWidth: Infinity, maxHeight: Infinity }}>\n <VStack spacing={8}>\n <VStack spacing={12}>\n {own.systemImage !== undefined && <Image systemName={own.systemImage} font={{ size: 48 }} foregroundStyle=\"secondary\" />}\n {styled({ multilineTextAlignment: 'center' }, styled({ font: { textStyle: 'title2', weight: 'bold' } }, title))}\n </VStack>\n {description !== undefined &&\n styled({ multilineTextAlignment: 'center' }, styled({ foreground: { hierarchical: 2 } }, styled({ font: { textStyle: 'callout' } }, description)))}\n </VStack>\n {own.actions}\n </VStack>,\n modifiers,\n );\n}\n\n/** `ContentUnavailableView.search(text:)` */\nContentUnavailableView.search = (text?: string): ReactNode => (\n <ContentUnavailableView\n title={text ? `No Results for “${text}”` : 'No Results'}\n systemImage=\"magnifyingglass\"\n description=\"Check the spelling or try a new search.\"\n />\n);\n\nexport interface GroupBoxProps extends ViewModifiers {\n label?: ReactNode;\n children?: ReactNode;\n}\n\n/** `GroupBox`: the label (headline) over the content, in a padded rounded box. */\nexport function GroupBox(props: GroupBoxProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const label = typeof own.label === 'string' ? <Text>{own.label}</Text> : own.label;\n return applyModifiers(\n <VStack\n alignment=\"leading\"\n spacing={8}\n padding={16}\n background={{ fill: 'secondarySystemBackground', in: <RoundedRectangle cornerRadius={8} /> }}\n >\n {label !== undefined && styled({ font: { textStyle: 'headline' } }, label)}\n {own.children}\n </VStack>,\n modifiers,\n );\n}\n\n/** `ControlGroup`: its controls, flowing in the enclosing stack (or items of their own in a menu). Its label is not drawn. */\nexport function ControlGroup(props: { label?: ReactNode; children?: ReactNode } & ViewModifiers): ReactNode {\n const { own, modifiers } = splitProps(props);\n return modifiers.length ? applyModifiers(<>{own.children}</>, modifiers) : own.children;\n}\n\nexport interface DisclosureGroupProps extends ViewModifiers {\n label: ReactNode;\n isExpanded?: BindingValue<boolean>;\n onExpandedChange?: (expanded: boolean) => void;\n children?: ReactNode;\n}\n\n/**\n * `DisclosureGroup`: a row with the label and a chevron that turns down as\n * the content opens below it, animated.\n */\nexport function DisclosureGroup(props: DisclosureGroupProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [internal, setInternal] = useState(false);\n const [expanded, setExpanded] = own.isExpanded !== undefined ? readBinding(own.isExpanded, own.onExpandedChange) : [internal, setInternal];\n const label = typeof own.label === 'string' ? <Text>{own.label}</Text> : own.label;\n const toggle = (): void => withAnimation({ type: 'easeInOut', duration: 0.25 }, () => setExpanded(!expanded));\n return applyModifiers(\n <VStack alignment=\"leading\" spacing={0}>\n <Button action={toggle} buttonStyle=\"plain\">\n <HStack>\n {styled({ foreground: { hierarchical: 1 } }, label)}\n <Spacer />\n <Image\n systemName=\"chevron.right\"\n font={{ textStyle: 'footnote', weight: 'semibold' }}\n foregroundStyle=\"tint\"\n rotationEffect={expanded ? 90 : 0}\n />\n </HStack>\n </Button>\n {expanded && (\n <VStack alignment=\"leading\" spacing={8} padding={['top', 8]} transition={{ kind: 'opacity' }}>\n {own.children}\n </VStack>\n )}\n </VStack>,\n modifiers,\n );\n}\n","/**\n * `Table`, drawn as iOS draws one: a list. In a compact width each row shows\n * the first column; in a regular width every column under a row of the\n * column titles, a sortable title a button with the sort's chevron.\n */\n\nimport { type Key, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { useHorizontalSizeClass } from '../environment';\nimport { applyModifiers, splitProps, styled, type ViewModifiers } from '../modifiers';\nimport { Button } from './controls';\nimport { List, type Selection } from './lists';\nimport { ForEach, HStack, VStack } from './stacks';\nimport { Image, Text } from './text';\n\nexport interface TableColumn<T> {\n title: string;\n /** The cell for a row; a function of the row, or a key whose value is shown as text. */\n content: ((row: T) => ReactNode) | keyof T;\n /** A fixed width; the other columns share the rest. */\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n /** A sortable column: the key its title sorts by (the app sorts the rows by `sortOrder`). */\n sortKey?: string;\n}\n\nexport interface SortDescriptor {\n key: string;\n ascending: boolean;\n}\n\nexport interface TableProps<T, K extends Key = Key> extends ViewModifiers {\n data: readonly T[];\n columns: readonly TableColumn<T>[];\n /** Each row's identity (its `id` property by default), what the selection holds. */\n id?: (row: T, index: number) => K;\n selection?: BindingValue<Set<K>> | BindingValue<K | null>;\n onSelectionChange?: (selection: Selection<K>) => void;\n /** The sort order, first descriptor first; tapping a sortable title puts it first or reverses it. */\n sortOrder?: BindingValue<readonly SortDescriptor[]>;\n}\n\nconst COLUMN_SPACING = 12;\n\nfunction cell<T>(column: TableColumn<T>, content: ReactNode): ReactNode {\n if (column.width !== undefined) return styled({ layoutPriority: 0 }, styled({ frame: { width: column.width, alignment: 'leading' } }, content));\n return styled(\n { layoutPriority: 0 },\n styled({ frame: { minWidth: column.minWidth ?? 0, maxWidth: column.maxWidth ?? 'infinity', alignment: 'leading' } }, content),\n );\n}\n\nfunction cellContent<T>(column: TableColumn<T>, row: T): ReactNode {\n if (typeof column.content === 'function') return column.content(row);\n return <Text>{String(row[column.content] ?? '')}</Text>;\n}\n\nexport function Table<T, K extends Key = Key>(props: TableProps<T, K>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const compact = useHorizontalSizeClass() !== 'regular';\n const sort = own.sortOrder !== undefined ? readBinding(own.sortOrder) : null;\n const keyOf = (row: T, index: number): K => {\n if (own.id) return own.id(row, index);\n const id = (row as { id?: unknown }).id;\n return (typeof id === 'string' || typeof id === 'number' ? id : index) as K;\n };\n const row = (value: T): ReactNode => {\n const first = own.columns[0];\n if (!first) return null;\n if (compact) return cellContent(first, value);\n return (\n <HStack spacing={COLUMN_SPACING}>\n {own.columns.map((column, index) => (\n <ColumnCell key={index}>{cell(column, cellContent(column, value))}</ColumnCell>\n ))}\n </HStack>\n );\n };\n const title = (column: TableColumn<T>): ReactNode => {\n if (!sort || column.sortKey === undefined) return <Text>{column.title}</Text>;\n const [order, setOrder] = sort;\n const current = order[0]?.key === column.sortKey ? order[0] : null;\n const tap = (): void => {\n const rest = order.filter((descriptor) => descriptor.key !== column.sortKey);\n setOrder([{ key: column.sortKey!, ascending: current ? !current.ascending : true }, ...rest]);\n };\n return (\n <Button action={tap} buttonStyle=\"plain\">\n <HStack spacing={4}>\n <Text>{column.title}</Text>\n {current && <Image systemName={current.ascending ? 'chevron.up' : 'chevron.down'} font={{ textStyle: 'caption2', weight: 'bold' }} />}\n </HStack>\n </Button>\n );\n };\n const list = (\n <List<K> selection={own.selection as BindingValue<Set<K>>} onSelectionChange={own.onSelectionChange}>\n <ForEach data={own.data} id={keyOf}>\n {(value, index) => <TableRow tag={keyOf(value, index)}>{row(value)}</TableRow>}\n </ForEach>\n </List>\n );\n if (compact) return applyModifiers(list, modifiers);\n return applyModifiers(\n <VStack spacing={0}>\n <HStack\n spacing={COLUMN_SPACING}\n font={{ textStyle: 'subheadline', weight: 'semibold' }}\n foregroundStyle=\"secondary\"\n padding={['horizontal', 20]}\n modifiers={[{ padding: ['vertical', 8] }]}\n >\n {own.columns.map((column, index) => (\n <ColumnCell key={index}>{cell(column, title(column))}</ColumnCell>\n ))}\n </HStack>\n {list}\n </VStack>,\n modifiers,\n );\n}\n\nfunction ColumnCell({ children }: { children?: ReactNode }): ReactNode {\n return children;\n}\n\n/** A table row: its content, tagged for the list's selection. */\nfunction TableRow({ children }: { tag: Key; children?: ReactNode }): ReactNode {\n return children;\n}\n","/** `ColorPicker` and `ShareLink`: controls that open the browser's own chooser and share sheet. */\n\nimport { chooseColor } from '@swiftbrowser/web/src/colorPicker';\nimport { browserEnvironment, performHostRequest } from '@swiftbrowser/web/src/hostRequests';\nimport type { RGBAColor } from '@swiftbrowser/web/src/protocol';\nimport type { ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { Color, Circle } from './shapes';\nimport { Button } from './controls';\nimport { HStack, Spacer } from './stacks';\nimport { Label, Text } from './text';\n\nexport interface ColorPickerProps extends ViewModifiers {\n title?: string;\n label?: ReactNode;\n selection: BindingValue<RGBAColor>;\n onChange?: (color: RGBAColor) => void;\n}\n\nconst hexOf = (c: RGBAColor): string =>\n '#' + [c.r, c.g, c.b].map((v) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')).join('');\n\n/** `ColorPicker(\"Tint\", selection:)`: the label and a swatch; tapping opens the browser's color chooser. */\nexport function ColorPicker(props: ColorPickerProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [selection, setSelection] = readBinding(own.selection, own.onChange);\n const label = own.label ?? (own.title !== undefined ? <Text>{own.title}</Text> : null);\n const pick = (): void => {\n chooseColor(hexOf(selection))\n .then((chosen) => {\n if (chosen) setSelection({ ...Color.hex(chosen), a: selection.a });\n })\n .catch((error: unknown) => console.error(error));\n };\n return applyModifiers(\n <Button action={pick} buttonStyle=\"plain\">\n <HStack>\n {label}\n <Spacer />\n <Circle\n fill={selection}\n frame={{ width: 28, height: 28 }}\n overlay={<Circle strokeBorder={{ style: Color.opacity('secondary', 0.3), lineWidth: 1 }} />}\n />\n </HStack>\n </Button>,\n modifiers,\n );\n}\n\nexport interface ShareLinkProps extends ViewModifiers {\n /** What is shared: a URL or text. */\n item: string | URL;\n subject?: string;\n message?: string;\n /** The label; \"Share\" with the share symbol by default. */\n title?: string;\n children?: ReactNode;\n}\n\n/** `ShareLink(item:)`: the Web Share API where the browser has it, else a download of the text. */\nexport function ShareLink(props: ShareLinkProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const share = (): void => {\n const isURL = own.item instanceof URL || /^[a-z][a-z0-9+.-]*:\\/\\//i.test(own.item);\n const params: Record<string, string> = {};\n if (own.subject) params['title'] = own.subject;\n if (isURL) params['url'] = String(own.item);\n const text = [own.message, isURL ? null : String(own.item)].filter(Boolean).join('\\n');\n if (text) params['text'] = text;\n // Within the tap, so the browser lets the share sheet open.\n performHostRequest({ op: 'request', id: 0, kind: 'share', params }, browserEnvironment).catch((error: unknown) => console.error(error));\n };\n return applyModifiers(\n <Button action={share}>{own.children ?? <Label title={own.title ?? 'Share'} systemImage=\"square.and.arrow.up\" />}</Button>,\n modifiers,\n );\n}\n","/**\n * `Canvas`: a `GeometryReader` whose content, at the reported size, is a\n * `canvas` element. The renderer function draws into a `GraphicsContext`\n * that records commands, as Sources/SwiftUI/API/Canvas.swift does; the page\n * draws them as SVG.\n */\n\nimport type { CanvasCommand, CanvasFilter, CanvasShading, CanvasState, Font, GradientStop } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, useState, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, styled, type ViewModifiers } from '../modifiers';\nimport type { Path, Point } from '../path';\nimport { color, font, shapeStyle, unitPoint, type ColorValue, type FontValue, type StyleValue, type UnitPointValue } from '../values';\n\ntype Matrix = [number, number, number, number, number, number];\nconst IDENTITY: Matrix = [1, 0, 0, 1, 0, 0];\n\nfunction multiply(m: Matrix, n: Matrix): Matrix {\n // Applies `n` first, then `m` (CGAffineTransform concatenation order).\n const [a, b, c, d, tx, ty] = m;\n const [a2, b2, c2, d2, tx2, ty2] = n;\n return [a2 * a + b2 * c, a2 * b + b2 * d, c2 * a + d2 * c, c2 * b + d2 * d, tx2 * a + ty2 * c + tx, tx2 * b + ty2 * d + ty];\n}\n\n/** A shading in the drawing's coordinates: a style, or a gradient between two points. */\nexport type Shading =\n | StyleValue\n | { linearGradient: { colors?: ColorValue[]; stops?: { color: ColorValue; location: number }[]; start: Point; end: Point } }\n | { radialGradient: { colors?: ColorValue[]; stops?: { color: ColorValue; location: number }[]; center: Point; startRadius: number; endRadius: number } };\n\nfunction stops(spec: { colors?: ColorValue[]; stops?: { color: ColorValue; location: number }[] }): GradientStop[] {\n if (spec.stops) return spec.stops.map((s) => ({ color: color(s.color), location: s.location }));\n const colors = spec.colors ?? [];\n const last = Math.max(colors.length - 1, 1);\n return colors.map((c, i) => ({ color: color(c), location: i / last }));\n}\n\n/** In a drawing `.primary` / `.secondary`… are the label colors, as `.color(.primary)` is. */\nconst LABEL_COLORS: Record<string, CanvasShading> = {\n primary: { name: 'primary' },\n secondary: { name: 'secondary' },\n tertiary: { name: 'tertiaryLabel' },\n quaternary: { name: 'quaternaryLabel' },\n};\n\nfunction shading(value: Shading): CanvasShading {\n if (typeof value === 'string' && value in LABEL_COLORS) return LABEL_COLORS[value]!;\n if (typeof value === 'object' && value !== null) {\n if ('linearGradient' in value) {\n const g = value.linearGradient as { start: Point & { x: number }; end: Point } & Parameters<typeof stops>[0];\n // `LinearGradient(...)` styles carry stops of protocol colors and unit points; canvas gradients carry `colors` or ColorValue stops in points.\n if (isCanvasGradient(g)) return { canvasLinearGradient: { stops: stops(g), start: g.start, end: g.end } };\n }\n if ('radialGradient' in value) {\n const g = value.radialGradient as { center: Point; startRadius: number; endRadius: number } & Parameters<typeof stops>[0];\n if (isCanvasGradient(g)) return { canvasRadialGradient: { stops: stops(g), center: g.center, startRadius: g.startRadius, endRadius: g.endRadius } };\n }\n }\n return shapeStyle(value as StyleValue);\n}\n\n/** A canvas gradient is written with `colors`, or with stops whose colors are names or `#hex` strings. */\nfunction isCanvasGradient(g: { colors?: unknown; stops?: { color: unknown }[] }): boolean {\n if (Array.isArray(g.colors)) return true;\n return Array.isArray(g.stops) && g.stops.some((s) => typeof s.color === 'string');\n}\n\nexport interface StrokeOptions {\n lineWidth?: number;\n lineCap?: 'butt' | 'round' | 'square';\n lineJoin?: 'miter' | 'round' | 'bevel';\n miterLimit?: number;\n dash?: number[];\n dashPhase?: number;\n}\n\n/** What a canvas image is: a symbol, a catalog image, or a remote image of a known size. */\nexport type CanvasImage = { systemName: string } | { name: string } | { url: string; width: number; height: number };\n\ninterface State {\n transform: Matrix;\n opacity: number;\n blendMode: string | undefined;\n clips: string[];\n filters: CanvasFilter[];\n}\n\n/** A view passed in `Canvas`'s `symbols`, resolved by its id. */\nexport interface ResolvedSymbol {\n symbol: string;\n}\n\n/** Where a symbol was drawn: the point (the context's transform applied) and the look at that moment. */\nexport interface SymbolDraw {\n id: string;\n x: number;\n y: number;\n rotation: number;\n scale: { x: number; y: number };\n opacity: number;\n}\n\n/** `GraphicsContext`: what `Canvas`'s renderer draws with. Methods return the context for chaining. */\nexport class GraphicsContext {\n readonly commands: CanvasCommand[] = [];\n readonly symbolDraws: SymbolDraw[] = [];\n private symbolIds: ReadonlySet<string> = new Set();\n\n /** @internal The ids `symbols` gave the canvas. */\n setSymbols(ids: Iterable<string>): void {\n this.symbolIds = new Set(ids);\n }\n\n /** `resolveSymbol(id:)`: the view the canvas was given under `id`, or null. */\n resolveSymbol(id: string): ResolvedSymbol | null {\n return this.symbolIds.has(id) ? { symbol: id } : null;\n }\n\n /**\n * `draw(symbol, at:)`: the symbol's view centered on the point. Symbols are\n * views laid over the drawing, so they draw above its other commands.\n */\n drawSymbol(symbol: ResolvedSymbol, at: Point): this {\n const [a, b, c, d, tx, ty] = this.state.transform;\n const scaleX = Math.hypot(a, b);\n const scaleY = scaleX > 0 ? (a * d - b * c) / scaleX : Math.hypot(c, d);\n this.symbolDraws.push({\n id: symbol.symbol,\n x: a * at.x + c * at.y + tx,\n y: b * at.x + d * at.y + ty,\n rotation: (Math.atan2(b, a) * 180) / Math.PI,\n scale: { x: scaleX, y: scaleY },\n opacity: this.state.opacity,\n });\n return this;\n }\n private state: State = { transform: IDENTITY, opacity: 1, blendMode: undefined, clips: [], filters: [] };\n\n constructor(readonly size: { width: number; height: number }) {}\n\n get opacity(): number {\n return this.state.opacity;\n }\n set opacity(value: number) {\n this.state.opacity = value;\n }\n get blendMode(): string | undefined {\n return this.state.blendMode;\n }\n set blendMode(value: string | undefined) {\n this.state.blendMode = value;\n }\n\n translateBy(x: number, y: number): this {\n this.state.transform = multiply(this.state.transform, [1, 0, 0, 1, x, y]);\n return this;\n }\n scaleBy(x: number, y: number = x): this {\n this.state.transform = multiply(this.state.transform, [x, 0, 0, y, 0, 0]);\n return this;\n }\n /** Degrees, clockwise on screen. */\n rotate(degrees: number): this {\n const r = (degrees * Math.PI) / 180;\n this.state.transform = multiply(this.state.transform, [Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0]);\n return this;\n }\n concatenate(matrix: Matrix): this {\n this.state.transform = multiply(this.state.transform, matrix);\n return this;\n }\n clip(to: Path): this {\n this.state.clips = [...this.state.clips, to.svg()];\n return this;\n }\n addFilter(filter: CanvasFilter): this {\n this.state.filters = [...this.state.filters, filter];\n return this;\n }\n\n /** `drawLayer { }`: draws with a copy of the state, restored after. */\n drawLayer(body: (context: GraphicsContext) => void): this {\n const saved = { ...this.state, clips: [...this.state.clips], filters: [...this.state.filters] };\n body(this);\n this.state = saved;\n return this;\n }\n\n fill(path: Path, with_: Shading, options: { eoFill?: boolean } = {}): this {\n this.push({ op: 'fill', path: path.svg(), shading: shading(with_), ...(options.eoFill ? { evenOdd: true } : {}) });\n return this;\n }\n\n stroke(path: Path, with_: Shading, options: StrokeOptions | number = {}): this {\n const o = typeof options === 'number' ? { lineWidth: options } : options;\n const command: CanvasCommand = { op: 'stroke', path: path.svg(), shading: shading(with_), lineWidth: o.lineWidth ?? 1 };\n if (o.lineCap) command.lineCap = o.lineCap;\n if (o.lineJoin) command.lineJoin = o.lineJoin;\n if (o.miterLimit !== undefined) command.miterLimit = o.miterLimit;\n if (o.dash) command.dash = o.dash;\n if (o.dashPhase !== undefined) command.dashPhase = o.dashPhase;\n this.push(command);\n return this;\n }\n\n /** `draw(Text(...), at:anchor:)` */\n drawText(text: string, at: Point, options: { anchor?: UnitPointValue; font?: FontValue; color?: StyleValue } = {}): this {\n const command: CanvasCommand = {\n op: 'text',\n text,\n x: at.x,\n y: at.y,\n anchor: unitPoint(options.anchor ?? 'center'),\n shading: shading(options.color ?? 'primary'),\n };\n if (options.font !== undefined) (command as { font?: Font }).font = font(options.font);\n this.push(command);\n return this;\n }\n\n /** `draw(Image(...), at:anchor:)` or `draw(_:in:)` with `size`. */\n drawImage(image: CanvasImage, at: Point, options: { anchor?: UnitPointValue; size?: { width: number; height: number }; color?: StyleValue } = {}): this {\n const props = 'url' in image ? { ...image, resizable: true } : 'name' in image ? { name: image.name, resizable: true } : image;\n const command = {\n op: 'image' as const,\n image: props,\n x: at.x,\n y: at.y,\n anchor: unitPoint(options.anchor ?? (options.size ? 'topLeading' : 'center')),\n ...(options.size ? { width: options.size.width, height: options.size.height } : {}),\n ...(options.color !== undefined ? { shading: shading(options.color) } : {}),\n };\n this.push(command as CanvasCommand);\n return this;\n }\n\n private push(command: CanvasCommand): void {\n const state: CanvasState = {};\n if (this.state.transform.some((v, i) => v !== IDENTITY[i])) state.transform = this.state.transform.map((v) => Math.round(v * 1e4) / 1e4) as Matrix;\n if (this.state.opacity !== 1) state.opacity = this.state.opacity;\n if (this.state.blendMode) state.blendMode = this.state.blendMode;\n if (this.state.clips.length) state.clips = [...this.state.clips];\n if (this.state.filters.length) state.filters = [...this.state.filters];\n this.commands.push({ ...state, ...command } as CanvasCommand);\n }\n}\n\nexport interface CanvasProps extends ViewModifiers {\n /** `Canvas { context, size in }` */\n renderer: (context: GraphicsContext, size: { width: number; height: number }) => void;\n /** `Canvas(renderer:symbols:)`: views the renderer draws by id (`resolveSymbol`, `drawSymbol`). */\n symbols?: Record<string, ReactNode>;\n}\n\nexport function Canvas(props: CanvasProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [size, setSize] = useState<{ width: number; height: number } | null>(null);\n let canvas: ReactNode = null;\n let draws: SymbolDraw[] = [];\n if (size) {\n const context = new GraphicsContext(size);\n if (own.symbols) context.setSymbols(Object.keys(own.symbols));\n own.renderer(context, size);\n canvas = sb('canvas', { width: size.width, height: size.height, commands: context.commands });\n draws = context.symbolDraws;\n }\n const reader = sb(\n 'geometry',\n {},\n {\n geometry: (event) => {\n if (!size || size.width !== event.width || size.height !== event.height) setSize({ width: event.width, height: event.height });\n },\n },\n canvas,\n );\n if (!own.symbols) return applyModifiers(reader, modifiers);\n // The drawn symbols, each its view centered on the point it was drawn at.\n const symbols = draws.map((draw, index) => {\n let view: ReactNode = own.symbols![draw.id];\n if (draw.scale.x !== 1 || draw.scale.y !== 1) view = styled({ scale: draw.scale }, view);\n if (Math.abs(draw.rotation) > 1e-6) view = styled({ rotation: draw.rotation }, view);\n if (draw.opacity !== 1) view = styled({ opacity: draw.opacity }, view);\n return <Fragment key={index}>{styled({ position: { x: draw.x, y: draw.y } }, view)}</Fragment>;\n });\n return applyModifiers(\n sb('zstack', { alignment: 'topLeading' }, undefined, [<Fragment key=\"canvas\">{reader}</Fragment>, ...symbols]),\n modifiers,\n );\n}\n","/** `TimelineView` and `VideoPlayer` with `useAVPlayer`. */\n\nimport type { RendererEvent } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\n\n// ---------------------------------------------------------------------------\n// TimelineView\n// ---------------------------------------------------------------------------\n\nexport type TimelineSchedule =\n | 'animation'\n | 'everyMinute'\n | { animation: { minimumInterval?: number; paused?: boolean } }\n | { periodic: { from?: Date; by: number } };\n\nexport interface TimelineViewProps {\n schedule: TimelineSchedule;\n children: (context: { date: Date }) => ReactNode;\n}\n\n/** `TimelineView(.periodic(from:by:)) { context in }`: the content renders again at each date of the schedule. */\nexport function TimelineView({ schedule, children }: TimelineViewProps): ReactNode {\n const [date, setDate] = useState(() => new Date());\n const key = typeof schedule === 'string' ? schedule : JSON.stringify(schedule);\n useEffect(() => {\n if (schedule === 'everyMinute') {\n let interval: ReturnType<typeof setInterval> | undefined;\n const timeout = setTimeout(() => {\n setDate(new Date());\n interval = setInterval(() => setDate(new Date()), 60_000);\n }, 60_000 - (Date.now() % 60_000));\n return () => {\n clearTimeout(timeout);\n if (interval) clearInterval(interval);\n };\n }\n if (typeof schedule === 'object' && 'periodic' in schedule) {\n const every = Math.max(schedule.periodic.by, 0.01) * 1000;\n const from = schedule.periodic.from?.getTime() ?? Date.now();\n // Aligned to the schedule's dates (from + k × interval).\n let timer: ReturnType<typeof setTimeout>;\n const tick = (): void => {\n const now = Date.now();\n const next = from + Math.ceil((now - from + 1) / every) * every;\n timer = setTimeout(() => {\n setDate(new Date(next));\n tick();\n }, Math.max(0, next - now));\n };\n tick();\n return () => clearTimeout(timer);\n }\n const options = typeof schedule === 'object' ? schedule.animation : {};\n if (options.paused) return;\n const minimum = (options.minimumInterval ?? 1 / 20) * 1000;\n let last = 0;\n let frame = 0;\n const loop = (time: number): void => {\n if (time - last >= minimum) {\n last = time;\n setDate(new Date());\n }\n frame = requestAnimationFrame(loop);\n };\n frame = requestAnimationFrame(loop);\n return () => cancelAnimationFrame(frame);\n // The schedule's identity is its JSON.\n }, [key]);\n return children({ date });\n}\n\n// ---------------------------------------------------------------------------\n// AVPlayer\n// ---------------------------------------------------------------------------\n\ntype VideoEvent = Extract<RendererEvent, { type: 'video' }>;\n\ninterface PlayerState {\n url: string | null;\n rate: number;\n muted: boolean;\n volume: number;\n loop: boolean;\n seek: { time: number; serial: number };\n duration: number | null;\n size: { width: number; height: number } | null;\n status: 'playing' | 'waiting' | 'paused';\n failed: string | null;\n}\n\n/**\n * `AVPlayer`: what plays, the rate, mute and volume, seeks. A view showing\n * it re-renders when those change; the position (`currentTime`, several\n * reports a second) re-renders nothing: read it or listen with `onTime`.\n */\nexport class AVPlayer {\n private state: PlayerState;\n private listeners = new Set<() => void>();\n private timeListeners = new Set<(time: number) => void>();\n private time = 0;\n private serial = 0;\n\n constructor(url: string | null = null, options: { loop?: boolean } = {}) {\n this.state = {\n url,\n rate: 0,\n muted: false,\n volume: 1,\n loop: options.loop ?? false,\n seek: { time: 0, serial: 0 },\n duration: null,\n size: null,\n status: 'paused',\n failed: null,\n };\n }\n\n get url(): string | null {\n return this.state.url;\n }\n get rate(): number {\n return this.state.rate;\n }\n get isPlaying(): boolean {\n return this.state.rate > 0;\n }\n get isMuted(): boolean {\n return this.state.muted;\n }\n get volume(): number {\n return this.state.volume;\n }\n get duration(): number | null {\n return this.state.duration;\n }\n get presentationSize(): { width: number; height: number } | null {\n return this.state.size;\n }\n get timeControlStatus(): PlayerState['status'] {\n return this.state.status;\n }\n get error(): string | null {\n return this.state.failed;\n }\n get currentTime(): number {\n return this.time;\n }\n /** @internal */\n get snapshot(): PlayerState {\n return this.state;\n }\n\n play(): void {\n this.update({ rate: 1 });\n }\n pause(): void {\n this.update({ rate: 0 });\n }\n seek(time: number): void {\n this.time = time;\n this.update({ seek: { time, serial: ++this.serial } });\n }\n replaceCurrentItem(url: string | null): void {\n this.time = 0;\n this.update({ url, duration: null, size: null, failed: null, seek: { time: 0, serial: ++this.serial } });\n }\n set isMuted(muted: boolean) {\n this.update({ muted });\n }\n set volume(volume: number) {\n this.update({ volume: Math.min(1, Math.max(0, volume)) });\n }\n set rate(rate: number) {\n this.update({ rate });\n }\n set loop(loop: boolean) {\n this.update({ loop });\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n /** `addPeriodicTimeObserver`: told the position as the page reports it. */\n onTime(listener: (time: number) => void): () => void {\n this.timeListeners.add(listener);\n return () => this.timeListeners.delete(listener);\n }\n\n /** @internal The page's report for a view showing this player. */\n handle(event: VideoEvent): void {\n if (event.time !== undefined) {\n this.time = event.time;\n for (const listener of this.timeListeners) listener(event.time);\n }\n switch (event.event) {\n case 'ready':\n this.update({\n duration: event.duration ?? null,\n size: event.width && event.height ? { width: event.width, height: event.height } : this.state.size,\n });\n break;\n case 'status':\n if (event.status) this.update({ status: event.status });\n break;\n case 'play':\n if (this.state.rate === 0) this.update({ rate: 1 });\n break;\n case 'pause':\n if (this.state.rate !== 0) this.update({ rate: 0 });\n break;\n case 'volume':\n this.update({ muted: event.muted ?? this.state.muted, volume: event.volume ?? this.state.volume });\n break;\n case 'rate':\n if (event.rate !== undefined) this.update({ rate: event.rate });\n break;\n case 'ended':\n if (!this.state.loop) this.update({ rate: 0 });\n break;\n case 'error':\n this.update({ failed: event.message ?? 'error', rate: 0 });\n break;\n default:\n break;\n }\n }\n\n private update(changes: Partial<PlayerState>): void {\n this.state = { ...this.state, ...changes };\n for (const listener of this.listeners) listener();\n }\n}\n\n/** A player kept for the component's life, re-rendering it when what it plays changes. */\nexport function useAVPlayer(url: string | null = null, options: { loop?: boolean } = {}): AVPlayer {\n const ref = useRef<AVPlayer | null>(null);\n ref.current ??= new AVPlayer(url, options);\n const player = ref.current;\n useSyncExternalStore(player.subscribe, () => player.snapshot, () => player.snapshot);\n useEffect(() => {\n if (player.url !== url) player.replaceCurrentItem(url);\n }, [player, url]);\n return player;\n}\n\nexport interface VideoPlayerProps extends ViewModifiers {\n player: AVPlayer | null;\n /** `videoGravity`: fit (default), fill, or stretch. */\n gravity?: 'resizeAspect' | 'resizeAspectFill' | 'resize';\n /** The browser's native controls; true by default, as `VideoPlayer` shows them. */\n controls?: boolean;\n /** `VideoPlayer(player:) { videoOverlay }`: drawn over the video. */\n videoOverlay?: ReactNode;\n}\n\n/** `VideoPlayer(player:)`: the page's `<video>` showing the player, or black without one. */\nexport function VideoPlayer(props: VideoPlayerProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const player = own.player;\n const state = useSyncExternalStore(\n player?.subscribe ?? NO_SUBSCRIBE,\n () => player?.snapshot ?? null,\n () => player?.snapshot ?? null,\n );\n if (!player || !state || !state.url) return applyModifiers(sb('color', { color: { r: 0, g: 0, b: 0, a: 1 } }), modifiers);\n const video = sb(\n 'video',\n {\n url: state.url,\n playing: state.rate > 0 && !state.failed,\n muted: state.muted,\n volume: state.volume,\n rate: state.rate > 0 ? state.rate : 1,\n loop: state.loop,\n gravity: own.gravity ?? 'resizeAspect',\n controls: own.controls ?? true,\n seek: state.seek,\n ...(state.size ? { width: state.size.width, height: state.size.height } : {}),\n },\n { video: (event) => player.handle(event) },\n );\n if (own.videoOverlay === undefined) return applyModifiers(video, modifiers);\n return applyModifiers(\n sb('zstack', { alignment: 'center' }, undefined, [<Fragment key=\"video\">{video}</Fragment>, <Fragment key=\"overlay\">{own.videoOverlay}</Fragment>]),\n modifiers,\n );\n}\n\nconst NO_SUBSCRIBE = (): (() => void) => () => {};\n","/**\n * `PhaseAnimator` and `KeyframeAnimator`. A phase animator moves its content\n * through phases, each change in one animated pass that the renderer tweens\n * (as the shim does); a keyframe animator computes its values frame by frame\n * along tracks of keyframes and renders them, as SwiftUI evaluates its\n * content per frame.\n */\n\nimport type { Animation } from '@swiftbrowser/web/src/protocol';\nimport { timingFor } from '@swiftbrowser/web/src/animation';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { withAnimation } from '../host/root';\n\n// ---------------------------------------------------------------------------\n// PhaseAnimator\n// ---------------------------------------------------------------------------\n\nexport interface PhaseAnimatorProps<Phase> {\n phases: readonly Phase[];\n /** Each change runs through the phases once, back to the first; without one the phases cycle while shown. */\n trigger?: unknown;\n /** The animation into a phase (`default` by default). */\n animation?: (phase: Phase) => Animation;\n children: (phase: Phase) => ReactNode;\n}\n\nexport function PhaseAnimator<Phase>({ phases, trigger, animation, children }: PhaseAnimatorProps<Phase>): ReactNode {\n const [index, setIndex] = useState(0);\n const hasTrigger = trigger !== undefined;\n const latest = useRef({ phases, animation });\n latest.current = { phases, animation };\n const first = useRef(true);\n\n useEffect(() => {\n if (hasTrigger && first.current) {\n first.current = false;\n return;\n }\n first.current = false;\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let step = 0;\n const count = latest.current.phases.length;\n if (count < 2) return;\n const advance = (): void => {\n if (cancelled) return;\n step += 1;\n const next = step % count;\n const { phases: current, animation: animationFor } = latest.current;\n const into = animationFor?.(current[next] as Phase) ?? { type: 'default' };\n withAnimation(into, () => setIndex(next));\n // A trigger runs through the phases once, ending on the first.\n if (hasTrigger && next === 0) return;\n const timing = timingFor(into);\n timer = setTimeout(advance, timing.duration + timing.delay);\n };\n // The first phase holds for a moment before the cycle starts, as the first change waits for a render.\n timer = setTimeout(advance, 0);\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [hasTrigger, trigger]);\n\n return children(phases[index % Math.max(phases.length, 1)] as Phase);\n}\n\n// ---------------------------------------------------------------------------\n// KeyframeAnimator\n// ---------------------------------------------------------------------------\n\nexport type KeyframeCurve = 'linear' | 'cubic' | 'spring' | 'move';\n\n/** One keyframe of a track: the value it reaches, in how long (seconds), along which curve. */\nexport interface Keyframe {\n to: number;\n duration: number;\n curve?: KeyframeCurve;\n}\n\nexport type KeyframeTracks<Value extends Record<string, number>> = { [K in keyof Value]?: readonly Keyframe[] };\n\nexport interface KeyframeAnimatorProps<Value extends Record<string, number>> {\n initialValue: Value;\n keyframes: KeyframeTracks<Value>;\n /** Each change plays the keyframes once; without one they repeat while shown (`repeating`). */\n trigger?: unknown;\n repeating?: boolean;\n children: (value: Value) => ReactNode;\n}\n\nfunction ease(curve: KeyframeCurve, t: number): number {\n switch (curve) {\n case 'move':\n return 1;\n case 'cubic':\n return t * t * (3 - 2 * t);\n case 'spring': {\n // A critically damped spring that settles within the keyframe.\n const omega = 7;\n return 1 - (1 + omega * t) * Math.exp(-omega * t);\n }\n default:\n return t;\n }\n}\n\n/** The tracks' values `elapsed` seconds in (each track from the initial value through its keyframes). */\nexport function keyframeValues<Value extends Record<string, number>>(initial: Value, tracks: KeyframeTracks<Value>, elapsed: number): Value {\n const value: Record<string, number> = { ...initial };\n for (const key of Object.keys(tracks) as (keyof Value & string)[]) {\n const frames = tracks[key] ?? [];\n let from: number = initial[key];\n let start = 0;\n let current: number = from;\n for (const frame of frames) {\n const end = start + frame.duration;\n if (elapsed >= end) {\n current = frame.to;\n } else {\n const t = frame.duration > 0 ? Math.max(0, (elapsed - start) / frame.duration) : 1;\n current = from + (frame.to - from) * ease(frame.curve ?? 'spring', t);\n break;\n }\n from = frame.to;\n start = end;\n }\n value[key] = current;\n }\n return value as Value;\n}\n\nfunction totalDuration(tracks: Record<string, readonly Keyframe[] | undefined>): number {\n return Math.max(0, ...Object.values(tracks).map((frames) => (frames ?? []).reduce((sum, frame) => sum + frame.duration, 0)));\n}\n\nexport function KeyframeAnimator<Value extends Record<string, number>>({\n initialValue,\n keyframes,\n trigger,\n repeating,\n children,\n}: KeyframeAnimatorProps<Value>): ReactNode {\n const [value, setValue] = useState<Value>(initialValue);\n const latest = useRef({ initialValue, keyframes });\n latest.current = { initialValue, keyframes };\n const first = useRef(true);\n const hasTrigger = trigger !== undefined;\n\n useEffect(() => {\n if (hasTrigger && first.current) {\n first.current = false;\n return;\n }\n first.current = false;\n if (!hasTrigger && !repeating) return;\n let frame = 0;\n let start: number | null = null;\n const tick = (now: number): void => {\n start ??= now;\n const { initialValue: initial, keyframes: tracks } = latest.current;\n const total = totalDuration(tracks as Record<string, readonly Keyframe[] | undefined>);\n let elapsed = (now - start) / 1000;\n if (!hasTrigger && repeating && total > 0) elapsed %= total;\n setValue(keyframeValues(initial, tracks, elapsed));\n if (hasTrigger && elapsed >= total) return;\n frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frame);\n }, [hasTrigger, trigger, repeating]);\n\n return children(value);\n}\n"],"names":["entry","next","frame","r","stops","wrap","Image","Fragment","clear","active","round","size","IDENTITY","opacity","clamp","stride","keyOf","row"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/environment.ts","../src/host/reconciler.ts","../src/host/instance.ts","../src/host/tree.ts","../src/host/root.ts","../src/mount.ts","../src/navigation-context.ts","../src/bridge.ts","../src/island.tsx","../src/binding.ts","../src/host/sb.ts","../src/coordinateSpace.tsx","../src/dragDrop.tsx","../src/values.ts","../src/scrollEnvironment.tsx","../src/components/row.tsx","../src/scrollReader.tsx","../src/lazy.tsx","../src/components/stacks.tsx","../src/components/text.tsx","../src/components/navigation.tsx","../src/components/split.tsx","../src/presentation.tsx","../src/inspector.tsx","../src/lifecycle.tsx","../src/pointer.tsx","../src/modifiers.tsx","../src/components/geometry.tsx","../src/visualEffect.tsx","../src/path.ts","../src/components/controls.tsx","../src/components/lists.tsx","../src/components/tabs.tsx","../src/components/shapes.tsx","../src/components/host.tsx","../src/components/menus.tsx","../src/components/images.tsx","../src/components/charts.tsx","../src/components/containers.tsx","../src/components/table.tsx","../src/components/system.tsx","../src/components/canvas.tsx","../src/components/media.tsx","../src/components/animators.tsx"],"sourcesContent":["/**\n * Environment values: what a modifier on a container passes to the views\n * below it (`.buttonStyle`, `.controlSize`…), and the device environment the\n * page sets (color scheme, Dynamic Type size).\n */\n\nimport type { ButtonStyle, ColorScheme, DynamicTypeSize, PickerStyle } from '@swiftbrowser/web/src/protocol';\nimport { createContext, createElement, useContext, type ReactNode } from 'react';\n\nexport type ControlSize = 'mini' | 'small' | 'regular' | 'large' | 'extraLarge';\n\nexport interface ViewEnvironment {\n buttonStyle?: ButtonStyle;\n controlSize?: ControlSize;\n pickerStyle?: PickerStyle;\n labelsHidden?: boolean;\n /** `.refreshable`: the nearest `List` or `ScrollView` below runs it on a pull. */\n refresh?: () => unknown;\n /** `.submitLabel`: the return key's label of the text fields below. */\n submitLabel?: string;\n /** `.labelStyle`: how the `Label`s below draw. */\n labelStyle?: 'automatic' | 'titleAndIcon' | 'titleOnly' | 'iconOnly';\n /** `.redacted(reason: .placeholder)`: text and images below draw as placeholder shapes. */\n redacted?: boolean;\n /** `.textCase(_:)` for the texts below. */\n textCase?: 'uppercase' | 'lowercase' | null;\n /** Inside an alert's actions: tapping a button also dismisses the alert. */\n dismissAlert?: () => void;\n}\n\nexport const ViewEnvironmentContext = createContext<ViewEnvironment>({});\n\nexport function useViewEnvironment(): ViewEnvironment {\n return useContext(ViewEnvironmentContext);\n}\n\n/** Wrap `children` in an environment with `values` added. */\nexport function withEnvironment(values: ViewEnvironment, children: ReactNode): ReactNode {\n return createElement(EnvironmentExtender, { values }, children);\n}\n\nfunction EnvironmentExtender({ values, children }: { values: ViewEnvironment; children?: ReactNode }): ReactNode {\n const parent = useContext(ViewEnvironmentContext);\n return createElement(ViewEnvironmentContext.Provider, { value: { ...parent, ...values } }, children);\n}\n\nexport type HorizontalSizeClass = 'compact' | 'regular';\n\nexport interface Environment {\n colorScheme: ColorScheme;\n dynamicTypeSize: DynamicTypeSize;\n /** `compact` below 700 points of width (an iPhone), `regular` from it (an iPad, a desktop window). */\n horizontalSizeClass: HorizontalSizeClass;\n}\n\nexport const EnvironmentContext = createContext<Environment>({\n colorScheme: 'light',\n dynamicTypeSize: 'large',\n horizontalSizeClass: 'compact',\n});\n\nexport function EnvironmentProvider({ value, children }: { value: Environment; children?: ReactNode }): ReactNode {\n return createElement(EnvironmentContext.Provider, { value }, children);\n}\n\n/** `@Environment(\\.colorScheme)` */\nexport function useColorScheme(): ColorScheme {\n return useContext(EnvironmentContext).colorScheme;\n}\n\n/** `@Environment(\\.dynamicTypeSize)` */\nexport function useDynamicTypeSize(): DynamicTypeSize {\n return useContext(EnvironmentContext).dynamicTypeSize;\n}\n\n/** `@Environment(\\.dismiss)`: set by sheets and pushed screens. */\nexport const DismissContext = createContext<(() => void) | null>(null);\n\nexport function useDismiss(): () => void {\n const dismiss = useContext(DismissContext);\n return dismiss ?? (() => {});\n}\n\n/** `@Environment(\\.horizontalSizeClass)` */\nexport function useHorizontalSizeClass(): HorizontalSizeClass {\n return useContext(EnvironmentContext).horizontalSizeClass;\n}\n\n/** `@Environment(\\.redactionReasons)`: whether the views below are placeholders. */\nexport function useRedacted(): boolean {\n return useContext(ViewEnvironmentContext).redacted === true;\n}\n","/**\n * The react-reconciler host config: React mutates `Instance` trees, and\n * `resetAfterCommit` asks the `HostTree` for the ops of the pass.\n */\n\nimport { createContext } from 'react';\nimport Reconciler from 'react-reconciler';\nimport { DefaultEventPriority } from 'react-reconciler/constants';\nimport type { HostProps, Instance } from './instance';\nimport type { HostTree } from './tree';\n\ntype HostContext = Record<string, never>;\n\nlet currentUpdatePriority = 0;\n\nfunction detach(parent: { children: Instance[] }, child: Instance): void {\n const at = parent.children.indexOf(child);\n if (at >= 0) parent.children.splice(at, 1);\n}\n\ntype Config = Reconciler.HostConfig<\n string, // Type\n HostProps, // Props\n HostTree, // Container\n Instance, // Instance\n never, // TextInstance\n never, // ActivityInstance\n never, // SuspenseInstance\n never, // HydratableInstance\n never, // FormInstance\n Instance, // PublicInstance\n HostContext, // HostContext\n never, // ChildSet\n ReturnType<typeof setTimeout>, // TimeoutHandle\n -1, // NoTimeout\n null, // TransitionStatus\n null, // SuspendedState\n null, // RendererInspectionConfig\n never, // FormStateMarkerInstance\n never, // HoistableRoot\n never // Resource\n>;\n\nconst hostConfig: Config = {\n supportsMutation: true,\n supportsPersistence: false,\n supportsHydration: false,\n isPrimaryRenderer: true,\n noTimeout: -1,\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n supportsMicrotasks: true,\n scheduleMicrotask: queueMicrotask,\n\n getRootHostContext: () => ({}),\n getChildHostContext: (parent) => parent,\n getPublicInstance: (instance) => instance,\n prepareForCommit: () => null,\n resetAfterCommit: (tree) => tree.commit(),\n preparePortalMount: () => {},\n shouldSetTextContent: () => false,\n\n createInstance: (type, props, tree) => {\n if (type !== 'sb') throw new Error(`Unknown host element <${type}>: only SwiftUI components render here.`);\n return tree.createInstance(props);\n },\n createTextInstance: (text) => {\n throw new Error(`Text strings must be rendered within a <Text> component (got ${JSON.stringify(text)}).`);\n },\n appendInitialChild: (parent, child) => parent.children.push(child),\n finalizeInitialChildren: () => false,\n commitMount: () => {},\n commitUpdate: (instance, _type, _prev, next, handle) => {\n const tree = treeOf(handle);\n if (tree) tree.updateInstance(instance, next);\n else {\n instance.props = next.props ?? {};\n instance.on = next.on;\n instance.target = next.target;\n }\n },\n\n appendChild: (parent, child) => {\n detach(parent, child);\n parent.children.push(child);\n },\n appendChildToContainer: (tree, child) => {\n detach(tree.root, child);\n tree.root.children.push(child);\n },\n insertBefore: (parent, child, before) => {\n detach(parent, child);\n const at = parent.children.indexOf(before);\n parent.children.splice(at < 0 ? parent.children.length : at, 0, child);\n },\n insertInContainerBefore: (tree, child, before) => {\n detach(tree.root, child);\n const at = tree.root.children.indexOf(before);\n tree.root.children.splice(at < 0 ? tree.root.children.length : at, 0, child);\n },\n removeChild: (parent, child) => detach(parent, child),\n removeChildFromContainer: (tree, child) => detach(tree.root, child),\n clearContainer: (tree) => {\n tree.root.children = [];\n },\n resetTextContent: () => {},\n commitTextUpdate: () => {},\n hideInstance: (instance) => {\n instance.hidden = true;\n },\n unhideInstance: (instance) => {\n instance.hidden = false;\n },\n hideTextInstance: () => {},\n unhideTextInstance: () => {},\n detachDeletedInstance: () => {},\n\n getInstanceFromNode: () => null,\n beforeActiveInstanceBlur: () => {},\n afterActiveInstanceBlur: () => {},\n prepareScopeUpdate: () => {},\n getInstanceFromScope: () => null,\n setCurrentUpdatePriority: (priority) => {\n currentUpdatePriority = priority;\n },\n getCurrentUpdatePriority: () => currentUpdatePriority,\n resolveUpdatePriority: () => (currentUpdatePriority !== 0 ? currentUpdatePriority : DefaultEventPriority),\n resetFormInstance: () => {},\n requestPostPaintCallback: () => {},\n shouldAttemptEagerTransition: () => false,\n trackSchedulerEvent: () => {},\n resolveEventType: () => null,\n resolveEventTimeStamp: () => -1.1,\n maySuspendCommit: () => false,\n maySuspendCommitOnUpdate: () => false,\n maySuspendCommitInSyncRender: () => false,\n suspendOnActiveViewTransition: () => {},\n getSuspendedCommitReason: () => null,\n bindToConsole: (methodName, args) => () => (console as unknown as Record<string, (...a: unknown[]) => unknown>)[methodName]?.(...args),\n preloadInstance: () => true,\n startSuspendingCommit: () => null,\n suspendInstance: () => {},\n waitForCommitToBeReady: () => null,\n NotPendingTransition: null,\n HostTransitionContext: createContext<null>(null) as unknown as Config['HostTransitionContext'],\n rendererVersion: '0.3.1',\n rendererPackageName: '@swiftbrowser/react',\n extraDevToolsConfig: null,\n};\n\n/**\n * The fiber's root container: `commitUpdate` needs the tree to retire an\n * element whose kind changed. React hands the fiber as the opaque handle.\n */\nfunction treeOf(handle: unknown): HostTree | null {\n let fiber = handle as { return: unknown; stateNode: unknown; tag: number } | null;\n while (fiber) {\n // HostRoot fibers (tag 3) hold the FiberRoot, whose containerInfo is our tree.\n if (fiber.tag === 3) return (fiber.stateNode as { containerInfo: HostTree }).containerInfo;\n fiber = fiber.return as typeof fiber;\n }\n return null;\n}\n\nexport const reconciler = Reconciler(hostConfig);\n","/**\n * The host tree the reconciler mutates: one `Instance` per host element. A\n * host element is always the intrinsic type `sb` with a `kind` (an element\n * kind of the ops protocol, or one of the two virtual kinds below) and the\n * element's `props`; the React components in ../components render nothing\n * else.\n */\n\nimport type { RendererEvent } from '@swiftbrowser/web/src/protocol';\nimport type { ReactNode } from 'react';\n\nexport type EventType = RendererEvent['type'];\nexport type EventOf<K extends EventType> = Extract<RendererEvent, { type: K }>;\n/** The renderer's events an element answers, by type. */\nexport type EventHandlers = { [K in EventType]?: (event: EventOf<K>) => void };\n\n/**\n * Where a virtual element acts: the nearest enclosing `navscreen` or `sheet`\n * element, or the root container.\n */\nexport type HoistTarget = 'navscreen' | 'sheet' | 'root';\n\n/**\n * A preference: not an element itself; its `props` are merged into the\n * target's props (`.navigationTitle` sets the enclosing screen's `title`,\n * `.presentationDetents` the enclosing sheet's `detents`).\n */\nexport const PREF_KIND = '$pref';\n/**\n * A hoist: not an element itself; its children become children of the target\n * after the target's own (`.toolbar` items join the screen, `.sheet` content\n * becomes a root-level `sheet` element).\n */\nexport const HOIST_KIND = '$hoist';\n\nexport interface HostProps {\n kind: string;\n props?: Record<string, unknown>;\n on?: EventHandlers;\n target?: HoistTarget;\n children?: ReactNode;\n}\n\nexport interface Instance {\n /** The element id in the ops protocol; stable for the instance's life. */\n id: number;\n kind: string;\n props: Record<string, unknown>;\n on: EventHandlers | undefined;\n target: HoistTarget | undefined;\n /** The children as React currently has them (virtual kinds included). */\n children: Instance[];\n /** Hidden by Suspense: left out of the emitted tree. */\n hidden: boolean;\n /** Whether a `create` op was emitted for the current id. */\n created: boolean;\n committedProps: Record<string, unknown> | null;\n committedParent: TreeNode | null;\n committedChildren: Instance[];\n}\n\n/** The root container, element id 0. */\nexport interface RootNode {\n id: 0;\n kind: 'root';\n children: Instance[];\n committedChildren: Instance[];\n}\n\nexport type TreeNode = Instance | RootNode;\n","/**\n * Turns the host tree into ops. The reconciler mutates `Instance.children`\n * freely during a React commit; `flush` then resolves the virtual kinds\n * (preferences and hoists), diffs the result against what was emitted last\n * time and produces one render pass: creates and updates, inserts (parents\n * before children, as the Swift core orders them), removes, `commit`.\n */\n\nimport type { Animation, Op, RendererEvent } from '@swiftbrowser/web/src/protocol';\nimport { HOIST_KIND, PREF_KIND, type HostProps, type Instance, type RootNode, type TreeNode } from './instance';\n\nexport type OpsSink = (ops: Op[]) => void;\n\ninterface Effective {\n props: Record<string, unknown>;\n children: Instance[];\n /** Children hoisted here from inside the subtree, appended after `children`. */\n hoisted: Instance[];\n}\n\ninterface Context {\n navscreen?: Instance;\n sheet?: Instance;\n}\n\nexport class HostTree {\n readonly root: RootNode = { id: 0, kind: 'root', children: [], committedChildren: [] };\n private nextId = 1;\n /** Emitted elements by id, for event dispatch. */\n private readonly live = new Map<number, Instance>();\n private committedLive = new Set<Instance>();\n /** Ids whose element changed kind: removed at the end of the next flush. */\n private retired: number[] = [];\n /** `withAnimation`: stamped on the next `commit`. */\n pendingAnimation: Animation | undefined;\n /** The root's `colorScheme` last sent (`.preferredColorScheme`); undefined while none was. */\n private committedColorScheme: 'light' | 'dark' | null | undefined;\n\n constructor(private readonly sink: OpsSink) {}\n\n createInstance(props: HostProps): Instance {\n return {\n id: this.nextId++,\n kind: props.kind,\n props: props.props ?? {},\n on: props.on,\n target: props.target,\n children: [],\n hidden: false,\n created: false,\n committedProps: null,\n committedParent: null,\n committedChildren: [],\n };\n }\n\n updateInstance(instance: Instance, next: HostProps): void {\n if (next.kind !== instance.kind) {\n // An element cannot change kind: the old one goes, a new id takes its\n // place and the children move over.\n if (instance.created) {\n this.retired.push(instance.id);\n this.live.delete(instance.id);\n }\n instance.id = this.nextId++;\n instance.kind = next.kind;\n instance.created = false;\n instance.committedProps = null;\n instance.committedParent = null;\n instance.committedChildren = [];\n }\n instance.props = next.props ?? {};\n instance.on = next.on;\n instance.target = next.target;\n }\n\n /** Emit the ops for everything that changed since the last commit. */\n commit(): void {\n const ops = this.flush();\n if (ops.length > 0) this.sink(ops);\n }\n\n flush(): Op[] {\n const animation = this.pendingAnimation;\n this.pendingAnimation = undefined;\n\n // Phase 1: the effective tree (virtual kinds resolved).\n const effective = new Map<TreeNode, Effective>();\n const rootEffective: Effective = { props: {}, children: [], hoisted: [] };\n effective.set(this.root, rootEffective);\n const visit = (child: Instance, sink: Instance[], ctx: Context): void => {\n if (child.hidden) return;\n if (child.kind === PREF_KIND) {\n const target = child.target === 'root' || child.target === undefined ? this.root : ctx[child.target];\n const entry = target ? effective.get(target) : undefined;\n if (entry) Object.assign(entry.props, child.props);\n return;\n }\n if (child.kind === HOIST_KIND) {\n const target = (child.target && child.target !== 'root' ? ctx[child.target] : undefined) ?? this.root;\n const entry = effective.get(target)!;\n for (const grandchild of child.children) visit(grandchild, entry.hoisted, ctx);\n return;\n }\n const entry: Effective = { props: { ...child.props }, children: [], hoisted: [] };\n effective.set(child, entry);\n sink.push(child);\n const next: Context =\n child.kind === 'navscreen' ? { ...ctx, navscreen: child } : child.kind === 'sheet' ? { ...ctx, sheet: child } : ctx;\n for (const grandchild of child.children) visit(grandchild, entry.children, next);\n };\n for (const child of this.root.children) visit(child, rootEffective.children, {});\n for (const entry of effective.values()) {\n if (entry.hoisted.length > 0) entry.children.push(...entry.hoisted);\n }\n\n // Phase 2: the diff.\n const live = new Set<Instance>();\n const parentOf = new Map<Instance, TreeNode>();\n for (const [node, entry] of effective) {\n for (const child of entry.children) {\n live.add(child);\n parentOf.set(child, node);\n }\n }\n\n const ops: Op[] = [];\n // Removed subtrees first, so sibling indices below are exact.\n const dead = new Set<Instance>();\n for (const instance of this.committedLive) if (!live.has(instance)) dead.add(instance);\n for (const instance of dead) {\n const parent = instance.committedParent;\n // The top of a removed subtree only: removing it removes the rest.\n if (parent && parent !== this.root && dead.has(parent as Instance)) continue;\n ops.push({ op: 'remove', id: instance.id });\n }\n for (const instance of dead) {\n this.live.delete(instance.id);\n instance.created = false;\n instance.committedProps = null;\n instance.committedParent = null;\n instance.committedChildren = [];\n }\n\n const emit = (parent: TreeNode, entry: Effective): void => {\n const current = parent.committedChildren.filter((child) => live.has(child) && parentOf.get(child) === parent);\n entry.children.forEach((child, index) => {\n const childEntry = effective.get(child)!;\n if (!child.created) {\n ops.push({ op: 'create', id: child.id, kind: child.kind, props: childEntry.props } as Op);\n child.created = true;\n this.live.set(child.id, child);\n } else if (!deepEqual(childEntry.props, child.committedProps)) {\n ops.push({ op: 'update', id: child.id, props: childEntry.props } as Op);\n }\n child.committedProps = childEntry.props;\n // A child that changed kind is the same instance under a new id: it\n // must be inserted again even where it already sits.\n if (current[index] !== child || child.committedParent !== parent) {\n ops.push({ op: 'insert', parent: parent.id, id: child.id, index });\n const at = current.indexOf(child);\n if (at >= 0) current.splice(at, 1);\n current.splice(index, 0, child);\n }\n child.committedParent = parent;\n emit(child, childEntry);\n });\n parent.committedChildren = entry.children;\n };\n emit(this.root, rootEffective);\n\n for (const id of this.retired) ops.push({ op: 'remove', id });\n this.retired = [];\n this.committedLive = live;\n\n // `.preferredColorScheme`: the only prop the root takes; `null` hands the\n // appearance back to the page once a preference is gone.\n const scheme = rootEffective.props['colorScheme'] as 'light' | 'dark' | null | undefined;\n const next = scheme === undefined ? (this.committedColorScheme === undefined ? undefined : null) : scheme;\n if (next !== undefined && next !== this.committedColorScheme) {\n ops.push({ op: 'update', id: 0, props: { colorScheme: next } } as Op);\n this.committedColorScheme = next === null ? undefined : next;\n }\n\n if (ops.length === 0) return ops;\n ops.push(animation ? { op: 'commit', animation } : { op: 'commit' });\n return ops;\n }\n\n /** Hand a renderer event to the element's handler for its type. */\n dispatch(event: RendererEvent): void {\n if (event.type === 'batch') {\n for (const each of event.events) this.dispatch(each);\n return;\n }\n if (!('id' in event)) return;\n const instance = this.live.get(event.id);\n const handler = instance?.on?.[event.type] as ((event: RendererEvent) => void) | undefined;\n handler?.(event);\n }\n}\n\n/** Structural equality of JSON-like values. */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a)) {\n const other = b as unknown[];\n return a.length === other.length && a.every((value, index) => deepEqual(value, other[index]));\n }\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n const keys = Object.keys(left);\n if (keys.length !== Object.keys(right).length) return false;\n return keys.every((key) => key in right && deepEqual(left[key], right[key]));\n}\n","/**\n * A SwiftUI root: renders a React element tree into a stream of render ops.\n * The page gives the ops to a `Renderer` (@swiftbrowser/web) and feeds the\n * renderer's events back through `dispatch`; headless code (tests) records\n * the ops instead.\n */\n\nimport type { Animation, ColorScheme, DynamicTypeSize, Op, RendererEvent } from '@swiftbrowser/web/src/protocol';\nimport { createElement, type ReactNode } from 'react';\nimport { ConcurrentRoot } from 'react-reconciler/constants';\nimport { EnvironmentProvider, type Environment } from '../environment';\nimport { reconciler } from './reconciler';\nimport { HostTree, type OpsSink } from './tree';\n\nexport interface SwiftUIRoot {\n /** Render (or re-render) the tree; the ops of the pass reach the sink before this returns. */\n render(element: ReactNode): void;\n unmount(): void;\n /** A renderer event (a tap, a toggle…) for the element it names. */\n dispatch(event: RendererEvent): void;\n /** The device environment the tree reads through `useColorScheme` and friends. */\n setEnvironment(environment: Partial<Environment>): void;\n}\n\nconst DEFAULT_ENVIRONMENT: Environment = { colorScheme: 'light', dynamicTypeSize: 'large', horizontalSizeClass: 'compact' };\n\nconst roots = new Set<HostTree>();\n\nexport function createSwiftUIRoot(sink: OpsSink): SwiftUIRoot {\n const tree = new HostTree(sink);\n roots.add(tree);\n // The tenth argument is `onDefaultTransitionIndicator` from react-reconciler\n // 0.33 (React 19.2) and `transitionCallbacks` before it (an object the\n // stable build never reads): a no-op function serves both, and the\n // eleventh is ignored by every version the package supports.\n const container = reconciler.createContainer(\n tree,\n ConcurrentRoot,\n null,\n false,\n null,\n '',\n (error) => {\n throw error;\n },\n (error) => console.error(error),\n (error) => console.warn(error),\n () => {},\n null,\n );\n let environment = DEFAULT_ENVIRONMENT;\n let current: ReactNode = null;\n const update = (): void => {\n reconciler.updateContainerSync(createElement(EnvironmentProvider, { value: environment }, current), container, null, null);\n reconciler.flushSyncWork();\n };\n return {\n render(element) {\n current = element;\n update();\n },\n unmount() {\n reconciler.updateContainerSync(null, container, null, null);\n reconciler.flushSyncWork();\n roots.delete(tree);\n },\n dispatch(event) {\n // Updates the handler makes flush before this returns, like the Swift\n // core answers an event with the ops of its render pass.\n reconciler.flushSyncFromReconciler(() => tree.dispatch(event));\n },\n setEnvironment(next) {\n environment = { ...environment, ...next };\n update();\n },\n };\n}\n\nexport type { ColorScheme, DynamicTypeSize, Op };\n\n/**\n * `withAnimation { }`: the state changes `body` makes render in one pass whose\n * `commit` carries the animation, so the renderer animates every frame and\n * style change of the pass.\n */\nexport function withAnimation<T>(animation: Animation | undefined, body: () => T): T;\nexport function withAnimation<T>(body: () => T): T;\nexport function withAnimation<T>(first: Animation | undefined | (() => T), second?: () => T): T {\n const animation: Animation = typeof first === 'function' ? { type: 'default' } : (first ?? { type: 'default' });\n const body = (typeof first === 'function' ? first : second) as () => T;\n for (const tree of roots) tree.pendingAnimation = animation;\n try {\n return reconciler.flushSyncFromReconciler(body);\n } finally {\n for (const tree of roots) tree.pendingAnimation = undefined;\n }\n}\n","/**\n * `mount(screen, element)`: the renderer of @swiftbrowser/web in `screen`\n * (the root container, element id 0, inside the device frame or full screen)\n * drawing a SwiftUI root. The page keeps the device chrome (theme, text size)\n * and tells both sides through `setEnvironment`.\n */\n\nimport { horizontalSizeClassFor, type ColorScheme, type DynamicTypeSize } from '@swiftbrowser/web/src/protocol';\nimport type { AssetCatalog } from '@swiftbrowser/web/src/assets';\nimport { Renderer } from '@swiftbrowser/web/src/renderer';\nimport type { ReactNode } from 'react';\nimport { createSwiftUIRoot, type SwiftUIRoot } from './host/root';\n\nexport interface MountOptions {\n colorScheme?: ColorScheme;\n dynamicTypeSize?: DynamicTypeSize;\n /** Device mode: the real safe-area insets (frame mode has the iPhone's). */\n safeArea?: { top: number; leading: number; bottom: number; trailing: number } | null;\n /** The root is as tall as its content (an island in a page), not as the screen. */\n contentHeight?: boolean;\n /**\n * The asset catalog manifest `Image(name:)` and catalog colors resolve\n * against (the `/catalog/<App>.json` the SwiftBrowser build writes, or one\n * of your own: `{ images: { name: { src, width, height, scale, kind } }, colors: {} }`).\n */\n assets?: AssetCatalog;\n}\n\nexport interface Mounted {\n root: SwiftUIRoot;\n renderer: Renderer;\n setEnvironment(environment: { colorScheme?: ColorScheme; dynamicTypeSize?: DynamicTypeSize }): void;\n unmount(): void;\n}\n\nexport function mount(screen: HTMLElement, element: ReactNode, options: MountOptions = {}): Mounted {\n let renderer: Renderer | null = null;\n const root = createSwiftUIRoot((ops) => renderer?.applyOps(ops));\n renderer = new Renderer(screen, (event) => root.dispatch(event));\n // The page's appearance; `.preferredColorScheme` overrides it while set.\n let pageScheme: ColorScheme = options.colorScheme ?? 'light';\n let preferred: ColorScheme | null = null;\n const environment = {\n colorScheme: pageScheme,\n dynamicTypeSize: options.dynamicTypeSize ?? 'large',\n horizontalSizeClass: horizontalSizeClassFor(screen.clientWidth || 393),\n };\n renderer.contentHeight = options.contentHeight ?? false;\n if (options.assets) renderer.setAssetCatalog(options.assets);\n renderer.setEnvironment({ colorScheme: environment.colorScheme, dynamicTypeSize: environment.dynamicTypeSize });\n if (options.safeArea !== undefined) renderer.setSafeArea(options.safeArea);\n root.setEnvironment(environment);\n\n const applyScheme = (): void => {\n const scheme = preferred ?? pageScheme;\n const device = screen.closest<HTMLElement>('.device');\n if (device) device.dataset['theme'] = scheme;\n renderer?.setEnvironment({ colorScheme: scheme });\n root.setEnvironment({ colorScheme: scheme });\n };\n const onPreferredScheme = (event: Event): void => {\n const scheme = (event as CustomEvent<{ colorScheme: ColorScheme | null }>).detail.colorScheme;\n preferred = scheme;\n // Outside the commit that asked for it.\n queueMicrotask(applyScheme);\n };\n screen.addEventListener('sb:color-scheme', onPreferredScheme);\n\n // The size class follows the root's width (700 points and up is regular).\n let sizeClass = environment.horizontalSizeClass;\n const observer =\n typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => {\n const next = horizontalSizeClassFor(screen.clientWidth);\n if (next === sizeClass) return;\n sizeClass = next;\n root.setEnvironment({ horizontalSizeClass: next });\n })\n : null;\n observer?.observe(screen);\n\n root.render(element);\n const mounted: Mounted = {\n root,\n renderer,\n setEnvironment(next) {\n if (next.colorScheme !== undefined) pageScheme = next.colorScheme;\n const scheme = preferred ?? pageScheme;\n renderer?.setEnvironment({ ...next, colorScheme: scheme });\n root.setEnvironment({ ...next, colorScheme: scheme });\n },\n unmount() {\n observer?.disconnect();\n screen.removeEventListener('sb:color-scheme', onPreferredScheme);\n root.unmount();\n renderer?.dispose();\n },\n };\n return mounted;\n}\n","import { createContext, useContext, type ReactNode } from 'react';\n\n/** What a `NavigationStack` offers the views inside it. */\nexport interface NavigationContextValue {\n push(value: unknown): void;\n pop(): void;\n /** `.navigationDestination(for:)`: how a pushed value becomes a screen. */\n registerDestination(destination: (value: unknown) => ReactNode): void;\n}\n\nexport const NavigationContext = createContext<NavigationContextValue | null>(null);\n\nexport function useNavigation(): NavigationContextValue | null {\n return useContext(NavigationContext);\n}\n\n/** Rendered by the `navigationDestination` modifier: registers the builder with the enclosing stack. */\nexport function RegisterDestination({ destination }: { destination: (value: never) => ReactNode }): null {\n const navigation = useContext(NavigationContext);\n navigation?.registerDestination(destination as (value: unknown) => ReactNode);\n return null;\n}\n","/**\n * React context does not cross a root boundary, and a `Host` (a react-dom\n * root inside the SwiftUI tree) or a `SwiftUIView` (a SwiftUI root inside a\n * react-dom tree) is one. The bridge reads the contexts on the outer side and\n * provides them again on the inner side. This package's own contexts always\n * travel; a component names any others it needs.\n */\n\nimport { createElement, useContext, type Context, type ReactNode } from 'react';\nimport { DismissContext, EnvironmentContext, ViewEnvironmentContext } from './environment';\nimport { NavigationContext } from './navigation-context';\n\nconst OWN: readonly Context<unknown>[] = [\n EnvironmentContext as Context<unknown>,\n ViewEnvironmentContext as Context<unknown>,\n NavigationContext as Context<unknown>,\n DismissContext as Context<unknown>,\n];\n\n/**\n * Returns a function that wraps `children` in providers of the current\n * values of this package's contexts and of `contexts`. The list of contexts\n * must not change between renders (each is read with a hook).\n */\nexport function useContextBridge(\n contexts: readonly Context<unknown>[] = [],\n options: { environment?: boolean } = {},\n): (children: ReactNode) => ReactNode {\n // An island is the source of its own device environment (its root\n // provides it), so it bridges everything but that.\n const own = options.environment === false ? OWN.filter((context) => context !== (EnvironmentContext as Context<unknown>)) : OWN;\n const all = [...own, ...contexts];\n // One hook per context, in a stable order: the list is fixed per call site.\n const values = all.map((context) => useContext(context));\n return (children) =>\n all.reduceRight<ReactNode>((inner, context, index) => createElement(context.Provider, { value: values[index] }, inner), children);\n}\n","/**\n * `SwiftUIView`: a SwiftUI tree inside a react-dom app. The element carries\n * the device's design tokens (the `device` class, without its frame) and the\n * renderer draws the tree in it. `fit=\"fill\"` draws in the box the page\n * gives it (give it a height); `fit=\"content\"` makes the island as tall as\n * its content. Navigation stacks and tab views fill the box, so they want\n * `fill`.\n */\n\nimport type { AssetCatalog } from '@swiftbrowser/web/src/assets';\nimport type { ColorScheme, DynamicTypeSize } from '@swiftbrowser/web/src/protocol';\nimport { applyTypeSizeVariables } from '@swiftbrowser/web/src/typography';\nimport { useLayoutEffect, useRef, type CSSProperties, type Context, type ReactNode } from 'react';\nimport { useContextBridge } from './bridge';\nimport { mount, type Mounted } from './mount';\n\nexport interface SwiftUIViewProps {\n children?: ReactNode;\n fit?: 'fill' | 'content';\n colorScheme?: ColorScheme;\n dynamicTypeSize?: DynamicTypeSize;\n /** Contexts of the page the SwiftUI tree reads (this package's own are not needed). */\n contexts?: readonly Context<unknown>[];\n /** The asset catalog manifest for `Image(name:)` and catalog colors (see `mount`). */\n assets?: AssetCatalog;\n /**\n * Insets the views keep clear of, as a device's status bar and home\n * indicator: a navigation bar sits below `top` (its background reaching\n * into it), a list starts below it. A number is the top inset. By default\n * a `fill` island keeps `WINDOW_TOP_INSET` at the top, as SwiftUI keeps its\n * bars off a window's edge where there is no status bar; `content` has none.\n */\n safeArea?: number | Partial<SafeAreaInsets>;\n className?: string;\n style?: CSSProperties;\n}\n\ninterface SafeAreaInsets {\n top: number;\n leading: number;\n bottom: number;\n trailing: number;\n}\n\n/** The top inset of a `fill` island: a window's bar row clear of its edge. */\nconst WINDOW_TOP_INSET = 10;\n\nexport function insetsOf(safeArea: SwiftUIViewProps['safeArea'], fit: 'fill' | 'content'): SafeAreaInsets {\n const given = typeof safeArea === 'number' ? { top: safeArea } : (safeArea ?? { top: fit === 'fill' ? WINDOW_TOP_INSET : 0 });\n return { top: given.top ?? 0, leading: given.leading ?? 0, bottom: given.bottom ?? 0, trailing: given.trailing ?? 0 };\n}\n\nexport function SwiftUIView({\n children,\n fit = 'fill',\n colorScheme = 'light',\n dynamicTypeSize = 'large',\n contexts,\n assets,\n safeArea,\n className,\n style,\n}: SwiftUIViewProps): ReactNode {\n const device = useRef<HTMLDivElement>(null);\n const screen = useRef<HTMLDivElement>(null);\n const mounted = useRef<Mounted | null>(null);\n const bridge = useContextBridge(contexts, { environment: false });\n const tree = bridge(children);\n const latest = useRef(tree);\n latest.current = tree;\n\n useLayoutEffect(() => {\n if (!screen.current) return;\n const instance = mount(screen.current, latest.current, {\n colorScheme,\n dynamicTypeSize,\n safeArea: insetsOf(safeArea, fit),\n contentHeight: fit === 'content',\n ...(assets ? { assets } : {}),\n });\n mounted.current = instance;\n return () => {\n mounted.current = null;\n instance.unmount();\n };\n // The environment is updated below; a change of fit re-mounts.\n }, [fit]);\n\n useLayoutEffect(() => {\n mounted.current?.root.render(tree);\n });\n\n const insets = insetsOf(safeArea, fit);\n const insetsKey = `${insets.top},${insets.leading},${insets.bottom},${insets.trailing}`;\n useLayoutEffect(() => {\n mounted.current?.renderer.setSafeArea(insets);\n // Keyed by value: a new object each render is the same insets.\n }, [insetsKey]);\n\n useLayoutEffect(() => {\n if (device.current) applyTypeSizeVariables(device.current, dynamicTypeSize);\n mounted.current?.setEnvironment({ colorScheme, dynamicTypeSize });\n }, [colorScheme, dynamicTypeSize]);\n\n const classes = ['device', 'sb-island', className].filter(Boolean).join(' ');\n return (\n <div ref={device} className={classes} data-theme={colorScheme} data-type-size={dynamicTypeSize} data-state=\"ready\" data-sb-fit={fit} style={style}>\n <div className=\"device-screen\">\n <div ref={screen} className=\"screen\" />\n </div>\n </div>\n );\n}\n","/**\n * A `Binding<T>`: a `useState` pair, so `isOn={[downloads, setDownloads]}`\n * reads like `isOn: $downloads`. A plain value with an `onChange` handler is\n * accepted everywhere a binding is.\n */\nexport type Binding<T> = readonly [T, (value: T) => void];\n\nexport type BindingValue<T> = Binding<T> | T;\n\nexport function readBinding<T>(value: BindingValue<T>, onChange?: (value: T) => void): [T, (next: T) => void] {\n if (Array.isArray(value) && value.length === 2 && typeof value[1] === 'function') {\n const [current, set] = value as Binding<T>;\n return [current, set];\n }\n return [value as T, onChange ?? (() => {})];\n}\n","import { createElement, type ReactElement, type ReactNode } from 'react';\nimport type { EventHandlers, HoistTarget, HostProps } from './instance';\n\n/** A host element: the intrinsic `sb` with a protocol kind and props. */\nexport function sb(\n kind: string,\n props?: Record<string, unknown>,\n on?: EventHandlers,\n children?: ReactNode,\n target?: HoistTarget,\n): ReactElement {\n const hostProps: HostProps = { kind };\n if (props) hostProps.props = props;\n if (on) hostProps.on = on;\n if (target) hostProps.target = target;\n return children === undefined ? createElement('sb', hostProps) : createElement('sb', hostProps, children);\n}\n","/**\n * Named coordinate spaces: `.coordinateSpace(name:)` reports where its view\n * is on screen (a layout-transparent `zstack` with `reportsFrame`), and a\n * `GeometryReader` inside answers `frame({ named })` relative to it.\n */\n\nimport { createContext, useContext, useState, type ReactNode } from 'react';\nimport { sb } from './host/sb';\n\nexport interface SpaceFrame {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** The named spaces around a view: their frames on screen (null until reported). */\nexport const CoordinateSpacesContext = createContext<Readonly<Record<string, SpaceFrame | null>>>({});\n\nexport function useCoordinateSpaces(): Readonly<Record<string, SpaceFrame | null>> {\n return useContext(CoordinateSpacesContext);\n}\n\nexport function CoordinateSpace({ name, children }: { name: string; children?: ReactNode }): ReactNode {\n const spaces = useContext(CoordinateSpacesContext);\n const [frame, setFrame] = useState<SpaceFrame | null>(null);\n return (\n <CoordinateSpacesContext.Provider value={{ ...spaces, [name]: frame }}>\n {sb(\n 'zstack',\n { alignment: 'center', reportsSize: true, reportsFrame: true },\n {\n geometry: (event) => {\n const next = { x: event.x ?? 0, y: event.y ?? 0, width: event.width, height: event.height };\n if (!frame || frame.x !== next.x || frame.y !== next.y || frame.width !== next.width || frame.height !== next.height) setFrame(next);\n },\n },\n children,\n )}\n </CoordinateSpacesContext.Provider>\n );\n}\n","/**\n * `.draggable` and `.dropDestination`. What is dragged stays in React: a\n * lift (`dragstart`) remembers the payload, a drop naming its source hands\n * it to the destination, and `dragend` forgets it. Drops from outside the\n * page arrive as text and files.\n */\n\nimport type { DropItem } from '@swiftbrowser/web/src/protocol';\nimport type { ReactNode } from 'react';\nimport { sb } from './host/sb';\nimport type { DropDestinationModifier } from './modifiers';\n\nlet active: { id: number; payload: unknown } | null = null;\n\nexport function Draggable({ payload, children }: { payload: unknown; children?: ReactNode }): ReactNode {\n return sb(\n 'draggable',\n {},\n {\n dragstart: (event) => {\n active = { id: event.id, payload };\n },\n dragend: (event) => {\n if (active?.id === event.id) active = null;\n },\n },\n children,\n );\n}\n\n/** Text as a string, a link as a `URL`, a file as a `File`. */\nfunction itemValue(item: DropItem): unknown {\n if (item.text !== undefined) {\n if (item.type === 'text/uri-list') {\n try {\n return new URL(item.text.split(/\\r?\\n/)[0]!.trim());\n } catch {\n return item.text;\n }\n }\n return item.text;\n }\n const binary = atob(item.data ?? '');\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return typeof File !== 'undefined' ? new File([bytes], item.name ?? 'file', { type: item.type }) : bytes;\n}\n\nexport function DropDestination({ action, isTargeted, accepts, children }: DropDestinationModifier & { children?: ReactNode }): ReactNode {\n return sb(\n 'dropdestination',\n { accepts: accepts ?? [] },\n {\n drop: (event) => {\n if (event.phase === 'entered') {\n isTargeted?.(true);\n return;\n }\n isTargeted?.(false);\n if (event.phase !== 'performed') return;\n let items: unknown[];\n if (event.source !== undefined) items = active && active.id === event.source ? [active.payload] : [];\n else items = (event.items ?? []).map(itemValue);\n if (items.length > 0) action(items, { x: event.x, y: event.y });\n },\n },\n children,\n );\n}\n","/**\n * Value types of the SwiftUI API as plain data: colors and shape styles,\n * fonts, frames, insets and gradients, encoded as the ops protocol wants them.\n */\n\nimport type {\n Color as ProtocolColor,\n EdgeInsets,\n Font as ProtocolFont,\n FontDesign,\n FontWeight,\n Frame,\n FrameAlignment,\n GradientStop,\n NamedColor,\n RGBAColor,\n SemanticColorName,\n ShapeStyle,\n TextStyle,\n UnitPoint,\n} from '@swiftbrowser/web/src/protocol';\n\nexport type { EdgeInsets, FontDesign, FontWeight, Frame, FrameAlignment, ShapeStyle, TextStyle, UnitPoint };\n/** The protocol's color value (the `Color` export is the view, with the color helpers as members). */\nexport type ColorType = ProtocolColor;\n/** The protocol's font value (the `Font` export is the helper object). */\nexport type FontType = ProtocolFont;\n\n// ---------------------------------------------------------------------------\n// Colors and shape styles\n// ---------------------------------------------------------------------------\n\n/** `.primary` … `.quaternary` as foreground styles (the label colors) or fills. */\nexport type HierarchyName = 'primary' | 'secondary' | 'tertiary' | 'quaternary';\n\n/**\n * A style as a prop: a protocol value, or a name. A hierarchy name\n * (`\"secondary\"`) is the hierarchical style, as `.foregroundStyle(.secondary)`\n * is; a palette or UIKit name (`\"red\"`, `\"secondarySystemBackground\"`) is that\n * semantic color; `\"white\"`, `\"black\"` and `\"#rrggbb[aa]\"` are explicit colors.\n */\nexport type StyleValue = ShapeStyle | HierarchyName | SemanticColorName | 'white' | 'black' | `#${string}`;\n\nconst HIERARCHY: Record<HierarchyName, 1 | 2 | 3 | 4> = { primary: 1, secondary: 2, tertiary: 3, quaternary: 4 };\n\nexport function rgb(r: number, g: number, b: number, a = 1): RGBAColor {\n return { r, g, b, a };\n}\n\nexport function hex(value: string): RGBAColor {\n const digits = value.replace('#', '');\n const wide = digits.length === 3 || digits.length === 4 ? [...digits].map((d) => d + d).join('') : digits;\n const n = (at: number): number => parseInt(wide.slice(at, at + 2), 16) / 255;\n return { r: n(0), g: n(2), b: n(4), a: wide.length >= 8 ? n(6) : 1 };\n}\n\nexport function shapeStyle(value: StyleValue): ShapeStyle {\n if (typeof value !== 'string') return value;\n if (value in HIERARCHY) return { hierarchical: HIERARCHY[value as HierarchyName] };\n if (value === 'white') return rgb(1, 1, 1);\n if (value === 'black') return rgb(0, 0, 0);\n if (value.startsWith('#')) return hex(value);\n return { name: value as SemanticColorName };\n}\n\n/** A color as a prop: a protocol color or a name (hierarchy names are not colors). */\nexport type ColorValue = ProtocolColor | SemanticColorName | 'white' | 'black' | `#${string}`;\n\nexport function color(value: ColorValue): ProtocolColor {\n return shapeStyle(value as StyleValue) as ProtocolColor;\n}\n\n/** `color.opacity(a)` */\nexport function opacity(value: ColorValue, a: number): ProtocolColor;\nexport function opacity(value: StyleValue, a: number): ShapeStyle;\nexport function opacity(value: StyleValue, a: number): ShapeStyle {\n const style = shapeStyle(value);\n if ('r' in style) return { ...style, a: style.a * a };\n if ('name' in style) return { ...style, a: ((style as NamedColor).a ?? 1) * a };\n if ('named' in style) return { ...style, opacity: style.opacity * a };\n return { ...style, opacity: ((style as { opacity?: number }).opacity ?? 1) * a };\n}\n\n/** `color.gradient`: the subtle vertical gradient iOS derives from a color. */\nexport function gradient(value: ColorValue): ShapeStyle {\n return { colorGradient: color(value) };\n}\n\n/** `Color.red`, `Color.white`, `Color(.secondarySystemBackground)`… (`Color` itself, a view, carries these as members). */\nexport const ColorValues = {\n red: { name: 'red' } as ProtocolColor,\n orange: { name: 'orange' } as ProtocolColor,\n yellow: { name: 'yellow' } as ProtocolColor,\n green: { name: 'green' } as ProtocolColor,\n mint: { name: 'mint' } as ProtocolColor,\n teal: { name: 'teal' } as ProtocolColor,\n cyan: { name: 'cyan' } as ProtocolColor,\n blue: { name: 'blue' } as ProtocolColor,\n indigo: { name: 'indigo' } as ProtocolColor,\n purple: { name: 'purple' } as ProtocolColor,\n pink: { name: 'pink' } as ProtocolColor,\n brown: { name: 'brown' } as ProtocolColor,\n gray: { name: 'gray' } as ProtocolColor,\n white: rgb(1, 1, 1) as ProtocolColor,\n black: rgb(0, 0, 0) as ProtocolColor,\n clear: { name: 'clear' } as ProtocolColor,\n primary: { name: 'primary' } as ProtocolColor,\n secondary: { name: 'secondary' } as ProtocolColor,\n accent: { name: 'accent' } as ProtocolColor,\n /** `Color(uiColor:)` / `Color(.name)`: a UIKit semantic color by its iOS name. */\n system: (name: SemanticColorName): ProtocolColor => ({ name }),\n rgb,\n hex,\n opacity,\n gradient,\n};\n\n// ---------------------------------------------------------------------------\n// Unit points and gradients\n// ---------------------------------------------------------------------------\n\nexport type UnitPointName =\n | 'center'\n | 'top'\n | 'bottom'\n | 'leading'\n | 'trailing'\n | 'topLeading'\n | 'topTrailing'\n | 'bottomLeading'\n | 'bottomTrailing';\nexport type UnitPointValue = UnitPoint | UnitPointName;\n\nconst UNIT_POINTS: Record<UnitPointName, UnitPoint> = {\n center: { x: 0.5, y: 0.5 },\n top: { x: 0.5, y: 0 },\n bottom: { x: 0.5, y: 1 },\n leading: { x: 0, y: 0.5 },\n trailing: { x: 1, y: 0.5 },\n topLeading: { x: 0, y: 0 },\n topTrailing: { x: 1, y: 0 },\n bottomLeading: { x: 0, y: 1 },\n bottomTrailing: { x: 1, y: 1 },\n};\n\nexport function unitPoint(value: UnitPointValue): UnitPoint {\n return typeof value === 'string' ? UNIT_POINTS[value] : value;\n}\n\nexport interface GradientColors {\n /** Evenly spaced colors, or explicit stops. */\n colors?: ColorValue[];\n stops?: { color: ColorValue; location: number }[];\n}\n\nfunction stops(spec: GradientColors): GradientStop[] {\n if (spec.stops) return spec.stops.map((stop) => ({ color: color(stop.color), location: stop.location }));\n const colors = spec.colors ?? [];\n const last = Math.max(colors.length - 1, 1);\n return colors.map((value, index) => ({ color: color(value), location: index / last }));\n}\n\nexport function LinearGradient(spec: GradientColors & { startPoint: UnitPointValue; endPoint: UnitPointValue }): ShapeStyle {\n return { linearGradient: { stops: stops(spec), start: unitPoint(spec.startPoint), end: unitPoint(spec.endPoint) } };\n}\n\nexport function RadialGradient(\n spec: GradientColors & { center: UnitPointValue; startRadius: number; endRadius: number },\n): ShapeStyle {\n return {\n radialGradient: { stops: stops(spec), center: unitPoint(spec.center), startRadius: spec.startRadius, endRadius: spec.endRadius },\n };\n}\n\nexport function AngularGradient(\n spec: GradientColors & { center: UnitPointValue; startAngle?: number; endAngle?: number },\n): ShapeStyle {\n return {\n angularGradient: {\n stops: stops(spec),\n center: unitPoint(spec.center),\n startAngle: spec.startAngle ?? 0,\n endAngle: spec.endAngle ?? 360,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Fonts\n// ---------------------------------------------------------------------------\n\n/** A font as a prop: a text style name (`\"headline\"`) or a `Font` object. */\nexport type FontValue = TextStyle | ProtocolFont;\n\nexport function font(value: FontValue): ProtocolFont {\n return typeof value === 'string' ? { textStyle: value } : value;\n}\n\n/** `Font.system(size:weight:design:)` */\nexport function system(size: number, weight?: FontWeight, design?: FontDesign): ProtocolFont;\n/** `Font.system(.body, design:weight:)` */\nexport function system(textStyle: TextStyle, design?: FontDesign, weight?: FontWeight): ProtocolFont;\nexport function system(first: number | TextStyle, second?: FontWeight | FontDesign, third?: FontDesign | FontWeight): ProtocolFont {\n const result: ProtocolFont = typeof first === 'number' ? { size: first } : { textStyle: first };\n const weight = typeof first === 'number' ? (second as FontWeight | undefined) : (third as FontWeight | undefined);\n const design = typeof first === 'number' ? (third as FontDesign | undefined) : (second as FontDesign | undefined);\n if (weight) result.weight = weight;\n if (design) result.design = design;\n return result;\n}\n\n/** `.font(.title2.bold())`, `.font(.subheadline.weight(.semibold))` */\nexport function weighted(value: FontValue, weight: FontWeight): ProtocolFont {\n return { ...font(value), weight };\n}\n\nexport const Font = { system, weighted, bold: (value: FontValue): ProtocolFont => weighted(value, 'bold') };\n\n// ---------------------------------------------------------------------------\n// Frames and insets\n// ---------------------------------------------------------------------------\n\n/** `Infinity` stands for `.infinity`. */\nexport interface FrameValue {\n width?: number;\n height?: number;\n minWidth?: number;\n maxWidth?: number;\n minHeight?: number;\n maxHeight?: number;\n alignment?: FrameAlignment;\n}\n\nexport function frame(value: FrameValue): Frame {\n const dimension = (n: number | undefined): number | 'infinity' | undefined =>\n n === undefined ? undefined : n === Infinity ? 'infinity' : n;\n const result: Frame = { alignment: value.alignment ?? 'center' };\n if (value.width !== undefined) result.width = value.width;\n if (value.height !== undefined) result.height = value.height;\n const minWidth = dimension(value.minWidth);\n const maxWidth = dimension(value.maxWidth);\n const minHeight = dimension(value.minHeight);\n const maxHeight = dimension(value.maxHeight);\n if (minWidth !== undefined) result.minWidth = minWidth;\n if (maxWidth !== undefined) result.maxWidth = maxWidth;\n if (minHeight !== undefined) result.minHeight = minHeight;\n if (maxHeight !== undefined) result.maxHeight = maxHeight;\n return result;\n}\n\nexport type EdgeName = 'top' | 'bottom' | 'leading' | 'trailing' | 'horizontal' | 'vertical' | 'all';\n/**\n * `.padding()` (`true`), `.padding(12)`, `.padding(.vertical, 6)` (`[\"vertical\", 6]`),\n * `.padding([.top, .leading], 8)`, or explicit insets.\n */\nexport type PaddingValue = true | number | EdgeInsets | [EdgeName | EdgeName[], number?];\n\nexport const DEFAULT_PADDING = 16;\n\nexport function padding(value: PaddingValue): EdgeInsets {\n if (value === true) return insets(['all'], DEFAULT_PADDING);\n if (typeof value === 'number') return insets(['all'], value);\n if (Array.isArray(value)) {\n const [edges, amount] = value;\n return insets(Array.isArray(edges) ? edges : [edges], amount ?? DEFAULT_PADDING);\n }\n return value;\n}\n\nexport function insets(edges: EdgeName[], amount: number): EdgeInsets {\n const result: EdgeInsets = {};\n for (const edge of edges) {\n if (edge === 'all' || edge === 'vertical' || edge === 'top') result.top = amount;\n if (edge === 'all' || edge === 'vertical' || edge === 'bottom') result.bottom = amount;\n if (edge === 'all' || edge === 'horizontal' || edge === 'leading') result.leading = amount;\n if (edge === 'all' || edge === 'horizontal' || edge === 'trailing') result.trailing = amount;\n }\n return result;\n}\n","/**\n * The scroll modifiers that pass down to the scroll views below, as SwiftUI's\n * environment does: `.scrollEdgeEffectStyle(_:for:)`,\n * `.scrollEdgeEffectHidden(_:for:)` and `.contentMargins(_:_:for:)`. A\n * `ScrollView` or `List` reads them from above and from its own props, the\n * closer setting winning edge by edge.\n */\n\nimport type { EdgeEffectProps, EdgeInsets } from '@swiftbrowser/web/src/protocol';\nimport { Children, createContext, createElement, useContext, type ReactNode } from 'react';\nimport { sb } from './host/sb';\nimport { padding, type PaddingValue } from './values';\n\nexport type ScrollEdgeEffectStyle = 'automatic' | 'hard' | 'soft';\n/** The vertical edges a scroll edge effect sits on. */\nexport type ScrollEdges = 'top' | 'bottom' | 'all' | 'vertical' | ('top' | 'bottom')[];\n\n/**\n * `.scrollEdgeEffectStyle(.hard, for: .top)` is `[\"hard\", \"top\"]`; a bare\n * style applies to both edges.\n */\nexport type ScrollEdgeEffectStyleValue = ScrollEdgeEffectStyle | [ScrollEdgeEffectStyle, ScrollEdges];\n/** `.scrollEdgeEffectHidden()` is `true`; `.scrollEdgeEffectHidden(true, for: .bottom)` is `[true, \"bottom\"]`. */\nexport type ScrollEdgeEffectHiddenValue = boolean | [boolean, ScrollEdges];\n\n/** The scroll settings in force at a point of the tree. */\nexport interface ScrollSettings {\n /** Per edge: a style (`hard`, `soft`; absent is automatic) or hidden. */\n topStyle?: 'hard' | 'soft';\n bottomStyle?: 'hard' | 'soft';\n topHidden?: boolean;\n bottomHidden?: boolean;\n /** `.contentMargins`: padding inside the scroll views below. */\n margins?: EdgeInsets;\n}\n\nconst ScrollSettingsContext = createContext<ScrollSettings>({});\n\nfunction edgesOf(edges: ScrollEdges): { top: boolean; bottom: boolean } {\n const list = Array.isArray(edges) ? edges : [edges];\n const all = list.some((edge) => edge === 'all' || edge === 'vertical');\n return { top: all || list.includes('top'), bottom: all || list.includes('bottom') };\n}\n\n/** The settings one modifier adds. */\nexport function edgeStyleSettings(value: ScrollEdgeEffectStyleValue): ScrollSettings {\n const [style, edges] = Array.isArray(value) ? value : [value, 'all' as const];\n const on = edgesOf(edges);\n const name = style === 'automatic' ? undefined : style;\n const result: ScrollSettings = {};\n // `automatic` clears what an outer modifier set, so the key is kept.\n if (on.top) result.topStyle = name;\n if (on.bottom) result.bottomStyle = name;\n return result;\n}\n\nexport function edgeHiddenSettings(value: ScrollEdgeEffectHiddenValue): ScrollSettings {\n const [hidden, edges] = Array.isArray(value) ? value : [value, 'all' as const];\n const on = edgesOf(edges);\n const result: ScrollSettings = {};\n if (on.top) result.topHidden = hidden;\n if (on.bottom) result.bottomHidden = hidden;\n return result;\n}\n\n/** `contentMargins={12}`, `{[\"horizontal\", 20]}` or insets; `true` is the default 16. */\nexport type ContentMarginsValue = PaddingValue;\n\nexport function marginSettings(value: ContentMarginsValue): ScrollSettings {\n return { margins: padding(value) };\n}\n\n/** `inner` over `outer`, edge by edge. */\nexport function mergeScrollSettings(outer: ScrollSettings, inner: ScrollSettings): ScrollSettings {\n const result: ScrollSettings = { ...outer };\n for (const key of ['topStyle', 'bottomStyle', 'topHidden', 'bottomHidden'] as const) {\n if (key in inner) (result as Record<string, unknown>)[key] = inner[key];\n }\n if (inner.margins) result.margins = { ...outer.margins, ...inner.margins };\n return result;\n}\n\n/** The views below see `settings` added to the ones around them. */\nexport function withScrollSettings(settings: ScrollSettings, children: ReactNode): ReactNode {\n return createElement(ScrollSettingsExtender, { settings }, children);\n}\n\nfunction ScrollSettingsExtender({ settings, children }: { settings: ScrollSettings; children?: ReactNode }): ReactNode {\n const outer = useContext(ScrollSettingsContext);\n return createElement(ScrollSettingsContext.Provider, { value: mergeScrollSettings(outer, settings) }, children);\n}\n\n/** The settings in force here, with a scroll view's own modifiers applied over them. */\nexport function useScrollSettings(own: ScrollSettings): ScrollSettings {\n return mergeScrollSettings(useContext(ScrollSettingsContext), own);\n}\n\n/** The `edgeEffect` prop of a `list` or `scrollview`, absent when both edges are automatic. */\nexport function edgeEffectProp(settings: ScrollSettings): EdgeEffectProps | undefined {\n const edges: EdgeEffectProps = {};\n const top = settings.topHidden ? 'hidden' : settings.topStyle;\n const bottom = settings.bottomHidden ? 'hidden' : settings.bottomStyle;\n if (top) edges.top = top;\n if (bottom) edges.bottom = bottom;\n return top || bottom ? edges : undefined;\n}\n\n/**\n * A scroll view's content with its content margins as padding inside it\n * (several children first become the stack the scroll view would make).\n */\nexport function marginedContent(children: ReactNode, margins: EdgeInsets | undefined, axis: 'horizontal' | 'vertical'): ReactNode {\n if (!margins || Object.values(margins).every((value) => !value)) return children;\n const list = Children.toArray(children);\n const content = list.length === 1 ? list[0] : sb(axis === 'horizontal' ? 'hstack' : 'vstack', { spacing: null, alignment: 'center' }, undefined, children);\n return sb('styled', { style: { padding: margins } }, undefined, content);\n}\n\n","/**\n * List rows that can be selected or deleted are wrapped in a `listrow`\n * (docs/ops-protocol.md, \"Edit mode and list selection\"). `ForEach`'s\n * `onDelete` and a `List`'s `selection` both end in this component; a row\n * that is neither selectable nor deletable renders bare.\n */\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\n\nexport interface ListSelection {\n isSelected(tag: unknown): boolean;\n select(tag: unknown): void;\n editing: boolean;\n}\n\nexport const ListSelectionContext = createContext<ListSelection | null>(null);\n\nexport interface RowProps {\n /** The row's tag (`.tag`, a `NavigationLink` value or a `ForEach` id). */\n tag?: unknown;\n /** `ForEach` with `onDelete`: what a swipe or the edit-mode minus does. */\n onDelete?: () => void;\n deletable?: boolean;\n /**\n * `ForEach` with `onMove`: called with the destination offset in the\n * `ForEach`'s data (as `move(fromOffsets:toOffset:)` takes it) when the\n * row was dragged to a new place.\n */\n onMove?: (to: number) => void;\n movable?: boolean;\n /** The row's offset in its `ForEach`. */\n index?: number;\n /** The row's index among its container's children (set by `List` / `Section`), for mapping `move`. */\n containerIndex?: number;\n children?: ReactNode;\n}\n\nexport function Row({ tag, onDelete, deletable, onMove, movable, index, containerIndex, children }: RowProps): ReactNode {\n const selection = useContext(ListSelectionContext);\n const selectable = selection !== null && tag !== undefined;\n const canDelete = onDelete !== undefined && deletable !== false;\n const canMove = onMove !== undefined && movable !== false;\n if (!selectable && !canDelete && !canMove) return children;\n const props: Record<string, unknown> = {};\n if (selectable) {\n props['selectable'] = true;\n props['selected'] = selection.isSelected(tag);\n }\n if (canDelete) props['deletable'] = true;\n if (canMove) props['movable'] = true;\n return sb(\n 'listrow',\n props,\n {\n tap: () => selectable && selection.select(tag),\n delete: () => onDelete?.(),\n move: (event) => {\n // `to` counts the container's children; the ForEach's first row is\n // `containerIndex - index` children in.\n const start = (containerIndex ?? index ?? 0) - (index ?? 0);\n onMove?.(Math.max(0, event.to - start));\n },\n },\n children,\n );\n}\n","/**\n * `ScrollViewReader` and `.id` (the `scrollID` modifier): `proxy.scrollTo(id)`\n * marks the view with that id with a `scrollTo` command whose serial is new,\n * and the page scrolls every scrolling ancestor to it after the pass.\n */\n\nimport type { UnitPoint } from '@swiftbrowser/web/src/protocol';\nimport { createContext, useContext, useState, type ReactNode } from 'react';\nimport { styled } from './modifiers';\nimport { unitPoint, type UnitPointValue } from './values';\n\ninterface ScrollRequest {\n id: string | number;\n anchor: UnitPoint | null;\n serial: number;\n}\n\nexport const ScrollRequestContext = createContext<ScrollRequest | null>(null);\nlet nextSerial = 1;\n\nexport interface ScrollViewProxy {\n /** Scroll so `anchor` of the view with that `scrollID` meets the same point of the visible area; no anchor: as little as shows it. */\n scrollTo(id: string | number, anchor?: UnitPointValue): void;\n}\n\nexport function ScrollViewReader({ children }: { children: (proxy: ScrollViewProxy) => ReactNode }): ReactNode {\n const [request, setRequest] = useState<ScrollRequest | null>(null);\n const proxy: ScrollViewProxy = {\n scrollTo: (id, anchor) => setRequest({ id, anchor: anchor === undefined ? null : unitPoint(anchor), serial: nextSerial++ }),\n };\n return <ScrollRequestContext.Provider value={request}>{children(proxy)}</ScrollRequestContext.Provider>;\n}\n\nexport function ScrollTarget({ id, children }: { id: string | number; children?: ReactNode }): ReactNode {\n const request = useContext(ScrollRequestContext);\n if (request && request.id === id) return styled({ scrollID: true, scrollTo: { anchor: request.anchor, serial: request.serial } }, children);\n return styled({ scrollID: true }, children);\n}\n","/**\n * Lazy rows (docs/ops-protocol.md, \"Lazy rows\"): inside a `List`,\n * `LazyVStack` or `LazyHStack`, a `ForEach` of more rows than a batch mounts\n * the first batch and a `lazyspacer`; the page reports the spacer when it\n * nears the visible area (`lazy`), and the next batch mounts, with a new\n * spacer after it.\n */\n\nimport { createContext, createElement, isValidElement, useContext, useEffect, useState, type ReactElement, type ReactNode } from 'react';\nimport { ScrollRequestContext } from './scrollReader';\nimport { sb } from './host/sb';\n\nexport const LAZY_BATCH = 12;\n\nexport const LazyContext = createContext<'vertical' | 'horizontal' | null>(null);\n\nexport interface LazyGroupProps {\n rows: ReactElement[];\n /** Set by a list: the group's first row's index among the container's children. */\n start?: number;\n /** Set by a list: wraps each row (selection tags) given its index among the container's children. */\n wrap?: (row: ReactElement, containerIndex: number) => ReactNode;\n}\n\nexport function LazyGroup({ rows, start = 0, wrap }: LazyGroupProps): ReactNode {\n const axis = useContext(LazyContext);\n const request = useContext(ScrollRequestContext);\n const [count, setCount] = useState(LAZY_BATCH);\n // A `scrollTo` whose target is a row not built yet builds the rows up to it\n // first, as SwiftUI does, so the target is on the page when it scrolls.\n const target = request ? rows.findIndex((row) => rowMatches(row, request.id)) : -1;\n const needed = target >= 0 ? Math.ceil((target + 1) / LAZY_BATCH) * LAZY_BATCH : 0;\n useEffect(() => {\n if (needed > count) setCount(needed);\n }, [needed, count]);\n const visible = Math.max(count, needed);\n const shown = axis === null ? rows : rows.slice(0, visible);\n const built = shown.map((row, index) => (wrap ? wrap(row, start + index) : row));\n if (axis === null || shown.length >= rows.length) return built;\n return [\n ...built,\n createElement(\n LazySpacer,\n { key: `lazy-${visible}`, axis, remaining: rows.length - shown.length, more: () => setCount(visible + LAZY_BATCH) },\n ),\n ];\n}\n\nfunction LazySpacer({ axis, remaining, more }: { axis: 'vertical' | 'horizontal'; remaining: number; more: () => void }): ReactNode {\n return sb('lazyspacer', { axis, remaining }, { lazy: more });\n}\n\n/** Whether a row is a scroll target's: its key (a `ForEach` id), or a `scrollID` on the row's view. */\nfunction rowMatches(row: ReactElement, id: string | number): boolean {\n if (row.key !== null && row.key === String(id)) return true;\n let element: ReactElement | null = row;\n for (let depth = 0; element && depth < 3; depth++) {\n const props = element.props as { scrollID?: unknown; children?: unknown };\n if (props.scrollID === id) return true;\n element = isValidElement(props.children) ? (props.children as ReactElement) : null;\n }\n return false;\n}\n","import type { FrameAlignment, GridItem as GridItemProps, GridRowAlignment, HStackAlignment, ScrollAxes, VStackAlignment } from '@swiftbrowser/web/src/protocol';\nimport { Children, Fragment, createElement, isValidElement, useState, type Key, type ReactElement, type ReactNode } from 'react';\nimport { useViewEnvironment } from '../environment';\nimport type { EventHandlers } from '../host/instance';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, takeModifier, type ModifierEntry, type ViewModifiers } from '../modifiers';\nimport {\n edgeEffectProp,\n edgeHiddenSettings,\n edgeStyleSettings,\n marginSettings,\n marginedContent,\n mergeScrollSettings,\n useScrollSettings,\n withScrollSettings,\n type ContentMarginsValue,\n type ScrollEdgeEffectHiddenValue,\n type ScrollEdgeEffectStyleValue,\n type ScrollSettings,\n} from '../scrollEnvironment';\nimport { Row, type RowProps } from './row';\nimport { LAZY_BATCH, LazyGroup, type LazyGroupProps } from '../lazy';\n\nexport interface VStackProps extends ViewModifiers {\n alignment?: VStackAlignment;\n spacing?: number | null;\n /** `.scrollTargetLayout()`: the children are the enclosing scroll view's snap points. */\n scrollTargetLayout?: boolean;\n children?: ReactNode;\n}\n\nexport function VStack(props: VStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const stack: Record<string, unknown> = { spacing: own.spacing ?? null, alignment: own.alignment ?? 'center' };\n if (own.scrollTargetLayout) stack['scrollTarget'] = true;\n return applyModifiers(sb('vstack', stack, undefined, own.children), modifiers);\n}\n\nexport interface HStackProps extends ViewModifiers {\n alignment?: HStackAlignment | 'firstTextBaseline' | 'lastTextBaseline';\n spacing?: number | null;\n scrollTargetLayout?: boolean;\n children?: ReactNode;\n}\n\nexport function HStack(props: HStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const stack: Record<string, unknown> = { spacing: own.spacing ?? null, alignment: own.alignment ?? 'center' };\n if (own.scrollTargetLayout) stack['scrollTarget'] = true;\n return applyModifiers(sb('hstack', stack, undefined, own.children), modifiers);\n}\n\nexport interface ZStackProps extends ViewModifiers {\n alignment?: FrameAlignment;\n children?: ReactNode;\n}\n\nexport function ZStack(props: ZStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('zstack', { alignment: own.alignment ?? 'center' }, undefined, own.children), modifiers);\n}\n\nexport interface SpacerProps extends ViewModifiers {\n minLength?: number | null;\n}\n\nexport function Spacer(props: SpacerProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('spacer', { minLength: own.minLength ?? null }), modifiers);\n}\n\nexport function Divider(props: ViewModifiers): ReactNode {\n const { modifiers } = splitProps(props);\n return applyModifiers(sb('divider', {}), modifiers);\n}\n\nexport interface ScrollViewProps extends ViewModifiers {\n axes?: ScrollAxes;\n /** `.scrollTargetBehavior(_:)`: snap to the `scrollTargetLayout` children, or a page at a time. */\n scrollTargetBehavior?: 'viewAligned' | 'paging';\n /** `.scrollDismissesKeyboard(.immediately)` */\n scrollDismissesKeyboard?: boolean;\n children?: ReactNode;\n}\n\nexport function ScrollView(props: ScrollViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const refresh = useRefreshable(takeModifier(modifiers, 'refreshable'));\n const ownSettings = takeScrollSettings(modifiers);\n const settings = useScrollSettings(ownSettings);\n const axes = own.axes ?? 'vertical';\n const scroll: Record<string, unknown> = { axes, ...refresh.props };\n if (own.scrollTargetBehavior) scroll['snap'] = own.scrollTargetBehavior;\n if (own.scrollDismissesKeyboard) scroll['dismissesKeyboard'] = true;\n const edgeEffect = edgeEffectProp(settings);\n if (edgeEffect) scroll['edgeEffect'] = edgeEffect;\n const content = marginedContent(own.children, settings.margins, axes === 'horizontal' ? 'horizontal' : 'vertical');\n return applyModifiers(sb('scrollview', scroll, refresh.handlers, providingScrollSettings(ownSettings, content)), modifiers);\n}\n\n/**\n * The scroll modifiers written on a `ScrollView` or `List` itself: they apply\n * to it, and pass on to the scroll views inside as from above.\n */\nexport function takeScrollSettings(modifiers: ModifierEntry[]): ScrollSettings {\n let settings: ScrollSettings = {};\n // Each sets different fields, so their order does not matter.\n const own: ScrollSettings[] = [];\n for (const key of ['scrollEdgeEffectStyle', 'scrollEdgeEffectHidden', 'contentMargins'] as const) {\n const value = takeModifier(modifiers, key);\n if (value === undefined) continue;\n if (key === 'scrollEdgeEffectStyle') own.push(edgeStyleSettings(value as ScrollEdgeEffectStyleValue));\n else if (key === 'scrollEdgeEffectHidden') own.push(edgeHiddenSettings(value as ScrollEdgeEffectHiddenValue));\n else own.push(marginSettings(value as ContentMarginsValue));\n }\n for (const each of own) settings = mergeScrollSettings(settings, each);\n return settings;\n}\n\n/** `children` under the settings a scroll view was given itself (when there are any). */\nexport function providingScrollSettings(settings: ScrollSettings, children: ReactNode): ReactNode {\n return Object.keys(settings).length > 0 ? withScrollSettings(settings, children) : children;\n}\n\n/**\n * `.refreshable` above a `List` or `ScrollView`: its props (`refreshable`,\n * `refreshing` while the action runs) and the `refresh` handler.\n */\nexport function useRefreshable(own?: () => unknown): { props: Record<string, unknown>; handlers?: EventHandlers } {\n // `.refreshable` on the list or scroll view itself, else from above it.\n const environment = useViewEnvironment();\n const refresh = own ?? environment.refresh;\n const [refreshing, setRefreshing] = useState(false);\n if (!refresh) return { props: {} };\n return {\n props: { refreshable: true, refreshing },\n handlers: {\n refresh: () => {\n if (refreshing) return;\n setRefreshing(true);\n Promise.resolve()\n .then(refresh)\n .catch((error: unknown) => console.error(error))\n .finally(() => setRefreshing(false));\n },\n },\n };\n}\n\nexport interface GroupProps extends ViewModifiers {\n children?: ReactNode;\n}\n\n/** `Group { }`: the modifiers apply to each child. */\nexport function Group(props: GroupProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n if (modifiers.length === 0) return own.children;\n return Children.map(own.children, (child) => applyModifiers(child, modifiers));\n}\n\nexport interface ForEachProps<T> extends ViewModifiers {\n data: readonly T[];\n /** The identity of each element (`id: \\.self` by default, or `.id` when the element has one). */\n id?: (element: T, index: number) => Key;\n /** `.onDelete`: the rows become deletable (a swipe, or edit mode's minus); called with the offsets to remove. */\n onDelete?: (offsets: number[]) => void;\n /** `.deleteDisabled`, per element. */\n deleteDisabled?: (element: T, index: number) => boolean;\n /**\n * `.onMove`: the rows become movable (a grip in edit mode, a long press\n * otherwise); called like `move(fromOffsets:toOffset:)`, with the offsets\n * moved and the offset they go before, counted before the move\n * (`moveItems` applies it to an array).\n */\n onMove?: (offsets: number[], to: number) => void;\n /** `.moveDisabled`, per element. */\n moveDisabled?: (element: T, index: number) => boolean;\n children: (element: T, index: number) => ReactNode;\n}\n\n/** `Array.move(fromOffsets:toOffset:)`: the array with `offsets` moved before `to` (counted before the move). */\nexport function moveItems<T>(items: readonly T[], offsets: readonly number[], to: number): T[] {\n const moving = new Set(offsets);\n const picked = items.filter((_, index) => moving.has(index));\n const rest = items.filter((_, index) => !moving.has(index));\n const before = offsets.filter((offset) => offset < to).length;\n const at = to - before;\n return [...rest.slice(0, at), ...picked, ...rest.slice(at)];\n}\n\n/** `ForEach(data, id:) { }`: one keyed child per element. */\nexport function ForEach<T>(props: ForEachProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const rows = own.data.map((element, index): ReactElement => {\n const key = own.id ? own.id(element, index) : keyOf(element, index);\n const content = applyModifiers(own.children(element, index), modifiers);\n if (!own.onDelete && !own.onMove) return createElement(Fragment, { key }, content);\n const { onDelete, onMove } = own;\n const row: RowProps = { tag: key, index };\n if (onDelete) {\n row.onDelete = () => onDelete([index]);\n row.deletable = !own.deleteDisabled?.(element, index);\n }\n if (onMove) {\n row.onMove = (to) => onMove([index], to);\n row.movable = !own.moveDisabled?.(element, index);\n }\n return createElement(Row, { key, ...row }, content);\n });\n // A long group builds its rows lazily inside a list or a lazy stack.\n return rows.length > LAZY_BATCH ? createElement(LazyGroup, { rows }) : rows;\n}\n\nfunction keyOf(element: unknown, index: number): Key {\n if (typeof element === 'string' || typeof element === 'number') return element;\n if (typeof element === 'object' && element !== null && 'id' in element) {\n const id = (element as { id: unknown }).id;\n if (typeof id === 'string' || typeof id === 'number') return id;\n }\n return index;\n}\n\n/**\n * The elements of `children`, through fragments, arrays and `ForEach`, so\n * `Picker` and `TabView` can read their options and tabs.\n */\nexport function flattenChildren(children: ReactNode, options: { keepLazy?: boolean } = {}): ReactElement[] {\n const result: ReactElement[] = [];\n const visit = (node: ReactNode): void => {\n if (node === null || node === undefined || typeof node === 'boolean') return;\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (!isValidElement(node)) return;\n const element = node as ReactElement<Record<string, unknown>>;\n if (element.type === Fragment) {\n const inner = element.props['children'] as ReactNode;\n // A keyed fragment around one view (a `ForEach` row) hands its key on,\n // so the row keeps its identity when the rows reorder.\n if (element.key !== null && isValidElement(inner) && inner.key === null && inner.type !== Fragment) {\n visit({ ...inner, key: element.key });\n return;\n }\n visit(inner);\n return;\n }\n if (element.type === ForEach) {\n // Expand it as it would render (keys, modifiers and `onDelete` rows included).\n visit(ForEach(element.props as unknown as ForEachProps<unknown>));\n return;\n }\n if (element.type === LazyGroup && !options.keepLazy) {\n visit((element.props as unknown as LazyGroupProps).rows);\n return;\n }\n result.push(element);\n };\n visit(children);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Grids\n// ---------------------------------------------------------------------------\n\nexport interface GridItemSpec {\n size?: { fixed: number } | { flexible: { minimum?: number; maximum?: number } } | { adaptive: { minimum: number; maximum?: number } };\n spacing?: number | null;\n alignment?: FrameAlignment | null;\n}\n\n/** `GridItem(.flexible(), spacing: 8)`; `GridItem.flexible()` for short. */\nexport function GridItem(spec: GridItemSpec = {}): GridItemProps {\n const dimension = (n: number | undefined): number | 'infinity' => (n === undefined || n === Infinity ? 'infinity' : n);\n let size: GridItemProps['size'];\n if (spec.size && 'fixed' in spec.size) size = { kind: 'fixed', value: spec.size.fixed };\n else if (spec.size && 'adaptive' in spec.size) {\n size = { kind: 'adaptive', minimum: spec.size.adaptive.minimum, maximum: dimension(spec.size.adaptive.maximum) };\n } else {\n const flexible = spec.size && 'flexible' in spec.size ? spec.size.flexible : {};\n size = { kind: 'flexible', minimum: flexible.minimum ?? 10, maximum: dimension(flexible.maximum) };\n }\n return { size, spacing: spec.spacing ?? null, alignment: spec.alignment ?? null };\n}\nGridItem.flexible = (options: { minimum?: number; maximum?: number; spacing?: number; alignment?: FrameAlignment } = {}): GridItemProps =>\n GridItem({ size: { flexible: options }, spacing: options.spacing, alignment: options.alignment });\nGridItem.fixed = (value: number, options: { spacing?: number; alignment?: FrameAlignment } = {}): GridItemProps =>\n GridItem({ size: { fixed: value }, spacing: options.spacing, alignment: options.alignment });\nGridItem.adaptive = (options: { minimum: number; maximum?: number; spacing?: number; alignment?: FrameAlignment }): GridItemProps =>\n GridItem({ size: { adaptive: options }, spacing: options.spacing, alignment: options.alignment });\n\nexport interface LazyVGridProps extends ViewModifiers {\n columns: GridItemProps[];\n alignment?: FrameAlignment;\n spacing?: number | null;\n children?: ReactNode;\n}\n\nexport function LazyVGrid(props: LazyVGridProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(\n sb('lazyvgrid', { columns: own.columns, spacing: own.spacing ?? null, alignment: own.alignment ?? 'center' }, undefined, own.children),\n modifiers,\n );\n}\n\nexport interface LazyHGridProps extends ViewModifiers {\n rows: GridItemProps[];\n /** How each cell sits in its slot: `top`, `center` (the default) or `bottom`. */\n alignment?: 'top' | 'center' | 'bottom' | 'firstTextBaseline' | 'lastTextBaseline';\n /** Between the columns (8 by default). */\n spacing?: number | null;\n children?: ReactNode;\n}\n\n/**\n * `LazyHGrid(rows:)`: the rows share the height it is proposed and the cells\n * fill them column by column, usually inside a horizontal `ScrollView`.\n */\nexport function LazyHGrid(props: LazyHGridProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(\n sb('lazyhgrid', { rows: own.rows, spacing: own.spacing ?? null, alignment: (own.alignment ?? 'center') as FrameAlignment }, undefined, own.children),\n modifiers,\n );\n}\n\nexport interface GridProps extends ViewModifiers {\n alignment?: FrameAlignment;\n horizontalSpacing?: number | null;\n verticalSpacing?: number | null;\n children?: ReactNode;\n}\n\nexport function Grid(props: GridProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(\n sb(\n 'grid',\n { horizontalSpacing: own.horizontalSpacing ?? null, verticalSpacing: own.verticalSpacing ?? null, alignment: own.alignment ?? 'center' },\n undefined,\n own.children,\n ),\n modifiers,\n );\n}\n\nexport interface GridRowProps extends ViewModifiers {\n alignment?: GridRowAlignment | null;\n children?: ReactNode;\n}\n\nexport function GridRow(props: GridRowProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('gridrow', { alignment: own.alignment ?? null }, undefined, own.children), modifiers);\n}\n","import type { Font, ShapeStyle, TextRun } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, isValidElement, type ReactElement, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, styled, takeModifier, type ViewModifiers } from '../modifiers';\nimport { useViewEnvironment } from '../environment';\nimport { color, font, shapeStyle, type ColorValue, type FontValue, type StyleValue } from '../values';\nimport { HStack } from './stacks';\n\nexport interface TextProps extends ViewModifiers {\n /** Strings and numbers, nested `<Text>`s (`Text + Text`) and inline `<Image>`s. */\n children?: ReactNode;\n italic?: boolean;\n underline?: boolean | { color?: ColorValue };\n strikethrough?: boolean | { color?: ColorValue };\n /** Points between characters (`.tracking` / `.kerning`). */\n tracking?: number;\n kerning?: number;\n baselineOffset?: number;\n /** A tap on the text opens this URL. */\n link?: string;\n}\n\n/** The run-level style of one `Text` (nested texts inherit the outer one). */\ninterface RunStyle {\n italic?: boolean;\n underline?: { color?: unknown };\n strikethrough?: { color?: unknown };\n kerning?: number;\n baselineOffset?: number;\n link?: string;\n font?: Font;\n foreground?: ShapeStyle;\n}\n\ntype Segment = { text: string; style: RunStyle } | { image: Record<string, unknown>; style: RunStyle };\n\nfunction runStyleOf(props: TextProps, inherited: RunStyle, nested: boolean): RunStyle {\n const style: RunStyle = { ...inherited };\n if (props.italic) style.italic = true;\n if (props.underline) style.underline = typeof props.underline === 'object' && props.underline.color ? { color: color(props.underline.color) } : {};\n if (props.strikethrough) {\n style.strikethrough = typeof props.strikethrough === 'object' && props.strikethrough.color ? { color: color(props.strikethrough.color) } : {};\n }\n const kerning = props.tracking ?? props.kerning;\n if (kerning !== undefined) style.kerning = kerning;\n if (props.baselineOffset !== undefined) style.baselineOffset = props.baselineOffset;\n if (props.link) style.link = props.link;\n if (nested) {\n // A nested text's font and color modifiers style its run; the outer\n // text's wrap the whole element (as `styled`), like the shim.\n let runFont: Font | undefined = props.font !== undefined ? font(props.font as FontValue) : undefined;\n if (props.bold) runFont = { ...(runFont ?? {}), weight: 'bold' };\n if (props.fontWeight) runFont = { ...(runFont ?? {}), weight: props.fontWeight };\n if (runFont) style.font = { ...(style.font ?? {}), ...runFont };\n if (props.foregroundStyle !== undefined) style.foreground = shapeStyle(props.foregroundStyle as StyleValue);\n }\n return style;\n}\n\n/** The segments of a text: raw strings merge into one; nested texts and images are their own. */\nfunction segmentsOf(children: ReactNode, style: RunStyle, into: Segment[]): void {\n const visit = (node: ReactNode): void => {\n if (node === null || node === undefined || typeof node === 'boolean') return;\n if (typeof node === 'string' || typeof node === 'number') {\n const last = into[into.length - 1];\n if (last && 'text' in last && last.style === style) last.text += String(node);\n else into.push({ text: String(node), style });\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (!isValidElement(node)) return;\n const element = node as ReactElement<Record<string, unknown>>;\n if (element.type === Fragment) {\n visit(element.props['children'] as ReactNode);\n return;\n }\n if (element.type === Text) {\n const props = element.props as TextProps;\n segmentsOf(props.children, runStyleOf(props, style, true), into);\n return;\n }\n if (element.type === Image) {\n const props = element.props as ImageProps;\n into.push({ image: imageProps(props), style });\n return;\n }\n };\n visit(children);\n}\n\nfunction isPlainStyle(style: RunStyle): boolean {\n return Object.keys(style).length === 0;\n}\n\nexport function Text(props: TextProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const style = runStyleOf(props, {}, false);\n const segments: Segment[] = [];\n segmentsOf(own.children, style, segments);\n const textCase = takeModifier(modifiers, 'textCase') ?? environment.textCase;\n if (textCase) {\n for (const segment of segments) {\n if ('text' in segment) segment.text = textCase === 'uppercase' ? segment.text.toUpperCase() : segment.text.toLowerCase();\n }\n }\n const redacted = takeModifier(modifiers, 'redacted') ?? environment.redacted;\n const content = segments.map((segment) => ('text' in segment ? segment.text : '')).join('');\n const plain = segments.length <= 1 && (segments.length === 0 || ('text' in segments[0]! && isPlainStyle(segments[0]!.style)));\n if (plain) return applyModifiers(placeholder(sb('text', { text: content }), redacted), modifiers);\n const runs: TextRun[] = segments.map((segment) => {\n const run: Record<string, unknown> = { ...segment.style };\n if ('text' in segment) run['text'] = segment.text;\n else run['image'] = segment.image;\n return run as TextRun;\n });\n const hasLinks = segments.some((segment) => segment.style.link);\n const handlers = hasLinks ? { link: (event: { value: string }) => openURL(event.value) } : undefined;\n return applyModifiers(placeholder(sb('text', { text: content, runs }, handlers), redacted), modifiers);\n}\n\n/**\n * `.redacted(reason: .placeholder)`: the view keeps its size and draws as a\n * rounded block of the tertiary fill, as iOS draws placeholder content.\n */\nexport function placeholder(node: ReactNode, redacted: boolean | undefined): ReactNode {\n if (!redacted) return node;\n return styled({ background: { hierarchical: 3 }, backgroundCornerRadius: 4 }, styled({ foreground: { name: 'clear' } }, node));\n}\n\nexport function openURL(url: string): void {\n if (typeof window !== 'undefined') window.open(url, '_blank', 'noopener');\n}\n\n// ---------------------------------------------------------------------------\n// Image\n// ---------------------------------------------------------------------------\n\nexport interface ImageProps extends ViewModifiers {\n /** An SF Symbol name. */\n systemName?: string;\n /** An asset-catalog image name (the renderer needs the catalog manifest). */\n name?: string;\n /** A remote image whose pixel size is known; `AsyncImage` loads one to learn it. */\n url?: string;\n width?: number;\n height?: number;\n resizable?: boolean;\n}\n\nfunction imageProps(props: ImageProps): Record<string, unknown> {\n if (props.systemName !== undefined) return { systemName: props.systemName };\n if (props.url !== undefined) return { url: props.url, resizable: props.resizable ?? false, width: props.width ?? 0, height: props.height ?? 0 };\n return { name: props.name ?? '', resizable: props.resizable ?? false };\n}\n\nexport function Image(props: ImageProps): ReactNode {\n const { modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const redacted = takeModifier(modifiers, 'redacted') ?? environment.redacted;\n return applyModifiers(placeholder(sb('image', imageProps(props)), redacted), modifiers);\n}\n\n// ---------------------------------------------------------------------------\n// Label, LabeledContent, Link\n// ---------------------------------------------------------------------------\n\nexport interface LabelProps extends ViewModifiers {\n title: ReactNode;\n systemImage?: string;\n image?: string;\n /** A custom icon view instead of a symbol. */\n icon?: ReactNode;\n}\n\n/** `Label(\"Favorites\", systemImage: \"heart.fill\")`: an 8pt-spaced `HStack` of icon and title. */\nexport function Label(props: LabelProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const style = takeModifier(modifiers, 'labelStyle') ?? environment.labelStyle ?? 'automatic';\n const icon = own.icon ?? (own.systemImage !== undefined ? <Image systemName={own.systemImage} /> : own.image !== undefined ? <Image name={own.image} /> : null);\n const title = typeof own.title === 'string' || typeof own.title === 'number' ? <Text>{own.title}</Text> : own.title;\n if (style === 'iconOnly') return applyModifiers(icon, modifiers);\n if (style === 'titleOnly') return applyModifiers(title, modifiers);\n return applyModifiers(\n <HStack spacing={8}>\n {styled({ labelIcon: true }, icon)}\n {title}\n </HStack>,\n modifiers,\n );\n}\n\nexport interface LabeledContentProps extends ViewModifiers {\n label: ReactNode;\n value?: ReactNode;\n children?: ReactNode;\n}\n\n/** `LabeledContent(\"Storage\", value: \"2.4 GB\")`: the label, a spacer, the value in the secondary color. */\nexport function LabeledContent(props: LabeledContentProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const label = typeof own.label === 'string' || typeof own.label === 'number' ? <Text>{own.label}</Text> : own.label;\n const content = own.children ?? own.value;\n const value = typeof content === 'string' || typeof content === 'number' ? <Text>{content}</Text> : content;\n return applyModifiers(\n <HStack>\n {label}\n {sb('spacer', { minLength: null })}\n {styled({ foreground: { hierarchical: 2 } }, value)}\n </HStack>,\n modifiers,\n );\n}\n\nexport interface LinkProps extends ViewModifiers {\n destination: string;\n title?: string;\n children?: ReactNode;\n}\n\n/** `Link(\"Visit the website\", destination:)`: a plain button that opens the URL. */\nexport function Link(props: LinkProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n return applyModifiers(sb('button', { role: null, style: 'automatic' }, { tap: () => openURL(own.destination) }, label), modifiers);\n}\n","import { Fragment, useRef, useState, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { DismissContext } from '../environment';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { NavigationContext, RegisterDestination, useNavigation, type NavigationContextValue } from '../navigation-context';\nimport { Text } from './text';\n\nexport interface NavigationStackProps extends ViewModifiers {\n /** `NavigationStack(path:)`: the pushed values. */\n path?: BindingValue<readonly unknown[]>;\n onPathChange?: (path: readonly unknown[]) => void;\n /** `.navigationDestination(for:)`, for every pushed value. */\n destination?: (value: never) => ReactNode;\n children?: ReactNode;\n}\n\n/** A pushed destination view (`NavigationLink(destination:)`), kept in the path. */\ninterface PushedView {\n view: ReactNode;\n}\n\nconst isPushedView = (value: unknown): value is PushedView =>\n typeof value === 'object' && value !== null && 'view' in value && Object.keys(value).length === 1;\n\nexport function NavigationStack(props: NavigationStackProps): ReactNode {\n const enclosing = useNavigation();\n // A stack inside another stack's screen is flattened, as SwiftUI does: its\n // content renders in place and its links push onto the enclosing stack.\n if (enclosing) return <FlattenedStack {...props} />;\n return <OwnStack {...props} />;\n}\n\nfunction FlattenedStack(props: NavigationStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(\n <>\n {own.destination && <RegisterDestination destination={own.destination} />}\n {own.children}\n </>,\n modifiers,\n );\n}\n\nfunction OwnStack(props: NavigationStackProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [internalPath, setInternalPath] = useState<readonly unknown[]>([]);\n const [path, setPath] = own.path !== undefined ? readBinding(own.path, own.onPathChange) : [internalPath, setInternalPath];\n const destination = useRef<((value: unknown) => ReactNode) | null>(null);\n destination.current = (own.destination as ((value: unknown) => ReactNode) | undefined) ?? null;\n const context: NavigationContextValue = {\n push: (value) => setPath([...path, value]),\n pop: () => setPath(path.slice(0, -1)),\n registerDestination: (builder) => {\n destination.current = builder;\n },\n };\n const screens: ReactNode[] = [\n <Fragment key=\"root\">\n {sb('navscreen', { title: '', displayMode: 'automatic', depth: 0 }, { tap: context.pop }, own.children)}\n </Fragment>,\n ];\n path.forEach((value, index) => {\n const pop = (): void => setPath(path.slice(0, index));\n screens.push(\n <Fragment key={index + 1}>\n {sb(\n 'navscreen',\n { title: '', displayMode: 'automatic', depth: index + 1 },\n { tap: pop },\n <DismissContext.Provider value={pop}>\n <PathScreen value={value} destination={destination} />\n </DismissContext.Provider>,\n )}\n </Fragment>,\n );\n });\n return applyModifiers(\n sb('navstack', {}, undefined, <NavigationContext.Provider value={context}>{screens}</NavigationContext.Provider>),\n modifiers,\n );\n}\n\n/** Rendered after the root screen, so a destination the root registered is known. */\nfunction PathScreen({ value, destination }: { value: unknown; destination: { current: ((value: unknown) => ReactNode) | null } }): ReactNode {\n if (isPushedView(value)) return value.view;\n return destination.current ? destination.current(value) : null;\n}\n\nexport interface NavigationLinkProps extends ViewModifiers {\n title?: string;\n /** The value to push (`navigationDestination` builds the screen). */\n value?: unknown;\n /** The screen to push. */\n destination?: ReactNode;\n children?: ReactNode;\n}\n\nexport function NavigationLink(props: NavigationLinkProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const navigation = useNavigation();\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n const tap = (): void => {\n if (!navigation) return;\n if (own.destination !== undefined) navigation.push({ view: own.destination } satisfies PushedView);\n else navigation.push(own.value);\n };\n return applyModifiers(sb('navlink', {}, { tap }, label), modifiers);\n}\n","/**\n * `NavigationSplitView`: in a regular width a `navsplit` of two columns (the\n * sidebar's stack and the detail's), the sidebar toggled by the bar button;\n * in a compact width one stack rooted at the sidebar that pushes the detail\n * while the sidebar's list has a selection, as on iOS.\n */\n\nimport { createContext, isValidElement, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { useHorizontalSizeClass } from '../environment';\nimport { withAnimation } from '../host/root';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { NavigationContext } from '../navigation-context';\nimport { NavigationStack } from './navigation';\n\nexport type NavigationSplitViewVisibility = 'automatic' | 'all' | 'doubleColumn' | 'detailOnly';\n\n/**\n * What the sidebar's `List(selection:)`s tell their split view: whether\n * each has something selected, and how to clear it. Each list reports under\n * its own key and retracts when it unmounts; the split pushes the detail in\n * a compact width while any of them has a selection.\n */\nexport interface SplitSelection {\n report(key: object, selected: boolean, clear: () => void): void;\n retract(key: object): void;\n}\n\nexport const SplitSelectionContext = createContext<SplitSelection | null>(null);\n\nexport interface NavigationSplitViewProps extends ViewModifiers {\n sidebar: ReactNode;\n detail: ReactNode;\n columnVisibility?: BindingValue<NavigationSplitViewVisibility>;\n onColumnVisibilityChange?: (visibility: NavigationSplitViewVisibility) => void;\n}\n\nexport function NavigationSplitView(props: NavigationSplitViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const sizeClass = useHorizontalSizeClass();\n const [selected, setSelected] = useState(false);\n // Each sidebar list's selection and its latest way to clear it (a new\n // closure each render; not state). The split follows whether any has one,\n // so two lists settle instead of overruling each other.\n // One object for the split's life: the lists key their reports by it, and\n // a new one each render would retract and re-report them every pass.\n const reporters = useRef(new Map<object, { selected: boolean; clear: () => void }>());\n const [report] = useState<SplitSelection>(() => {\n // `setSelected` with an unchanged value is a no-op, so the lists settle.\n const settle = (): void => setSelected([...reporters.current.values()].some((entry) => entry.selected));\n return {\n report: (key, nowSelected, clear) => {\n reporters.current.set(key, { selected: nowSelected, clear });\n settle();\n },\n retract: (key) => {\n if (reporters.current.delete(key)) settle();\n },\n };\n });\n const clear = (): void => {\n for (const entry of reporters.current.values()) if (entry.selected) entry.clear();\n };\n const [internal, setInternal] = useState<NavigationSplitViewVisibility>('automatic');\n const [visibility, setVisibility] =\n own.columnVisibility !== undefined ? readBinding(own.columnVisibility, own.onColumnVisibilityChange) : [internal, setInternal];\n\n if (sizeClass === 'compact') {\n return applyModifiers(\n <SplitSelectionContext.Provider value={report}>\n <CompactSplit sidebar={own.sidebar} detail={own.detail} selected={selected} clear={clear} />\n </SplitSelectionContext.Provider>,\n modifiers,\n );\n }\n\n const sidebarVisible = visibility !== 'detailOnly';\n const toggle = (): void => withAnimation(() => setVisibility(sidebarVisible ? 'detailOnly' : 'all'));\n const detail = isValidElement(own.detail) && own.detail.type === NavigationStack ? own.detail : <NavigationStack>{own.detail}</NavigationStack>;\n return applyModifiers(\n sb('navsplit', { sidebarVisible }, { tap: toggle }, [\n <SplitColumn key=\"sidebar\" report={report}>\n <NavigationStack>{own.sidebar}</NavigationStack>\n </SplitColumn>,\n <SplitColumn key=\"detail\" report={null}>\n {detail}\n </SplitColumn>,\n ]),\n modifiers,\n );\n}\n\n/** A column: its own navigation scope (no enclosing stack), and the sidebar's selection reporting. */\nfunction SplitColumn({ report, children }: { report: SplitSelection | null; children?: ReactNode }): ReactNode {\n return (\n <NavigationContext.Provider value={null}>\n <SplitSelectionContext.Provider value={report}>{children}</SplitSelectionContext.Provider>\n </NavigationContext.Provider>\n );\n}\n\nfunction CompactSplit({ sidebar, detail, selected, clear }: { sidebar: ReactNode; detail: ReactNode; selected: boolean; clear: () => void }): ReactNode {\n // Pushes made from the detail, after it.\n const [extra, setExtra] = useState<readonly unknown[]>([]);\n const base = selected ? [{ view: <DetailScope>{detail}</DetailScope> }] : [];\n const path = [...base, ...extra];\n const setPath = (next: readonly unknown[]): void => {\n if (selected && next.length === 0) {\n setExtra([]);\n clear();\n return;\n }\n setExtra(next.slice(base.length));\n };\n return (\n <NavigationContext.Provider value={null}>\n <NavigationStack path={[path, setPath]}>{sidebar}</NavigationStack>\n </NavigationContext.Provider>\n );\n}\n\n/** The detail pushed in a compact split: its list selections do not drive the split. */\nfunction DetailScope({ children }: { children?: ReactNode }): ReactNode {\n return <SplitSelectionContext.Provider value={null}>{children}</SplitSelectionContext.Provider>;\n}\n\n/**\n * Used by `List(selection:)`: tells the enclosing split view whether the\n * sidebar has a selection. A list without a selection binding (a `Form`, a\n * plain list) passes `active: false` and says nothing.\n */\nexport function useReportSplitSelection(split: SplitSelection | null, selected: boolean, clear: () => void, active = true): void {\n const key = useRef({}).current;\n useLayoutEffect(() => {\n if (active) split?.report(key, selected, clear);\n else split?.retract(key);\n });\n useLayoutEffect(() => () => split?.retract(key), [split, key]);\n}\n\n/** Presented content (a sheet, a popover, an inspector) is outside its presenter's split column. */\nexport function OutsideSplit({ children }: { children?: ReactNode }): ReactNode {\n return <SplitSelectionContext.Provider value={null}>{children}</SplitSelectionContext.Provider>;\n}\n","/**\n * Sheets and alerts: presented content becomes a root-level `sheet` / `alert`\n * element after the app's tree, as the Swift core emits them.\n */\n\nimport type { Detent } from '@swiftbrowser/web/src/protocol';\nimport { useEffect, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from './binding';\nimport { DismissContext, withEnvironment } from './environment';\nimport { HOIST_KIND, PREF_KIND } from './host/instance';\nimport { NavigationContext } from './navigation-context';\nimport { OutsideSplit } from './components/split';\nimport { sb } from './host/sb';\n\nexport interface SheetModifier {\n isPresented: BindingValue<boolean>;\n onDismiss?: () => void;\n content: ReactNode;\n /** `.fullScreenCover` */\n fullScreen?: boolean;\n}\n\nexport function SheetPresenter({ isPresented, onDismiss, content, fullScreen }: SheetModifier): ReactNode {\n const [presented, setPresented] = readBinding(isPresented);\n if (!presented) return null;\n const dismiss = (): void => {\n setPresented(false);\n onDismiss?.();\n };\n const detents: Detent[] = fullScreen ? ['full'] : ['large'];\n return sb(\n HOIST_KIND,\n undefined,\n undefined,\n sb(\n 'sheet',\n { detents },\n { tap: dismiss },\n <NavigationContext.Provider value={null}>\n <OutsideSplit>\n <DismissContext.Provider value={dismiss}>{content}</DismissContext.Provider>\n </OutsideSplit>\n </NavigationContext.Provider>,\n ),\n 'root',\n );\n}\n\n/** `.presentationDetents([.medium])`, inside a sheet's content. */\nexport type DetentValue = Detent | { height: number } | { fraction: number };\n\nexport function presentationDetents(detents: DetentValue[]): ReactNode {\n const encoded = detents.map(\n (detent): Detent => (typeof detent === 'string' ? detent : 'height' in detent ? `height:${detent.height}` : `fraction:${detent.fraction}`),\n );\n return sb(PREF_KIND, { detents: encoded }, undefined, undefined, 'sheet');\n}\n\nexport interface AlertModifier {\n title: string;\n isPresented: BindingValue<boolean>;\n message?: string;\n /** The buttons; each dismisses the alert when tapped. */\n actions?: ReactNode;\n /** `.confirmationDialog` */\n style?: 'alert' | 'dialog';\n}\n\nexport function AlertPresenter({ title, isPresented, message, actions, style }: AlertModifier): ReactNode {\n const [presented, setPresented] = readBinding(isPresented);\n if (!presented) return null;\n const dismiss = (): void => setPresented(false);\n return sb(\n HOIST_KIND,\n undefined,\n undefined,\n sb(\n 'alert',\n { title, message: message ?? null, style: style ?? 'alert' },\n { tap: dismiss },\n withEnvironment({ dismissAlert: dismiss }, actions),\n ),\n 'root',\n );\n}\n\n/** `.onAppear` / `.onDisappear` */\nexport function Lifecycle({ onAppear, onDisappear }: { onAppear?: () => void; onDisappear?: () => void }): null {\n useEffect(() => {\n onAppear?.();\n return () => onDisappear?.();\n // Once per mount, like SwiftUI.\n }, []);\n return null;\n}\n","/**\n * `.inspector(isPresented:)`: in a regular width an `inspector` element, the\n * view and a trailing `inspectorpanel` the renderer slides in and out; in a\n * compact width a sheet with the inspector's content.\n */\n\nimport type { ReactNode } from 'react';\nimport { readBinding } from './binding';\nimport { useHorizontalSizeClass } from './environment';\nimport { sb } from './host/sb';\nimport type { InspectorModifier } from './modifiers';\nimport { SheetPresenter } from './presentation';\nimport { OutsideSplit } from './components/split';\n\nexport function Inspector({ isPresented, content, columnWidth, children }: InspectorModifier & { children?: ReactNode }): ReactNode {\n const sizeClass = useHorizontalSizeClass();\n const [presented, setPresented] = readBinding(isPresented);\n if (sizeClass === 'compact') {\n return (\n <>\n {children}\n <SheetPresenter isPresented={[presented, setPresented]} content={content} />\n </>\n );\n }\n // The panel is beside the content, not part of its split column.\n const outside = <OutsideSplit>{content}</OutsideSplit>;\n const panelContent = columnWidth !== undefined ? sb('styled', { style: { inspectorColumnWidth: columnWidth } }, undefined, outside) : outside;\n return sb('inspector', { presented }, undefined, [\n <InspectorPart key=\"content\">{children}</InspectorPart>,\n <InspectorPart key=\"panel\">{sb('inspectorpanel', {}, undefined, panelContent)}</InspectorPart>,\n ]);\n}\n\nfunction InspectorPart({ children }: { children?: ReactNode }): ReactNode {\n return children;\n}\n","/** `.task` and `.onChange(of:)`, as components the modifiers place beside the view. */\n\nimport { useEffect, useRef } from 'react';\n\nexport function Task({ id, action }: { id: unknown; action: (signal: AbortSignal) => unknown }): null {\n const latest = useRef(action);\n latest.current = action;\n useEffect(() => {\n const controller = new AbortController();\n Promise.resolve()\n .then(() => latest.current(controller.signal))\n .catch((error: unknown) => {\n // A cancelled task's rejection is expected, as Swift's CancellationError is.\n if (!controller.signal.aborted) console.error(error);\n });\n return () => controller.abort();\n }, [id]);\n return null;\n}\n\nexport function OnChange({\n value,\n action,\n initial,\n}: {\n value: unknown;\n action: (oldValue: unknown, newValue: unknown) => void;\n initial?: boolean;\n}): null {\n const previous = useRef<{ value: unknown } | null>(null);\n const latest = useRef(action);\n latest.current = action;\n useEffect(() => {\n const last = previous.current;\n previous.current = { value };\n if (last === null) {\n if (initial) latest.current(value, value);\n return;\n }\n if (!Object.is(last.value, value)) latest.current(last.value, value);\n }, [value, initial]);\n return null;\n}\n","/**\n * Modifiers for a page with a mouse and a keyboard, and the effects the\n * renderer draws for them: hover, tooltips, cursors, keyboard shortcuts,\n * key presses, symbol effects, matched geometry, haptics.\n */\n\nimport type { SymbolEffectStyle } from '@swiftbrowser/web/src/protocol';\nimport { useEffect, useId, useRef, type ReactNode } from 'react';\nimport { sb } from './host/sb';\nimport { styled } from './modifiers';\n\nexport function Hover({ action, children }: { action: (hovering: boolean) => void; children?: ReactNode }): ReactNode {\n return sb('styled', { style: { hover: true } }, { hover: (event) => action(event.value) }, children);\n}\n\nconst CURSORS: Record<string, string> = {\n link: 'pointer',\n automatic: 'auto',\n default: 'default',\n text: 'text',\n verticalText: 'vertical-text',\n grabIdle: 'grab',\n grabActive: 'grabbing',\n rectSelection: 'crosshair',\n columnResize: 'col-resize',\n rowResize: 'row-resize',\n};\n\nexport function cursorFor(style: string): string {\n return CURSORS[style] ?? style;\n}\n\n// ---------------------------------------------------------------------------\n// Symbol effects\n// ---------------------------------------------------------------------------\n\nexport interface SymbolEffectModifier {\n effect: SymbolEffectStyle['effect'];\n direction?: 'up' | 'down';\n speed?: number;\n repeat?: number | 'forever';\n /** `.symbolEffect(_:isActive:)`: the effect runs while true (true by default). */\n isActive?: boolean;\n /** `.symbolEffect(_:value:)`: the effect plays once each time this changes. */\n value?: unknown;\n}\n\nexport function SymbolEffect({ spec, children }: { spec: SymbolEffectModifier; children?: ReactNode }): ReactNode {\n const serial = useRef<{ value: unknown; count: number } | null>(null);\n const discrete = 'value' in spec;\n if (discrete) {\n if (!serial.current) serial.current = { value: spec.value, count: 0 };\n else if (!Object.is(serial.current.value, spec.value)) serial.current = { value: spec.value, count: serial.current.count + 1 };\n }\n if (!discrete && spec.isActive === false) return children;\n const effect: SymbolEffectStyle = { effect: spec.effect };\n if (spec.direction) effect.direction = spec.direction;\n if (spec.speed !== undefined) effect.speed = spec.speed;\n if (spec.repeat !== undefined) effect.repeat = spec.repeat;\n if (discrete) effect.trigger = serial.current!.count;\n return styled({ symbolEffect: effect }, children);\n}\n\n// ---------------------------------------------------------------------------\n// Matched geometry\n// ---------------------------------------------------------------------------\n\n/** `@Namespace`: a namespace for `matchedGeometryEffect` ids. */\nexport function useNamespace(): string {\n return useId();\n}\n\n// ---------------------------------------------------------------------------\n// Keyboard\n// ---------------------------------------------------------------------------\n\nexport type KeyEquivalent = 'return' | 'escape' | 'delete' | 'tab' | 'space' | 'upArrow' | 'downArrow' | 'leftArrow' | 'rightArrow' | (string & {});\nexport type EventModifier = 'command' | 'shift' | 'option' | 'control';\n\nexport interface KeyboardShortcut {\n key: KeyEquivalent;\n /** `command` by default, as SwiftUI's; `[]` for none. `command` is Ctrl off Apple platforms. */\n modifiers?: EventModifier[];\n}\n\nconst KEY_NAMES: Record<string, string> = {\n return: 'Enter',\n escape: 'Escape',\n delete: 'Backspace',\n tab: 'Tab',\n space: ' ',\n upArrow: 'ArrowUp',\n downArrow: 'ArrowDown',\n leftArrow: 'ArrowLeft',\n rightArrow: 'ArrowRight',\n};\n\nconst isApple = (): boolean => typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent);\n\nexport function matchesKey(event: KeyboardEvent, key: KeyEquivalent): boolean {\n const name = KEY_NAMES[key] ?? key;\n return name.length === 1 ? event.key.toLowerCase() === name.toLowerCase() : event.key === name;\n}\n\nfunction matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n if (!matchesKey(event, shortcut.key)) return false;\n const wanted = new Set(shortcut.modifiers ?? ['command']);\n const command = isApple() ? event.metaKey : event.ctrlKey;\n const control = isApple() ? event.ctrlKey : false;\n return (\n command === wanted.has('command') &&\n event.shiftKey === wanted.has('shift') &&\n event.altKey === wanted.has('option') &&\n control === (isApple() && wanted.has('control'))\n );\n}\n\n/** A shortcut that runs `action` while the component is mounted. */\nexport function useKeyboardShortcut(shortcut: KeyboardShortcut | undefined, action: () => void): void {\n const latest = useRef(action);\n latest.current = action;\n const key = shortcut ? `${shortcut.key}:${(shortcut.modifiers ?? ['command']).join('+')}` : '';\n useEffect(() => {\n if (!shortcut || typeof document === 'undefined') return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.defaultPrevented || !matchesShortcut(event, shortcut)) return;\n event.preventDefault();\n latest.current();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [key]);\n}\n\nexport interface KeyPress {\n key: string;\n characters: string;\n modifiers: EventModifier[];\n phase: 'down' | 'repeat';\n}\n\nexport interface OnKeyPressModifier {\n /** Only these keys (`KeyEquivalent`s or characters); every key when absent. */\n keys?: KeyEquivalent[];\n /** Return `'handled'` to stop the key there. */\n action: (press: KeyPress) => 'handled' | 'ignored' | void;\n}\n\n/**\n * `.onKeyPress`: keys pressed while the view is on screen and no text field\n * has the focus (the page has no focus for a plain view, so the screen\n * stands in for it).\n */\nexport function KeyPressListener({ spec }: { spec: OnKeyPressModifier }): null {\n const latest = useRef(spec);\n latest.current = spec;\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const onKey = (event: KeyboardEvent): void => {\n const target = event.target as HTMLElement | null;\n if (event.defaultPrevented || target?.closest('input, textarea, [contenteditable]')) return;\n const { keys, action } = latest.current;\n if (keys && !keys.some((key) => matchesKey(event, key))) return;\n const modifiers: EventModifier[] = [];\n if (event.metaKey) modifiers.push('command');\n if (event.shiftKey) modifiers.push('shift');\n if (event.altKey) modifiers.push('option');\n if (event.ctrlKey) modifiers.push('control');\n const result = action({ key: event.key, characters: event.key.length === 1 ? event.key : '', modifiers, phase: event.repeat ? 'repeat' : 'down' });\n if (result === 'handled') event.preventDefault();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Sensory feedback\n// ---------------------------------------------------------------------------\n\nexport type SensoryFeedback = 'success' | 'warning' | 'error' | 'selection' | 'increase' | 'decrease' | 'start' | 'stop' | 'alignment' | 'levelChange' | 'impact';\n\nconst PATTERNS: Record<SensoryFeedback, number | number[]> = {\n success: [12, 60, 18],\n warning: [18, 80, 18],\n error: [24, 50, 24, 50, 24],\n selection: 8,\n increase: 10,\n decrease: 10,\n start: 14,\n stop: 14,\n alignment: 6,\n levelChange: 10,\n impact: 16,\n};\n\n/** `.sensoryFeedback(_:trigger:)`: a vibration where the browser and device have one (Android), nothing elsewhere. */\nexport function SensoryFeedbackPlayer({ feedback, trigger }: { feedback: SensoryFeedback; trigger: unknown }): null {\n const first = useRef(true);\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n if (typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function') navigator.vibrate(PATTERNS[feedback]);\n }, [trigger, feedback]);\n return null;\n}\n","/**\n * View modifiers as props. Every component accepts them, and applies them in\n * the order they are written, innermost first, exactly like a SwiftUI\n * modifier chain reads: `<Text padding background=\"red\" />` is\n * `Text().padding().background(.red)`. Each modifier that changes layout or\n * style wraps the view in a `styled` element, as the Swift shim does; the\n * environment ones wrap it in a context; the navigation and presentation ones\n * attach preferences and hoisted elements beside it.\n */\n\nimport type {\n Animation,\n ButtonStyle,\n EdgeInsets,\n FixedSize,\n FontWeight,\n FrameAlignment,\n ImageScale,\n PickerStyle,\n Style,\n TextAlignment,\n ToolbarPlacement,\n Transition,\n} from '@swiftbrowser/web/src/protocol';\nimport { Children, Fragment, cloneElement, createElement, isValidElement, useRef, type ReactElement, type ReactNode } from 'react';\nimport type { BindingValue } from './binding';\nimport { readBinding } from './binding';\nimport { withEnvironment, type ControlSize, type ViewEnvironment } from './environment';\nimport { Draggable, DropDestination } from './dragDrop';\nimport { Inspector } from './inspector';\nimport { OnChange, Task } from './lifecycle';\nimport { ScrollTarget } from './scrollReader';\nimport { CoordinateSpace } from './coordinateSpace';\nimport {\n edgeHiddenSettings,\n edgeStyleSettings,\n marginSettings,\n withScrollSettings,\n type ContentMarginsValue,\n type ScrollEdgeEffectHiddenValue,\n type ScrollEdgeEffectStyleValue,\n} from './scrollEnvironment';\nimport { ScrollTransitionView, VisualEffectView, type ScrollTransitionClosure, type ScrollTransitionSpec, type VisualEffectClosure } from './visualEffect';\nimport {\n Hover,\n KeyPressListener,\n SensoryFeedbackPlayer,\n SymbolEffect,\n cursorFor,\n type KeyEquivalent,\n type KeyboardShortcut,\n type OnKeyPressModifier,\n type SensoryFeedback,\n type SymbolEffectModifier,\n} from './pointer';\nimport { HOIST_KIND, PREF_KIND } from './host/instance';\nimport { sb } from './host/sb';\nimport { RegisterDestination } from './navigation-context';\nimport {\n AlertPresenter,\n Lifecycle,\n SheetPresenter,\n presentationDetents,\n type AlertModifier,\n type DetentValue,\n type SheetModifier,\n} from './presentation';\nimport {\n color,\n font,\n frame,\n padding,\n rgb,\n shapeStyle,\n unitPoint,\n type ColorValue,\n type UnitPointValue,\n type FontValue,\n type FrameValue,\n type PaddingValue,\n type StyleValue,\n} from './values';\n\n/** A shape component carries its protocol kind; `RoundedRectangle` reads the radius from its props. */\nexport interface ShapeSpec {\n kind: string;\n cornerRadius: number | null;\n}\n\n/** `.background(style, in: shape)` */\nexport interface BackgroundInShape {\n fill: StyleValue;\n in: ReactElement;\n}\n\nexport type BackgroundValue = StyleValue | BackgroundInShape | ReactElement;\n\nexport interface SearchableModifier {\n text: BindingValue<string>;\n onChange?: (text: string) => void;\n prompt?: string;\n}\n\n/** `DragGesture.Value`: the renderer's drag event, in the element's own coordinates. */\nexport interface DragValue {\n translation: { width: number; height: number };\n location: { x: number; y: number };\n startLocation: { x: number; y: number };\n velocity: { width: number; height: number };\n}\n\nexport interface DragGestureModifier {\n minimumDistance?: number;\n onChanged?: (value: DragValue) => void;\n onEnded?: (value: DragValue) => void;\n}\n\nexport interface SwipeActionsModifier {\n edge?: 'leading' | 'trailing';\n allowsFullSwipe?: boolean;\n /** The actions: `Button`s (a `tint` colors one, a `destructive` role makes it red). */\n children: ReactNode;\n}\n\nexport type ToolbarItemPlacementName =\n | 'automatic'\n | 'topBarLeading'\n | 'topBarTrailing'\n | 'navigationBarLeading'\n | 'navigationBarTrailing'\n | 'cancellationAction'\n | 'confirmationAction'\n | 'destructiveAction'\n | 'primaryAction'\n | 'navigation'\n | 'principal'\n | 'bottomBar'\n | 'secondaryAction';\n\n/** `.toolbarRole(_:)`: `editor` shows a regular-width screen's secondary actions in its bar. */\nexport type ToolbarRole = 'automatic' | 'navigationStack' | 'browser' | 'editor';\n\nexport function toolbarPlacement(name: ToolbarItemPlacementName | undefined): ToolbarPlacement {\n switch (name) {\n case 'topBarLeading':\n case 'navigationBarLeading':\n case 'cancellationAction':\n case 'navigation':\n return 'leading';\n case 'principal':\n return 'principal';\n case 'bottomBar':\n return 'bottom';\n case 'secondaryAction':\n // Collapsed into the bar's More menu (inline for an editor role in a regular width).\n return 'secondary';\n default:\n return 'trailing';\n }\n}\n\nexport interface ViewModifiers {\n padding?: PaddingValue;\n font?: FontValue;\n fontWeight?: FontWeight;\n bold?: boolean;\n foregroundStyle?: StyleValue;\n background?: BackgroundValue;\n overlay?: ReactElement | { content: ReactElement; alignment?: FrameAlignment };\n frame?: FrameValue;\n cornerRadius?: number;\n clipShape?: ReactElement;\n clipped?: boolean;\n opacity?: number;\n disabled?: boolean;\n hidden?: boolean;\n layoutPriority?: number;\n /** A count, `null` to lift a limit, or a range `[min, max]` (`.lineLimit(2...4)`; `max` null for `2...`). */\n lineLimit?: number | null | readonly [number, number | null];\n multilineTextAlignment?: TextAlignment;\n fixedSize?: boolean | FixedSize;\n offset?: { x?: number; y?: number };\n /** Degrees, clockwise; `{ degrees, anchor }` turns around another point. */\n rotationEffect?: number | { degrees: number; anchor?: UnitPointValue };\n scaleEffect?: number | { x: number; y: number; anchor?: UnitPointValue };\n shadow?: { color?: ColorValue; radius: number; x?: number; y?: number };\n tint?: ColorValue;\n badge?: string | number | null;\n listRowInsets?: EdgeInsets;\n imageScale?: ImageScale;\n transition?: Transition;\n /** `.animation(_:value:)`: animate this subtree's changes whenever `value` changes. */\n animation?: { animation?: Animation; value: unknown };\n gridColumnAlignment?: 'leading' | 'center' | 'trailing';\n gridCellColumns?: number;\n // Environment\n buttonStyle?: ButtonStyle | 'borderless';\n controlSize?: ControlSize;\n pickerStyle?: PickerStyle;\n labelsHidden?: boolean;\n // Navigation and presentation\n navigationTitle?: string;\n navigationBarTitleDisplayMode?: 'automatic' | 'inline' | 'large';\n /** `.toolbarRole(.editor)`: the screen's secondary actions show inline in a regular width. */\n toolbarRole?: ToolbarRole;\n /** `ToolbarItem` elements. */\n toolbar?: ReactNode;\n searchable?: SearchableModifier;\n navigationDestination?: (value: never) => ReactNode;\n sheet?: SheetModifier;\n fullScreenCover?: SheetModifier;\n alert?: AlertModifier;\n confirmationDialog?: AlertModifier;\n presentationDetents?: DetentValue[];\n // Gestures and lifecycle\n onTapGesture?: () => void;\n /** `.gesture(DragGesture().onChanged { }.onEnded { })` */\n dragGesture?: DragGestureModifier;\n /** `.onLongPressGesture { }` */\n onLongPressGesture?: (() => void) | { minimumDuration?: number; action: () => void };\n /** `.contextMenu { items }`: a long press or right click opens the items. */\n contextMenu?: ReactNode;\n /** `.swipeActions(edge:allowsFullSwipe:) { buttons }`, on a list row. */\n swipeActions?: SwipeActionsModifier | SwipeActionsModifier[];\n onAppear?: () => void;\n onDisappear?: () => void;\n /** `.tag(_:)`: read by `Picker` options and `TabView` tabs. */\n tag?: unknown;\n /** Extra modifiers in order, for one that must apply twice (`.padding().background().padding()`). */\n modifiers?: ViewModifiers[];\n // Visual effects\n /** `.aspectRatio(_:contentMode:)`: a ratio (width / height), or `{ ratio, contentMode }`; `ratio: null` keeps the view's own. */\n aspectRatio?: number | { ratio?: number | null; contentMode?: 'fit' | 'fill' };\n scaledToFit?: boolean;\n scaledToFill?: boolean;\n blur?: number;\n brightness?: number;\n contrast?: number;\n saturation?: number;\n grayscale?: number;\n /** Degrees. */\n hueRotation?: number;\n colorInvert?: boolean;\n colorMultiply?: ColorValue;\n /** A CSS `mix-blend-mode` name (`multiply`, `screen`, `overlay`…), as `.blendMode` maps them. */\n blendMode?: string;\n /** `.mask(_:)` with a style: the view shows through its alpha (a gradient fades it). */\n mask?: StyleValue;\n /** `.position(x:y:)` */\n position?: { x: number; y: number };\n zIndex?: number;\n /** `.allowsHitTesting(false)` lets taps through to what is under the view. */\n allowsHitTesting?: boolean;\n /** `.ignoresSafeArea()` (`true`), or the edges. */\n ignoresSafeArea?: true | ('top' | 'bottom' | 'leading' | 'trailing')[];\n /** `.rotation3DEffect(_:axis:anchor:perspective:)`, the angle in degrees. */\n rotation3DEffect?: { angle: number; axis: { x: number; y: number; z: number }; anchor?: UnitPointValue; perspective?: number };\n /** `.gridCellAnchor(_:)` */\n gridCellAnchor?: UnitPointValue;\n /**\n * `.alignmentGuide(_:computeValue:)`: moves the view's guide. `value` gets\n * the view's dimensions; it is sampled at three sizes, so it must be linear\n * in them (`d.width + 4`, `d.height / 2`, a constant), as the shim requires.\n */\n alignmentGuide?: { guide: AlignmentGuideName; value: (d: { width: number; height: number }) => number };\n /** `.preferredColorScheme(_:)`: asks the page for that appearance (`null`: the viewer's). */\n preferredColorScheme?: 'light' | 'dark' | null;\n /** `.refreshable { }`: the nearest `List` or `ScrollView` below shows pull to refresh. */\n refreshable?: () => unknown;\n /** `.submitLabel(_:)` for the text fields below: `done`, `go`, `send`, `search`, `next`… */\n submitLabel?: string;\n /** `.labelStyle(_:)` for the `Label`s below. */\n labelStyle?: 'automatic' | 'titleAndIcon' | 'titleOnly' | 'iconOnly';\n /**\n * `.task { }`: runs when the view appears, cancelled (the signal aborts)\n * when it disappears. `{ id, action }` restarts it when `id` changes.\n */\n task?: ((signal: AbortSignal) => unknown) | { id: unknown; action: (signal: AbortSignal) => unknown };\n /** `.onChange(of:initial:) { old, new in }` */\n onChangeOf?: { value: unknown; action: (oldValue: unknown, newValue: unknown) => void; initial?: boolean };\n /** `.id(_:)` inside a `ScrollViewReader`: the target `proxy.scrollTo` scrolls to. */\n scrollID?: string | number;\n /** `.draggable(_:)`: a long press or a 10 pt drag lifts the view, carrying `payload`. */\n draggable?: unknown;\n /** `.dropDestination(for:)`: takes what is dropped on the view. */\n dropDestination?: DropDestinationModifier;\n /** `.inspector(isPresented:)`: a trailing panel in a regular width, a sheet in a compact one. */\n inspector?: InspectorModifier;\n /** `.onHover { hovering in }`: a mouse entering and leaving the view. */\n onHover?: (hovering: boolean) => void;\n /** `.help(_:)`: a tooltip. */\n help?: string;\n /** `.pointerStyle(_:)`: `link`, `text`, `grabIdle`, `grabActive`… or any CSS cursor. */\n pointerStyle?: string;\n /** `.symbolEffect(_:options:isActive:)` / `.symbolEffect(_:options:value:)` */\n symbolEffect?: SymbolEffectModifier;\n /** `.matchedGeometryEffect(id:in:)`: `namespace` from `useNamespace()`. */\n matchedGeometryEffect?: { id: string | number; namespace?: string };\n /** `.layoutValue(key:value:)`: values a custom `Layout` reads from this subview. */\n layoutValue?: Record<string, unknown>;\n /** `.safeAreaInset(edge:spacing:) { content }`: content beside the view, which the view makes room for. */\n safeAreaInset?: { edge: 'top' | 'bottom' | 'leading' | 'trailing'; spacing?: number; alignment?: 'leading' | 'center' | 'trailing' | 'top' | 'bottom'; content: ReactNode };\n /** `.popover(isPresented:)`: presented as a sheet, as on an iPhone. */\n popover?: SheetModifier;\n /** `.redacted(reason: .placeholder)` (`true`) and `.unredacted()` (`false`). */\n redacted?: boolean;\n /** `.keyboardShortcut(_:modifiers:)` on a `Button`: the shortcut runs its action. */\n keyboardShortcut?: KeyboardShortcut | KeyEquivalent;\n /** `.onKeyPress(keys:action:)` */\n onKeyPress?: OnKeyPressModifier;\n /** `.sensoryFeedback(_:trigger:)` */\n sensoryFeedback?: { feedback: SensoryFeedback; trigger: unknown };\n /** `.textCase(_:)` */\n textCase?: 'uppercase' | 'lowercase' | null;\n /** `.coordinateSpace(name:)`: readers inside answer `frame({ named })` relative to this view. */\n coordinateSpace?: string;\n /**\n * `.contentTransition(_:)`: how the texts below change in an animated pass\n * (`numericText` rolls them up, or down when the new number is smaller;\n * `{ numericText: { countsDown } }` fixes the direction; `opacity` and\n * `interpolate` crossfade; `identity` swaps).\n */\n contentTransition?: 'numericText' | 'opacity' | 'interpolate' | 'identity' | { numericText: { countsDown?: boolean } };\n /**\n * `.scrollEdgeEffectStyle(_:for:)` for the scroll views and lists below\n * (and this one): `hard`, `soft` or `automatic` on both edges, or\n * `[\"hard\", \"top\"]` for some.\n */\n scrollEdgeEffectStyle?: ScrollEdgeEffectStyleValue;\n /** `.scrollEdgeEffectHidden(_:for:)`: `true` for both edges, or `[true, \"bottom\"]`. */\n scrollEdgeEffectHidden?: ScrollEdgeEffectHiddenValue;\n /**\n * `.contentMargins(_:_:)`: padding inside the scroll views below (and this\n * one), which their content scrolls under. Takes what `padding` takes.\n */\n contentMargins?: ContentMarginsValue;\n /**\n * `.containerRelativeFrame(_:)`: the view's size along `axes` follows the\n * nearest container (the scroll view's visible area, else the screen):\n * the whole of it, `span` of `count` columns `spacing` apart, or what\n * `length(containerLength, axis)` answers (a linear function of it).\n */\n containerRelativeFrame?: ContainerRelativeFrameValue;\n /**\n * `.visualEffect { content, proxy in … }`: effects (offset, scale,\n * rotation, opacity, blur, color adjustments) computed from the view's\n * geometry, without changing its layout. `proxy.frame('global')` and\n * `proxy.bounds('scrollView')` stay current as the page scrolls.\n */\n visualEffect?: VisualEffectClosure;\n /**\n * `.scrollTransition { content, phase in … }`: effects as the view goes out\n * of its scroll view's visible area and comes back. A closure, or\n * `{ transition, configuration, axis }`.\n */\n scrollTransition?: ScrollTransitionClosure | ScrollTransitionSpec;\n}\n\n/** The axes `containerRelativeFrame` sizes. */\nexport type ContainerAxes = 'horizontal' | 'vertical' | 'both';\n\nexport type ContainerRelativeFrameValue =\n | ContainerAxes\n | {\n axes: ContainerAxes;\n /** `count:span:spacing:`: `span` of `count` equal columns separated by `spacing`. */\n count?: number;\n span?: number;\n spacing?: number;\n /** The closure form: the length for a container length (sampled as a linear function). */\n length?: (containerLength: number, axis: 'horizontal' | 'vertical') => number;\n alignment?: FrameAlignment;\n };\n\n/** The `containerRelativeFrame` style hint for a modifier value. */\nexport function containerRelativeFrame(value: ContainerRelativeFrameValue): NonNullable<Style['containerRelativeFrame']> {\n const spec = typeof value === 'string' ? { axes: value } : value;\n const horizontal = spec.axes !== 'vertical';\n const vertical = spec.axes !== 'horizontal';\n let a = 1;\n let b = 0;\n if (spec.length) {\n const axis = horizontal ? 'horizontal' : 'vertical';\n b = spec.length(0, axis);\n a = (spec.length(1000, axis) - b) / 1000;\n } else if (spec.count !== undefined) {\n // SwiftUI: (container − spacing × (count − 1)) × span / count + spacing × (span − 1).\n const n = Math.max(spec.count, 1);\n const span = Math.max(spec.span ?? 1, 1);\n const spacing = spec.spacing ?? 0;\n a = span / n;\n b = (-spacing * (n - 1) * span) / n + spacing * (span - 1);\n }\n return { ...(horizontal ? { horizontal: true } : {}), ...(vertical ? { vertical: true } : {}), a, b, alignment: spec.alignment ?? 'center' };\n}\n\nexport type AlignmentGuideName =\n | 'leading'\n | 'trailing'\n | 'horizontalCenter'\n | 'top'\n | 'bottom'\n | 'verticalCenter'\n | 'firstTextBaseline'\n | 'lastTextBaseline'\n | 'listRowSeparatorLeading'\n | 'listRowSeparatorTrailing';\n\nexport interface DropDestinationModifier {\n /**\n * Called on a drop: the payloads of an in-app drag (what `draggable` carried),\n * or the items dragged in from outside the page. Return false to refuse.\n */\n action: (items: unknown[], location: { x: number; y: number }) => boolean | void;\n /** While a drag is over the view. */\n isTargeted?: (targeted: boolean) => void;\n /** The MIME patterns taken from outside the page (`text/plain`, `image/*`…); none by default. */\n accepts?: string[];\n}\n\nexport interface InspectorModifier {\n isPresented: BindingValue<boolean>;\n content: ReactNode;\n /** `.inspectorColumnWidth(_:)` */\n columnWidth?: number;\n}\n\nexport type ModifierKey = keyof ViewModifiers;\nexport type ModifierEntry = [ModifierKey, unknown];\n\nconst MODIFIER_KEYS: ReadonlySet<string> = new Set<ModifierKey>([\n 'padding',\n 'font',\n 'fontWeight',\n 'bold',\n 'foregroundStyle',\n 'background',\n 'overlay',\n 'frame',\n 'cornerRadius',\n 'clipShape',\n 'clipped',\n 'opacity',\n 'disabled',\n 'hidden',\n 'layoutPriority',\n 'lineLimit',\n 'multilineTextAlignment',\n 'fixedSize',\n 'offset',\n 'rotationEffect',\n 'scaleEffect',\n 'shadow',\n 'tint',\n 'badge',\n 'listRowInsets',\n 'imageScale',\n 'transition',\n 'animation',\n 'gridColumnAlignment',\n 'gridCellColumns',\n 'buttonStyle',\n 'controlSize',\n 'pickerStyle',\n 'labelsHidden',\n 'navigationTitle',\n 'navigationBarTitleDisplayMode',\n 'toolbarRole',\n 'toolbar',\n 'searchable',\n 'navigationDestination',\n 'sheet',\n 'fullScreenCover',\n 'alert',\n 'confirmationDialog',\n 'presentationDetents',\n 'onTapGesture',\n 'dragGesture',\n 'onLongPressGesture',\n 'contextMenu',\n 'swipeActions',\n 'onAppear',\n 'onDisappear',\n 'tag',\n 'modifiers',\n 'aspectRatio',\n 'scaledToFit',\n 'scaledToFill',\n 'blur',\n 'brightness',\n 'contrast',\n 'saturation',\n 'grayscale',\n 'hueRotation',\n 'colorInvert',\n 'colorMultiply',\n 'blendMode',\n 'mask',\n 'position',\n 'zIndex',\n 'allowsHitTesting',\n 'ignoresSafeArea',\n 'rotation3DEffect',\n 'gridCellAnchor',\n 'alignmentGuide',\n 'preferredColorScheme',\n 'refreshable',\n 'submitLabel',\n 'labelStyle',\n 'task',\n 'onChangeOf',\n 'scrollID',\n 'draggable',\n 'dropDestination',\n 'inspector',\n 'onHover',\n 'help',\n 'pointerStyle',\n 'symbolEffect',\n 'matchedGeometryEffect',\n 'layoutValue',\n 'safeAreaInset',\n 'popover',\n 'redacted',\n 'keyboardShortcut',\n 'onKeyPress',\n 'sensoryFeedback',\n 'textCase',\n 'coordinateSpace',\n 'contentTransition',\n 'scrollEdgeEffectStyle',\n 'scrollEdgeEffectHidden',\n 'contentMargins',\n 'containerRelativeFrame',\n 'visualEffect',\n 'scrollTransition',\n]);\n\n/**\n * Separate a component's own props from the modifiers, keeping the modifiers\n * in the order they were written (object keys keep insertion order).\n */\nexport function splitProps<P extends object>(props: P): { own: Omit<P, ModifierKey>; modifiers: ModifierEntry[] } {\n const own: Record<string, unknown> = {};\n const modifiers: ModifierEntry[] = [];\n for (const [key, value] of Object.entries(props)) {\n if (MODIFIER_KEYS.has(key)) modifiers.push([key as ModifierKey, value]);\n else own[key] = value;\n }\n return { own: own as Omit<P, ModifierKey>, modifiers };\n}\n\n/** Remove and return one modifier a component handles itself. */\nexport function takeModifier<K extends ModifierKey>(modifiers: ModifierEntry[], key: K): ViewModifiers[K] | undefined {\n const at = modifiers.findIndex(([name]) => name === key);\n if (at < 0) return undefined;\n const [, value] = modifiers[at]!;\n modifiers.splice(at, 1);\n return value as ViewModifiers[K];\n}\n\nexport function styled(style: Style, child: ReactNode): ReactElement {\n return sb('styled', { style }, undefined, child);\n}\n\nfunction decorated(role: 'background' | 'overlay', alignment: FrameAlignment, content: ReactNode, decoration: ReactNode): ReactElement {\n return sb('decorated', { role, alignment }, undefined, [\n createElement(Fragment, { key: 'content' }, content),\n createElement(Fragment, { key: 'decoration' }, decoration),\n ]);\n}\n\nexport function shapeSpecOf(element: ReactElement): ShapeSpec | null {\n const spec = (element.type as { shape?: ShapeSpec }).shape;\n if (!spec) return null;\n const radius = (element.props as { cornerRadius?: number }).cornerRadius;\n return { kind: spec.kind, cornerRadius: spec.cornerRadius ?? radius ?? 0 };\n}\n\n/** `.animation(_:value:)`: a token that changes with the value. */\nfunction AnimatedStyle({ animation, value, children }: { animation: Animation; value: unknown; children?: ReactNode }): ReactElement {\n const last = useRef<{ value: unknown; token: number }>({ value, token: 0 });\n if (!Object.is(last.current.value, value)) last.current = { value, token: last.current.token + 1 };\n return styled({ animation, animationToken: last.current.token }, children);\n}\n\nfunction Searchable({ text, onChange, prompt }: SearchableModifier): ReactElement {\n const [value, setValue] = readBinding(text, onChange);\n return sb('searchfield', { text: value, placeholder: prompt ?? 'Search' }, { text: (event) => setValue(event.value) });\n}\n\n/**\n * Apply `modifiers` to `element`, in order. Styled wrappers nest around the\n * element; preferences, hoisted elements and lifecycle components come after\n * it, in a fragment.\n */\nexport function applyModifiers(element: ReactNode, modifiers: readonly ModifierEntry[]): ReactNode {\n const sides: ReactNode[] = [];\n const node = wrap(element, modifiers, sides);\n // always a fragment, so a side modifier coming or going leaves the view in place\n return createElement(Fragment, null, node, ...sides);\n}\n\nfunction wrap(element: ReactNode, modifiers: readonly ModifierEntry[], sides: ReactNode[]): ReactNode {\n let node = element;\n for (const [key, value] of modifiers) {\n const inactive = value === undefined || (value === null && key !== 'lineLimit' && key !== 'badge');\n const next = inactive ? node : apply(key, value, node, sides);\n node = next === node ? neutral(key, node) : next;\n }\n return node;\n}\n\n/** The modifiers whose wrapper is a `styled` node (a view `background` too). */\nconst STYLED_KEYS: ReadonlySet<ModifierKey> = new Set<ModifierKey>([\n 'padding', 'font', 'fontWeight', 'bold', 'foregroundStyle', 'background', 'frame', 'cornerRadius', 'clipShape', 'clipped',\n 'opacity', 'disabled', 'hidden', 'layoutPriority', 'lineLimit', 'multilineTextAlignment', 'fixedSize', 'offset',\n 'rotationEffect', 'scaleEffect', 'shadow', 'tint', 'badge', 'listRowInsets', 'imageScale', 'transition',\n 'gridColumnAlignment', 'gridCellColumns', 'aspectRatio', 'scaledToFit', 'scaledToFill', 'blur', 'brightness', 'contrast',\n 'saturation', 'grayscale', 'hueRotation', 'colorInvert', 'colorMultiply', 'blendMode', 'mask', 'position', 'zIndex',\n 'allowsHitTesting', 'ignoresSafeArea', 'rotation3DEffect', 'gridCellAnchor', 'alignmentGuide', 'help', 'pointerStyle',\n 'matchedGeometryEffect', 'containerRelativeFrame', 'contentTransition',\n]);\n\n/** The modifiers whose wrapper extends the view environment. */\nconst ENVIRONMENT_KEYS: ReadonlySet<ModifierKey> = new Set<ModifierKey>([\n 'buttonStyle', 'controlSize', 'pickerStyle', 'labelsHidden', 'refreshable', 'submitLabel', 'labelStyle', 'redacted', 'textCase',\n]);\n\n/** The modifiers whose wrapper extends the scroll settings. */\nconst SCROLL_KEYS: ReadonlySet<ModifierKey> = new Set<ModifierKey>(['scrollEdgeEffectStyle', 'scrollEdgeEffectHidden', 'contentMargins']);\n\n/**\n * A modifier that is written but does nothing (`undefined`, `false`) still\n * wraps the view, in the same kind of wrapper it has when it is on, with\n * nothing in it. Otherwise turning it on or off would change the element\n * types above the view and React would remount everything under it, as\n * SwiftUI never does for `.overlay { if open { … } }` or `.disabled(flag)`.\n */\nfunction neutral(key: ModifierKey, node: ReactNode): ReactNode {\n if (key === 'overlay') return decorated('overlay', 'center', node, null);\n if (STYLED_KEYS.has(key)) return styled({}, node);\n if (ENVIRONMENT_KEYS.has(key)) return withEnvironment({}, node);\n if (SCROLL_KEYS.has(key)) return withScrollSettings({}, node);\n return node;\n}\n\nfunction apply(key: ModifierKey, value: unknown, node: ReactNode, sides: ReactNode[]): ReactNode {\n switch (key) {\n case 'padding':\n return styled({ padding: padding(value as PaddingValue) }, node);\n case 'font':\n return styled({ font: font(value as FontValue) }, node);\n case 'fontWeight':\n return styled({ font: { weight: value as FontWeight } }, node);\n case 'bold':\n return value ? styled({ font: { weight: 'bold' } }, node) : node;\n case 'foregroundStyle':\n return styled({ foreground: shapeStyle(value as StyleValue) }, node);\n case 'background': {\n if (isValidElement(value)) return decorated('background', 'center', node, value);\n const inShape = value as BackgroundInShape;\n if (typeof inShape === 'object' && inShape !== null && 'in' in inShape && isValidElement(inShape.in)) {\n return decorated('background', 'center', node, cloneElement(inShape.in, { fill: inShape.fill } as object));\n }\n return styled({ background: shapeStyle(value as StyleValue) }, node);\n }\n case 'overlay': {\n if (isValidElement(value)) return decorated('overlay', 'center', node, value);\n const spec = value as { content: ReactElement; alignment?: FrameAlignment };\n return decorated('overlay', spec.alignment ?? 'center', node, spec.content);\n }\n case 'frame':\n return styled({ frame: frame(value as FrameValue) }, node);\n case 'cornerRadius':\n return styled({ cornerRadius: value as number }, node);\n case 'clipShape': {\n const spec = isValidElement(value) ? shapeSpecOf(value) : null;\n return styled({ cornerRadius: spec?.cornerRadius ?? 0 }, node);\n }\n case 'clipped':\n return value ? styled({ clipped: true }, node) : node;\n case 'opacity':\n return styled({ opacity: value as number }, node);\n case 'disabled':\n return value ? styled({ disabled: true }, node) : node;\n case 'hidden':\n return value ? styled({ hidden: true }, node) : node;\n case 'layoutPriority':\n return styled({ layoutPriority: value as number }, node);\n case 'lineLimit': {\n if (Array.isArray(value)) {\n const [min, max] = value as [number, number | null];\n return styled({ lineLimit: max, lineLimitMin: min }, node);\n }\n return styled({ lineLimit: value as number | null }, node);\n }\n case 'multilineTextAlignment':\n return styled({ multilineTextAlignment: value as TextAlignment }, node);\n case 'fixedSize':\n return value ? styled({ fixedSize: value === true ? { horizontal: true, vertical: true } : (value as FixedSize) }, node) : node;\n case 'offset': {\n const offset = value as { x?: number; y?: number };\n return styled({ offset: { x: offset.x ?? 0, y: offset.y ?? 0 } }, node);\n }\n case 'rotationEffect': {\n if (typeof value === 'number') return styled({ rotation: value }, node);\n const spec = value as { degrees: number; anchor?: UnitPointValue };\n const style: Style = { rotation: spec.degrees };\n if (spec.anchor !== undefined) style.rotationAnchor = unitPoint(spec.anchor);\n return styled(style, node);\n }\n case 'scaleEffect': {\n if (typeof value === 'number') return styled({ scale: { x: value, y: value } }, node);\n const spec = value as { x: number; y: number; anchor?: UnitPointValue };\n const style: Style = { scale: { x: spec.x, y: spec.y } };\n if (spec.anchor !== undefined) style.scaleAnchor = unitPoint(spec.anchor);\n return styled(style, node);\n }\n case 'shadow': {\n const shadow = value as { color?: ColorValue; radius: number; x?: number; y?: number };\n return styled(\n { shadow: { color: shadow.color ? color(shadow.color) : rgb(0, 0, 0, 0.33), radius: shadow.radius, x: shadow.x ?? 0, y: shadow.y ?? 0 } },\n node,\n );\n }\n case 'tint':\n return styled({ tint: color(value as ColorValue) }, node);\n case 'badge':\n return styled({ badge: value === null ? null : String(value) }, node);\n case 'listRowInsets':\n return styled({ listRowInsets: value as EdgeInsets }, node);\n case 'imageScale':\n return styled({ imageScale: value as ImageScale }, node);\n case 'transition':\n return styled({ transition: value as Transition }, node);\n case 'animation': {\n const spec = value as { animation?: Animation; value: unknown };\n return createElement(AnimatedStyle, { animation: spec.animation ?? { type: 'default' }, value: spec.value }, node);\n }\n case 'gridColumnAlignment':\n return styled({ gridColumnAlignment: value } as Style, node);\n case 'gridCellColumns':\n return styled({ gridCellColumns: value as number }, node);\n case 'buttonStyle':\n return withEnvironment({ buttonStyle: value === 'borderless' ? 'plain' : (value as ButtonStyle) }, node);\n case 'controlSize':\n return withEnvironment({ controlSize: value as ControlSize }, node);\n case 'pickerStyle':\n return withEnvironment({ pickerStyle: value as PickerStyle }, node);\n case 'labelsHidden':\n return withEnvironment({ labelsHidden: Boolean(value) }, node);\n case 'navigationTitle':\n sides.push(sb(PREF_KIND, { title: value as string }, undefined, undefined, 'navscreen'));\n return node;\n case 'navigationBarTitleDisplayMode':\n sides.push(sb(PREF_KIND, { displayMode: value as string }, undefined, undefined, 'navscreen'));\n return node;\n case 'toolbarRole':\n sides.push(sb(PREF_KIND, { toolbarRole: value as string }, undefined, undefined, 'navscreen'));\n return node;\n case 'toolbar':\n sides.push(sb(HOIST_KIND, undefined, undefined, value as ReactNode, 'navscreen'));\n return node;\n case 'searchable':\n sides.push(sb(HOIST_KIND, undefined, undefined, createElement(Searchable, value as SearchableModifier), 'navscreen'));\n return node;\n case 'navigationDestination':\n sides.push(createElement(RegisterDestination, { destination: value as (value: never) => ReactNode }));\n return node;\n case 'sheet':\n sides.push(createElement(SheetPresenter, value as SheetModifier));\n return node;\n case 'fullScreenCover':\n sides.push(createElement(SheetPresenter, { ...(value as SheetModifier), fullScreen: true }));\n return node;\n case 'alert':\n sides.push(createElement(AlertPresenter, value as AlertModifier));\n return node;\n case 'confirmationDialog':\n sides.push(createElement(AlertPresenter, { ...(value as AlertModifier), style: 'dialog' }));\n return node;\n case 'presentationDetents':\n sides.push(presentationDetents(value as DetentValue[]));\n return node;\n case 'onTapGesture':\n return sb('tapgesture', {}, { tap: value as () => void }, node);\n case 'dragGesture': {\n const drag = value as DragGestureModifier;\n return sb(\n 'gesture',\n { drag: true, longPress: false, minimumDistance: drag.minimumDistance ?? 10, minimumDuration: 0.5 },\n {\n drag: (event) => {\n const dragValue: DragValue = {\n translation: event.translation,\n location: event.location,\n startLocation: event.startLocation,\n velocity: event.velocity,\n };\n if (event.phase === 'ended' || event.phase === 'cancelled') drag.onEnded?.(dragValue);\n else drag.onChanged?.(dragValue);\n },\n },\n node,\n );\n }\n case 'onLongPressGesture': {\n const spec = typeof value === 'function' ? { action: value as () => void } : (value as { minimumDuration?: number; action: () => void });\n return sb(\n 'gesture',\n { drag: false, longPress: true, minimumDistance: 10, minimumDuration: spec.minimumDuration ?? 0.5 },\n { longpress: () => spec.action() },\n node,\n );\n }\n case 'contextMenu':\n return sb('contextmenu', {}, undefined, [createElement(Fragment, { key: 'content' }, node), createElement(Fragment, { key: 'items' }, value as ReactNode)]);\n case 'swipeActions': {\n const specs = Array.isArray(value) ? (value as SwipeActionsModifier[]) : [value as SwipeActionsModifier];\n const trailing: ReactNode[] = [];\n const leading: ReactNode[] = [];\n let fullSwipeTrailing = true;\n let fullSwipeLeading = true;\n for (const spec of specs) {\n const actions = Children.toArray(spec.children);\n if (spec.edge === 'leading') {\n leading.push(...actions);\n fullSwipeLeading = spec.allowsFullSwipe ?? true;\n } else {\n trailing.push(...actions);\n fullSwipeTrailing = spec.allowsFullSwipe ?? true;\n }\n }\n return sb(\n 'swipeactions',\n { trailing: trailing.length, leading: leading.length, fullSwipeTrailing, fullSwipeLeading },\n undefined,\n [createElement(Fragment, { key: 'content' }, node), ...trailing, ...leading],\n );\n }\n case 'onAppear':\n sides.push(createElement(Lifecycle, { onAppear: value as () => void }));\n return node;\n case 'onDisappear':\n sides.push(createElement(Lifecycle, { onDisappear: value as () => void }));\n return node;\n case 'tag':\n return node;\n case 'aspectRatio': {\n const spec = typeof value === 'number' ? { ratio: value } : (value as { ratio?: number | null; contentMode?: 'fit' | 'fill' });\n return styled({ aspectRatio: { ratio: spec.ratio ?? null, contentMode: spec.contentMode ?? 'fit' } }, node);\n }\n case 'scaledToFit':\n return value ? styled({ aspectRatio: { ratio: null, contentMode: 'fit' } }, node) : node;\n case 'scaledToFill':\n return value ? styled({ aspectRatio: { ratio: null, contentMode: 'fill' } }, node) : node;\n case 'blur':\n return styled({ blur: value as number }, node);\n case 'brightness':\n return styled({ brightness: value as number }, node);\n case 'contrast':\n return styled({ contrast: value as number }, node);\n case 'saturation':\n return styled({ saturation: value as number }, node);\n case 'grayscale':\n return styled({ grayscale: value as number }, node);\n case 'hueRotation':\n return styled({ hueRotation: value as number }, node);\n case 'colorInvert':\n return value ? styled({ colorInvert: true }, node) : node;\n case 'colorMultiply':\n return styled({ colorMultiply: color(value as ColorValue) }, node);\n case 'blendMode':\n return styled({ blendMode: value as string }, node);\n case 'mask':\n return styled({ mask: shapeStyle(value as StyleValue) }, node);\n case 'position':\n return styled({ position: value as { x: number; y: number } }, node);\n case 'zIndex':\n return styled({ zIndex: value as number }, node);\n case 'allowsHitTesting':\n return value === false ? styled({ hitTesting: false }, node) : node;\n case 'ignoresSafeArea':\n return styled({ ignoresSafeArea: value === true ? 'all' : (value as ('top' | 'bottom' | 'leading' | 'trailing')[]) }, node);\n case 'rotation3DEffect': {\n const spec = value as { angle: number; axis: { x: number; y: number; z: number }; anchor?: UnitPointValue; perspective?: number };\n const rotation: Style['rotation3D'] = { angle: spec.angle, axis: spec.axis };\n if (spec.anchor !== undefined) rotation!.anchor = unitPoint(spec.anchor);\n if (spec.perspective !== undefined) rotation!.perspective = spec.perspective;\n return styled({ rotation3D: rotation }, node);\n }\n case 'gridCellAnchor':\n return styled({ gridCellAnchor: unitPoint(value as UnitPointValue) }, node);\n case 'alignmentGuide': {\n const spec = value as { guide: AlignmentGuideName; value: (d: { width: number; height: number }) => number };\n const at = (width: number, height: number): number => spec.value({ width, height });\n const a = at(0, 0);\n const round = (n: number): number => Math.round(n * 1e6) / 1e6;\n const vertical = ['top', 'bottom', 'verticalCenter', 'firstTextBaseline', 'lastTextBaseline'].includes(spec.guide);\n const name = spec.guide === 'horizontalCenter' || spec.guide === 'verticalCenter' ? 'center' : spec.guide;\n return styled(\n {\n alignmentGuide: {\n axis: vertical ? 'vertical' : 'horizontal',\n name,\n value: [round(a), round((at(100, 0) - a) / 100), round((at(0, 100) - a) / 100)],\n },\n },\n node,\n );\n }\n case 'preferredColorScheme':\n sides.push(sb(PREF_KIND, { colorScheme: value as 'light' | 'dark' | null }, undefined, undefined, 'root'));\n return node;\n case 'refreshable':\n return withEnvironment({ refresh: value as () => unknown }, node);\n case 'submitLabel':\n return withEnvironment({ submitLabel: value as string }, node);\n case 'labelStyle':\n return withEnvironment({ labelStyle: value as ViewEnvironment['labelStyle'] }, node);\n case 'task': {\n const spec = typeof value === 'function' ? { id: undefined, action: value as (signal: AbortSignal) => unknown } : (value as { id: unknown; action: (signal: AbortSignal) => unknown });\n sides.push(createElement(Task, spec));\n return node;\n }\n case 'onChangeOf':\n sides.push(createElement(OnChange, value as { value: unknown; action: (oldValue: unknown, newValue: unknown) => void; initial?: boolean }));\n return node;\n case 'scrollID':\n return createElement(ScrollTarget, { id: value as string | number }, node);\n case 'draggable':\n return createElement(Draggable, { payload: value }, node);\n case 'dropDestination':\n return createElement(DropDestination, value as DropDestinationModifier, node);\n case 'inspector':\n return createElement(Inspector, value as InspectorModifier, node);\n case 'onHover':\n return createElement(Hover, { action: value as (hovering: boolean) => void }, node);\n case 'help':\n return styled({ help: value as string }, node);\n case 'pointerStyle':\n return styled({ pointerStyle: cursorFor(value as string) }, node);\n case 'symbolEffect':\n return createElement(SymbolEffect, { spec: value as SymbolEffectModifier }, node);\n case 'matchedGeometryEffect': {\n const spec = value as { id: string | number; namespace?: string };\n return styled({ matchedGeometry: `${spec.namespace ?? ''}:${spec.id}` }, node);\n }\n case 'layoutValue':\n // Read by the enclosing `Layout` from the subview's props; nothing to draw.\n return node;\n case 'safeAreaInset': {\n const spec = value as { edge: 'top' | 'bottom' | 'leading' | 'trailing'; spacing?: number; alignment?: string; content: ReactNode };\n const vertical = spec.edge === 'top' || spec.edge === 'bottom';\n const before = spec.edge === 'top' || spec.edge === 'leading';\n const children = before\n ? [createElement(Fragment, { key: 'inset' }, spec.content), createElement(Fragment, { key: 'content' }, node)]\n : [createElement(Fragment, { key: 'content' }, node), createElement(Fragment, { key: 'inset' }, spec.content)];\n return vertical\n ? sb('vstack', { spacing: spec.spacing ?? 0, alignment: spec.alignment ?? 'center' }, undefined, children)\n : sb('hstack', { spacing: spec.spacing ?? 0, alignment: spec.alignment ?? 'center' }, undefined, children);\n }\n case 'popover':\n sides.push(createElement(SheetPresenter, value as SheetModifier));\n return node;\n case 'redacted':\n return withEnvironment({ redacted: Boolean(value) }, node);\n case 'keyboardShortcut':\n // A `Button` takes its own shortcut; elsewhere it has no action to run.\n return node;\n case 'onKeyPress':\n sides.push(createElement(KeyPressListener, { spec: value as OnKeyPressModifier }));\n return node;\n case 'sensoryFeedback': {\n const spec = value as { feedback: SensoryFeedback; trigger: unknown };\n sides.push(createElement(SensoryFeedbackPlayer, spec));\n return node;\n }\n case 'textCase':\n return withEnvironment({ textCase: value as 'uppercase' | 'lowercase' | null }, node);\n case 'coordinateSpace':\n return createElement(CoordinateSpace, { name: value as string }, node);\n case 'scrollEdgeEffectStyle':\n return withScrollSettings(edgeStyleSettings(value as ScrollEdgeEffectStyleValue), node);\n case 'scrollEdgeEffectHidden':\n return withScrollSettings(edgeHiddenSettings(value as ScrollEdgeEffectHiddenValue), node);\n case 'contentMargins':\n return withScrollSettings(marginSettings(value as ContentMarginsValue), node);\n case 'containerRelativeFrame':\n return styled({ containerRelativeFrame: containerRelativeFrame(value as ContainerRelativeFrameValue) }, node);\n case 'visualEffect':\n return createElement(VisualEffectView, { effect: value as VisualEffectClosure }, node);\n case 'scrollTransition': {\n const spec = typeof value === 'function' ? { transition: value as ScrollTransitionClosure } : (value as ScrollTransitionSpec);\n return createElement(ScrollTransitionView, { spec }, node);\n }\n case 'contentTransition': {\n if (value === 'identity') return node;\n if (typeof value === 'object') {\n const countsDown = (value as { numericText: { countsDown?: boolean } }).numericText.countsDown;\n return styled({ contentTransition: { kind: 'numericText', ...(countsDown !== undefined ? { countsDown } : {}) } }, node);\n }\n return styled({ contentTransition: { kind: value as 'numericText' | 'opacity' | 'interpolate' } }, node);\n }\n case 'modifiers': {\n let result = node;\n for (const extra of value as ViewModifiers[]) {\n result = wrap(result, Object.entries(extra) as ModifierEntry[], sides);\n }\n return result;\n }\n default: {\n const unknown: never = key;\n throw new Error(`Unknown modifier ${String(unknown)}`);\n }\n }\n}\n","/**\n * `GeometryReader` and custom `Layout`: both are round trips with the\n * renderer. The engine lays the element out and reports what it found (a\n * `geometry` event with the size, a `layout` event with the children's\n * measurements); the component answers by rendering again.\n */\n\nimport type { Dimension, GeometryEvent, LayoutChildMeasurement, LayoutProposal as ProtocolProposal } from '@swiftbrowser/web/src/protocol';\nimport { useEffect, useState, type ReactElement, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ModifierKey, type ViewModifiers } from '../modifiers';\nimport { unitPoint, type UnitPointValue } from '../values';\nimport { flattenChildren } from './stacks';\nimport { useCoordinateSpaces } from '../coordinateSpace';\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface Rect extends Size {\n x: number;\n y: number;\n}\n\n/** A reader's safe-area insets, every edge given. */\nexport interface SafeAreaInsets {\n top: number;\n leading: number;\n bottom: number;\n trailing: number;\n}\n\n/** `GeometryProxy`: what the reader's content is told. */\nexport interface GeometryProxy {\n size: Size;\n /**\n * The reader's frame: in its own space (`local`, the default), on the\n * root's screen (`global`), or relative to an enclosing view marked\n * `coordinateSpace=\"name\"` (`{ named: 'name' }`), scrolling included, kept\n * current as the views around it scroll.\n */\n frame(space?: 'local' | 'global' | { named: string }): Rect;\n /**\n * `bounds(of: .scrollView)`: the visible part of the scroll view (or list)\n * the reader is in, in the reader's own coordinates; null outside one.\n */\n bounds(of: 'scrollView'): Rect | null;\n /** How far the device's safe area (the status bar, the home indicator) reaches into the reader. */\n safeAreaInsets: SafeAreaInsets;\n}\n\nexport interface GeometryReaderProps extends ViewModifiers {\n children: (proxy: GeometryProxy) => ReactNode;\n}\n\n/** What the page last reported about a reader. */\nexport interface ReportedGeometry {\n size: Size;\n origin: { x: number; y: number } | null;\n safeArea: SafeAreaInsets;\n /** The enclosing scroll view's visible rectangle on screen, and its axis. */\n scrollView: (Rect & { axis: 'horizontal' | 'vertical' }) | null;\n}\n\nconst NO_INSETS: SafeAreaInsets = { top: 0, leading: 0, bottom: 0, trailing: 0 };\n\nexport const NO_GEOMETRY: ReportedGeometry = { size: { width: 0, height: 0 }, origin: null, safeArea: NO_INSETS, scrollView: null };\n\n/** The reader's record after a `geometry` event. */\nexport function nextGeometry(event: GeometryEvent, reported: ReportedGeometry): ReportedGeometry {\n const hasOrigin = event.x !== undefined && event.y !== undefined;\n return {\n size: { width: event.width, height: event.height },\n origin: hasOrigin ? { x: event.x!, y: event.y! } : reported.origin,\n safeArea: event.safeArea ?? reported.safeArea,\n // A frame report without a scroll view means the reader is in none.\n scrollView: hasOrigin ? (event.scrollView ?? null) : reported.scrollView,\n };\n}\n\n/**\n * The proxy over a reader's record. `onReadFrame` is called when the content\n * reads anything that needs the reader's place on screen.\n */\nexport function geometryProxy(reported: ReportedGeometry, spaces: Readonly<Record<string, { x: number; y: number } | null>>, onReadFrame: () => void): GeometryProxy {\n return {\n size: reported.size,\n frame: (space = 'local') => {\n if (space === 'local') return { x: 0, y: 0, ...reported.size };\n onReadFrame();\n const origin = reported.origin ?? { x: 0, y: 0 };\n if (space === 'global') return { ...origin, ...reported.size };\n const named = spaces[space.named];\n return { x: origin.x - (named?.x ?? 0), y: origin.y - (named?.y ?? 0), ...reported.size };\n },\n bounds: () => {\n onReadFrame();\n const view = reported.scrollView;\n if (!view || !reported.origin) return null;\n return { x: view.x - reported.origin.x, y: view.y - reported.origin.y, width: view.width, height: view.height };\n },\n get safeAreaInsets() {\n onReadFrame();\n return reported.safeArea;\n },\n };\n}\n\n/**\n * `GeometryReader { proxy in }`: fills its proposal and reports its size.\n * The content renders with a zero size first and again with the real one in\n * the same event cycle, before the page paints. A content that reads the\n * global frame, the scroll view's bounds or the safe-area insets asks the\n * page for them from then on.\n */\nexport function GeometryReader(props: GeometryReaderProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [reported, setReported] = useState<ReportedGeometry>(NO_GEOMETRY);\n const [needsFrame, setNeedsFrame] = useState(false);\n let readFrame = false;\n const proxy = geometryProxy(reported, useCoordinateSpaces(), () => {\n readFrame = true;\n });\n const content = own.children(proxy);\n useEffect(() => {\n if (readFrame && !needsFrame) setNeedsFrame(true);\n });\n return applyModifiers(\n sb(\n 'geometry',\n needsFrame ? { reportsFrame: true } : {},\n {\n geometry: (event) => {\n const next = nextGeometry(event, reported);\n if (JSON.stringify(next) !== JSON.stringify(reported)) setReported(next);\n },\n },\n content,\n ),\n modifiers,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Custom layouts\n// ---------------------------------------------------------------------------\n\n/** A proposal axis: points, `Infinity`, or `null` (unspecified). */\nexport interface LayoutProposal {\n width: number | null;\n height: number | null;\n}\n\nexport interface LayoutSubview {\n /** The engine's answers for a zero, unspecified and infinite proposal. */\n min: Size;\n ideal: Size;\n max: Size;\n /** `.layoutPriority` of the subview (0 by default). */\n priority: number;\n /** `.layoutValue(key:value:)`s of the subview (`subview[Key.self]`). */\n values: Readonly<Record<string, unknown>>;\n /** `ViewSpacing`: the space the subview wants beside another, iOS's default 8 between views. */\n spacing: ViewSpacing;\n /** The size for a proposal: `ideal` on an unspecified axis, else clamped to min…max. */\n sizeThatFits(proposal: LayoutProposal): Size;\n /** Place the subview: `at` is the point `anchor` (default top leading) lands on, in the layout's bounds. */\n place(options: { x: number; y: number; anchor?: UnitPointValue; proposal?: LayoutProposal }): void;\n}\n\n/** `ViewSpacing`: what a subview wants between itself and a neighbor. */\nexport interface ViewSpacing {\n /** `distance(to:along:)`: the space between this subview and `next` on an axis. */\n distance(next: ViewSpacing, axis: 'horizontal' | 'vertical'): number;\n}\n\n/** iOS's default space between two views, the renderer's stack spacing when none is given. */\nexport const DEFAULT_VIEW_SPACING: ViewSpacing = { distance: () => 8 };\n\nexport type LayoutGuide = 'leading' | 'horizontalCenter' | 'trailing' | 'top' | 'verticalCenter' | 'bottom' | 'firstTextBaseline' | 'lastTextBaseline';\n\n/** SwiftUI's `Layout` protocol: the two methods, an optional cache shared by them, and explicit alignment guides. */\nexport interface CustomLayout<Cache = unknown> {\n sizeThatFits(proposal: LayoutProposal, subviews: readonly LayoutSubview[], cache: Cache): Size;\n placeSubviews(bounds: Rect, proposal: LayoutProposal, subviews: readonly LayoutSubview[], cache: Cache): void;\n /** `makeCache(subviews:)`: computed once for the subviews, before sizing and placing. */\n makeCache?(subviews: readonly LayoutSubview[]): Cache;\n /**\n * `explicitAlignment(of:in:proposal:subviews:cache:)`: where the layout\n * puts a guide, in its bounds (null: the guide's default). A stack, frame\n * or overlay aligning the layout by that guide uses it.\n */\n explicitAlignment?(guide: LayoutGuide, bounds: Rect, proposal: LayoutProposal, subviews: readonly LayoutSubview[], cache: Cache): number | null;\n /** `spacing(subviews:cache:)`: accepted; the engine spaces the layout like any view (8 by default). */\n spacing?(subviews: readonly LayoutSubview[], cache: Cache): ViewSpacing;\n}\n\n/** What `Layout` reads from each subview's element besides the engine's measurements. */\nexport interface SubviewTraits {\n priority: number;\n values: Record<string, unknown>;\n}\n\nexport interface LayoutProps<Cache = unknown> extends ViewModifiers {\n layout: CustomLayout<Cache>;\n children?: ReactNode;\n}\n\n/** Each subview's `layoutPriority` and `layoutValue`s, read from its element's props. */\nfunction subviewTraits(children: ReactNode): SubviewTraits[] {\n return flattenChildren(children).map((element: ReactElement) => {\n const props = element.props as { layoutPriority?: number; layoutValue?: Record<string, unknown> };\n return { priority: props.layoutPriority ?? 0, values: props.layoutValue ?? {} };\n });\n}\n\ninterface LayoutRecord {\n proposal: LayoutProposal;\n children: LayoutChildMeasurement[];\n}\n\nconst fromDimension = (value: Dimension | null): number | null => (value === 'infinity' ? Infinity : value);\nconst toDimension = (value: number): Dimension => (Number.isFinite(value) ? Math.round(value * 100) / 100 : 'infinity');\nconst toSize = (size: { width: Dimension; height: Dimension }): Size => ({\n width: fromDimension(size.width) ?? 0,\n height: fromDimension(size.height) ?? 0,\n});\n\nconst GUIDES: readonly LayoutGuide[] = ['leading', 'horizontalCenter', 'trailing', 'top', 'verticalCenter', 'bottom', 'firstTextBaseline', 'lastTextBaseline'];\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/** Run the layout for a record: the size, the frames and the min/ideal/max sizes. */\nexport function answerLayout<Cache>(\n layout: CustomLayout<Cache>,\n record: LayoutRecord,\n traits: readonly SubviewTraits[] = [],\n): { size: Size; frames: Rect[]; sizes: { min: Size; ideal: Size; max: Size }; guides: Partial<Record<LayoutGuide, number>> } {\n const frames: (Rect | null)[] = record.children.map(() => null);\n const subviews: LayoutSubview[] = record.children.map((measurement, index) => {\n const min = toSize(measurement.min);\n const ideal = toSize(measurement.ideal);\n const max = toSize(measurement.max);\n const sizeThatFits = (proposal: LayoutProposal): Size => ({\n width: proposal.width === null ? ideal.width : clamp(proposal.width, min.width, max.width),\n height: proposal.height === null ? ideal.height : clamp(proposal.height, min.height, max.height),\n });\n return {\n min,\n ideal,\n max,\n priority: traits[index]?.priority ?? 0,\n values: traits[index]?.values ?? {},\n spacing: DEFAULT_VIEW_SPACING,\n sizeThatFits,\n place: ({ x, y, anchor, proposal }) => {\n const size = sizeThatFits(proposal ?? { width: null, height: null });\n const point = unitPoint(anchor ?? 'topLeading');\n frames[index] = { x: x - point.x * size.width, y: y - point.y * size.height, ...size };\n },\n };\n });\n const cache = (layout.makeCache ? layout.makeCache(subviews) : undefined) as Cache;\n const measure = (proposal: LayoutProposal): Size => layout.sizeThatFits(proposal, subviews, cache);\n const size = measure(record.proposal);\n layout.placeSubviews({ x: 0, y: 0, ...size }, record.proposal, subviews, cache);\n const placed = frames.map((frame, index) => {\n if (frame) return frame;\n // An unplaced subview sits centered, as in SwiftUI.\n const own = subviews[index]!.sizeThatFits({ width: size.width, height: size.height });\n return { x: (size.width - own.width) / 2, y: (size.height - own.height) / 2, ...own };\n });\n const guides: Partial<Record<LayoutGuide, number>> = {};\n if (layout.explicitAlignment) {\n const bounds = { x: 0, y: 0, ...size };\n for (const guide of GUIDES) {\n const value = layout.explicitAlignment(guide, bounds, record.proposal, subviews, cache);\n if (value !== null && value !== undefined && Number.isFinite(value)) guides[guide] = value;\n }\n }\n return {\n size,\n frames: placed,\n guides,\n sizes: {\n min: measure({ width: 0, height: 0 }),\n ideal: measure({ width: null, height: null }),\n max: measure({ width: Infinity, height: Infinity }),\n },\n };\n}\n\n/**\n * `Layout`: a custom layout the engine asks for sizes and frames. Until the\n * first answer the element fills its proposal; then it answers from the\n * layout's own `sizeThatFits` and `placeSubviews`.\n */\nexport function Layout<Cache = unknown>(props: LayoutProps<Cache>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [record, setRecord] = useState<LayoutRecord | null>(null);\n let layoutProps: Record<string, unknown> = { proposal: null, size: null, frames: null };\n // The explicit guides the last answer gave, as alignment guides of the layout's box.\n const guideModifiers: [ModifierKey, unknown][] = [];\n if (record) {\n const answer = answerLayout(own.layout, record, subviewTraits(own.children));\n for (const [guide, value] of Object.entries(answer.guides)) guideModifiers.push(['alignmentGuide', { guide, value: () => value }]);\n const encode = (size: Size): { width: Dimension; height: Dimension } => ({ width: toDimension(size.width), height: toDimension(size.height) });\n const round = (value: number): number => Math.round(value * 100) / 100;\n layoutProps = {\n proposal: {\n width: record.proposal.width === null ? null : toDimension(record.proposal.width),\n height: record.proposal.height === null ? null : toDimension(record.proposal.height),\n },\n size: { width: round(answer.size.width), height: round(answer.size.height) },\n frames: answer.frames.map((frame) => ({ x: round(frame.x), y: round(frame.y), width: round(frame.width), height: round(frame.height) })),\n sizes: { min: encode(answer.sizes.min), ideal: encode(answer.sizes.ideal), max: encode(answer.sizes.max) },\n };\n }\n return applyModifiers(\n sb(\n 'layout',\n layoutProps,\n {\n layout: (event) => {\n const proposal: ProtocolProposal = event.proposal;\n setRecord({\n proposal: { width: fromDimension(proposal.width), height: fromDimension(proposal.height) },\n children: event.children,\n });\n },\n },\n own.children,\n ),\n [...guideModifiers, ...modifiers],\n );\n}\n","/**\n * `.visualEffect { content, proxy in … }` and `.scrollTransition { content, phase in … }`.\n *\n * Both draw effects that depend on where the view is, without changing its\n * layout. The view is wrapped in a layout-transparent box that reports its\n * frame on screen (and the visible rectangle of the scroll view it is in),\n * kept current as the page scrolls; the effects apply inside that box, so\n * they never move what is measured.\n */\n\nimport type { Rotation3D, Style } from '@swiftbrowser/web/src/protocol';\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { useCoordinateSpaces } from './coordinateSpace';\nimport { geometryProxy, nextGeometry, NO_GEOMETRY, type GeometryProxy, type ReportedGeometry } from './components/geometry';\nimport { sb } from './host/sb';\nimport { unitPoint, type UnitPoint, type UnitPointValue } from './values';\n\ninterface EffectValues {\n offsetX: number;\n offsetY: number;\n scaleX: number;\n scaleY: number;\n scaleAnchor?: UnitPoint;\n rotation: number;\n rotationAnchor?: UnitPoint;\n rotation3D?: Rotation3D;\n opacity: number;\n blur: number;\n brightness: number;\n contrast: number;\n saturation: number;\n grayscale: number;\n hueRotation: number;\n}\n\nconst IDENTITY: EffectValues = {\n offsetX: 0,\n offsetY: 0,\n scaleX: 1,\n scaleY: 1,\n rotation: 0,\n opacity: 1,\n blur: 0,\n brightness: 0,\n contrast: 1,\n saturation: 1,\n grayscale: 0,\n hueRotation: 0,\n};\n\n/**\n * SwiftUI's `VisualEffect`: the effects a `visualEffect` or `scrollTransition`\n * closure returns, chained from the `effect` it is handed\n * (`effect.offset({ y: 20 }).opacity(0.5)`). Chained effects compose:\n * offsets and rotations add, scales and opacities multiply.\n */\nexport class VisualEffect {\n /** @internal */\n constructor(readonly values: EffectValues = IDENTITY) {}\n\n private with(patch: Partial<EffectValues>): VisualEffect {\n return new VisualEffect({ ...this.values, ...patch });\n }\n\n offset(offset: { x?: number; y?: number }): VisualEffect {\n return this.with({ offsetX: this.values.offsetX + (offset.x ?? 0), offsetY: this.values.offsetY + (offset.y ?? 0) });\n }\n\n scaleEffect(scale: number | { x?: number; y?: number }, anchor?: UnitPointValue): VisualEffect {\n const x = typeof scale === 'number' ? scale : (scale.x ?? 1);\n const y = typeof scale === 'number' ? scale : (scale.y ?? 1);\n return this.with({ scaleX: this.values.scaleX * x, scaleY: this.values.scaleY * y, ...(anchor !== undefined ? { scaleAnchor: unitPoint(anchor) } : {}) });\n }\n\n /** Degrees. */\n rotationEffect(degrees: number, anchor?: UnitPointValue): VisualEffect {\n return this.with({ rotation: this.values.rotation + degrees, ...(anchor !== undefined ? { rotationAnchor: unitPoint(anchor) } : {}) });\n }\n\n rotation3DEffect(spec: { angle: number; axis: { x: number; y: number; z: number }; anchor?: UnitPointValue; perspective?: number }): VisualEffect {\n const rotation: Rotation3D = { angle: spec.angle, axis: spec.axis };\n if (spec.anchor !== undefined) rotation.anchor = unitPoint(spec.anchor);\n if (spec.perspective !== undefined) rotation.perspective = spec.perspective;\n return this.with({ rotation3D: rotation });\n }\n\n opacity(opacity: number): VisualEffect {\n return this.with({ opacity: this.values.opacity * opacity });\n }\n\n blur(radius: number): VisualEffect {\n return this.with({ blur: this.values.blur + radius });\n }\n\n brightness(amount: number): VisualEffect {\n return this.with({ brightness: this.values.brightness + amount });\n }\n\n contrast(amount: number): VisualEffect {\n return this.with({ contrast: this.values.contrast * amount });\n }\n\n saturation(amount: number): VisualEffect {\n return this.with({ saturation: this.values.saturation * amount });\n }\n\n grayscale(amount: number): VisualEffect {\n return this.with({ grayscale: Math.min(1, this.values.grayscale + amount) });\n }\n\n /** Degrees. */\n hueRotation(degrees: number): VisualEffect {\n return this.with({ hueRotation: this.values.hueRotation + degrees });\n }\n}\n\n/** The effect a closure starts from. */\nexport const EMPTY_EFFECT = new VisualEffect();\n\nconst round = (value: number): number => Math.round(value * 1000) / 1000;\n\n/** The `styled` style that draws `values` (identity fields left out). */\nexport function effectStyle(values: EffectValues): Style {\n const style: Style = {};\n if (values.offsetX !== 0 || values.offsetY !== 0) style.offset = { x: round(values.offsetX), y: round(values.offsetY) };\n if (values.scaleX !== 1 || values.scaleY !== 1) {\n style.scale = { x: round(values.scaleX), y: round(values.scaleY) };\n if (values.scaleAnchor) style.scaleAnchor = values.scaleAnchor;\n }\n if (values.rotation !== 0) {\n style.rotation = round(values.rotation);\n if (values.rotationAnchor) style.rotationAnchor = values.rotationAnchor;\n }\n if (values.rotation3D && values.rotation3D.angle !== 0) style.rotation3D = { ...values.rotation3D, angle: round(values.rotation3D.angle) };\n if (values.opacity !== 1) style.opacity = round(values.opacity);\n if (values.blur !== 0) style.blur = round(values.blur);\n if (values.brightness !== 0) style.brightness = round(values.brightness);\n if (values.contrast !== 1) style.contrast = round(values.contrast);\n if (values.saturation !== 1) style.saturation = round(values.saturation);\n if (values.grayscale !== 0) style.grayscale = round(values.grayscale);\n if (values.hueRotation !== 0) style.hueRotation = round(values.hueRotation);\n return style;\n}\n\n/** `from` → `to` by `t` (0…1), field by field; anchors and 3-D axes come from the side that sets them. */\nexport function interpolateEffects(from: EffectValues, to: EffectValues, t: number): EffectValues {\n const mix = (a: number, b: number): number => a + (b - a) * t;\n const result: EffectValues = {\n offsetX: mix(from.offsetX, to.offsetX),\n offsetY: mix(from.offsetY, to.offsetY),\n scaleX: mix(from.scaleX, to.scaleX),\n scaleY: mix(from.scaleY, to.scaleY),\n rotation: mix(from.rotation, to.rotation),\n opacity: mix(from.opacity, to.opacity),\n blur: mix(from.blur, to.blur),\n brightness: mix(from.brightness, to.brightness),\n contrast: mix(from.contrast, to.contrast),\n saturation: mix(from.saturation, to.saturation),\n grayscale: mix(from.grayscale, to.grayscale),\n hueRotation: mix(from.hueRotation, to.hueRotation),\n };\n const scaleAnchor = to.scaleAnchor ?? from.scaleAnchor;\n if (scaleAnchor) result.scaleAnchor = scaleAnchor;\n const rotationAnchor = to.rotationAnchor ?? from.rotationAnchor;\n if (rotationAnchor) result.rotationAnchor = rotationAnchor;\n const rotation3D = to.rotation3D ?? from.rotation3D;\n if (rotation3D) result.rotation3D = { ...rotation3D, angle: mix(from.rotation3D?.angle ?? 0, to.rotation3D?.angle ?? 0) };\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// The measured box\n// ---------------------------------------------------------------------------\n\n/**\n * Renders `children` styled by `style(reported, markRead)` inside a box that\n * reports its geometry; the frame on screen is asked for once `markRead` is\n * called (always, with `alwaysFrame`).\n */\nfunction EffectBox({\n render,\n alwaysFrame,\n animationToken,\n children,\n}: {\n render: (reported: ReportedGeometry, markRead: () => void) => Style;\n alwaysFrame: boolean;\n /** When given, a change of the number animates the effect (as `.animation(.default, value:)`). */\n animationToken?: (reported: ReportedGeometry) => number;\n children?: ReactNode;\n}): ReactNode {\n const [reported, setReported] = useState<ReportedGeometry>(NO_GEOMETRY);\n const [needsFrame, setNeedsFrame] = useState(alwaysFrame);\n let readFrame = false;\n const style = render(reported, () => {\n readFrame = true;\n });\n useEffect(() => {\n if (readFrame && !needsFrame) setNeedsFrame(true);\n });\n let content = Object.keys(style).length > 0 ? sb('styled', { style }, undefined, children) : children;\n if (animationToken) content = sb('styled', { style: { animation: { type: 'default' }, animationToken: animationToken(reported) } }, undefined, content);\n return sb(\n 'zstack',\n { alignment: 'center', reportsSize: true, ...(needsFrame ? { reportsFrame: true } : {}) },\n {\n geometry: (event) => {\n const next = nextGeometry(event, reported);\n if (JSON.stringify(next) !== JSON.stringify(reported)) setReported(next);\n },\n },\n content,\n );\n}\n\nexport type VisualEffectClosure = (effect: VisualEffect, proxy: GeometryProxy) => VisualEffect;\n\n/** `.visualEffect { content, proxy in … }`. */\nexport function VisualEffectView({ effect, children }: { effect: VisualEffectClosure; children?: ReactNode }): ReactNode {\n const spaces = useCoordinateSpaces();\n return (\n <EffectBox alwaysFrame={false} render={(reported, markRead) => effectStyle(effect(EMPTY_EFFECT, geometryProxy(reported, spaces, markRead)).values)}>\n {children}\n </EffectBox>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Scroll transitions\n// ---------------------------------------------------------------------------\n\n/**\n * Where a view is in its scroll view: `topLeading` (going out past the top or\n * leading edge), `identity` (in view) or `bottomTrailing`, with `value` -1, 0\n * or 1. An `interactive` transition draws the effect partway between phases\n * as the view crosses the edge.\n */\nexport interface ScrollTransitionPhase {\n phase: 'topLeading' | 'identity' | 'bottomTrailing';\n value: -1 | 0 | 1;\n isIdentity: boolean;\n}\n\nconst PHASES = {\n topLeading: { phase: 'topLeading', value: -1, isIdentity: false },\n identity: { phase: 'identity', value: 0, isIdentity: true },\n bottomTrailing: { phase: 'bottomTrailing', value: 1, isIdentity: false },\n} as const satisfies Record<string, ScrollTransitionPhase>;\n\nexport type ScrollTransitionClosure = (effect: VisualEffect, phase: ScrollTransitionPhase) => VisualEffect;\n\nexport interface ScrollTransitionSpec {\n transition: ScrollTransitionClosure;\n /**\n * `interactive` (the default) follows the scrolling, drawing the effect\n * partway as the view crosses the edge; `animated` switches phases once the\n * view is partly out; `identity` never leaves the identity phase.\n */\n configuration?: 'interactive' | 'animated' | 'identity';\n /** The axis to follow; the scroll view's own by default. */\n axis?: 'horizontal' | 'vertical';\n}\n\n/**\n * How far the view has gone out of its scroll view's visible rectangle:\n * negative past the top or leading edge, positive past the bottom or\n * trailing one, as a fraction of its own length (0 while wholly in view).\n */\nexport function scrollProgress(reported: ReportedGeometry, axis?: 'horizontal' | 'vertical'): number {\n const view = reported.scrollView;\n const origin = reported.origin;\n if (!view || !origin) return 0;\n const horizontal = (axis ?? view.axis) === 'horizontal';\n const start = horizontal ? origin.x : origin.y;\n const length = horizontal ? reported.size.width : reported.size.height;\n const viewStart = horizontal ? view.x : view.y;\n const viewEnd = viewStart + (horizontal ? view.width : view.height);\n if (length <= 0) return 0;\n if (start < viewStart) return -Math.min(1, (viewStart - start) / length);\n if (start + length > viewEnd) return Math.min(1, (start + length - viewEnd) / length);\n return 0;\n}\n\n/** The effect values a scroll transition draws at `progress` (see `scrollProgress`). */\nexport function scrollTransitionValues(spec: ScrollTransitionSpec, progress: number): EffectValues {\n const identity = spec.transition(EMPTY_EFFECT, PHASES.identity).values;\n const configuration = spec.configuration ?? 'interactive';\n if (configuration === 'identity' || progress === 0) return identity;\n const edge = spec.transition(EMPTY_EFFECT, progress < 0 ? PHASES.topLeading : PHASES.bottomTrailing).values;\n if (configuration === 'animated') return edge;\n return interpolateEffects(identity, edge, Math.abs(progress));\n}\n\n/** `.scrollTransition { content, phase in … }`. */\nexport function ScrollTransitionView({ spec, children }: { spec: ScrollTransitionSpec; children?: ReactNode }): ReactNode {\n return (\n <EffectBox\n alwaysFrame\n render={(reported) => effectStyle(scrollTransitionValues(spec, scrollProgress(reported, spec.axis)))}\n {...(spec.configuration === 'animated' ? { animationToken: (reported: ReportedGeometry) => Math.sign(scrollProgress(reported, spec.axis)) + 1 } : {})}\n >\n {children}\n </EffectBox>\n );\n}\n","/**\n * `Path`: a builder for SVG path data, in SwiftUI's vocabulary. Custom\n * shapes (`Shape` with a `path` function) and `Canvas` drawing take one.\n * Points are rounded to hundredths, as the Swift shim rounds them.\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface CGRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst r = (n: number): string => {\n const v = Math.round(n * 100) / 100;\n return Object.is(v, -0) ? '0' : String(v);\n};\n\nexport class Path {\n private readonly parts: string[] = [];\n private current: Point | null = null;\n private start: Point | null = null;\n\n constructor(build?: (path: Path) => void) {\n build?.(this);\n }\n\n /** `Path(rect)` */\n static rect(rect: CGRect): Path {\n return new Path().addRect(rect);\n }\n /** `Path(roundedRect:cornerRadius:)` */\n static roundedRect(rect: CGRect, cornerRadius: number): Path {\n return new Path().addRoundedRect(rect, cornerRadius);\n }\n /** `Path(ellipseIn:)` */\n static ellipse(rect: CGRect): Path {\n return new Path().addEllipse(rect);\n }\n\n move(to: Point): this {\n this.parts.push(`M${r(to.x)} ${r(to.y)}`);\n this.current = to;\n this.start = to;\n return this;\n }\n\n addLine(to: Point): this {\n if (!this.current) return this.move(to);\n this.parts.push(`L${r(to.x)} ${r(to.y)}`);\n this.current = to;\n return this;\n }\n\n addLines(points: readonly Point[]): this {\n points.forEach((point, index) => (index === 0 ? this.move(point) : this.addLine(point)));\n return this;\n }\n\n addQuadCurve(to: Point, control: Point): this {\n if (!this.current) this.move(control);\n this.parts.push(`Q${r(control.x)} ${r(control.y)} ${r(to.x)} ${r(to.y)}`);\n this.current = to;\n return this;\n }\n\n addCurve(to: Point, control1: Point, control2: Point): this {\n if (!this.current) this.move(control1);\n this.parts.push(`C${r(control1.x)} ${r(control1.y)} ${r(control2.x)} ${r(control2.y)} ${r(to.x)} ${r(to.y)}`);\n this.current = to;\n return this;\n }\n\n /**\n * `addArc(center:radius:startAngle:endAngle:clockwise:)`, angles in\n * degrees. As in SwiftUI's flipped coordinates, `clockwise: false` draws\n * clockwise on screen.\n */\n addArc(center: Point, radius: number, startAngle: number, endAngle: number, clockwise: boolean): this {\n const rad = (deg: number): number => (deg * Math.PI) / 180;\n const point = (deg: number): Point => ({ x: center.x + radius * Math.cos(rad(deg)), y: center.y + radius * Math.sin(rad(deg)) });\n const from = point(startAngle);\n if (this.current) this.addLine(from);\n else this.move(from);\n // On screen (y down), SwiftUI's `clockwise: false` sweeps with increasing angles.\n const sweepPositive = !clockwise;\n let delta = endAngle - startAngle;\n if (sweepPositive) while (delta < 0) delta += 360;\n else while (delta > 0) delta -= 360;\n if (Math.abs(delta) >= 360) {\n // A full circle: two half arcs.\n const half = point(startAngle + (sweepPositive ? 180 : -180));\n const flag = sweepPositive ? 1 : 0;\n this.parts.push(`A${r(radius)} ${r(radius)} 0 0 ${flag} ${r(half.x)} ${r(half.y)}`);\n this.parts.push(`A${r(radius)} ${r(radius)} 0 0 ${flag} ${r(from.x)} ${r(from.y)}`);\n this.current = from;\n return this;\n }\n const to = point(startAngle + delta);\n const large = Math.abs(delta) > 180 ? 1 : 0;\n this.parts.push(`A${r(radius)} ${r(radius)} 0 ${large} ${sweepPositive ? 1 : 0} ${r(to.x)} ${r(to.y)}`);\n this.current = to;\n return this;\n }\n\n addRect(rect: CGRect): this {\n this.move({ x: rect.x, y: rect.y });\n this.addLine({ x: rect.x + rect.width, y: rect.y });\n this.addLine({ x: rect.x + rect.width, y: rect.y + rect.height });\n this.addLine({ x: rect.x, y: rect.y + rect.height });\n return this.closeSubpath();\n }\n\n addRoundedRect(rect: CGRect, cornerRadius: number): this {\n const c = Math.max(0, Math.min(cornerRadius, rect.width / 2, rect.height / 2));\n if (c === 0) return this.addRect(rect);\n const { x, y, width: w, height: h } = rect;\n this.move({ x: x + c, y });\n this.addLine({ x: x + w - c, y });\n this.parts.push(`A${r(c)} ${r(c)} 0 0 1 ${r(x + w)} ${r(y + c)}`);\n this.current = { x: x + w, y: y + c };\n this.addLine({ x: x + w, y: y + h - c });\n this.parts.push(`A${r(c)} ${r(c)} 0 0 1 ${r(x + w - c)} ${r(y + h)}`);\n this.current = { x: x + w - c, y: y + h };\n this.addLine({ x: x + c, y: y + h });\n this.parts.push(`A${r(c)} ${r(c)} 0 0 1 ${r(x)} ${r(y + h - c)}`);\n this.current = { x, y: y + h - c };\n this.addLine({ x, y: y + c });\n this.parts.push(`A${r(c)} ${r(c)} 0 0 1 ${r(x + c)} ${r(y)}`);\n this.current = { x: x + c, y };\n return this.closeSubpath();\n }\n\n addEllipse(rect: CGRect): this {\n const rx = rect.width / 2;\n const ry = rect.height / 2;\n const cx = rect.x + rx;\n const cy = rect.y + ry;\n this.move({ x: cx + rx, y: cy });\n this.parts.push(`A${r(rx)} ${r(ry)} 0 0 1 ${r(cx - rx)} ${r(cy)}`);\n this.parts.push(`A${r(rx)} ${r(ry)} 0 0 1 ${r(cx + rx)} ${r(cy)}`);\n this.current = { x: cx + rx, y: cy };\n return this.closeSubpath();\n }\n\n addPath(path: Path): this {\n this.parts.push(path.svg());\n return this;\n }\n\n closeSubpath(): this {\n this.parts.push('Z');\n this.current = this.start;\n return this;\n }\n\n get isEmpty(): boolean {\n return this.parts.length === 0;\n }\n\n /** The SVG path data. */\n svg(): string {\n return this.parts.join('');\n }\n\n toString(): string {\n return this.svg();\n }\n}\n","import type { ButtonRole, ButtonStyle, PickerStyle, SliderLabel, TextFieldStyle } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, type ReactElement, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { useViewEnvironment, type ControlSize } from '../environment';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, styled, takeModifier, toolbarPlacement, type ToolbarItemPlacementName, type ViewModifiers } from '../modifiers';\nimport { flattenChildren } from './stacks';\nimport { useKeyboardShortcut } from '../pointer';\nimport { Image, Text, type TextProps } from './text';\n\n// ---------------------------------------------------------------------------\n// Button\n// ---------------------------------------------------------------------------\n\nexport interface ButtonProps extends ViewModifiers {\n title?: string;\n role?: 'destructive' | 'cancel';\n action?: () => void;\n /** The label, when there is no `title`. */\n children?: ReactNode;\n}\n\nexport function Button(props: ButtonProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const ownStyle = takeModifier(modifiers, 'buttonStyle');\n const ownSize = takeModifier(modifiers, 'controlSize');\n const style: ButtonStyle = ownStyle === 'borderless' ? 'plain' : (ownStyle ?? environment.buttonStyle ?? 'automatic');\n const controlSize: ControlSize | undefined = ownSize ?? environment.controlSize;\n const buttonProps: Record<string, unknown> = { role: (own.role ?? null) as ButtonRole, style };\n if (controlSize !== undefined && controlSize !== 'regular') buttonProps['controlSize'] = controlSize;\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n const tap = (): void => {\n own.action?.();\n environment.dismissAlert?.();\n };\n const shortcut = takeModifier(modifiers, 'keyboardShortcut');\n useKeyboardShortcut(typeof shortcut === 'string' ? { key: shortcut } : shortcut, () => {\n if (!buttonDisabled(modifiers)) tap();\n });\n return applyModifiers(sb('button', buttonProps, { tap }, label), modifiers);\n}\n\n// ---------------------------------------------------------------------------\n// Toggle\n// ---------------------------------------------------------------------------\n\nexport interface ToggleProps extends ViewModifiers {\n isOn: BindingValue<boolean>;\n onChange?: (isOn: boolean) => void;\n title?: string;\n children?: ReactNode;\n}\n\nexport function Toggle(props: ToggleProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [isOn, setOn] = readBinding(own.isOn, own.onChange);\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n return applyModifiers(sb('toggle', { isOn }, { toggle: (event) => setOn(event.value) }, label), modifiers);\n}\n\n// ---------------------------------------------------------------------------\n// Picker\n// ---------------------------------------------------------------------------\n\nexport interface PickerOption<T> {\n label: string;\n tag: T;\n}\n\nexport interface PickerProps<T> extends ViewModifiers {\n label: string;\n selection: BindingValue<T>;\n onChange?: (value: T) => void;\n /** The options, or `<Text tag={…}>` children (a `Text` without a tag is tagged with its string). */\n options?: readonly (T | PickerOption<T>)[];\n children?: ReactNode;\n}\n\nexport function Picker<T>(props: PickerProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const ownStyle = takeModifier(modifiers, 'pickerStyle');\n const style: PickerStyle = ownStyle ?? environment.pickerStyle ?? 'menu';\n const [selection, setSelection] = readBinding(own.selection, own.onChange);\n const options = pickerOptions<T>(own.options, own.children);\n const selected = Math.max(\n 0,\n options.findIndex((option) => Object.is(option.tag, selection)),\n );\n return applyModifiers(\n sb(\n 'picker',\n { style, label: own.label, options: options.map((option) => option.label), selected },\n { select: (event) => options[event.value] && setSelection(options[event.value]!.tag) },\n ),\n modifiers,\n );\n}\n\nfunction pickerOptions<T>(options: readonly (T | PickerOption<T>)[] | undefined, children: ReactNode): PickerOption<T>[] {\n if (options) {\n return options.map((option) =>\n typeof option === 'object' && option !== null && 'label' in option && 'tag' in option\n ? (option as PickerOption<T>)\n : { label: String(option), tag: option as T },\n );\n }\n return flattenChildren(children).map((element) => {\n const label = plainText(element);\n const tag = (element.props as { tag?: T }).tag;\n return { label, tag: (tag !== undefined ? tag : label) as T };\n });\n}\n\n/** The string of a `<Text>` element (other elements read as their title, else \"\"). */\nexport function plainText(element: ReactElement): string {\n const props = element.props as TextProps & { title?: unknown };\n if (element.type === Text) return collectText(props.children);\n if (typeof props.title === 'string') return props.title;\n return '';\n}\n\nfunction collectText(node: ReactNode): string {\n if (node === null || node === undefined || typeof node === 'boolean') return '';\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(collectText).join('');\n if (typeof node === 'object' && 'props' in node) {\n const element = node as ReactElement<{ children?: ReactNode }>;\n if (element.type === Fragment || element.type === Text) return collectText(element.props.children);\n }\n return '';\n}\n\n// ---------------------------------------------------------------------------\n// Slider, Stepper\n// ---------------------------------------------------------------------------\n\nexport interface SliderProps extends ViewModifiers {\n value: BindingValue<number>;\n onChange?: (value: number) => void;\n /** `in: 0...1` */\n range?: readonly [number, number];\n step?: number;\n label?: ReactNode;\n minimumValueLabel?: ReactNode;\n maximumValueLabel?: ReactNode;\n}\n\nexport function Slider(props: SliderProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const [value, setValue] = readBinding(own.value, own.onChange);\n const [min, max] = own.range ?? [0, 1];\n const labels: SliderLabel[] = [];\n const children: ReactNode[] = [];\n if (own.label !== undefined && !environment.labelsHidden) {\n labels.push('label');\n children.push(<Fragment key=\"label\">{own.label}</Fragment>);\n }\n if (own.minimumValueLabel !== undefined || own.maximumValueLabel !== undefined) {\n labels.push('min', 'max');\n children.push(<Fragment key=\"min\">{own.minimumValueLabel}</Fragment>, <Fragment key=\"max\">{own.maximumValueLabel}</Fragment>);\n }\n return applyModifiers(\n sb('slider', { value, min, max, step: own.step ?? null, labels }, { slide: (event) => setValue(event.value) }, children.length ? children : undefined),\n modifiers,\n );\n}\n\nexport interface StepperProps extends ViewModifiers {\n value: BindingValue<number>;\n onChange?: (value: number) => void;\n /** `in: 1...10` */\n range?: readonly [number, number];\n step?: number;\n title?: string;\n children?: ReactNode;\n}\n\nexport function Stepper(props: StepperProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [value, setValue] = readBinding(own.value, own.onChange);\n const step = own.step ?? 1;\n const [min, max] = own.range ?? [-Infinity, Infinity];\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.children;\n return applyModifiers(\n sb(\n 'stepper',\n { canIncrement: value < max, canDecrement: value > min },\n { step: (event) => setValue(Math.min(max, Math.max(min, value + Math.sign(event.value) * step))) },\n label,\n ),\n modifiers,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Text fields\n// ---------------------------------------------------------------------------\n\nexport interface TextFieldProps extends ViewModifiers {\n /** The placeholder (SwiftUI's title). */\n placeholder?: string;\n text: BindingValue<string>;\n onChange?: (text: string) => void;\n onSubmit?: () => void;\n textFieldStyle?: TextFieldStyle;\n secure?: boolean;\n axis?: 'vertical';\n /** `.focused($isFocused)`: the field takes the focus while true, and sets it as the viewer focuses or leaves it. */\n focused?: BindingValue<boolean>;\n}\n\nexport function TextField(props: TextFieldProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const ownSubmitLabel = takeModifier(modifiers, 'submitLabel');\n const [text, setText] = readBinding(own.text, own.onChange);\n const fieldProps: Record<string, unknown> = {\n text,\n placeholder: own.placeholder ?? '',\n style: own.textFieldStyle ?? 'plain',\n secure: own.secure ?? false,\n };\n if (own.onSubmit) fieldProps['submit'] = true;\n if (own.axis) fieldProps['axis'] = own.axis;\n const submitLabel = ownSubmitLabel ?? environment.submitLabel;\n if (submitLabel) fieldProps['submitLabel'] = submitLabel;\n const focus = own.focused !== undefined ? readBinding(own.focused) : null;\n if (focus) fieldProps['focused'] = focus[0];\n return applyModifiers(\n sb('textfield', fieldProps, {\n text: (event) => setText(event.value),\n submit: () => own.onSubmit?.(),\n focus: (event) => focus?.[1](event.value),\n }),\n modifiers,\n );\n}\n\nexport function SecureField(props: Omit<TextFieldProps, 'secure'>): ReactNode {\n return <TextField {...props} secure />;\n}\n\n// ---------------------------------------------------------------------------\n// ProgressView\n// ---------------------------------------------------------------------------\n\nexport interface ProgressViewProps extends ViewModifiers {\n /** Determinate progress (`value / total`); absent: the spinning indicator. */\n value?: number;\n total?: number;\n label?: ReactNode;\n currentValueLabel?: ReactNode;\n /** The label, as children. */\n children?: ReactNode;\n}\n\nexport function ProgressView(props: ProgressViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n if (own.value === undefined) {\n return applyModifiers(\n styled({ foreground: { hierarchical: 2 } }, styled({ font: { size: 20 } }, <Image systemName=\"progress.indicator\" />)),\n modifiers,\n );\n }\n const label = own.label ?? own.children;\n const children: ReactNode[] = [];\n if (label !== undefined && label !== null) children.push(<Fragment key=\"label\">{label}</Fragment>);\n if (own.currentValueLabel !== undefined && own.currentValueLabel !== null) {\n children.push(<Fragment key=\"current\">{styled({ foreground: { hierarchical: 2 } }, own.currentValueLabel)}</Fragment>);\n }\n return applyModifiers(\n sb(\n 'gauge',\n { value: own.value / (own.total ?? 1), style: 'progress', hasLabel: true, hasCurrentValueLabel: true },\n undefined,\n children.length ? children : undefined,\n ),\n modifiers,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar\n// ---------------------------------------------------------------------------\n\nexport interface ToolbarItemProps {\n placement?: ToolbarItemPlacementName;\n children?: ReactNode;\n}\n\n/** `ToolbarItem(placement:) { }`, inside a `toolbar` modifier. */\nexport function ToolbarItem(props: ToolbarItemProps): ReactNode {\n return sb('toolbar', { placement: toolbarPlacement(props.placement) }, undefined, props.children);\n}\n\nexport const ToolbarItemGroup = ToolbarItem;\n\nexport interface ToolbarSpacerProps {\n /**\n * `flexible` (the default) shares the room the groups leave, pushing them\n * apart; `fixed` is a standard 8 gap and keeps the row centered.\n */\n sizing?: 'flexible' | 'fixed';\n placement?: ToolbarItemPlacementName;\n}\n\n/**\n * `ToolbarSpacer(_:placement:)` (iOS 26), inside a `toolbar` modifier: ends\n * the glass group of the items before it, so a bottom bar's items float in\n * separate capsules. Between navigation bar groups it only separates them.\n */\nexport function ToolbarSpacer(props: ToolbarSpacerProps): ReactNode {\n return sb('toolbar', { placement: toolbarPlacement(props.placement), spacer: props.sizing ?? 'flexible' });\n}\n\n// ---------------------------------------------------------------------------\n// DatePicker, TextEditor\n// ---------------------------------------------------------------------------\n\nexport type DatePickerComponents = 'date' | 'hourAndMinute' | 'dateAndTime';\n\nexport interface DatePickerProps extends ViewModifiers {\n label?: string;\n selection: BindingValue<Date>;\n onChange?: (date: Date) => void;\n /** `displayedComponents:`; `date` by default. */\n displayedComponents?: DatePickerComponents;\n /** `in:` bounds. */\n range?: readonly [Date | null, Date | null];\n}\n\n/** `DatePicker(\"Date\", selection:)`: the compact style, with the browser's native pickers. */\nexport function DatePicker(props: DatePickerProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const environment = useViewEnvironment();\n const [date, setDate] = readBinding(own.selection, own.onChange);\n const labelsHidden = takeModifier(modifiers, 'labelsHidden') ?? environment.labelsHidden ?? false;\n const seconds = (value: Date | null | undefined): number | null => (value ? Math.floor(value.getTime() / 1000) : null);\n const pickerProps: Record<string, unknown> = {\n seconds: seconds(date) ?? 0,\n components: own.displayedComponents ?? 'date',\n min: seconds(own.range?.[0]),\n max: seconds(own.range?.[1]),\n };\n if (labelsHidden) pickerProps['labelsHidden'] = true;\n const label = labelsHidden || own.label === undefined ? undefined : <Text>{own.label}</Text>;\n return applyModifiers(sb('datepicker', pickerProps, { date: (event) => setDate(new Date(event.value * 1000)) }, label), modifiers);\n}\n\nexport interface TextEditorProps extends ViewModifiers {\n text: BindingValue<string>;\n onChange?: (text: string) => void;\n focused?: BindingValue<boolean>;\n}\n\n/** `TextEditor(text:)`: a multi-line field filling its proposal. */\nexport function TextEditor(props: TextEditorProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [text, setText] = readBinding(own.text, own.onChange);\n const focus = own.focused !== undefined ? readBinding(own.focused) : null;\n const editor: Record<string, unknown> = { text };\n if (focus) editor['focused'] = focus[0];\n return applyModifiers(\n sb('texteditor', editor, { text: (event) => setText(event.value), focus: (event) => focus?.[1](event.value) }),\n modifiers,\n );\n}\n\n/** A `disabled` modifier on the button itself turns its shortcut off too. */\nfunction buttonDisabled(modifiers: readonly [string, unknown][]): boolean {\n return modifiers.some(([key, value]) => key === 'disabled' && value === true);\n}\n","import type { ListStyle } from '@swiftbrowser/web/src/protocol';\nimport { isValidElement, useContext, type ReactElement, type ReactNode } from 'react';\nimport { SplitSelectionContext, useReportSplitSelection } from './split';\nimport { readBinding, type BindingValue } from '../binding';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, takeModifier, type ViewModifiers } from '../modifiers';\nimport { plainText } from './controls';\nimport { NavigationLink } from './navigation';\nimport { ListSelectionContext, Row, type ListSelection, type RowProps } from './row';\nimport { flattenChildren, providingScrollSettings, takeScrollSettings, useRefreshable } from './stacks';\nimport { edgeEffectProp, useScrollSettings } from '../scrollEnvironment';\nimport { LazyContext, LazyGroup, type LazyGroupProps } from '../lazy';\nimport { Text } from './text';\n\nconst NO_CLEAR = (): void => {};\n\n/** A selection: one value (or `null`), or a `Set` of values. */\nexport type Selection<T> = T | null | Set<T>;\n\nexport interface ListProps<T = unknown> extends ViewModifiers {\n listStyle?: ListStyle;\n /** Edit mode (`EditButton`). */\n editing?: BindingValue<boolean>;\n /** `List(selection:)`: rows with a `tag` (or a `NavigationLink` value) become selectable; a `Set` selects several. */\n selection?: BindingValue<Set<T>> | BindingValue<T | null>;\n onSelectionChange?: (selection: Selection<T>) => void;\n children?: ReactNode;\n}\n\nexport function List<T = unknown>(props: ListProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [editing] = own.editing !== undefined ? readBinding(own.editing) : [false];\n const listProps: Record<string, unknown> = { style: own.listStyle ?? 'insetGrouped' };\n if (editing) listProps['editing'] = true;\n let selection: ListSelection | null = null;\n const split = useContext(SplitSelectionContext);\n let selected = false;\n let clearSelection = NO_CLEAR;\n if (own.selection !== undefined) {\n const [value, setValue] = readBinding(own.selection as BindingValue<Selection<T>>, own.onSelectionChange);\n selected = value instanceof Set ? value.size > 0 : value !== null && value !== undefined;\n clearSelection = () => setValue(value instanceof Set ? new Set<T>() : null);\n selection = {\n editing,\n isSelected: (tag) => (value instanceof Set ? value.has(tag as T) : value !== null && Object.is(value, tag)),\n select: (tag) => {\n if (value instanceof Set) {\n const next = new Set(value);\n if (next.has(tag as T)) next.delete(tag as T);\n else next.add(tag as T);\n setValue(next);\n } else {\n setValue(editing && Object.is(value, tag) ? null : (tag as T));\n }\n },\n };\n }\n useReportSplitSelection(split, selected, clearSelection, own.selection !== undefined);\n const refresh = useRefreshable(takeModifier(modifiers, 'refreshable'));\n Object.assign(listProps, refresh.props);\n // `.scrollEdgeEffectStyle` / `.scrollEdgeEffectHidden` (content margins are a scroll view's).\n const ownSettings = takeScrollSettings(modifiers);\n const edgeEffect = edgeEffectProp(useScrollSettings(ownSettings));\n if (edgeEffect) listProps['edgeEffect'] = edgeEffect;\n const element = (\n <LazyContext.Provider value=\"vertical\">\n {sb('list', listProps, refresh.handlers, providingScrollSettings(ownSettings, wrapRows(own.children)))}\n </LazyContext.Provider>\n );\n return applyModifiers(\n selection ? <ListSelectionContext.Provider value={selection}>{element}</ListSelectionContext.Provider> : element,\n modifiers,\n );\n}\n\n/** `Form { }`: an inset grouped list, as the shim draws it. */\nexport function Form(props: Omit<ListProps, 'listStyle' | 'selection' | 'onSelectionChange'>): ReactNode {\n return <List {...props} />;\n}\n\nexport interface SectionProps extends ViewModifiers {\n /** A string or a `<Text>` becomes the section's header text; any other view is a view header. */\n header?: ReactNode;\n footer?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Section(props: SectionProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const header = supplement(own.header);\n const footer = supplement(own.footer);\n const children: ReactNode[] = [];\n if (header.view) children.push(sb('sectionheader', {}, undefined, header.view));\n if (own.children !== undefined) children.push(wrapRows(own.children));\n if (footer.view) children.push(sb('sectionfooter', {}, undefined, footer.view));\n return applyModifiers(sb('section', { header: header.text, footer: footer.text }, undefined, children), modifiers);\n}\n\n/**\n * Rows with a tag (`.tag`, or a `NavigationLink` value) become `Row`s, so a\n * `List(selection:)` can select them; a `Row` from `ForEach`'s `onDelete`\n * keeps its own. Sections pass through (they wrap their own rows).\n */\nfunction wrapRows(children: ReactNode): ReactNode {\n // Lazy groups stay groups (they build their rows as they scroll in); the\n // rows before one count it as one child, the rows after as its rows.\n let offset = 0;\n return flattenChildren(children, { keepLazy: true }).map((element, index) => {\n const at = index + offset;\n if (element.type === LazyGroup) {\n const group = element.props as LazyGroupProps;\n offset += group.rows.length - 1;\n return { ...withKey(element, index), props: { ...group, start: at, wrap: wrapRow } };\n }\n return wrapRow(withKey(element, index), at);\n });\n}\n\n/** A row as its container holds it: a `Row` knows its index; a tagged view becomes a selectable `Row`. */\nfunction wrapRow(element: ReactElement, containerIndex: number): ReactElement {\n if (element.type === Section) return element;\n if (element.type === Row) return { ...element, props: { ...(element.props as RowProps), containerIndex } };\n const props = element.props as { tag?: unknown; value?: unknown };\n const tag = props.tag !== undefined ? props.tag : element.type === NavigationLink ? props.value : undefined;\n if (tag === undefined) return element;\n return (\n <Row key={element.key ?? containerIndex} tag={tag} containerIndex={containerIndex}>\n {element}\n </Row>\n );\n}\n\nfunction withKey(element: ReactElement, index: number): ReactElement {\n return element.key !== null ? element : { ...element, key: String(index) };\n}\n\nfunction supplement(node: ReactNode): { text: string | null; view: ReactElement | null } {\n if (node === undefined || node === null || node === false) return { text: null, view: null };\n if (typeof node === 'string' || typeof node === 'number') return { text: String(node), view: null };\n if (isValidElement(node) && node.type === Text) {\n const props = node.props as { children?: ReactNode };\n const only = Object.keys(props).every((key) => key === 'children');\n if (only) return { text: plainText(node), view: null };\n }\n return { text: null, view: isValidElement(node) ? node : null };\n}\n","import { useState, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, takeModifier, type ViewModifiers } from '../modifiers';\nimport { flattenChildren } from './stacks';\n\nexport interface TabViewProps<T> extends ViewModifiers {\n selection?: BindingValue<T>;\n onChange?: (value: T) => void;\n /** `<Tab>` children. */\n children?: ReactNode;\n}\n\nexport function TabView<T = number>(props: TabViewProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const tabs = flattenChildren(own.children);\n const tags = tabs.map((tab, index) => {\n const tag = (tab.props as { tag?: T }).tag;\n return (tag !== undefined ? tag : index) as T;\n });\n const [internal, setInternal] = useState<T>(tags[0] as T);\n const [selection, setSelection] = own.selection !== undefined ? readBinding(own.selection, own.onChange) : [internal, setInternal];\n const selected = Math.max(\n 0,\n tags.findIndex((tag) => Object.is(tag, selection)),\n );\n return applyModifiers(\n sb('tabview', { selected }, { select: (event) => tags[event.value] !== undefined && setSelection(tags[event.value] as T) }, tabs),\n modifiers,\n );\n}\n\nexport interface TabProps<T> extends ViewModifiers {\n title: string;\n systemImage?: string;\n role?: 'search';\n tag?: T;\n children?: ReactNode;\n}\n\n/** `Tab(\"Library\", systemImage: \"books.vertical\") { }` */\nexport function Tab<T>(props: TabProps<T>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const badge = takeModifier(modifiers, 'badge');\n const tabProps: Record<string, unknown> = { title: own.title, systemImage: own.systemImage ?? null };\n if (badge !== undefined && badge !== null) tabProps['badge'] = String(badge);\n if (own.role) tabProps['role'] = own.role;\n return applyModifiers(sb('tab', tabProps, undefined, own.children), modifiers);\n}\n","import type { ShapeKind, Stroke } from '@swiftbrowser/web/src/protocol';\nimport { useState, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ShapeSpec, type ViewModifiers } from '../modifiers';\nimport { Path, type CGRect } from '../path';\nimport { ColorValues, color, shapeStyle, type ColorValue, type StyleValue } from '../values';\n\nexport interface StrokeSpec {\n style?: StyleValue;\n lineWidth?: number;\n dash?: number[];\n dashPhase?: number;\n lineCap?: 'butt' | 'round' | 'square';\n lineJoin?: 'miter' | 'round' | 'bevel';\n miterLimit?: number;\n}\n\nexport type StrokeValue = StyleValue | StrokeSpec;\n\nexport interface ShapeProps extends ViewModifiers {\n /** `.fill(_:)`; without a fill or stroke the shape draws in the foreground color. */\n fill?: StyleValue;\n /** `.stroke(_:lineWidth:)` */\n stroke?: StrokeValue;\n /** `.strokeBorder(_:style:)`: the stroke inside the bounds. */\n strokeBorder?: StrokeValue;\n trim?: { from: number; to: number };\n}\n\nconst STYLE_KEYS = ['r', 'name', 'named', 'hierarchical', 'linearGradient', 'radialGradient', 'angularGradient', 'colorGradient', 'material'];\n\nfunction strokeOf(value: StrokeValue | undefined, inset: boolean): Stroke | null {\n if (value === undefined) return null;\n const isSpec = typeof value === 'object' && value !== null && !STYLE_KEYS.some((key) => key in value);\n const spec: StrokeSpec = isSpec ? (value as StrokeSpec) : { style: value as StyleValue };\n const stroke: Stroke = { color: shapeStyle(spec.style ?? 'primary'), lineWidth: spec.lineWidth ?? 1 };\n if (inset) stroke.inset = true;\n if (spec.dash) stroke.dash = spec.dash;\n if (spec.dashPhase !== undefined) stroke.dashPhase = spec.dashPhase;\n if (spec.lineCap) stroke.lineCap = spec.lineCap;\n if (spec.lineJoin) stroke.lineJoin = spec.lineJoin;\n if (spec.miterLimit !== undefined) stroke.miterLimit = spec.miterLimit;\n return stroke;\n}\n\nfunction shape(kind: ShapeKind, cornerRadius: number, props: ShapeProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const shapeProps: Record<string, unknown> = {\n shape: kind,\n cornerRadius,\n fill: own.fill !== undefined ? shapeStyle(own.fill) : null,\n stroke: strokeOf(own.strokeBorder, true) ?? strokeOf(own.stroke, false),\n };\n if (own.trim) shapeProps['trim'] = own.trim;\n return applyModifiers(sb('shape', shapeProps), modifiers);\n}\n\n/** Capsules, circles and ellipses carry this radius, like the shim. */\nconst ROUND = 9999;\n\nexport function Rectangle(props: ShapeProps): ReactNode {\n return shape('rectangle', 0, props);\n}\nRectangle.shape = { kind: 'rectangle', cornerRadius: 0 } satisfies ShapeSpec;\n\nexport interface RoundedRectangleProps extends ShapeProps {\n cornerRadius: number;\n}\n\nexport function RoundedRectangle(props: RoundedRectangleProps): ReactNode {\n const { cornerRadius, ...rest } = props;\n return shape('roundedRectangle', cornerRadius, rest);\n}\nRoundedRectangle.shape = { kind: 'roundedRectangle', cornerRadius: null } satisfies ShapeSpec;\n\nexport function Circle(props: ShapeProps): ReactNode {\n return shape('circle', ROUND, props);\n}\nCircle.shape = { kind: 'circle', cornerRadius: ROUND } satisfies ShapeSpec;\n\nexport function Capsule(props: ShapeProps): ReactNode {\n return shape('capsule', ROUND, props);\n}\nCapsule.shape = { kind: 'capsule', cornerRadius: ROUND } satisfies ShapeSpec;\n\nexport function Ellipse(props: ShapeProps): ReactNode {\n return shape('ellipse', ROUND, props);\n}\nEllipse.shape = { kind: 'ellipse', cornerRadius: ROUND } satisfies ShapeSpec;\n\nexport interface ContainerRelativeShapeProps extends ShapeProps {\n /** The container's corner radius (a widget's, a card's). */\n cornerRadius?: number;\n}\n\n/** `ContainerRelativeShape`: a rounded rectangle with its container's corners. */\nexport function ContainerRelativeShape(props: ContainerRelativeShapeProps): ReactNode {\n const { cornerRadius, ...rest } = props;\n return shape('containerRelative', cornerRadius ?? 0, rest);\n}\nContainerRelativeShape.shape = { kind: 'containerRelative', cornerRadius: null } satisfies ShapeSpec;\n\n// ---------------------------------------------------------------------------\n// Custom shapes\n// ---------------------------------------------------------------------------\n\nexport interface CustomShapeProps extends Omit<ShapeProps, 'trim'> {\n /** `path(in:)`: the shape's path for a rectangle of the size it is laid out at. */\n path: (rect: CGRect) => Path;\n /** `FillStyle(eoFill: true)` */\n evenOdd?: boolean;\n}\n\n/**\n * A custom `Shape`: the element reports its laid-out size, and the shape\n * draws `path(in:)` for that size, as the Swift shim does.\n */\nexport function Shape(props: CustomShapeProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [size, setSize] = useState<{ width: number; height: number } | null>(null);\n const shapeProps: Record<string, unknown> = {\n shape: 'path',\n cornerRadius: 0,\n fill: own.fill !== undefined ? shapeStyle(own.fill) : null,\n // A custom shape's border is its path stroked as is (the shim insets an InsettableShape first).\n stroke: strokeOf(own.strokeBorder ?? own.stroke, false),\n reportsSize: true,\n path: size ? own.path({ x: 0, y: 0, width: size.width, height: size.height }).svg() : '',\n size: size ?? { width: 0, height: 0 },\n };\n if (own.evenOdd) shapeProps['fillRule'] = 'evenodd';\n return applyModifiers(\n sb('shape', shapeProps, {\n geometry: (event) => {\n if (!size || size.width !== event.width || size.height !== event.height) setSize({ width: event.width, height: event.height });\n },\n }),\n modifiers,\n );\n}\n\nexport interface UnevenRoundedRectangleProps extends ShapeProps {\n topLeadingRadius?: number;\n bottomLeadingRadius?: number;\n bottomTrailingRadius?: number;\n topTrailingRadius?: number;\n}\n\n/** `UnevenRoundedRectangle`: a custom shape with a radius per corner. */\nexport function UnevenRoundedRectangle(props: UnevenRoundedRectangleProps): ReactNode {\n const { topLeadingRadius = 0, bottomLeadingRadius = 0, bottomTrailingRadius = 0, topTrailingRadius = 0, trim: _trim, ...rest } = props;\n const path = (rect: CGRect): Path => {\n const clamp = (radius: number): number => Math.max(0, Math.min(radius, rect.width / 2, rect.height / 2));\n const tl = clamp(topLeadingRadius);\n const tr = clamp(topTrailingRadius);\n const br = clamp(bottomTrailingRadius);\n const bl = clamp(bottomLeadingRadius);\n const { width: w, height: h } = rect;\n const p = new Path().move({ x: tl, y: 0 }).addLine({ x: w - tr, y: 0 });\n if (tr) p.addArc({ x: w - tr, y: tr }, tr, -90, 0, false);\n p.addLine({ x: w, y: h - br });\n if (br) p.addArc({ x: w - br, y: h - br }, br, 0, 90, false);\n p.addLine({ x: bl, y: h });\n if (bl) p.addArc({ x: bl, y: h - bl }, bl, 90, 180, false);\n p.addLine({ x: 0, y: tl });\n if (tl) p.addArc({ x: tl, y: tl }, tl, 180, 270, false);\n return p.closeSubpath();\n };\n return <Shape {...rest} path={path} />;\n}\n\n// ---------------------------------------------------------------------------\n// Color as a view\n// ---------------------------------------------------------------------------\n\nexport interface ColorViewProps extends ViewModifiers {\n color: ColorValue;\n}\n\n/** `Color.red` as a view: a box of the color that fills its proposal. */\nfunction ColorView(props: ColorViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('color', { color: color(own.color) }), modifiers);\n}\n\n/**\n * `Color`: as a view, `<Color color=\"red\" />`; as values, `Color.red`,\n * `Color.opacity('black', 0.2)`, `Color.gradient('teal')`, `Color.hex('#336699')`.\n */\nexport const Color: typeof ColorView & typeof ColorValues = Object.assign(ColorView, ColorValues);\n","/**\n * `Host`: ordinary React DOM inside a SwiftUI tree. The children render in a\n * react-dom root of their own, inside a `host` element the layout engine\n * sizes (docs/ops-protocol.md, \"Host elements\"): by its content, like text,\n * or filling its proposal. The DOM content sees this package's contexts\n * (`useDismiss`, `useNavigation`, the environment) and any it names.\n */\n\nimport { notifyHostContentChange, registerHostContent, unregisterHostContent } from '@swiftbrowser/web/src/hostContent';\nimport { useEffect, useId, useLayoutEffect, useRef, useState, type CSSProperties, type Context, type ReactNode } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { flushSync } from 'react-dom';\nimport { useContextBridge } from '../bridge';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\n\nexport interface HostProps extends ViewModifiers {\n /**\n * `content` (the default): the box is as wide as the content wants, at most\n * the proposed width, and as tall as the content at that width. `fill`:\n * the box takes the proposal (combine with `frame`); the content fills it.\n */\n sizing?: 'fill' | 'content';\n /** Contexts of the SwiftUI tree the DOM content reads (this package's own always cross). */\n contexts?: readonly Context<unknown>[];\n className?: string;\n style?: CSSProperties;\n children?: ReactNode;\n}\n\nexport function Host(props: HostProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const key = useId();\n // The content element, one per mount. It is registered from the effects\n // below, not here: StrictMode runs this initializer twice and keeps one\n // result, and a registration made here would name the other.\n const [content] = useState<HTMLElement | null>(() => {\n if (typeof document === 'undefined') return null;\n const element = document.createElement('div');\n element.className = 'sb-host-content';\n return element;\n });\n const bridge = useContextBridge(own.contexts);\n const root = useRef<Root | null>(null);\n const mounted = useRef(false);\n // In `fill` sizing the wrapper is as tall as the box, so percentage\n // heights in the content (`height: 100%`) reach it.\n const sizing = own.sizing ?? 'content';\n const style: CSSProperties | undefined = sizing === 'fill' ? { height: '100%', ...own.style } : own.style;\n const tree = bridge(\n <div className={own.className} style={style}>\n {own.children}\n </div>,\n );\n\n useLayoutEffect(() => {\n if (!content) return;\n mounted.current = true;\n // After the commit that created the `host` element: the renderer adopts a\n // content registered late at the change notice below. Registered again\n // after StrictMode's simulated unmount, which unregistered it.\n registerHostContent(key, content);\n root.current ??= createRoot(content);\n const current = root.current;\n // In a microtask: still before the browser paints, but outside any commit\n // react-dom may be in the middle of (a `SwiftUIView` is one of its\n // components). The synchronous render lets the engine measure the new\n // content right away, and the tree is laid out again around it.\n queueMicrotask(() => {\n if (root.current !== current) return;\n flushSync(() => current.render(tree));\n notifyHostContentChange(key);\n });\n });\n\n useEffect(\n () => () => {\n mounted.current = false;\n unregisterHostContent(key);\n // Not inside the SwiftUI root's commit; and not at all when the host\n // mounted again meanwhile (StrictMode's simulated remount keeps the root).\n queueMicrotask(() => {\n if (mounted.current) return;\n const current = root.current;\n root.current = null;\n current?.unmount();\n });\n },\n [key],\n );\n\n return applyModifiers(sb('host', { content: key, sizing }), modifiers);\n}\n","import { Fragment, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { Button } from './controls';\nimport { Text } from './text';\n\nexport interface MenuProps extends ViewModifiers {\n /** The label: a title, or any view. */\n title?: string;\n label?: ReactNode;\n /** The items: buttons, pickers, dividers, sections, texts, nested menus. */\n children?: ReactNode;\n}\n\n/** `Menu(\"Sort\") { … }`: the label opens a popover of the items. */\nexport function Menu(props: MenuProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const label = own.title !== undefined ? <Text>{own.title}</Text> : own.label;\n return applyModifiers(\n sb('menu', {}, undefined, [\n <Fragment key=\"label\">{sb('zstack', { alignment: 'center' }, undefined, label)}</Fragment>,\n <Fragment key=\"items\">{own.children}</Fragment>,\n ]),\n modifiers,\n );\n}\n\nexport interface EditButtonProps extends ViewModifiers {\n /** The list's edit mode (`List editing={…}`). */\n editMode: BindingValue<boolean>;\n onChange?: (editing: boolean) => void;\n}\n\n/** `EditButton()`: \"Edit\" / \"Done\", flipping the edit mode it is given. */\nexport function EditButton(props: EditButtonProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [editing, setEditing] = readBinding(own.editMode, own.onChange);\n return applyModifiers(<Button title={editing ? 'Done' : 'Edit'} action={() => setEditing(!editing)} />, modifiers);\n}\n","import { useEffect, useState, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\n\nexport interface AsyncImageProps extends ViewModifiers {\n url: string;\n /** `.resizable()` on the loaded image. */\n resizable?: boolean;\n /** Shown until the image loaded (nothing by default). */\n placeholder?: ReactNode;\n /** Shown when the image failed to load (the placeholder by default). */\n failure?: ReactNode;\n}\n\ninterface Loaded {\n url: string;\n width: number;\n height: number;\n}\n\nconst loaded = new Map<string, Loaded | 'failed'>();\n\n/**\n * `AsyncImage(url:)`: the page loads the image to learn its size (the\n * engine lays a remote image out by its pixel size, as the Swift core does\n * after its `image` request), then shows it.\n */\nexport function AsyncImage(props: AsyncImageProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [state, setState] = useState<Loaded | 'failed' | null>(() => loaded.get(own.url) ?? null);\n useEffect(() => {\n const cached = loaded.get(own.url);\n if (cached) {\n setState(cached);\n return;\n }\n if (typeof Image === 'undefined') return;\n let live = true;\n const image = new Image();\n image.onload = () => {\n const result: Loaded = { url: own.url, width: image.naturalWidth, height: image.naturalHeight };\n loaded.set(own.url, result);\n if (live) setState(result);\n };\n image.onerror = () => {\n loaded.set(own.url, 'failed');\n if (live) setState('failed');\n };\n image.src = own.url;\n return () => {\n live = false;\n };\n }, [own.url]);\n if (state === null) return own.placeholder ?? null;\n if (state === 'failed') return own.failure ?? own.placeholder ?? null;\n return applyModifiers(\n sb('image', { url: state.url, resizable: own.resizable ?? false, width: state.width, height: state.height }),\n modifiers,\n );\n}\n","/**\n * Swift Charts: `Chart` with bar, line, area, point and rule marks. The\n * marks are declarations; `Chart` reads them, builds the scales (bands for\n * categories, \"nice\" numeric domains, calendar strides for dates), turns\n * every value into the protocol's unit coordinates and emits one `chart`\n * element with its axes and legend, as Sources/SwiftUI/Charts does.\n */\n\nimport type {\n ChartAxis,\n ChartInterpolation,\n ChartLegend,\n ChartMark,\n ChartSymbol,\n FrameAlignment,\n ShapeStyle,\n} from '@swiftbrowser/web/src/protocol';\nimport { Fragment, type ReactElement, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { shapeStyle, type StyleValue } from '../values';\nimport { flattenChildren } from './stacks';\n\nexport type ChartValue = number | Date | string;\n\nexport interface AnnotationSpec {\n position?: 'top' | 'bottom' | 'leading' | 'trailing' | 'overlay';\n alignment?: FrameAlignment;\n spacing?: number;\n content: ReactNode;\n}\n\ninterface MarkCommon {\n foregroundStyle?: StyleValue;\n /** `.foregroundStyle(by:)`: a series name; the palette colors it and the legend lists it. */\n foregroundStyleBy?: string;\n opacity?: number;\n /** `.annotation(position:alignment:spacing:) { }` */\n annotation?: AnnotationSpec;\n}\n\nexport interface BarMarkProps extends MarkCommon {\n x: ChartValue;\n y: ChartValue;\n /** `yStart:` (0 by default). */\n yStart?: number;\n cornerRadius?: number;\n /** `width: .fixed(points)` */\n width?: number;\n}\nexport interface LineMarkProps extends MarkCommon {\n x: ChartValue;\n y: number;\n series?: string;\n interpolation?: ChartInterpolation;\n lineWidth?: number;\n symbol?: ChartSymbol;\n symbolSize?: number;\n}\nexport interface AreaMarkProps extends MarkCommon {\n x: ChartValue;\n y: number;\n yStart?: number;\n series?: string;\n interpolation?: ChartInterpolation;\n}\nexport interface PointMarkProps extends MarkCommon {\n x: ChartValue;\n y: number;\n symbol?: ChartSymbol;\n symbolSize?: number;\n}\nexport interface RuleMarkProps extends MarkCommon {\n /** A vertical rule at `x`, or a horizontal one at `y`. */\n x?: ChartValue;\n y?: number;\n xStart?: ChartValue;\n xEnd?: ChartValue;\n yStart?: number;\n yEnd?: number;\n lineWidth?: number;\n}\n\n/** The marks render nothing themselves; `Chart` reads them. */\nexport function BarMark(_props: BarMarkProps): null {\n return null;\n}\nexport function LineMark(_props: LineMarkProps): null {\n return null;\n}\nexport function AreaMark(_props: AreaMarkProps): null {\n return null;\n}\nexport function PointMark(_props: PointMarkProps): null {\n return null;\n}\nexport function RuleMark(_props: RuleMarkProps): null {\n return null;\n}\n\nexport interface ChartProps extends ViewModifiers {\n /** `.chartXAxis(.hidden)` is `null`; the position otherwise. */\n xAxis?: 'bottom' | 'top' | null;\n yAxis?: 'trailing' | 'leading' | null;\n /** `.chartLegend`: the position, or `null` to hide it. Shown at the top when a series exists. */\n legend?: 'top' | 'bottom' | 'leading' | 'trailing' | null;\n /** `.chartXScale(domain:)`: numbers, dates or the categories in order. */\n xScale?: { domain?: readonly [ChartValue, ChartValue] | readonly string[] };\n /** `.chartYScale(domain:)`; `includesZero` is true by default, as in Swift Charts. */\n yScale?: { domain?: readonly [number, number]; includesZero?: boolean };\n children?: ReactNode;\n}\n\nconst PALETTE = ['blue', 'green', 'orange', 'purple', 'red', 'teal', 'yellow', 'pink', 'indigo', 'mint', 'cyan', 'brown'] as const;\nconst SYMBOLS: ChartSymbol[] = ['circle', 'square', 'triangle', 'diamond', 'cross', 'plus', 'asterisk'];\n\ntype MarkKind = 'bar' | 'line' | 'area' | 'point' | 'rule';\ninterface Declared {\n kind: MarkKind;\n props: BarMarkProps & LineMarkProps & AreaMarkProps & PointMarkProps & RuleMarkProps;\n}\n\nfunction declaredMarks(children: ReactNode): Declared[] {\n const kinds = new Map<unknown, MarkKind>([\n [BarMark, 'bar'],\n [LineMark, 'line'],\n [AreaMark, 'area'],\n [PointMark, 'point'],\n [RuleMark, 'rule'],\n ]);\n const result: Declared[] = [];\n for (const element of flattenChildren(children)) {\n const kind = kinds.get(element.type);\n if (kind) result.push({ kind, props: element.props as Declared['props'] });\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Scales\n// ---------------------------------------------------------------------------\n\ninterface Scale {\n /** Unit position of a value along the axis (0 → 1 left to right / bottom to top). */\n unit(value: ChartValue): number;\n /** The band of a category, or the band around a continuous center. */\n band(value: ChartValue): [number, number];\n ticks: number[];\n gridLines: number[];\n labels: { at: number; text: string; anchor?: 'leading' }[];\n domain: [number, number];\n kind: 'band' | 'number' | 'time';\n}\n\nconst asNumber = (value: ChartValue): number => (value instanceof Date ? value.getTime() : typeof value === 'number' ? value : NaN);\n\nfunction bandScale(categories: string[]): Scale {\n const n = Math.max(categories.length, 1);\n const index = new Map(categories.map((c, i) => [c, i]));\n const center = (value: ChartValue): number => ((index.get(String(value)) ?? 0) + 0.5) / n;\n return {\n kind: 'band',\n unit: center,\n band: (value) => {\n const i = index.get(String(value)) ?? 0;\n return [i / n, (i + 1) / n];\n },\n ticks: categories.map((_, i) => (i + 0.5) / n),\n gridLines: [],\n labels: categories.map((text, i) => ({ at: (i + 0.5) / n, text })),\n domain: [0, n],\n };\n}\n\n/** Steps of 1, 2, 2.5, 5 × 10ᵏ, the one nearest `span / (desired − 1)`. */\nexport function niceStep(span: number, desired = 5): number {\n if (!(span > 0)) return 1;\n const raw = span / Math.max(desired - 1, 1);\n const magnitude = 10 ** Math.floor(Math.log10(raw));\n let best = magnitude;\n // A tie goes to the larger step (fewer ticks).\n for (const candidate of [1, 2, 2.5, 5, 10].map((m) => m * magnitude)) {\n if (Math.abs(candidate - raw) <= Math.abs(best - raw)) best = candidate;\n }\n return best;\n}\n\nfunction decimalsOf(step: number): number {\n const text = step.toString();\n const dot = text.indexOf('.');\n return dot < 0 ? 0 : text.length - dot - 1;\n}\n\nfunction numberScale(values: number[], options: { includesZero?: boolean; domain?: readonly [number, number] } = {}): Scale {\n let min = Math.min(...values);\n let max = Math.max(...values);\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n min = 0;\n max = 1;\n }\n if (options.includesZero) {\n min = Math.min(min, 0);\n max = Math.max(max, 0);\n }\n if (min === max) {\n if (min === 0) max = 1;\n else {\n min = Math.min(min, 0);\n max = Math.max(max, 0);\n if (min === max) max = min + 1;\n }\n }\n const step = niceStep(max - min);\n let lo: number;\n let hi: number;\n if (options.domain) [lo, hi] = options.domain;\n else {\n lo = Math.floor(min / step + 1e-9) * step;\n hi = Math.ceil(max / step - 1e-9) * step;\n }\n const ticks: number[] = [];\n const first = Math.ceil(lo / step - 1e-9) * step;\n for (let value = first; value <= hi + 1e-9; value += step) ticks.push(Number(value.toFixed(10)));\n const decimals = decimalsOf(step);\n const unit = (value: ChartValue): number => (asNumber(value) - lo) / (hi - lo || 1);\n const format = new Intl.NumberFormat('en-US', { maximumFractionDigits: decimals });\n return {\n kind: 'number',\n unit,\n band: (value) => [unit(value), unit(value)],\n ticks: ticks.map(unit),\n gridLines: ticks.map(unit),\n labels: ticks.map((value) => ({ at: unit(value), text: format.format(value) })),\n domain: [lo, hi],\n };\n}\n\nconst HOUR = 3_600_000;\nconst DAY = 24 * HOUR;\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/** Calendar ticks in UTC, with the stride that gives at most `desired + 1` intervals. */\nexport function timeTicks(min: number, max: number, desired = 8): { ticks: number[]; format: (ms: number) => string } {\n const span = Math.max(max - min, 1);\n const pick = (strides: number[], unit: number): number => strides.find((s) => span / (s * unit) <= desired + 1) ?? strides[strides.length - 1]!;\n const ticks: number[] = [];\n if (span <= 3 * DAY) {\n const hours = pick([1, 3, 6, 12], HOUR);\n const start = Math.floor(min / (hours * HOUR)) * hours * HOUR;\n for (let t = start; t <= max; t += hours * HOUR) if (t >= min) ticks.push(t);\n return {\n ticks,\n format: (ms) => {\n const h = new Date(ms).getUTCHours();\n const minute = new Date(ms).getUTCMinutes();\n const suffix = h < 12 ? 'AM' : 'PM';\n const hour12 = h % 12 === 0 ? 12 : h % 12;\n return minute === 0 ? `${hour12} ${suffix}` : `${hour12}:${String(minute).padStart(2, '0')} ${suffix}`;\n },\n };\n }\n if (span <= 45 * DAY) {\n const days = pick([1, 2, 7, 14], DAY);\n const start = Math.floor(min / DAY) * DAY;\n for (let t = start; t <= max; t += days * DAY) if (t >= min) ticks.push(t);\n return { ticks, format: (ms) => `${MONTHS[new Date(ms).getUTCMonth()]} ${new Date(ms).getUTCDate()}` };\n }\n const months = span / (30.4 * DAY);\n if (months <= 6 * (desired + 1)) {\n const stride = pick([1, 2, 3, 6], 30.4 * DAY);\n const first = new Date(min);\n let year = first.getUTCFullYear();\n let month = Math.floor(first.getUTCMonth() / stride) * stride;\n for (;;) {\n const t = Date.UTC(year, month, 1);\n if (t > max) break;\n if (t >= min) ticks.push(t);\n month += stride;\n if (month >= 12) {\n month -= 12;\n year += 1;\n }\n }\n const years = new Set(ticks.map((t) => new Date(t).getUTCFullYear()));\n return {\n ticks,\n format: (ms) => {\n const d = new Date(ms);\n return years.size > 1 ? `${MONTHS[d.getUTCMonth()]} ${d.getUTCFullYear()}` : MONTHS[d.getUTCMonth()]!;\n },\n };\n }\n const stride = pick([1, 2, 5, 10], 365.25 * DAY);\n const startYear = Math.floor(new Date(min).getUTCFullYear() / stride) * stride;\n for (let year = startYear; ; year += stride) {\n const t = Date.UTC(year, 0, 1);\n if (t > max) break;\n if (t >= min) ticks.push(t);\n }\n return { ticks, format: (ms) => String(new Date(ms).getUTCFullYear()) };\n}\n\nfunction timeScale(values: number[], domain?: readonly [ChartValue, ChartValue]): Scale {\n let lo = domain ? asNumber(domain[0]) : Math.min(...values);\n let hi = domain ? asNumber(domain[1]) : Math.max(...values);\n if (!Number.isFinite(lo) || !Number.isFinite(hi)) {\n lo = 0;\n hi = DAY;\n }\n if (lo === hi) hi = lo + DAY;\n const { ticks, format } = timeTicks(lo, hi);\n const unit = (value: ChartValue): number => (asNumber(value) - lo) / (hi - lo);\n return {\n kind: 'time',\n unit,\n band: (value) => [unit(value), unit(value)],\n ticks: ticks.map(unit),\n gridLines: ticks.map(unit),\n labels: ticks.map((t) => ({ at: unit(t), text: format(t), anchor: 'leading' as const })),\n domain: [lo, hi],\n };\n}\n\nfunction scaleFor(values: ChartValue[], options: { includesZero?: boolean; domain?: ChartProps['xScale'] extends infer S ? (S extends { domain?: infer D } ? D : never) : never }): Scale {\n const domain = options.domain;\n if (domain && domain.length > 2) return bandScale([...(domain as readonly string[])]);\n if (domain && domain.length === 2 && typeof domain[0] === 'string') return bandScale([...(domain as readonly string[])]);\n if (values.some((v) => typeof v === 'string')) {\n const categories: string[] = [];\n for (const v of values) if (!categories.includes(String(v))) categories.push(String(v));\n return bandScale(categories);\n }\n if (values.some((v) => v instanceof Date)) return timeScale(values.map(asNumber), domain as readonly [ChartValue, ChartValue] | undefined);\n return numberScale(values.map(asNumber), { includesZero: options.includesZero, domain: domain as readonly [number, number] | undefined });\n}\n\n// ---------------------------------------------------------------------------\n// Chart\n// ---------------------------------------------------------------------------\n\nexport function Chart(props: ChartProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const marks = declaredMarks(own.children);\n\n // Series, in first-seen order, colored from the palette.\n const series: string[] = [];\n for (const mark of marks) {\n const key = mark.props.foregroundStyleBy;\n if (key !== undefined && !series.includes(key)) series.push(key);\n }\n const styleOf = (mark: Declared): ShapeStyle => {\n if (mark.props.foregroundStyle !== undefined) return shapeStyle(mark.props.foregroundStyle);\n const key = mark.props.foregroundStyleBy;\n if (key !== undefined) return { name: PALETTE[series.indexOf(key) % PALETTE.length]! };\n return { name: 'blue' };\n };\n\n // Scales from every value a mark touches.\n const xValues: ChartValue[] = [];\n const yValues: ChartValue[] = [];\n for (const { kind, props: p } of marks) {\n if (p.x !== undefined) xValues.push(p.x);\n if (p.xStart !== undefined) xValues.push(p.xStart);\n if (p.xEnd !== undefined) xValues.push(p.xEnd);\n if (p.y !== undefined) yValues.push(p.y);\n if (p.yStart !== undefined) yValues.push(p.yStart);\n if (p.yEnd !== undefined) yValues.push(p.yEnd);\n if (kind === 'bar' || kind === 'area') yValues.push(p.yStart ?? 0);\n }\n const xScale = scaleFor(xValues, { domain: own.xScale?.domain });\n const yScale = scaleFor(yValues, { includesZero: own.yScale?.includesZero ?? true, domain: own.yScale?.domain });\n // Unit coordinates, rounded so equal values compare equal.\n const round = (n: number): number => Math.round(n * 1e6) / 1e6;\n const ux = (v: ChartValue): number => round(xScale.unit(v));\n const uy = (v: ChartValue): number => round(1 - yScale.unit(v));\n\n // Bars on a continuous x axis: the band is the smallest gap between centers.\n let continuousBand = 1;\n if (xScale.kind !== 'band') {\n const centers = [...new Set(marks.filter((m) => m.kind === 'bar').map((m) => ux(m.props.x)))].sort((a, b) => a - b);\n for (let i = 1; i < centers.length; i++) continuousBand = Math.min(continuousBand, centers[i]! - centers[i - 1]!);\n }\n\n const encoded: ChartMark[] = [];\n const items: ReactElement[] = [];\n const annotate = (mark: Declared, rect: { x0: number; x1: number; y0: number; y1: number }): void => {\n const annotation = mark.props.annotation;\n if (!annotation) return;\n items.push(\n <Fragment key={items.length}>\n {sb(\n 'chartitem',\n {\n role: 'annotation',\n ...rect,\n position: annotation.position ?? 'top',\n alignment: annotation.alignment ?? 'center',\n spacing: annotation.spacing ?? 4,\n },\n undefined,\n annotation.content,\n )}\n </Fragment>,\n );\n };\n const common = (mark: Declared): { style: ShapeStyle; opacity?: number } => {\n const base: { style: ShapeStyle; opacity?: number } = { style: styleOf(mark) };\n if (mark.props.opacity !== undefined) base.opacity = mark.props.opacity;\n return base;\n };\n\n // Lines and areas group by series key, in first-seen order, points in x order.\n const groups = new Map<string, Declared[]>();\n for (const mark of marks) {\n if (mark.kind !== 'line' && mark.kind !== 'area') continue;\n const key = `${mark.kind}:${mark.props.series ?? mark.props.foregroundStyleBy ?? ''}`;\n const group = groups.get(key);\n if (group) group.push(mark);\n else groups.set(key, [mark]);\n }\n const emittedGroups = new Set<string>();\n\n for (const mark of marks) {\n const p = mark.props;\n switch (mark.kind) {\n case 'bar': {\n const style = common(mark);\n const [b0, b1] = xScale.kind === 'band' ? xScale.band(p.x) : [ux(p.x) - continuousBand / 2, ux(p.x) + continuousBand / 2];\n const center = round((b0 + b1) / 2);\n const half = round(((b1 - b0) * 0.8) / 2);\n const top = uy(Math.max(asNumber(p.y), p.yStart ?? 0));\n const bottom = uy(Math.min(asNumber(p.y), p.yStart ?? 0));\n const rect: ChartMark = {\n kind: 'rect',\n ...style,\n x0: p.width !== undefined ? center : round(center - half),\n x1: p.width !== undefined ? center : round(center + half),\n y0: top,\n y1: bottom,\n cornerRadius: p.cornerRadius ?? 0,\n fixedWidth: p.width ?? null,\n };\n encoded.push(rect);\n annotate(mark, { x0: rect.x0, x1: rect.x1, y0: top, y1: bottom });\n break;\n }\n case 'line':\n case 'area': {\n const key = `${mark.kind}:${p.series ?? p.foregroundStyleBy ?? ''}`;\n if (emittedGroups.has(key)) {\n annotate(mark, { x0: ux(p.x), x1: ux(p.x), y0: uy(p.y), y1: uy(p.y) });\n break;\n }\n emittedGroups.add(key);\n const group = [...groups.get(key)!].sort((a, b) => ux(a.props.x) - ux(b.props.x));\n const first = group[0]!;\n if (mark.kind === 'line') {\n const line: ChartMark = {\n kind: 'line',\n ...common(first),\n points: group.map((m) => ({ x: ux(m.props.x), y: uy(m.props.y) })),\n lineWidth: first.props.lineWidth ?? 2,\n interpolation: first.props.interpolation ?? 'linear',\n symbol: first.props.symbol ?? (first.props.foregroundStyleBy !== undefined && marks.some((m) => m.props.symbol) ? SYMBOLS[series.indexOf(first.props.foregroundStyleBy) % SYMBOLS.length]! : null),\n symbolSize: first.props.symbolSize ?? 8,\n };\n encoded.push(line);\n } else {\n const area: ChartMark = {\n kind: 'area',\n ...common(first),\n points: group.map((m) => ({\n x: ux(m.props.x),\n y0: uy(Math.max(m.props.y, m.props.yStart ?? 0)),\n y1: uy(Math.min(m.props.y, m.props.yStart ?? 0)),\n })),\n interpolation: first.props.interpolation ?? 'linear',\n };\n encoded.push(area);\n }\n annotate(mark, { x0: ux(p.x), x1: ux(p.x), y0: uy(p.y), y1: uy(p.y) });\n break;\n }\n case 'point': {\n const point: ChartMark = { kind: 'point', ...common(mark), x: ux(p.x), y: uy(p.y), symbol: p.symbol ?? 'circle', symbolSize: p.symbolSize ?? 8 };\n encoded.push(point);\n annotate(mark, { x0: point.x, x1: point.x, y0: point.y, y1: point.y });\n break;\n }\n case 'rule': {\n const vertical = p.x !== undefined;\n const rule: ChartMark = {\n kind: 'rule',\n ...common(mark),\n x0: vertical ? ux(p.x!) : p.xStart !== undefined ? ux(p.xStart) : 0,\n x1: vertical ? ux(p.x!) : p.xEnd !== undefined ? ux(p.xEnd) : 1,\n y0: vertical ? (p.yEnd !== undefined ? uy(p.yEnd) : 0) : uy(p.y ?? 0),\n y1: vertical ? (p.yStart !== undefined ? uy(p.yStart) : 1) : uy(p.y ?? 0),\n lineWidth: p.lineWidth ?? 1,\n };\n encoded.push(rule);\n annotate(mark, { x0: rule.x0, x1: rule.x1, y0: rule.y0, y1: rule.y1 });\n break;\n }\n default:\n break;\n }\n }\n\n const axis = (scale: Scale, position: ChartAxis['position'], flipY: boolean): ChartAxis => {\n const flip = (u: number): number => round(flipY ? 1 - u : u);\n return {\n position,\n gridLines: scale.gridLines.map(flip),\n ticks: scale.ticks.map(flip),\n labels: scale.labels.map((label) => ({ ...label, at: flip(label.at) })),\n };\n };\n const chartProps = {\n marks: encoded,\n xAxis: own.xAxis === null ? null : axis(xScale, own.xAxis ?? 'bottom', false),\n yAxis: own.yAxis === null ? null : axis(yScale, own.yAxis ?? 'trailing', true),\n legend:\n own.legend === null || series.length === 0\n ? null\n : ({\n position: own.legend ?? 'top',\n items: series.map((label, index) => ({ label, style: { name: PALETTE[index % PALETTE.length]! }, symbol: null })),\n } satisfies ChartLegend),\n };\n return applyModifiers(sb('chart', chartProps, undefined, items.length ? items : undefined), modifiers);\n}\n","/**\n * Gauges, `ViewThatFits`, lazy stacks, and the composite containers the\n * shim builds from other views: `ContentUnavailableView`, `GroupBox`,\n * `ControlGroup`, `DisclosureGroup`.\n */\n\nimport type { GaugeStyle, HStackAlignment, VStackAlignment } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, useState, type ReactNode } from 'react';\nimport { LazyContext } from '../lazy';\nimport { readBinding, type BindingValue } from '../binding';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, styled, type ViewModifiers } from '../modifiers';\nimport { withAnimation } from '../host/root';\nimport { Button } from './controls';\nimport { RoundedRectangle } from './shapes';\nimport { HStack, Spacer, VStack } from './stacks';\nimport { Image, Text } from './text';\n\n// ---------------------------------------------------------------------------\n// Gauge\n// ---------------------------------------------------------------------------\n\nexport interface GaugeProps extends ViewModifiers {\n value: number;\n /** `in: 0...1` */\n range?: readonly [number, number];\n label?: ReactNode;\n currentValueLabel?: ReactNode;\n gaugeStyle?: Exclude<GaugeStyle, 'progress'>;\n}\n\n/** `Gauge(value:in:) { label } currentValueLabel: { }` */\nexport function Gauge(props: GaugeProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [min, max] = own.range ?? [0, 1];\n const value = (own.value - min) / (max - min || 1);\n const children: ReactNode[] = [];\n const asView = (node: ReactNode): ReactNode => (typeof node === 'string' || typeof node === 'number' ? <Text>{node}</Text> : node);\n if (own.label !== undefined) children.push(<Fragment key=\"label\">{asView(own.label)}</Fragment>);\n if (own.currentValueLabel !== undefined) children.push(<Fragment key=\"current\">{asView(own.currentValueLabel)}</Fragment>);\n return applyModifiers(\n sb(\n 'gauge',\n {\n value: Math.min(1, Math.max(0, value)),\n style: own.gaugeStyle ?? 'automatic',\n hasLabel: own.label !== undefined,\n hasCurrentValueLabel: own.currentValueLabel !== undefined,\n },\n undefined,\n children.length ? children : undefined,\n ),\n modifiers,\n );\n}\n\n// ---------------------------------------------------------------------------\n// ViewThatFits\n// ---------------------------------------------------------------------------\n\nexport interface ViewThatFitsProps extends ViewModifiers {\n /** The axes a candidate must fit on (`in:`); both by default. */\n axes?: 'horizontal' | 'vertical' | 'both';\n /** The candidates, preferred first. */\n children?: ReactNode;\n}\n\n/** `ViewThatFits`: the first child whose ideal size fits, else the last. */\nexport function ViewThatFits(props: ViewThatFitsProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n return applyModifiers(sb('viewthatfits', { axes: own.axes ?? 'both' }, undefined, own.children), modifiers);\n}\n\n// ---------------------------------------------------------------------------\n// Lazy stacks\n// ---------------------------------------------------------------------------\n\n\nexport interface LazyVStackProps extends ViewModifiers {\n alignment?: VStackAlignment;\n spacing?: number | null;\n /** `.scrollTargetLayout()`: the children are the scroll view's snap points. */\n scrollTargetLayout?: boolean;\n children?: ReactNode;\n}\n\n/** `LazyVStack`: a `VStack` whose long `ForEach`es build their rows as they scroll into view. */\nexport function LazyVStack(props: LazyVStackProps): ReactNode {\n return (\n <LazyContext.Provider value=\"vertical\">\n <VStack {...props} />\n </LazyContext.Provider>\n );\n}\n\nexport interface LazyHStackProps extends ViewModifiers {\n alignment?: HStackAlignment;\n spacing?: number | null;\n scrollTargetLayout?: boolean;\n children?: ReactNode;\n}\n\nexport function LazyHStack(props: LazyHStackProps): ReactNode {\n return (\n <LazyContext.Provider value=\"horizontal\">\n <HStack {...props} />\n </LazyContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Composites\n// ---------------------------------------------------------------------------\n\nexport interface ContentUnavailableViewProps extends ViewModifiers {\n title: ReactNode;\n systemImage?: string;\n /** A string or a view. */\n description?: ReactNode;\n actions?: ReactNode;\n}\n\n/** `ContentUnavailableView(_:systemImage:description:)`: the empty state iOS shows, filling its space. */\nexport function ContentUnavailableView(props: ContentUnavailableViewProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const title = typeof own.title === 'string' ? <Text>{own.title}</Text> : own.title;\n const description = typeof own.description === 'string' ? <Text>{own.description}</Text> : own.description;\n return applyModifiers(\n <VStack spacing={16} padding={['horizontal', 32]} frame={{ maxWidth: Infinity, maxHeight: Infinity }}>\n <VStack spacing={8}>\n <VStack spacing={12}>\n {own.systemImage !== undefined && <Image systemName={own.systemImage} font={{ size: 48 }} foregroundStyle=\"secondary\" />}\n {styled({ multilineTextAlignment: 'center' }, styled({ font: { textStyle: 'title2', weight: 'bold' } }, title))}\n </VStack>\n {description !== undefined &&\n styled({ multilineTextAlignment: 'center' }, styled({ foreground: { hierarchical: 2 } }, styled({ font: { textStyle: 'callout' } }, description)))}\n </VStack>\n {own.actions}\n </VStack>,\n modifiers,\n );\n}\n\n/** `ContentUnavailableView.search(text:)` */\nContentUnavailableView.search = (text?: string): ReactNode => (\n <ContentUnavailableView\n title={text ? `No Results for “${text}”` : 'No Results'}\n systemImage=\"magnifyingglass\"\n description=\"Check the spelling or try a new search.\"\n />\n);\n\nexport interface GroupBoxProps extends ViewModifiers {\n label?: ReactNode;\n children?: ReactNode;\n}\n\n/** `GroupBox`: the label (headline) over the content, in a padded rounded box. */\nexport function GroupBox(props: GroupBoxProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const label = typeof own.label === 'string' ? <Text>{own.label}</Text> : own.label;\n return applyModifiers(\n <VStack\n alignment=\"leading\"\n spacing={8}\n padding={16}\n background={{ fill: 'secondarySystemBackground', in: <RoundedRectangle cornerRadius={8} /> }}\n >\n {label !== undefined && styled({ font: { textStyle: 'headline' } }, label)}\n {own.children}\n </VStack>,\n modifiers,\n );\n}\n\n/** `ControlGroup`: its controls, flowing in the enclosing stack (or items of their own in a menu). Its label is not drawn. */\nexport function ControlGroup(props: { label?: ReactNode; children?: ReactNode } & ViewModifiers): ReactNode {\n const { own, modifiers } = splitProps(props);\n return modifiers.length ? applyModifiers(<>{own.children}</>, modifiers) : own.children;\n}\n\nexport interface DisclosureGroupProps extends ViewModifiers {\n label: ReactNode;\n isExpanded?: BindingValue<boolean>;\n onExpandedChange?: (expanded: boolean) => void;\n children?: ReactNode;\n}\n\n/**\n * `DisclosureGroup`: a row with the label and a chevron that turns down as\n * the content opens below it, animated.\n */\nexport function DisclosureGroup(props: DisclosureGroupProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [internal, setInternal] = useState(false);\n const [expanded, setExpanded] = own.isExpanded !== undefined ? readBinding(own.isExpanded, own.onExpandedChange) : [internal, setInternal];\n const label = typeof own.label === 'string' ? <Text>{own.label}</Text> : own.label;\n const toggle = (): void => withAnimation({ type: 'easeInOut', duration: 0.25 }, () => setExpanded(!expanded));\n return applyModifiers(\n <VStack alignment=\"leading\" spacing={0}>\n <Button action={toggle} buttonStyle=\"plain\">\n <HStack>\n {styled({ foreground: { hierarchical: 1 } }, label)}\n <Spacer />\n <Image\n systemName=\"chevron.right\"\n font={{ textStyle: 'footnote', weight: 'semibold' }}\n foregroundStyle=\"tint\"\n rotationEffect={expanded ? 90 : 0}\n />\n </HStack>\n </Button>\n {expanded && (\n <VStack alignment=\"leading\" spacing={8} padding={['top', 8]} transition={{ kind: 'opacity' }}>\n {own.children}\n </VStack>\n )}\n </VStack>,\n modifiers,\n );\n}\n","/**\n * `Table`, drawn as iOS draws one: a list. In a compact width each row shows\n * the first column; in a regular width every column under a row of the\n * column titles, a sortable title a button with the sort's chevron.\n */\n\nimport { type Key, type ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { useHorizontalSizeClass } from '../environment';\nimport { applyModifiers, splitProps, styled, type ViewModifiers } from '../modifiers';\nimport { Button } from './controls';\nimport { List, type Selection } from './lists';\nimport { ForEach, HStack, VStack } from './stacks';\nimport { Image, Text } from './text';\n\nexport interface TableColumn<T> {\n title: string;\n /** The cell for a row; a function of the row, or a key whose value is shown as text. */\n content: ((row: T) => ReactNode) | keyof T;\n /** A fixed width; the other columns share the rest. */\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n /** A sortable column: the key its title sorts by (the app sorts the rows by `sortOrder`). */\n sortKey?: string;\n}\n\nexport interface SortDescriptor {\n key: string;\n ascending: boolean;\n}\n\nexport interface TableProps<T, K extends Key = Key> extends ViewModifiers {\n data: readonly T[];\n columns: readonly TableColumn<T>[];\n /** Each row's identity (its `id` property by default), what the selection holds. */\n id?: (row: T, index: number) => K;\n selection?: BindingValue<Set<K>> | BindingValue<K | null>;\n onSelectionChange?: (selection: Selection<K>) => void;\n /** The sort order, first descriptor first; tapping a sortable title puts it first or reverses it. */\n sortOrder?: BindingValue<readonly SortDescriptor[]>;\n}\n\nconst COLUMN_SPACING = 12;\n\nfunction cell<T>(column: TableColumn<T>, content: ReactNode): ReactNode {\n if (column.width !== undefined) return styled({ layoutPriority: 0 }, styled({ frame: { width: column.width, alignment: 'leading' } }, content));\n return styled(\n { layoutPriority: 0 },\n styled({ frame: { minWidth: column.minWidth ?? 0, maxWidth: column.maxWidth ?? 'infinity', alignment: 'leading' } }, content),\n );\n}\n\nfunction cellContent<T>(column: TableColumn<T>, row: T): ReactNode {\n if (typeof column.content === 'function') return column.content(row);\n return <Text>{String(row[column.content] ?? '')}</Text>;\n}\n\nexport function Table<T, K extends Key = Key>(props: TableProps<T, K>): ReactNode {\n const { own, modifiers } = splitProps(props);\n const compact = useHorizontalSizeClass() !== 'regular';\n const sort = own.sortOrder !== undefined ? readBinding(own.sortOrder) : null;\n const keyOf = (row: T, index: number): K => {\n if (own.id) return own.id(row, index);\n const id = (row as { id?: unknown }).id;\n return (typeof id === 'string' || typeof id === 'number' ? id : index) as K;\n };\n const row = (value: T): ReactNode => {\n const first = own.columns[0];\n if (!first) return null;\n if (compact) return cellContent(first, value);\n return (\n <HStack spacing={COLUMN_SPACING}>\n {own.columns.map((column, index) => (\n <ColumnCell key={index}>{cell(column, cellContent(column, value))}</ColumnCell>\n ))}\n </HStack>\n );\n };\n const title = (column: TableColumn<T>): ReactNode => {\n if (!sort || column.sortKey === undefined) return <Text>{column.title}</Text>;\n const [order, setOrder] = sort;\n const current = order[0]?.key === column.sortKey ? order[0] : null;\n const tap = (): void => {\n const rest = order.filter((descriptor) => descriptor.key !== column.sortKey);\n setOrder([{ key: column.sortKey!, ascending: current ? !current.ascending : true }, ...rest]);\n };\n return (\n <Button action={tap} buttonStyle=\"plain\">\n <HStack spacing={4}>\n <Text>{column.title}</Text>\n {current && <Image systemName={current.ascending ? 'chevron.up' : 'chevron.down'} font={{ textStyle: 'caption2', weight: 'bold' }} />}\n </HStack>\n </Button>\n );\n };\n const list = (\n <List<K> selection={own.selection as BindingValue<Set<K>>} onSelectionChange={own.onSelectionChange}>\n <ForEach data={own.data} id={keyOf}>\n {(value, index) => <TableRow tag={keyOf(value, index)}>{row(value)}</TableRow>}\n </ForEach>\n </List>\n );\n if (compact) return applyModifiers(list, modifiers);\n return applyModifiers(\n <VStack spacing={0}>\n <HStack\n spacing={COLUMN_SPACING}\n font={{ textStyle: 'subheadline', weight: 'semibold' }}\n foregroundStyle=\"secondary\"\n padding={['horizontal', 20]}\n modifiers={[{ padding: ['vertical', 8] }]}\n >\n {own.columns.map((column, index) => (\n <ColumnCell key={index}>{cell(column, title(column))}</ColumnCell>\n ))}\n </HStack>\n {list}\n </VStack>,\n modifiers,\n );\n}\n\nfunction ColumnCell({ children }: { children?: ReactNode }): ReactNode {\n return children;\n}\n\n/** A table row: its content, tagged for the list's selection. */\nfunction TableRow({ children }: { tag: Key; children?: ReactNode }): ReactNode {\n return children;\n}\n","/** `ColorPicker` and `ShareLink`: controls that open the browser's own chooser and share sheet. */\n\nimport { chooseColor } from '@swiftbrowser/web/src/colorPicker';\nimport { browserEnvironment, performHostRequest } from '@swiftbrowser/web/src/hostRequests';\nimport type { RGBAColor } from '@swiftbrowser/web/src/protocol';\nimport type { ReactNode } from 'react';\nimport { readBinding, type BindingValue } from '../binding';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\nimport { Color, Circle } from './shapes';\nimport { Button } from './controls';\nimport { HStack, Spacer } from './stacks';\nimport { Label, Text } from './text';\n\nexport interface ColorPickerProps extends ViewModifiers {\n title?: string;\n label?: ReactNode;\n selection: BindingValue<RGBAColor>;\n onChange?: (color: RGBAColor) => void;\n}\n\nconst hexOf = (c: RGBAColor): string =>\n '#' + [c.r, c.g, c.b].map((v) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')).join('');\n\n/** `ColorPicker(\"Tint\", selection:)`: the label and a swatch; tapping opens the browser's color chooser. */\nexport function ColorPicker(props: ColorPickerProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [selection, setSelection] = readBinding(own.selection, own.onChange);\n const label = own.label ?? (own.title !== undefined ? <Text>{own.title}</Text> : null);\n const pick = (): void => {\n chooseColor(hexOf(selection))\n .then((chosen) => {\n if (chosen) setSelection({ ...Color.hex(chosen), a: selection.a });\n })\n .catch((error: unknown) => console.error(error));\n };\n return applyModifiers(\n <Button action={pick} buttonStyle=\"plain\">\n <HStack>\n {label}\n <Spacer />\n <Circle\n fill={selection}\n frame={{ width: 28, height: 28 }}\n overlay={<Circle strokeBorder={{ style: Color.opacity('secondary', 0.3), lineWidth: 1 }} />}\n />\n </HStack>\n </Button>,\n modifiers,\n );\n}\n\nexport interface ShareLinkProps extends ViewModifiers {\n /** What is shared: a URL or text. */\n item: string | URL;\n subject?: string;\n message?: string;\n /** The label; \"Share\" with the share symbol by default. */\n title?: string;\n children?: ReactNode;\n}\n\n/** `ShareLink(item:)`: the Web Share API where the browser has it, else a download of the text. */\nexport function ShareLink(props: ShareLinkProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const share = (): void => {\n const isURL = own.item instanceof URL || /^[a-z][a-z0-9+.-]*:\\/\\//i.test(own.item);\n const params: Record<string, string> = {};\n if (own.subject) params['title'] = own.subject;\n if (isURL) params['url'] = String(own.item);\n const text = [own.message, isURL ? null : String(own.item)].filter(Boolean).join('\\n');\n if (text) params['text'] = text;\n // Within the tap, so the browser lets the share sheet open.\n performHostRequest({ op: 'request', id: 0, kind: 'share', params }, browserEnvironment).catch((error: unknown) => console.error(error));\n };\n return applyModifiers(\n <Button action={share}>{own.children ?? <Label title={own.title ?? 'Share'} systemImage=\"square.and.arrow.up\" />}</Button>,\n modifiers,\n );\n}\n","/**\n * `Canvas`: a `GeometryReader` whose content, at the reported size, is a\n * `canvas` element. The renderer function draws into a `GraphicsContext`\n * that records commands, as Sources/SwiftUI/API/Canvas.swift does; the page\n * draws them as SVG.\n */\n\nimport type { CanvasCommand, CanvasFilter, CanvasShading, CanvasState, Font, GradientStop } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, useState, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, styled, type ViewModifiers } from '../modifiers';\nimport type { Path, Point } from '../path';\nimport { color, font, shapeStyle, unitPoint, type ColorValue, type FontValue, type StyleValue, type UnitPointValue } from '../values';\n\ntype Matrix = [number, number, number, number, number, number];\nconst IDENTITY: Matrix = [1, 0, 0, 1, 0, 0];\n\nfunction multiply(m: Matrix, n: Matrix): Matrix {\n // Applies `n` first, then `m` (CGAffineTransform concatenation order).\n const [a, b, c, d, tx, ty] = m;\n const [a2, b2, c2, d2, tx2, ty2] = n;\n return [a2 * a + b2 * c, a2 * b + b2 * d, c2 * a + d2 * c, c2 * b + d2 * d, tx2 * a + ty2 * c + tx, tx2 * b + ty2 * d + ty];\n}\n\n/** A shading in the drawing's coordinates: a style, or a gradient between two points. */\nexport type Shading =\n | StyleValue\n | { linearGradient: { colors?: ColorValue[]; stops?: { color: ColorValue; location: number }[]; start: Point; end: Point } }\n | { radialGradient: { colors?: ColorValue[]; stops?: { color: ColorValue; location: number }[]; center: Point; startRadius: number; endRadius: number } };\n\nfunction stops(spec: { colors?: ColorValue[]; stops?: { color: ColorValue; location: number }[] }): GradientStop[] {\n if (spec.stops) return spec.stops.map((s) => ({ color: color(s.color), location: s.location }));\n const colors = spec.colors ?? [];\n const last = Math.max(colors.length - 1, 1);\n return colors.map((c, i) => ({ color: color(c), location: i / last }));\n}\n\n/** In a drawing `.primary` / `.secondary`… are the label colors, as `.color(.primary)` is. */\nconst LABEL_COLORS: Record<string, CanvasShading> = {\n primary: { name: 'primary' },\n secondary: { name: 'secondary' },\n tertiary: { name: 'tertiaryLabel' },\n quaternary: { name: 'quaternaryLabel' },\n};\n\nfunction shading(value: Shading): CanvasShading {\n if (typeof value === 'string' && value in LABEL_COLORS) return LABEL_COLORS[value]!;\n if (typeof value === 'object' && value !== null) {\n if ('linearGradient' in value) {\n const g = value.linearGradient as { start: Point & { x: number }; end: Point } & Parameters<typeof stops>[0];\n // `LinearGradient(...)` styles carry stops of protocol colors and unit points; canvas gradients carry `colors` or ColorValue stops in points.\n if (isCanvasGradient(g)) return { canvasLinearGradient: { stops: stops(g), start: g.start, end: g.end } };\n }\n if ('radialGradient' in value) {\n const g = value.radialGradient as { center: Point; startRadius: number; endRadius: number } & Parameters<typeof stops>[0];\n if (isCanvasGradient(g)) return { canvasRadialGradient: { stops: stops(g), center: g.center, startRadius: g.startRadius, endRadius: g.endRadius } };\n }\n }\n return shapeStyle(value as StyleValue);\n}\n\n/** A canvas gradient is written with `colors`, or with stops whose colors are names or `#hex` strings. */\nfunction isCanvasGradient(g: { colors?: unknown; stops?: { color: unknown }[] }): boolean {\n if (Array.isArray(g.colors)) return true;\n return Array.isArray(g.stops) && g.stops.some((s) => typeof s.color === 'string');\n}\n\nexport interface StrokeOptions {\n lineWidth?: number;\n lineCap?: 'butt' | 'round' | 'square';\n lineJoin?: 'miter' | 'round' | 'bevel';\n miterLimit?: number;\n dash?: number[];\n dashPhase?: number;\n}\n\n/** What a canvas image is: a symbol, a catalog image, or a remote image of a known size. */\nexport type CanvasImage = { systemName: string } | { name: string } | { url: string; width: number; height: number };\n\ninterface State {\n transform: Matrix;\n opacity: number;\n blendMode: string | undefined;\n clips: string[];\n filters: CanvasFilter[];\n}\n\n/** A view passed in `Canvas`'s `symbols`, resolved by its id. */\nexport interface ResolvedSymbol {\n symbol: string;\n}\n\n/** Where a symbol was drawn: the point (the context's transform applied) and the look at that moment. */\nexport interface SymbolDraw {\n id: string;\n x: number;\n y: number;\n rotation: number;\n scale: { x: number; y: number };\n opacity: number;\n}\n\n/** `GraphicsContext`: what `Canvas`'s renderer draws with. Methods return the context for chaining. */\nexport class GraphicsContext {\n readonly commands: CanvasCommand[] = [];\n readonly symbolDraws: SymbolDraw[] = [];\n private symbolIds: ReadonlySet<string> = new Set();\n\n /** @internal The ids `symbols` gave the canvas. */\n setSymbols(ids: Iterable<string>): void {\n this.symbolIds = new Set(ids);\n }\n\n /** `resolveSymbol(id:)`: the view the canvas was given under `id`, or null. */\n resolveSymbol(id: string): ResolvedSymbol | null {\n return this.symbolIds.has(id) ? { symbol: id } : null;\n }\n\n /**\n * `draw(symbol, at:)`: the symbol's view centered on the point. Symbols are\n * views laid over the drawing, so they draw above its other commands.\n */\n drawSymbol(symbol: ResolvedSymbol, at: Point): this {\n const [a, b, c, d, tx, ty] = this.state.transform;\n const scaleX = Math.hypot(a, b);\n const scaleY = scaleX > 0 ? (a * d - b * c) / scaleX : Math.hypot(c, d);\n this.symbolDraws.push({\n id: symbol.symbol,\n x: a * at.x + c * at.y + tx,\n y: b * at.x + d * at.y + ty,\n rotation: (Math.atan2(b, a) * 180) / Math.PI,\n scale: { x: scaleX, y: scaleY },\n opacity: this.state.opacity,\n });\n return this;\n }\n private state: State = { transform: IDENTITY, opacity: 1, blendMode: undefined, clips: [], filters: [] };\n\n constructor(readonly size: { width: number; height: number }) {}\n\n get opacity(): number {\n return this.state.opacity;\n }\n set opacity(value: number) {\n this.state.opacity = value;\n }\n get blendMode(): string | undefined {\n return this.state.blendMode;\n }\n set blendMode(value: string | undefined) {\n this.state.blendMode = value;\n }\n\n translateBy(x: number, y: number): this {\n this.state.transform = multiply(this.state.transform, [1, 0, 0, 1, x, y]);\n return this;\n }\n scaleBy(x: number, y: number = x): this {\n this.state.transform = multiply(this.state.transform, [x, 0, 0, y, 0, 0]);\n return this;\n }\n /** Degrees, clockwise on screen. */\n rotate(degrees: number): this {\n const r = (degrees * Math.PI) / 180;\n this.state.transform = multiply(this.state.transform, [Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0]);\n return this;\n }\n concatenate(matrix: Matrix): this {\n this.state.transform = multiply(this.state.transform, matrix);\n return this;\n }\n clip(to: Path): this {\n this.state.clips = [...this.state.clips, to.svg()];\n return this;\n }\n addFilter(filter: CanvasFilter): this {\n this.state.filters = [...this.state.filters, filter];\n return this;\n }\n\n /** `drawLayer { }`: draws with a copy of the state, restored after. */\n drawLayer(body: (context: GraphicsContext) => void): this {\n const saved = { ...this.state, clips: [...this.state.clips], filters: [...this.state.filters] };\n body(this);\n this.state = saved;\n return this;\n }\n\n fill(path: Path, with_: Shading, options: { eoFill?: boolean } = {}): this {\n this.push({ op: 'fill', path: path.svg(), shading: shading(with_), ...(options.eoFill ? { evenOdd: true } : {}) });\n return this;\n }\n\n stroke(path: Path, with_: Shading, options: StrokeOptions | number = {}): this {\n const o = typeof options === 'number' ? { lineWidth: options } : options;\n const command: CanvasCommand = { op: 'stroke', path: path.svg(), shading: shading(with_), lineWidth: o.lineWidth ?? 1 };\n if (o.lineCap) command.lineCap = o.lineCap;\n if (o.lineJoin) command.lineJoin = o.lineJoin;\n if (o.miterLimit !== undefined) command.miterLimit = o.miterLimit;\n if (o.dash) command.dash = o.dash;\n if (o.dashPhase !== undefined) command.dashPhase = o.dashPhase;\n this.push(command);\n return this;\n }\n\n /** `draw(Text(...), at:anchor:)` */\n drawText(text: string, at: Point, options: { anchor?: UnitPointValue; font?: FontValue; color?: StyleValue } = {}): this {\n const command: CanvasCommand = {\n op: 'text',\n text,\n x: at.x,\n y: at.y,\n anchor: unitPoint(options.anchor ?? 'center'),\n shading: shading(options.color ?? 'primary'),\n };\n if (options.font !== undefined) (command as { font?: Font }).font = font(options.font);\n this.push(command);\n return this;\n }\n\n /** `draw(Image(...), at:anchor:)` or `draw(_:in:)` with `size`. */\n drawImage(image: CanvasImage, at: Point, options: { anchor?: UnitPointValue; size?: { width: number; height: number }; color?: StyleValue } = {}): this {\n const props = 'url' in image ? { ...image, resizable: true } : 'name' in image ? { name: image.name, resizable: true } : image;\n const command = {\n op: 'image' as const,\n image: props,\n x: at.x,\n y: at.y,\n anchor: unitPoint(options.anchor ?? (options.size ? 'topLeading' : 'center')),\n ...(options.size ? { width: options.size.width, height: options.size.height } : {}),\n ...(options.color !== undefined ? { shading: shading(options.color) } : {}),\n };\n this.push(command as CanvasCommand);\n return this;\n }\n\n private push(command: CanvasCommand): void {\n const state: CanvasState = {};\n if (this.state.transform.some((v, i) => v !== IDENTITY[i])) state.transform = this.state.transform.map((v) => Math.round(v * 1e4) / 1e4) as Matrix;\n if (this.state.opacity !== 1) state.opacity = this.state.opacity;\n if (this.state.blendMode) state.blendMode = this.state.blendMode;\n if (this.state.clips.length) state.clips = [...this.state.clips];\n if (this.state.filters.length) state.filters = [...this.state.filters];\n this.commands.push({ ...state, ...command } as CanvasCommand);\n }\n}\n\nexport interface CanvasProps extends ViewModifiers {\n /** `Canvas { context, size in }` */\n renderer: (context: GraphicsContext, size: { width: number; height: number }) => void;\n /** `Canvas(renderer:symbols:)`: views the renderer draws by id (`resolveSymbol`, `drawSymbol`). */\n symbols?: Record<string, ReactNode>;\n}\n\nexport function Canvas(props: CanvasProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const [size, setSize] = useState<{ width: number; height: number } | null>(null);\n let canvas: ReactNode = null;\n let draws: SymbolDraw[] = [];\n if (size) {\n const context = new GraphicsContext(size);\n if (own.symbols) context.setSymbols(Object.keys(own.symbols));\n own.renderer(context, size);\n canvas = sb('canvas', { width: size.width, height: size.height, commands: context.commands });\n draws = context.symbolDraws;\n }\n const reader = sb(\n 'geometry',\n {},\n {\n geometry: (event) => {\n if (!size || size.width !== event.width || size.height !== event.height) setSize({ width: event.width, height: event.height });\n },\n },\n canvas,\n );\n if (!own.symbols) return applyModifiers(reader, modifiers);\n // The drawn symbols, each its view centered on the point it was drawn at.\n const symbols = draws.map((draw, index) => {\n let view: ReactNode = own.symbols![draw.id];\n if (draw.scale.x !== 1 || draw.scale.y !== 1) view = styled({ scale: draw.scale }, view);\n if (Math.abs(draw.rotation) > 1e-6) view = styled({ rotation: draw.rotation }, view);\n if (draw.opacity !== 1) view = styled({ opacity: draw.opacity }, view);\n return <Fragment key={index}>{styled({ position: { x: draw.x, y: draw.y } }, view)}</Fragment>;\n });\n return applyModifiers(\n sb('zstack', { alignment: 'topLeading' }, undefined, [<Fragment key=\"canvas\">{reader}</Fragment>, ...symbols]),\n modifiers,\n );\n}\n","/** `TimelineView` and `VideoPlayer` with `useAVPlayer`. */\n\nimport type { RendererEvent } from '@swiftbrowser/web/src/protocol';\nimport { Fragment, useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { sb } from '../host/sb';\nimport { applyModifiers, splitProps, type ViewModifiers } from '../modifiers';\n\n// ---------------------------------------------------------------------------\n// TimelineView\n// ---------------------------------------------------------------------------\n\nexport type TimelineSchedule =\n | 'animation'\n | 'everyMinute'\n | { animation: { minimumInterval?: number; paused?: boolean } }\n | { periodic: { from?: Date; by: number } };\n\nexport interface TimelineViewProps {\n schedule: TimelineSchedule;\n children: (context: { date: Date }) => ReactNode;\n}\n\n/** `TimelineView(.periodic(from:by:)) { context in }`: the content renders again at each date of the schedule. */\nexport function TimelineView({ schedule, children }: TimelineViewProps): ReactNode {\n const [date, setDate] = useState(() => new Date());\n const key = typeof schedule === 'string' ? schedule : JSON.stringify(schedule);\n useEffect(() => {\n if (schedule === 'everyMinute') {\n let interval: ReturnType<typeof setInterval> | undefined;\n const timeout = setTimeout(() => {\n setDate(new Date());\n interval = setInterval(() => setDate(new Date()), 60_000);\n }, 60_000 - (Date.now() % 60_000));\n return () => {\n clearTimeout(timeout);\n if (interval) clearInterval(interval);\n };\n }\n if (typeof schedule === 'object' && 'periodic' in schedule) {\n const every = Math.max(schedule.periodic.by, 0.01) * 1000;\n const from = schedule.periodic.from?.getTime() ?? Date.now();\n // Aligned to the schedule's dates (from + k × interval).\n let timer: ReturnType<typeof setTimeout>;\n const tick = (): void => {\n const now = Date.now();\n const next = from + Math.ceil((now - from + 1) / every) * every;\n timer = setTimeout(() => {\n setDate(new Date(next));\n tick();\n }, Math.max(0, next - now));\n };\n tick();\n return () => clearTimeout(timer);\n }\n const options = typeof schedule === 'object' ? schedule.animation : {};\n if (options.paused) return;\n const minimum = (options.minimumInterval ?? 1 / 20) * 1000;\n let last = 0;\n let frame = 0;\n const loop = (time: number): void => {\n if (time - last >= minimum) {\n last = time;\n setDate(new Date());\n }\n frame = requestAnimationFrame(loop);\n };\n frame = requestAnimationFrame(loop);\n return () => cancelAnimationFrame(frame);\n // The schedule's identity is its JSON.\n }, [key]);\n return children({ date });\n}\n\n// ---------------------------------------------------------------------------\n// AVPlayer\n// ---------------------------------------------------------------------------\n\ntype VideoEvent = Extract<RendererEvent, { type: 'video' }>;\n\ninterface PlayerState {\n url: string | null;\n rate: number;\n muted: boolean;\n volume: number;\n loop: boolean;\n seek: { time: number; serial: number };\n duration: number | null;\n size: { width: number; height: number } | null;\n status: 'playing' | 'waiting' | 'paused';\n failed: string | null;\n}\n\n/**\n * `AVPlayer`: what plays, the rate, mute and volume, seeks. A view showing\n * it re-renders when those change; the position (`currentTime`, several\n * reports a second) re-renders nothing: read it or listen with `onTime`.\n */\nexport class AVPlayer {\n private state: PlayerState;\n private listeners = new Set<() => void>();\n private timeListeners = new Set<(time: number) => void>();\n private time = 0;\n private serial = 0;\n\n constructor(url: string | null = null, options: { loop?: boolean } = {}) {\n this.state = {\n url,\n rate: 0,\n muted: false,\n volume: 1,\n loop: options.loop ?? false,\n seek: { time: 0, serial: 0 },\n duration: null,\n size: null,\n status: 'paused',\n failed: null,\n };\n }\n\n get url(): string | null {\n return this.state.url;\n }\n get rate(): number {\n return this.state.rate;\n }\n get isPlaying(): boolean {\n return this.state.rate > 0;\n }\n get isMuted(): boolean {\n return this.state.muted;\n }\n get volume(): number {\n return this.state.volume;\n }\n get duration(): number | null {\n return this.state.duration;\n }\n get presentationSize(): { width: number; height: number } | null {\n return this.state.size;\n }\n get timeControlStatus(): PlayerState['status'] {\n return this.state.status;\n }\n get error(): string | null {\n return this.state.failed;\n }\n get currentTime(): number {\n return this.time;\n }\n /** @internal */\n get snapshot(): PlayerState {\n return this.state;\n }\n\n play(): void {\n this.update({ rate: 1 });\n }\n pause(): void {\n this.update({ rate: 0 });\n }\n seek(time: number): void {\n this.time = time;\n this.update({ seek: { time, serial: ++this.serial } });\n }\n replaceCurrentItem(url: string | null): void {\n this.time = 0;\n this.update({ url, duration: null, size: null, failed: null, seek: { time: 0, serial: ++this.serial } });\n }\n set isMuted(muted: boolean) {\n this.update({ muted });\n }\n set volume(volume: number) {\n this.update({ volume: Math.min(1, Math.max(0, volume)) });\n }\n set rate(rate: number) {\n this.update({ rate });\n }\n set loop(loop: boolean) {\n this.update({ loop });\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n /** `addPeriodicTimeObserver`: told the position as the page reports it. */\n onTime(listener: (time: number) => void): () => void {\n this.timeListeners.add(listener);\n return () => this.timeListeners.delete(listener);\n }\n\n /** @internal The page's report for a view showing this player. */\n handle(event: VideoEvent): void {\n if (event.time !== undefined) {\n this.time = event.time;\n for (const listener of this.timeListeners) listener(event.time);\n }\n switch (event.event) {\n case 'ready':\n this.update({\n duration: event.duration ?? null,\n size: event.width && event.height ? { width: event.width, height: event.height } : this.state.size,\n });\n break;\n case 'status':\n if (event.status) this.update({ status: event.status });\n break;\n case 'play':\n if (this.state.rate === 0) this.update({ rate: 1 });\n break;\n case 'pause':\n if (this.state.rate !== 0) this.update({ rate: 0 });\n break;\n case 'volume':\n this.update({ muted: event.muted ?? this.state.muted, volume: event.volume ?? this.state.volume });\n break;\n case 'rate':\n if (event.rate !== undefined) this.update({ rate: event.rate });\n break;\n case 'ended':\n if (!this.state.loop) this.update({ rate: 0 });\n break;\n case 'error':\n this.update({ failed: event.message ?? 'error', rate: 0 });\n break;\n default:\n break;\n }\n }\n\n private update(changes: Partial<PlayerState>): void {\n this.state = { ...this.state, ...changes };\n for (const listener of this.listeners) listener();\n }\n}\n\n/** A player kept for the component's life, re-rendering it when what it plays changes. */\nexport function useAVPlayer(url: string | null = null, options: { loop?: boolean } = {}): AVPlayer {\n const ref = useRef<AVPlayer | null>(null);\n ref.current ??= new AVPlayer(url, options);\n const player = ref.current;\n useSyncExternalStore(player.subscribe, () => player.snapshot, () => player.snapshot);\n useEffect(() => {\n if (player.url !== url) player.replaceCurrentItem(url);\n }, [player, url]);\n return player;\n}\n\nexport interface VideoPlayerProps extends ViewModifiers {\n player: AVPlayer | null;\n /** `videoGravity`: fit (default), fill, or stretch. */\n gravity?: 'resizeAspect' | 'resizeAspectFill' | 'resize';\n /** The browser's native controls; true by default, as `VideoPlayer` shows them. */\n controls?: boolean;\n /** `VideoPlayer(player:) { videoOverlay }`: drawn over the video. */\n videoOverlay?: ReactNode;\n}\n\n/** `VideoPlayer(player:)`: the page's `<video>` showing the player, or black without one. */\nexport function VideoPlayer(props: VideoPlayerProps): ReactNode {\n const { own, modifiers } = splitProps(props);\n const player = own.player;\n const state = useSyncExternalStore(\n player?.subscribe ?? NO_SUBSCRIBE,\n () => player?.snapshot ?? null,\n () => player?.snapshot ?? null,\n );\n if (!player || !state || !state.url) return applyModifiers(sb('color', { color: { r: 0, g: 0, b: 0, a: 1 } }), modifiers);\n const video = sb(\n 'video',\n {\n url: state.url,\n playing: state.rate > 0 && !state.failed,\n muted: state.muted,\n volume: state.volume,\n rate: state.rate > 0 ? state.rate : 1,\n loop: state.loop,\n gravity: own.gravity ?? 'resizeAspect',\n controls: own.controls ?? true,\n seek: state.seek,\n ...(state.size ? { width: state.size.width, height: state.size.height } : {}),\n },\n { video: (event) => player.handle(event) },\n );\n if (own.videoOverlay === undefined) return applyModifiers(video, modifiers);\n return applyModifiers(\n sb('zstack', { alignment: 'center' }, undefined, [<Fragment key=\"video\">{video}</Fragment>, <Fragment key=\"overlay\">{own.videoOverlay}</Fragment>]),\n modifiers,\n );\n}\n\nconst NO_SUBSCRIBE = (): (() => void) => () => {};\n","/**\n * `PhaseAnimator` and `KeyframeAnimator`. A phase animator moves its content\n * through phases, each change in one animated pass that the renderer tweens\n * (as the shim does); a keyframe animator computes its values frame by frame\n * along tracks of keyframes and renders them, as SwiftUI evaluates its\n * content per frame.\n */\n\nimport type { Animation } from '@swiftbrowser/web/src/protocol';\nimport { timingFor } from '@swiftbrowser/web/src/animation';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { withAnimation } from '../host/root';\n\n// ---------------------------------------------------------------------------\n// PhaseAnimator\n// ---------------------------------------------------------------------------\n\nexport interface PhaseAnimatorProps<Phase> {\n phases: readonly Phase[];\n /** Each change runs through the phases once, back to the first; without one the phases cycle while shown. */\n trigger?: unknown;\n /** The animation into a phase (`default` by default). */\n animation?: (phase: Phase) => Animation;\n children: (phase: Phase) => ReactNode;\n}\n\nexport function PhaseAnimator<Phase>({ phases, trigger, animation, children }: PhaseAnimatorProps<Phase>): ReactNode {\n const [index, setIndex] = useState(0);\n const hasTrigger = trigger !== undefined;\n const latest = useRef({ phases, animation });\n latest.current = { phases, animation };\n const first = useRef(true);\n\n useEffect(() => {\n if (hasTrigger && first.current) {\n first.current = false;\n return;\n }\n first.current = false;\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let step = 0;\n const count = latest.current.phases.length;\n if (count < 2) return;\n const advance = (): void => {\n if (cancelled) return;\n step += 1;\n const next = step % count;\n const { phases: current, animation: animationFor } = latest.current;\n const into = animationFor?.(current[next] as Phase) ?? { type: 'default' };\n withAnimation(into, () => setIndex(next));\n // A trigger runs through the phases once, ending on the first.\n if (hasTrigger && next === 0) return;\n const timing = timingFor(into);\n timer = setTimeout(advance, timing.duration + timing.delay);\n };\n // The first phase holds for a moment before the cycle starts, as the first change waits for a render.\n timer = setTimeout(advance, 0);\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [hasTrigger, trigger]);\n\n return children(phases[index % Math.max(phases.length, 1)] as Phase);\n}\n\n// ---------------------------------------------------------------------------\n// KeyframeAnimator\n// ---------------------------------------------------------------------------\n\nexport type KeyframeCurve = 'linear' | 'cubic' | 'spring' | 'move';\n\n/** One keyframe of a track: the value it reaches, in how long (seconds), along which curve. */\nexport interface Keyframe {\n to: number;\n duration: number;\n curve?: KeyframeCurve;\n}\n\nexport type KeyframeTracks<Value extends Record<string, number>> = { [K in keyof Value]?: readonly Keyframe[] };\n\nexport interface KeyframeAnimatorProps<Value extends Record<string, number>> {\n initialValue: Value;\n keyframes: KeyframeTracks<Value>;\n /** Each change plays the keyframes once; without one they repeat while shown (`repeating`). */\n trigger?: unknown;\n repeating?: boolean;\n children: (value: Value) => ReactNode;\n}\n\nfunction ease(curve: KeyframeCurve, t: number): number {\n switch (curve) {\n case 'move':\n return 1;\n case 'cubic':\n return t * t * (3 - 2 * t);\n case 'spring': {\n // A critically damped spring that settles within the keyframe.\n const omega = 7;\n return 1 - (1 + omega * t) * Math.exp(-omega * t);\n }\n default:\n return t;\n }\n}\n\n/** The tracks' values `elapsed` seconds in (each track from the initial value through its keyframes). */\nexport function keyframeValues<Value extends Record<string, number>>(initial: Value, tracks: KeyframeTracks<Value>, elapsed: number): Value {\n const value: Record<string, number> = { ...initial };\n for (const key of Object.keys(tracks) as (keyof Value & string)[]) {\n const frames = tracks[key] ?? [];\n let from: number = initial[key];\n let start = 0;\n let current: number = from;\n for (const frame of frames) {\n const end = start + frame.duration;\n if (elapsed >= end) {\n current = frame.to;\n } else {\n const t = frame.duration > 0 ? Math.max(0, (elapsed - start) / frame.duration) : 1;\n current = from + (frame.to - from) * ease(frame.curve ?? 'spring', t);\n break;\n }\n from = frame.to;\n start = end;\n }\n value[key] = current;\n }\n return value as Value;\n}\n\nfunction totalDuration(tracks: Record<string, readonly Keyframe[] | undefined>): number {\n return Math.max(0, ...Object.values(tracks).map((frames) => (frames ?? []).reduce((sum, frame) => sum + frame.duration, 0)));\n}\n\nexport function KeyframeAnimator<Value extends Record<string, number>>({\n initialValue,\n keyframes,\n trigger,\n repeating,\n children,\n}: KeyframeAnimatorProps<Value>): ReactNode {\n const [value, setValue] = useState<Value>(initialValue);\n const latest = useRef({ initialValue, keyframes });\n latest.current = { initialValue, keyframes };\n const first = useRef(true);\n const hasTrigger = trigger !== undefined;\n\n useEffect(() => {\n if (hasTrigger && first.current) {\n first.current = false;\n return;\n }\n first.current = false;\n if (!hasTrigger && !repeating) return;\n let frame = 0;\n let start: number | null = null;\n const tick = (now: number): void => {\n start ??= now;\n const { initialValue: initial, keyframes: tracks } = latest.current;\n const total = totalDuration(tracks as Record<string, readonly Keyframe[] | undefined>);\n let elapsed = (now - start) / 1000;\n if (!hasTrigger && repeating && total > 0) elapsed %= total;\n setValue(keyframeValues(initial, tracks, elapsed));\n if (hasTrigger && elapsed >= total) return;\n frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frame);\n }, [hasTrigger, trigger, repeating]);\n\n return children(value);\n}\n"],"names":["entry","next","insets","frame","r","stops","wrap","Image","Fragment","clear","active","round","size","IDENTITY","opacity","clamp","stride","keyOf","row"],"mappings":"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"}