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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/NOTICE +2 -2
  2. package/README.md +2 -3
  3. package/dist/acknowledgements/inventory.json +5 -5
  4. package/dist/actions/RowActions.d.ts +4 -4
  5. package/dist/actions/RowActions.js +93 -27
  6. package/dist/actions/fullSwipeContact.d.ts +73 -0
  7. package/dist/actions/fullSwipeContact.js +186 -0
  8. package/dist/actions/rowScrub.d.ts +7 -4
  9. package/dist/actions/rowScrub.js +39 -37
  10. package/dist/actions/types.d.ts +13 -7
  11. package/dist/app/InstallComponents.d.ts +4 -7
  12. package/dist/app/InstallComponents.js +7 -7
  13. package/dist/app/InstallationDiagnostics.d.ts +2 -1
  14. package/dist/app/InstallationDiagnostics.js +2 -1
  15. package/dist/app/appearance.d.ts +5 -3
  16. package/dist/app/appearance.js +5 -3
  17. package/dist/app/appearanceStore.d.ts +3 -2
  18. package/dist/app/buildInfo.d.ts +4 -4
  19. package/dist/app/buildInfo.js +2 -2
  20. package/dist/app/definition.d.ts +11 -3
  21. package/dist/app/definition.js +2 -0
  22. package/dist/app/head.d.ts +2 -1
  23. package/dist/app/head.js +13 -16
  24. package/dist/app/inlineCSP.d.ts +6 -0
  25. package/dist/app/inlineCSP.js +25 -0
  26. package/dist/app/install.d.ts +1 -0
  27. package/dist/app/install.js +5 -2
  28. package/dist/app/installCheck.js +32 -86
  29. package/dist/app/installContext.d.ts +10 -5
  30. package/dist/app/installContext.js +2 -0
  31. package/dist/app/installCustom.js +1 -0
  32. package/dist/app/installExperience.js +0 -60
  33. package/dist/app/installationFailure.d.ts +3 -2
  34. package/dist/app/installationFailure.js +1 -1
  35. package/dist/app/launchScreen.d.ts +6 -2
  36. package/dist/app/launchScreen.js +104 -1
  37. package/dist/app/launchScreenRuntime.d.ts +31 -4
  38. package/dist/app/launchScreenRuntime.js +150 -22
  39. package/dist/app/launchWatchdog.js +25 -65
  40. package/dist/app/platformScripts.js +11 -0
  41. package/dist/app/styles.d.ts +3 -0
  42. package/dist/app/styles.js +42 -0
  43. package/dist/app/viewportValue.d.ts +2 -1
  44. package/dist/app/vite.d.ts +4 -0
  45. package/dist/app/vite.js +22 -24
  46. package/dist/content/content.d.ts +35 -30
  47. package/dist/content/content.js +19 -16
  48. package/dist/content/layout.d.ts +10 -2
  49. package/dist/content/layout.js +4 -2
  50. package/dist/content/scaledMetric.d.ts +2 -1
  51. package/dist/content/scaledMetric.js +2 -1
  52. package/dist/controls/ColorPicker.d.ts +2 -4
  53. package/dist/controls/ColorPicker.js +2 -4
  54. package/dist/controls/DatePicker.d.ts +4 -4
  55. package/dist/controls/DatePicker.js +2 -2
  56. package/dist/controls/ProgressView.d.ts +4 -4
  57. package/dist/controls/ProgressView.js +1 -2
  58. package/dist/controls/civilDate.d.ts +1 -1
  59. package/dist/controls/civilDate.js +1 -1
  60. package/dist/data/database.d.ts +9 -8
  61. package/dist/data/database.js +4 -4
  62. package/dist/docs/components/file-importer.md +1 -1
  63. package/dist/docs/components/paste-button.md +1 -1
  64. package/dist/docs/components/photos-picker.md +1 -1
  65. package/dist/docs/components/share-link.md +1 -1
  66. package/dist/docs/limitations.md +1 -1
  67. package/dist/docs/push.md +3 -3
  68. package/dist/docs/reference.md +1888 -0
  69. package/dist/docs/tailwind.md +76 -0
  70. package/dist/docs/tokens.md +1 -1
  71. package/dist/gestures/GestureView.d.ts +3 -1
  72. package/dist/gestures/GestureView.js +2 -1
  73. package/dist/gestures/gesture.d.ts +22 -2
  74. package/dist/gestures/gesture.js +7 -2
  75. package/dist/glass/GlassEffect.d.ts +2 -1
  76. package/dist/glass/GlassEffect.js +2 -1
  77. package/dist/glass/GlassPresentation.d.ts +1 -0
  78. package/dist/glass/GlassPresentation.js +21 -4
  79. package/dist/glass/TabBar.js +23 -1
  80. package/dist/glass/errorAlert.js +2 -1
  81. package/dist/glass/errors.d.ts +3 -1
  82. package/dist/glass/fallback/runtime.d.ts +1 -0
  83. package/dist/glass/fallback/runtime.js +8 -1
  84. package/dist/glass/lens/controlLift.d.ts +1 -1
  85. package/dist/glass/lens/controlLift.js +1 -1
  86. package/dist/glass/lens/interactivePress.d.ts +2 -2
  87. package/dist/glass/lens/interactivePress.js +2 -2
  88. package/dist/glass/lens/menu-opening-native-fits.json +1 -1
  89. package/dist/glass/lens/menuContextFit.json +1 -1
  90. package/dist/glass/lens/menuDropFit.json +1 -1
  91. package/dist/glass/lens/menuField.d.ts +2 -2
  92. package/dist/glass/lens/menuField.js +3 -3
  93. package/dist/glass/lens/menuGlyphDropFit.json +1 -1
  94. package/dist/glass/lens/menuMorphFit.json +1 -1
  95. package/dist/glass/lens/menuMorphPhoneFit.json +1 -1
  96. package/dist/glass/lens/tabAccessoryMotion.d.ts +1 -1
  97. package/dist/glass/lens/tabSearchMember.d.ts +1 -1
  98. package/dist/glass/lens/tabSearchMember.js +1 -1
  99. package/dist/glass/liquidContext.d.ts +2 -0
  100. package/dist/glass/menuPresenter.d.ts +2 -0
  101. package/dist/glass/menuPresenter.js +1 -1
  102. package/dist/glass/regions.d.ts +3 -2
  103. package/dist/glass/regions.js +1 -1
  104. package/dist/glass/renderSpecs.d.ts +1 -0
  105. package/dist/glass/renderSpecs.js +1 -0
  106. package/dist/glass/shapeTrack.d.ts +1 -1
  107. package/dist/glass/submenuMotion.d.ts +1 -1
  108. package/dist/glass/submenuMotion.js +1 -1
  109. package/dist/glass/webgpu/controlRim.d.ts +29 -0
  110. package/dist/glass/webgpu/controlRim.js +68 -0
  111. package/dist/glass/webgpu/entry.worker.js +3 -6
  112. package/dist/glass/webgpu/frameClock.d.ts +6 -2
  113. package/dist/glass/webgpu/frameClock.js +9 -2
  114. package/dist/glass/webgpu/frameProbe.d.ts +1 -1
  115. package/dist/glass/webgpu/frameProbe.js +3 -3
  116. package/dist/glass/webgpu/passes.d.ts +2 -2
  117. package/dist/glass/webgpu/production.d.ts +1 -0
  118. package/dist/glass/webgpu/production.js +31 -1
  119. package/dist/glass/webgpu/raster.d.ts +18 -0
  120. package/dist/glass/webgpu/raster.js +105 -15
  121. package/dist/glass/webgpu/rasterMaterial.d.ts +4 -0
  122. package/dist/glass/webgpu/rasterMaterial.js +17 -1
  123. package/dist/glass/webgpu/rasterUniforms.js +9 -0
  124. package/dist/glass/webgpu/regionScene.d.ts +4 -1
  125. package/dist/glass/webgpu/regionScene.js +30 -1
  126. package/dist/glass/webgpu/renderer.js +23 -7
  127. package/dist/glass/webgpu/shaders.d.ts +2 -2
  128. package/dist/glass/webgpu/shaders.js +5 -1
  129. package/dist/haptics/SensoryButton.d.ts +4 -4
  130. package/dist/haptics/SensoryButton.js +3 -3
  131. package/dist/image/Image.d.ts +6 -3
  132. package/dist/image/Image.js +4 -3
  133. package/dist/image/asset.d.ts +2 -1
  134. package/dist/keyboard/adapter.d.ts +3 -4
  135. package/dist/keyboard/adapter.js +2 -2
  136. package/dist/keyboard/avoidance.d.ts +1 -1
  137. package/dist/keyboard/avoidance.js +1 -1
  138. package/dist/keyboard/geometry.d.ts +1 -1
  139. package/dist/keyboard/motion.d.ts +1 -1
  140. package/dist/keyboard/motion.js +1 -1
  141. package/dist/list-form/ListForm.d.ts +10 -9
  142. package/dist/list-form/ListForm.js +3 -3
  143. package/dist/list-form/ListItem.js +1 -1
  144. package/dist/list-form/RowLabel.d.ts +1 -1
  145. package/dist/list-form/RowLabel.js +1 -1
  146. package/dist/list-form/Slider.js +1 -1
  147. package/dist/list-form/editMotion.js +1 -1
  148. package/dist/list-form/editing.d.ts +10 -11
  149. package/dist/list-form/editing.js +5 -6
  150. package/dist/list-form/offsets.d.ts +2 -2
  151. package/dist/list-form/offsets.js +2 -2
  152. package/dist/media/react.d.ts +2 -1
  153. package/dist/media/react.js +2 -1
  154. package/dist/media/types.d.ts +6 -3
  155. package/dist/motion/TransitionView.d.ts +4 -2
  156. package/dist/motion/TransitionView.js +3 -2
  157. package/dist/motion/animationValue.d.ts +2 -2
  158. package/dist/motion/animationValue.js +9 -10
  159. package/dist/motion/matchedGeometry.d.ts +10 -9
  160. package/dist/motion/matchedGeometry.js +9 -9
  161. package/dist/motion/springTrack.d.ts +1 -2
  162. package/dist/motion/springTrack.js +10 -5
  163. package/dist/motion/transition.d.ts +4 -1
  164. package/dist/motion/transition.js +2 -0
  165. package/dist/navigation/DetailList.d.ts +1 -1
  166. package/dist/navigation/DetailList.js +1 -1
  167. package/dist/navigation/ScreenContainer.js +1 -1
  168. package/dist/navigation/Sidebar.d.ts +3 -1
  169. package/dist/navigation/Sidebar.js +1 -1
  170. package/dist/navigation/SidebarSymbol.d.ts +2 -1
  171. package/dist/navigation/SidebarSymbol.js +2 -1
  172. package/dist/navigation/chromeCurves.js +1 -1
  173. package/dist/navigation/navigationContext.d.ts +2 -1
  174. package/dist/navigation/navigationContext.js +2 -1
  175. package/dist/navigation/splitContext.d.ts +2 -1
  176. package/dist/navigation/splitContext.js +2 -1
  177. package/dist/navigation/toolbarMinimization.d.ts +4 -3
  178. package/dist/navigation/types.d.ts +8 -6
  179. package/dist/navigation/zoomGeometry.js +1 -1
  180. package/dist/navigation/zoomMotion.d.ts +1 -1
  181. package/dist/navigation/zoomMotion.js +2 -2
  182. package/dist/navigation/zoomTransition.js +3 -4
  183. package/dist/presentation/Presentation.d.ts +10 -9
  184. package/dist/presentation/Presentation.js +4 -3
  185. package/dist/presentation/model.d.ts +2 -1
  186. package/dist/presentation/presentationSource.js +1 -1
  187. package/dist/press/Pressable.d.ts +5 -1
  188. package/dist/press/Pressable.js +2 -0
  189. package/dist/press/stateMachine.d.ts +1 -1
  190. package/dist/public/Label.d.ts +2 -1
  191. package/dist/public/Label.js +2 -1
  192. package/dist/public/Screen.d.ts +4 -6
  193. package/dist/public/actions.d.ts +2 -1
  194. package/dist/public/actions.js +2 -1
  195. package/dist/public/buttonBorderShape.d.ts +2 -1
  196. package/dist/public/colors.d.ts +7 -4
  197. package/dist/public/colors.js +3 -2
  198. package/dist/public/controlStyle.d.ts +17 -14
  199. package/dist/public/controls.d.ts +29 -28
  200. package/dist/public/controls.js +25 -24
  201. package/dist/public/deviceActions.d.ts +6 -4
  202. package/dist/public/deviceActions.js +4 -2
  203. package/dist/public/environment.d.ts +16 -13
  204. package/dist/public/environment.js +11 -9
  205. package/dist/public/filePickers.d.ts +6 -4
  206. package/dist/public/filePickers.js +3 -2
  207. package/dist/public/glass.d.ts +8 -6
  208. package/dist/public/glass.js +2 -2
  209. package/dist/public/glassValue.d.ts +3 -4
  210. package/dist/public/glassValue.js +3 -4
  211. package/dist/public/keyboard.d.ts +4 -1
  212. package/dist/public/keyboard.js +2 -1
  213. package/dist/public/navigationTransition.d.ts +6 -6
  214. package/dist/public/navigationTransition.js +3 -3
  215. package/dist/public/presentation.d.ts +8 -7
  216. package/dist/public/presentation.js +5 -5
  217. package/dist/public/runtime.d.ts +9 -8
  218. package/dist/public/runtime.js +7 -7
  219. package/dist/public/scroll.d.ts +6 -3
  220. package/dist/public/scroll.js +3 -1
  221. package/dist/public/structure.d.ts +2 -2
  222. package/dist/public/toolbar.d.ts +15 -11
  223. package/dist/public/toolbar.js +13 -8
  224. package/dist/reachability/model.d.ts +4 -3
  225. package/dist/reachability/react.d.ts +4 -1
  226. package/dist/reachability/react.js +2 -1
  227. package/dist/root/SatinRoot.d.ts +3 -3
  228. package/dist/root/SatinRoot.js +12 -36
  229. package/dist/root/mountSatin.d.ts +1 -1
  230. package/dist/root/mountSatin.js +26 -35
  231. package/dist/root/runtimeContext.d.ts +2 -1
  232. package/dist/root/runtimeContext.js +2 -1
  233. package/dist/safe-area/Overlay.d.ts +3 -2
  234. package/dist/safe-area/Overlay.js +2 -1
  235. package/dist/safe-area/SafeAreaInset.d.ts +11 -7
  236. package/dist/safe-area/SafeAreaInset.js +10 -9
  237. package/dist/safe-area/context.d.ts +3 -3
  238. package/dist/safe-area/context.js +1 -1
  239. package/dist/safe-area/displayCorners.d.ts +4 -2
  240. package/dist/safe-area/displayCorners.js +4 -2
  241. package/dist/safe-area/modifiers.d.ts +14 -10
  242. package/dist/safe-area/modifiers.js +10 -6
  243. package/dist/safe-area/useSafeAreaMetrics.js +2 -2
  244. package/dist/scroll/ScrollSurface.d.ts +5 -5
  245. package/dist/scroll/ScrollSurface.js +6 -2
  246. package/dist/scroll/ScrollTarget.d.ts +1 -1
  247. package/dist/scroll/ScrollTarget.js +1 -1
  248. package/dist/scroll/edgePolicy.d.ts +2 -2
  249. package/dist/scroll/position.d.ts +5 -3
  250. package/dist/scroll/position.js +1 -1
  251. package/dist/scroll/screenGeometry.d.ts +1 -1
  252. package/dist/scroll/screenGeometry.js +1 -1
  253. package/dist/scroll/types.d.ts +1 -1
  254. package/dist/search/PadSearchDrawer.d.ts +7 -0
  255. package/dist/search/PadSearchDrawer.js +8 -0
  256. package/dist/search/PadSearchPresentationContext.d.ts +6 -0
  257. package/dist/search/PadSearchPresentationContext.js +4 -0
  258. package/dist/search/SearchDrawer.d.ts +1 -1
  259. package/dist/search/SearchDrawer.js +7 -2
  260. package/dist/search/SearchSuggestionsPopover.d.ts +6 -0
  261. package/dist/search/SearchSuggestionsPopover.js +42 -0
  262. package/dist/search/SearchToolbarField.d.ts +2 -1
  263. package/dist/search/SearchToolbarField.js +28 -7
  264. package/dist/search/padSearchBarMotion.d.ts +69 -0
  265. package/dist/search/padSearchBarMotion.js +73 -0
  266. package/dist/search/padSearchFieldSamples.json +491 -0
  267. package/dist/search/searchMotion.d.ts +1 -1
  268. package/dist/search/searchMotion.js +1 -1
  269. package/dist/search/searchPlacement.d.ts +3 -0
  270. package/dist/search/searchPlacement.js +7 -0
  271. package/dist/search/searchable.d.ts +14 -12
  272. package/dist/search/usePadSearchFieldMotion.d.ts +4 -0
  273. package/dist/search/usePadSearchFieldMotion.js +100 -0
  274. package/dist/search/useSearchPresentation.d.ts +2 -1
  275. package/dist/search/useSearchPresentation.js +24 -6
  276. package/dist/server.d.ts +4 -4
  277. package/dist/server.js +4 -4
  278. package/dist/shapes/corners.d.ts +3 -3
  279. package/dist/shapes/corners.js +2 -3
  280. package/dist/styles.css +8302 -8236
  281. package/dist/sw/vite.d.ts +4 -0
  282. package/dist/sw/vite.js +2 -0
  283. package/dist/symbols/Symbol.d.ts +7 -5
  284. package/dist/symbols/Symbol.js +5 -3
  285. package/dist/symbols/catalogue.d.ts +1 -1
  286. package/dist/symbols/types.d.ts +6 -4
  287. package/dist/tabs/TabSection.d.ts +3 -2
  288. package/dist/tabs/TabSection.js +2 -1
  289. package/dist/tabs/TabView.js +54 -51
  290. package/dist/tasks/useTask.d.ts +5 -4
  291. package/dist/tasks/useTask.js +4 -3
  292. package/dist/testing.d.ts +3 -2
  293. package/dist/testing.js +3 -2
  294. package/dist/text-input/TextEditor.js +7 -3
  295. package/dist/text-input/focusChain.d.ts +4 -3
  296. package/dist/text-input/focusChain.js +3 -2
  297. package/dist/text-input/kinds.d.ts +1 -1
  298. package/dist/web/WebView.d.ts +10 -3
  299. package/dist/web/WebView.js +3 -2
  300. package/dist/web/authentication.d.ts +12 -1
  301. package/dist/web/authentication.js +2 -1
  302. package/dist/web/openURL.d.ts +10 -4
  303. package/dist/web/openURL.js +4 -2
  304. package/dist/web/useWebAuthentication.d.ts +2 -1
  305. package/dist/web/useWebAuthentication.js +2 -1
  306. package/dist/zoom/Zoomable.d.ts +3 -3
  307. package/dist/zoom/Zoomable.js +2 -2
  308. package/package.json +4 -4
  309. package/dist/docs/swiftui-reference.md +0 -1895
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "provenance": {
3
- "scene": "ParityReference toolbar-ellipsis, stock SwiftUI toolbar Menu over black (iPhone 17 Pro Max Simulator, iOS 27.0)",
3
+ "scene": "ParityReference toolbar-ellipsis, native controls toolbar Menu over black (iPhone 17 Pro Max Simulator, iOS 27.0)",
4
4
  "capture": "morph2 native recording menu measurements.mp4",
5
5
  "model": "One damped spring per axis, each a displacement from 1 to 0: released after `delay` ms with initial velocity `velocity` (per second; negative moves toward the target), natural frequency `omega` (rad/s), damping ratio `zeta`. centerX, centerY, width and height are the travelling member, normalized between the trigger (0) and the panel (1).",
6
6
  "open": "ms after the trigger release +43 ms. Fitted to the native outline bounds (union of trigger and drop), RMS 0.018-0.041 per axis (native measurements).",
@@ -3,7 +3,7 @@ import { type FieldSpring } from '../fieldMotion.js';
3
3
  * Motion of the TabView bottom accessory between its expanded row (above the tab bar) and its
4
4
  * inline row (beside the minimized tab circle).
5
5
  *
6
- * Native reference: stock SwiftUI `.tabViewBottomAccessory` + `.tabBarMinimizeBehavior(.onScrollDown)`
6
+ * Measured bottom accessory motion during tab-bar minimization
7
7
  * with three Music-style tabs, iPhone 17 Pro Max, iOS 27.0 Simulator, counter-retimed
8
8
  * (RMS 2.6 pt collapse, 1.1 pt
9
9
  * expand). Each edge follows an underdamped spring (damping ratio about 0.72), and the two axes
@@ -2,7 +2,7 @@ import type { CapsuleShape } from '../renderSpecs.js';
2
2
  /**
3
3
  * The trailing Search member of a minimizing tab bar (`Tab(role: .search)` on iPhone).
4
4
  *
5
- * Native reference: stock SwiftUI on iOS 27.0, iPhone 17 Pro Max (search-tab-split, Simulator
5
+ * Native reference: native controls on iOS 27.0, iPhone 17 Pro Max (search-tab-split, Simulator
6
6
  * tracks at 60 Hz) and the owner's Apple Music recording on a physical iPhone. On collapse the
7
7
  * bar's trailing end separates into its own capsule within one or two frames: at the split it
8
8
  * spans x = 339–413 of the 21–419 bar, full height. It then narrows from its leading edge into
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The trailing Search member of a minimizing tab bar (`Tab(role: .search)` on iPhone).
3
3
  *
4
- * Native reference: stock SwiftUI on iOS 27.0, iPhone 17 Pro Max (search-tab-split, Simulator
4
+ * Native reference: native controls on iOS 27.0, iPhone 17 Pro Max (search-tab-split, Simulator
5
5
  * tracks at 60 Hz) and the owner's Apple Music recording on a physical iPhone. On collapse the
6
6
  * bar's trailing end separates into its own capsule within one or two frames: at the split it
7
7
  * spans x = 339–413 of the 21–419 bar, full height. It then narrows from its leading edge into
@@ -7,6 +7,8 @@ export type RegisteredTabBar = TabBarProps & Readonly<{
7
7
  /** 'top': the regular-width iPad bar, laid out by `itemFrames` inside `insetHost`. */
8
8
  placement?: 'bottom' | 'top';
9
9
  itemFrames?: readonly TabItemFrame[];
10
+ /** iPad search handoff; applied to material, foreground and controls together. */
11
+ searchProgress?: number;
10
12
  }>;
11
13
  export type MaterialEffectRegistration = Readonly<{
12
14
  /** The one glass renderer. */
@@ -2,6 +2,8 @@ import type { MenuEntry } from './menuTypes.js';
2
2
  import { type MenuContactSample } from '../menu/menuContact.js';
3
3
  import { type ReactNode } from 'react';
4
4
  import { type PressableProps } from '../press/Pressable.js';
5
+ /** The props a custom `Menu` trigger receives. Forward all of them to the element that opens the
6
+ * menu. */
5
7
  export type MenuTriggerProps = Pick<PressableProps, 'onPress' | 'disabled' | 'aria-expanded' | 'aria-haspopup' | 'aria-controls'>;
6
8
  export type MenuProps = Readonly<{
7
9
  label: ReactNode;
@@ -58,7 +58,7 @@ const MENU_GLYPH_RETURN_MS = 400;
58
58
  /** Safety margin past the close morph for the renderer's settle acknowledgement. */
59
59
  const MENU_SETTLE_TIMEOUT_MS = 700;
60
60
  /** The order of a menu that opens upward: the first action nearest the trigger, so the list and
61
- * each section in it read bottom to top (stock SwiftUI Menu, iPhone, a trigger near the bottom of
61
+ * each section in it read bottom to top (native menu, iPhone, a trigger near the bottom of
62
62
  * the screen). A submenu's own rows open separately and keep their order. */
63
63
  function nearestFirst(actions) {
64
64
  return [...actions]
@@ -45,7 +45,8 @@ type GlassRect = Readonly<{
45
45
  width: number;
46
46
  height: number;
47
47
  }>;
48
- /** Normalized RGBA channels in 0...1. Glass.tintRGBA rejects nonfinite or out-of-range channels. */
48
+ /** A glass tint as red, green, blue and alpha channels from 0 to 1. `Glass.tintRGBA` rejects
49
+ * values outside that range. */
49
50
  export type GlassTint = readonly [red: number, green: number, blue: number, alpha: number];
50
51
  export type GlassMaterial = Readonly<{
51
52
  variant: 'regular' | 'clear';
@@ -225,7 +226,7 @@ export declare function glassPresenterBounds(frame: GlassRegion['frame'], inset:
225
226
  * The 12M guard permits that stack plus chrome; it is not a memory benchmark. */
226
227
  export declare const GLASS_REGION_LIMIT = 16;
227
228
  export declare const GLASS_REGION_PIXEL_LIMIT = 12000000;
228
- /** Immutable SwiftUI-style material values. RGBA channels use the range 0...1. */
229
+ /** Immutable glass material values. RGBA channels use the range 0...1. */
229
230
  export declare class Glass {
230
231
  static readonly regular: Glass;
231
232
  static readonly clear: Glass;
@@ -26,7 +26,7 @@ export function glassPresenterBounds(frame, inset, emerge) {
26
26
  * The 12M guard permits that stack plus chrome; it is not a memory benchmark. */
27
27
  export const GLASS_REGION_LIMIT = 16;
28
28
  export const GLASS_REGION_PIXEL_LIMIT = 12_000_000;
29
- /** Immutable SwiftUI-style material values. RGBA channels use the range 0...1. */
29
+ /** Immutable glass material values. RGBA channels use the range 0...1. */
30
30
  export class Glass {
31
31
  static regular = new Glass('regular');
32
32
  static clear = new Glass('clear');
@@ -202,6 +202,7 @@ export type RuntimeGeometry = Readonly<{
202
202
  tabBarPillWidths?: readonly number[];
203
203
  /** 'top' is the regular-width iPad tab bar; the phone dock is 'bottom' (the default). */
204
204
  tabBarPlacement?: 'bottom' | 'top';
205
+ tabBarOpacity?: number;
205
206
  tabBarPillHeight?: number;
206
207
  tabBarPillCenterY?: number;
207
208
  tabBarCentres?: readonly number[];
@@ -151,6 +151,7 @@ export function createRenderSpecs(geometry, appearance = 'light', liquidMotion =
151
151
  frameX: geometry.dockX,
152
152
  frameY: geometry.dockY,
153
153
  id: 'dock',
154
+ opacity: geometry.tabBarOpacity,
154
155
  radius: geometry.dockRadius,
155
156
  },
156
157
  {
@@ -8,7 +8,7 @@ import type { SurfaceRenderSpec } from './renderSpecs.js';
8
8
  * seems to slide and smear while nothing behind it moves (owner, Oct 13: "it looks like content is
9
9
  * moving underneath as the menu grows").
10
10
  *
11
- * Native Liquid Glass keeps the content behind it in place: only the edge moves. A shape track
11
+ * Native glass keeps the content behind it in place: only the edge moves. A shape track
12
12
  * does the same. The element keeps one layout box for the whole run (the envelope of every frame
13
13
  * the glass passes through), so its canvas never resizes or moves and samples the page where it
14
14
  * really is. The worker draws the glass at the track's frame for each frame's presentation time,
@@ -1,6 +1,6 @@
1
1
  import { type SpringParameters } from '../motion/springTrack.js';
2
2
  /**
3
- * Nested menus, measured from stock SwiftUI on iOS 27.0 (submenus/SPEC.md).
3
+ * Nested menus, measured from native controls on iOS 27.0 (submenus/SPEC.md).
4
4
  *
5
5
  * iPhone stacks each submenu over its parent: the parent shrinks to 0.97 about its top edge and
6
6
  * its rows dim to half ink, and the child grows out of the row that opened it into a full-width
@@ -4,7 +4,7 @@ import { setGlassShapeTrack } from './shapeTrackRegistry.js';
4
4
  import { shapeTrackClock, shapeTrackEnvelope, shapeTrackFrame, } from './shapeTrack.js';
5
5
  import { springMotion, springTrack, sampledKeyframes, } from '../motion/springTrack.js';
6
6
  /**
7
- * Nested menus, measured from stock SwiftUI on iOS 27.0 (submenus/SPEC.md).
7
+ * Nested menus, measured from native controls on iOS 27.0 (submenus/SPEC.md).
8
8
  *
9
9
  * iPhone stacks each submenu over its parent: the parent shrinks to 0.97 about its top edge and
10
10
  * its rows dim to half ink, and the child grows out of the row that opened it into a full-width
@@ -0,0 +1,29 @@
1
+ /** Exterior rim measured from the iOS 27 stock 44 pt circle, at 3 device pixels/pt.
2
+ * See scripts/research/glass-blackroom/fit-rim.py and the round-2 evidence packet.
3
+ *
4
+ * The dark line is outside the material aperture. Its colour comes from the local
5
+ * backdrop, while the interior specular is a separate normal-dependent lobe.
6
+ * Both lateral normals have the same response; a signed horizontal term would
7
+ * introduce lighting that the native flat-background captures do not contain.
8
+ */
9
+ export declare function controlRimUniform(appearance: 'light' | 'dark'): [number, number, number, number];
10
+ /** Native dark regular glass changes with the short side, independently of corner radius.
11
+ * The 44/50/62/64/70/80/100 pt sweep measured white interior 185/185/185/185/175/159/128.
12
+ * Grey and 75% grey deltas follow backdrop squared. Limit extrapolation to the measured range.
13
+ */
14
+ export declare function controlSizeResponse(appearance: 'light' | 'dark', width: number, height: number): number;
15
+ /** White backdrop, bottom exterior at 2 pt: native 44/62 pt controls are 252,
16
+ * 80 pt controls are 248 light / 246 dark; the unscaled kernel is 245.
17
+ * Keep the broad shadow separate from the sub-point rim coverage.
18
+ */
19
+ export declare function controlShadowScale(appearance: 'light' | 'dark', width: number, height: number): number;
20
+ /** Native 44 pt sweep at background code levels 32/64/96/128: first exterior pixel 6/17/32/52. */
21
+ export declare const CONTROL_RIM_LOW_LUMA_GAIN = 0.6891894;
22
+ /** Joint least-squares fit of the unclipped black/grey/white cardinal profiles.
23
+ * Final amplitudes include the 1.02493656 contrast fit over 32 unclipped flat-background
24
+ * vertical rays after the measured size response. Photo cases were held out.
25
+ * Shared across appearances: the native colour matrix supplies their different contrast.
26
+ * Narrow support/amount, diffuse support/amount (all support distances in points).
27
+ */
28
+ export declare const CONTROL_SPECULAR: readonly [1.25, 1.5385214, 6.4, 0.38803352];
29
+ export declare const controlRimWGSL = "\nfn materialBoundary(distance: f32, normal: vec2<f32>, uv: vec2<f32>) -> vec4<f32> {\n let rim = global.uControlRim_slot;\n let angular = normal.x * normal.x + rim.w * normal.y * normal.y;\n let backdrop = materialMip(uv, 0.0);\n let luminance = dot(backdrop, vec3f(0.2126, 0.7152, 0.0722));\n let opacity = rim.y + 0.6891894 * max(0.5 - luminance, 0.0);\n let radial = opacity * clamp(1.0 - max(distance, 0.0) / rim.x, 0.0, 1.0);\n // Size sweep: exterior contrast changes linearly above mid-grey, while the face\n // changes quadratically. Normalizing by luminance expresses that contrast as coverage.\n let sizeContrast = global.uControlSize_slot.x * max(2.0 * luminance - 1.0, 0.0);\n let sizeCoverage = sizeContrast / max(0.6 * luminance, 0.001);\n let coverage = clamp(radial * angular * (1.0 + sizeCoverage), 0.0, 1.0);\n // Nine-level native sweep: light reflects a quadratic colour transform;\n // dark retains a small highlight in the upper half of the backdrop range.\n let lightColour = clamp(backdrop * (backdrop - vec3f(0.5)), vec3f(0.0), vec3f(1.0));\n let darkColour = 0.6 * max(backdrop - vec3f(0.5), vec3f(0.0)) * (vec3f(1.0) - backdrop);\n let colour = mix(lightColour, darkColour, rim.z);\n return vec4f(colour * coverage, coverage);\n}\nfn controlSpecular(distance: f32, normal: vec2<f32>) -> f32 {\n let profile = global.uControlSpecular_slot;\n let depth = max(-distance, 0.0);\n let narrow = profile.y * max(1.0 - depth / profile.x, 0.0);\n let diffuse = profile.w * max(1.0 - depth / profile.z, 0.0);\n let facing = clamp((abs(normal.y) - 0.16) / 0.84, 0.0, 1.0);\n return (narrow + diffuse) * facing * facing * facing;\n}\n";
@@ -0,0 +1,68 @@
1
+ /** Exterior rim measured from the iOS 27 stock 44 pt circle, at 3 device pixels/pt.
2
+ * See scripts/research/glass-blackroom/fit-rim.py and the round-2 evidence packet.
3
+ *
4
+ * The dark line is outside the material aperture. Its colour comes from the local
5
+ * backdrop, while the interior specular is a separate normal-dependent lobe.
6
+ * Both lateral normals have the same response; a signed horizontal term would
7
+ * introduce lighting that the native flat-background captures do not contain.
8
+ */
9
+ export function controlRimUniform(appearance) {
10
+ // Coverage/low-luma gain jointly fit to 36 native pixels over nine backdrop levels.
11
+ // Exterior support (pt), coverage at contour, dark-appearance blend, vertical response.
12
+ return appearance === 'light' ? [5 / 6, 0.75531308, 0, 0.32] : [5 / 6, 0.75531308, 1, 0];
13
+ }
14
+ /** Native dark regular glass changes with the short side, independently of corner radius.
15
+ * The 44/50/62/64/70/80/100 pt sweep measured white interior 185/185/185/185/175/159/128.
16
+ * Grey and 75% grey deltas follow backdrop squared. Limit extrapolation to the measured range.
17
+ */
18
+ export function controlSizeResponse(appearance, width, height) {
19
+ return appearance === 'dark'
20
+ ? (1.6 / 255) * Math.min(36, Math.max(0, Math.min(width, height) - 64))
21
+ : 0;
22
+ }
23
+ /** White backdrop, bottom exterior at 2 pt: native 44/62 pt controls are 252,
24
+ * 80 pt controls are 248 light / 246 dark; the unscaled kernel is 245.
25
+ * Keep the broad shadow separate from the sub-point rim coverage.
26
+ */
27
+ export function controlShadowScale(appearance, width, height) {
28
+ const growth = Math.min(16, Math.max(0, Math.min(width, height) - 64)) / 16;
29
+ return 0.3 + (appearance === 'dark' ? 0.6 : 0.4) * growth;
30
+ }
31
+ /** Native 44 pt sweep at background code levels 32/64/96/128: first exterior pixel 6/17/32/52. */
32
+ export const CONTROL_RIM_LOW_LUMA_GAIN = 0.6891894;
33
+ /** Joint least-squares fit of the unclipped black/grey/white cardinal profiles.
34
+ * Final amplitudes include the 1.02493656 contrast fit over 32 unclipped flat-background
35
+ * vertical rays after the measured size response. Photo cases were held out.
36
+ * Shared across appearances: the native colour matrix supplies their different contrast.
37
+ * Narrow support/amount, diffuse support/amount (all support distances in points).
38
+ */
39
+ export const CONTROL_SPECULAR = [1.25, 1.5385214, 6.4, 0.38803352];
40
+ export const controlRimWGSL = /* wgsl */ `
41
+ fn materialBoundary(distance: f32, normal: vec2<f32>, uv: vec2<f32>) -> vec4<f32> {
42
+ let rim = global.uControlRim_slot;
43
+ let angular = normal.x * normal.x + rim.w * normal.y * normal.y;
44
+ let backdrop = materialMip(uv, 0.0);
45
+ let luminance = dot(backdrop, vec3f(0.2126, 0.7152, 0.0722));
46
+ let opacity = rim.y + ${CONTROL_RIM_LOW_LUMA_GAIN} * max(0.5 - luminance, 0.0);
47
+ let radial = opacity * clamp(1.0 - max(distance, 0.0) / rim.x, 0.0, 1.0);
48
+ // Size sweep: exterior contrast changes linearly above mid-grey, while the face
49
+ // changes quadratically. Normalizing by luminance expresses that contrast as coverage.
50
+ let sizeContrast = global.uControlSize_slot.x * max(2.0 * luminance - 1.0, 0.0);
51
+ let sizeCoverage = sizeContrast / max(0.6 * luminance, 0.001);
52
+ let coverage = clamp(radial * angular * (1.0 + sizeCoverage), 0.0, 1.0);
53
+ // Nine-level native sweep: light reflects a quadratic colour transform;
54
+ // dark retains a small highlight in the upper half of the backdrop range.
55
+ let lightColour = clamp(backdrop * (backdrop - vec3f(0.5)), vec3f(0.0), vec3f(1.0));
56
+ let darkColour = 0.6 * max(backdrop - vec3f(0.5), vec3f(0.0)) * (vec3f(1.0) - backdrop);
57
+ let colour = mix(lightColour, darkColour, rim.z);
58
+ return vec4f(colour * coverage, coverage);
59
+ }
60
+ fn controlSpecular(distance: f32, normal: vec2<f32>) -> f32 {
61
+ let profile = global.uControlSpecular_slot;
62
+ let depth = max(-distance, 0.0);
63
+ let narrow = profile.y * max(1.0 - depth / profile.x, 0.0);
64
+ let diffuse = profile.w * max(1.0 - depth / profile.z, 0.0);
65
+ let facing = clamp((abs(normal.y) - 0.16) / 0.84, 0.0, 1.0);
66
+ return (narrow + diffuse) * facing * facing * facing;
67
+ }
68
+ `;
@@ -1,16 +1,13 @@
1
- import { WorkerFrameClock } from './frameClock.js';
1
+ import { workerAnimationFrameClock } from './frameClock.js';
2
2
  import { glassFailureCode } from './errorCode.js';
3
3
  import { createWebGPURenderer } from './renderer.js';
4
4
  import { glassTiming, setGlassTimingSink } from './profile.js';
5
5
  setGlassTimingSink(event => globalThis.postMessage({ glassProfile: event }));
6
6
  glassTiming('worker-start');
7
- const clock = new WorkerFrameClock(message => globalThis.postMessage(message));
7
+ const clock = workerAnimationFrameClock;
8
8
  const renderer = createWebGPURenderer(message => globalThis.postMessage(message), clock);
9
9
  globalThis.onmessage = event => {
10
- if (event.data.request?.type === 'page-frame')
11
- clock.receive(event.data.request);
12
- else
13
- renderer.receive(event);
10
+ renderer.receive(event);
14
11
  };
15
12
  globalThis.addEventListener('error', event => globalThis.postMessage({
16
13
  glassError: {
@@ -1,18 +1,22 @@
1
1
  import type { Envelope } from '../worker/protocol.js';
2
2
  /** Epoch milliseconds from the document's animation frame, shared with WAAPI. */
3
3
  export interface FrameClock {
4
+ readonly kind?: 'page-raf' | 'worker-raf';
4
5
  request(callback: (at: number) => void): number;
5
6
  cancel(token: number): void;
6
7
  }
7
8
  export declare const documentFrameClock: FrameClock;
9
+ /** A retained worker timeline can sample without a page callback or message round trip.
10
+ * Both realms use epoch milliseconds, so the same WAAPI track remains the time authority. */
11
+ export declare const workerAnimationFrameClock: FrameClock;
8
12
  type FrameRequest = {
9
13
  glassFrame: {
10
14
  token: number;
11
15
  cancel?: boolean;
12
16
  };
13
17
  };
14
- /** The experimental worker renderer asks the page for one frame at a time.
15
- * Worker rAF can run faster than the page and is not a presentation clock. */
18
+ /** Page-linked worker clock retained for diagnostic comparisons. Its round trip
19
+ * also inherits page stalls; the independent worker renderer does not use it. */
16
20
  export declare class WorkerFrameClock implements FrameClock {
17
21
  private sequence;
18
22
  private pending?;
@@ -1,9 +1,16 @@
1
1
  export const documentFrameClock = {
2
+ kind: 'page-raf',
2
3
  request: callback => requestAnimationFrame(timestamp => callback(performance.timeOrigin + timestamp)),
3
4
  cancel: token => cancelAnimationFrame(token),
4
5
  };
5
- /** The experimental worker renderer asks the page for one frame at a time.
6
- * Worker rAF can run faster than the page and is not a presentation clock. */
6
+ /** A retained worker timeline can sample without a page callback or message round trip.
7
+ * Both realms use epoch milliseconds, so the same WAAPI track remains the time authority. */
8
+ export const workerAnimationFrameClock = {
9
+ ...documentFrameClock,
10
+ kind: 'worker-raf',
11
+ };
12
+ /** Page-linked worker clock retained for diagnostic comparisons. Its round trip
13
+ * also inherits page stalls; the independent worker renderer does not use it. */
7
14
  export class WorkerFrameClock {
8
15
  sequence = 0;
9
16
  pending;
@@ -44,7 +44,7 @@ export declare class FrameProbe {
44
44
  private post;
45
45
  constructor(post: (summary: FrameSummary[]) => void);
46
46
  get timestampQuery(): boolean;
47
- useDevice(device: GPUDevice | undefined): void;
47
+ useDevice(device: GPUDevice | undefined, gpuTiming?: boolean): void;
48
48
  /** Wraps one frame's encoding and submission. Returns the frame's sample: its completion and
49
49
  * GPU times are filled in when they arrive. */
50
50
  frame(kind: FrameKind, interval: number | null, restart: boolean, encode: (e: GPUCommandEncoder) => void, canSubmit?: () => boolean): FrameProbeSample | undefined;
@@ -78,12 +78,12 @@ export class FrameProbe {
78
78
  this.post = post;
79
79
  }
80
80
  get timestampQuery() {
81
- return !!this.device?.features.has('timestamp-query');
81
+ return !!this.timer;
82
82
  }
83
- useDevice(device) {
83
+ useDevice(device, gpuTiming = true) {
84
84
  this.device = device;
85
85
  this.timer = undefined;
86
- if (device?.features.has('timestamp-query'))
86
+ if (gpuTiming && device?.features.has('timestamp-query'))
87
87
  try {
88
88
  this.timer = new GPUFrameTimer(device);
89
89
  }
@@ -1,7 +1,7 @@
1
1
  declare const shaders: {
2
2
  bar: {
3
- readonly wgsl: 'diagnostic(off, derivative_uniformity);\nstruct Parameters {\n uInputSize_slot: vec4<f32>,\n uInputClamp_slot: vec4<f32>,\n uResolution_slot: vec4<f32>,\n uShape_slot: vec4<f32>,\n uRadius_slot: vec4<f32>,\n uMorphParams_slot: vec4<f32>,\n uMorphShape0_slot: vec4<f32>,\n uMorphShape1_slot: vec4<f32>,\n uMorphShape2_slot: vec4<f32>,\n uMorphShape3_slot: vec4<f32>,\n uMorphShape4_slot: vec4<f32>,\n uMorphShape5_slot: vec4<f32>,\n uMorphShape6_slot: vec4<f32>,\n uMorphShape7_slot: vec4<f32>,\n uMorphShape8_slot: vec4<f32>,\n uMorphShape9_slot: vec4<f32>,\n uMorphShape10_slot: vec4<f32>,\n uMorphShape11_slot: vec4<f32>,\n uMorphShape12_slot: vec4<f32>,\n uMorphShape13_slot: vec4<f32>,\n uMorphShape14_slot: vec4<f32>,\n uMorphShape15_slot: vec4<f32>,\n uMorphRadii0_slot: vec4<f32>,\n uMorphRadii1_slot: vec4<f32>,\n uMorphRadii2_slot: vec4<f32>,\n uMorphRadii3_slot: vec4<f32>,\n uMaterialUnits_slot: vec4<f32>,\n uMaterialInner_slot: vec4<f32>,\n uMaterialOuter_slot: vec4<f32>,\n uMaterialBlend_slot: vec4<f32>,\n uMaterialBlurFill_slot: vec4<f32>,\n uMaterialBlurDistances_slot: vec4<f32>,\n uMaterialBlurDifferences_slot: vec4<f32>,\n uMaterialAberration_slot: vec4<f32>,\n uMaterialAberrationDirection_slot: vec4<f32>,\n uMaterialFace0_slot: vec4<f32>,\n uMaterialFace1_slot: vec4<f32>,\n uMaterialFace2_slot: vec4<f32>,\n uMaterialBleed0_slot: vec4<f32>,\n uMaterialBleed1_slot: vec4<f32>,\n uMaterialBleed2_slot: vec4<f32>,\n uMaterialShadow0_slot: vec4<f32>,\n uMaterialShadow1_slot: vec4<f32>,\n uMaterialShadow2_slot: vec4<f32>,\n uMaterialShadowField_slot: vec4<f32>,\n uMaterialShadowResponse_slot: vec4<f32>,\n uMaterialShadowOffset_slot: vec4<f32>,\n uMaterialColour_slot: vec4<f32>,\n uMaterialBleed_slot: vec4<f32>,\n uMaterialBleedField_slot: vec4<f32>,\n uMaterialBackgroundKey_slot: vec4<f32>,\n uMaterialBackgroundLight_slot: vec4<f32>,\n uMaterialKey_slot: vec4<f32>,\n uMaterialFill_slot: vec4<f32>,\n uMaterialLight_slot: vec4<f32>,\n uMaterialRim_slot: vec4<f32>,\n uMaterialContourAngular_slot: vec4<f32>,\n uMaterialSdfProjection_slot: vec4<f32>,\n uMaterialSdfDiffuse_slot: vec4<f32>,\n uMaterialSdfKey_slot: vec4<f32>,\n uMaterialSdfFill_slot: vec4<f32>,\n uMaterialSdfAngles_slot: vec4<f32>,\n uMaterialSdf0_slot: vec4<f32>,\n uMaterialSdf1_slot: vec4<f32>,\n uMaterialSdf2_slot: vec4<f32>,\n uMaterialMix_slot: vec4<f32>,\n uCoverageWidth_slot: vec4<f32>,\n uDiagnosticOutput_slot: vec4<f32>,\n uInnerShade_slot: vec4<f32>,\n uTouchLight_slot: vec4<f32>,\n uTouchLightColour_slot: vec4<f32>,\n uTabBarOptics_slot: vec4<f32>,\n kernelScale_slot: vec4<f32>,\n}\n\nstruct FragmentOutput {\n @location(0) finalColor: vec4<f32>,\n}\n\n@group(0) @binding(0) \nvar<uniform> global: Parameters;\n@group(0) @binding(1) \nvar sourceSampler: sampler;\n@group(0) @binding(2) \nvar uTexture_texture: texture_2d<f32>;\n@group(0) @binding(3) \nvar uSource_texture: texture_2d<f32>;\nvar<private> vTextureCoord_1: vec2<f32>;\nvar<private> vFilterCoord_1: vec2<f32>;\nvar<private> finalColor: vec4<f32>;\n\nfn sdRoundRect(p: vec2<f32>, halfSize: vec2<f32>, radius: f32) -> f32 {\n var p_1: vec2<f32>;\n var halfSize_1: vec2<f32>;\n var radius_1: f32;\n var q: vec2<f32>;\n\n p_1 = p;\n halfSize_1 = halfSize;\n radius_1 = radius;\n let _e105 = p_1;\n let _e107 = halfSize_1;\n let _e109 = radius_1;\n q = ((abs(_e105) - _e107) + vec2(_e109));\n let _e113 = q;\n let _e115 = q;\n let _e120 = q;\n let _e126 = radius_1;\n return ((min(max(_e113.x, _e115.y), 0f) + length(max(_e120, vec2(0f)))) - _e126);\n}\n\nfn morphMemberDistance(p_2: vec2<f32>, shape: vec4<f32>, radius_2: f32) -> f32 {\n var p_3: vec2<f32>;\n var shape_1: vec4<f32>;\n var radius_3: f32;\n var q_1: vec2<f32>;\n\n p_3 = p_2;\n shape_1 = shape;\n radius_3 = radius_2;\n let _e147 = p_3;\n let _e148 = shape_1;\n let _e152 = shape_1;\n let _e155 = radius_3;\n q_1 = ((abs((_e147 - _e148.xy)) - _e152.zw) + vec2(_e155));\n let _e159 = q_1;\n let _e161 = q_1;\n let _e166 = q_1;\n let _e173 = radius_3;\n return ((min(max(_e159.x, _e161.y), 0f) + length(max(_e166, vec2(0f)))) - _e173);\n}\n\nfn morphSmoothMin(a: f32, b: f32) -> f32 {\n var a_1: f32;\n var b_1: f32;\n var k: f32;\n var h: f32;\n\n a_1 = a;\n b_1 = b;\n let _e145 = global.uMorphParams_slot;\n k = _e145.y;\n let _e148 = k;\n if (_e148 <= 0f) {\n let _e151 = a_1;\n let _e152 = b_1;\n return min(_e151, _e152);\n }\n let _e154 = k;\n let _e155 = a_1;\n let _e156 = b_1;\n let _e162 = k;\n h = (max((_e154 - abs((_e155 - _e156))), 0f) / _e162);\n let _e165 = a_1;\n let _e166 = b_1;\n let _e168 = h;\n let _e169 = h;\n let _e171 = k;\n return (min(_e165, _e166) - (((_e168 * _e169) * _e171) * 0.25f));\n}\n\nfn morphMemberNormal(p_4: vec2<f32>, shape_2: vec4<f32>, radius_4: f32) -> vec2<f32> {\n var p_5: vec2<f32>;\n var shape_3: vec4<f32>;\n var radius_5: f32;\n var delta: vec2<f32>;\n var q_2: vec2<f32>;\n var n: vec2<f32>;\n var local: vec2<f32>;\n\n p_5 = p_4;\n shape_3 = shape_2;\n radius_5 = radius_4;\n let _e147 = p_5;\n let _e148 = shape_3;\n delta = (_e147 - _e148.xy);\n let _e152 = delta;\n let _e154 = shape_3;\n let _e157 = radius_5;\n q_2 = ((abs(_e152) - _e154.zw) + vec2(_e157));\n let _e161 = q_2;\n let _e166 = delta;\n n = (max(_e161, vec2(0f)) * sign(_e166));\n let _e170 = q_2;\n let _e172 = q_2;\n if (max(_e170.x, _e172.y) <= 0f) {\n let _e177 = q_2;\n let _e179 = q_2;\n if (_e177.x >= _e179.y) {\n let _e182 = delta;\n local = vec2<f32>(sign(_e182.x), 0f);\n } else {\n let _e189 = delta;\n local = vec2<f32>(0f, sign(_e189.y));\n }\n let _e195 = local;\n n = _e195;\n }\n let _e196 = n;\n let _e197 = n;\n return (_e196 / vec2(max(length(_e197), 0.00000001f)));\n}\n\nfn morphAdd(p_6: vec2<f32>, shape_4: vec4<f32>, radius_6: f32, d: ptr<function, f32>, n_1: ptr<function, vec2<f32>>) {\n var p_7: vec2<f32>;\n var shape_5: vec4<f32>;\n var radius_7: f32;\n var b_2: f32;\n var nb: vec2<f32>;\n var k_1: f32;\n var h_1: f32;\n var w: f32;\n\n p_7 = p_6;\n shape_5 = shape_4;\n radius_7 = radius_6;\n let _e149 = p_7;\n let _e150 = shape_5;\n let _e151 = radius_7;\n let _e152 = morphMemberDistance(_e149, _e150, _e151);\n b_2 = _e152;\n let _e154 = p_7;\n let _e155 = shape_5;\n let _e156 = radius_7;\n let _e157 = morphMemberNormal(_e154, _e155, _e156);\n nb = _e157;\n let _e159 = (*d);\n if (_e159 > 1000000000f) {\n {\n let _e162 = b_2;\n (*d) = _e162;\n let _e163 = nb;\n (*n_1) = _e163;\n return;\n }\n }\n let _e164 = global.uMorphParams_slot;\n let _e167 = (*n_1);\n let _e168 = nb;\n k_1 = (_e164.y * pow(clamp(((1f - dot(_e167, _e168)) * 0.5f), 0f, 1f), 1f));\n let _e181 = k_1;\n if (_e181 <= 0.0001f) {\n {\n let _e184 = b_2;\n let _e185 = (*d);\n if (_e184 < _e185) {\n {\n let _e187 = b_2;\n (*d) = _e187;\n let _e188 = nb;\n (*n_1) = _e188;\n }\n }\n return;\n }\n }\n let _e189 = k_1;\n let _e190 = (*d);\n let _e191 = b_2;\n let _e197 = k_1;\n h_1 = (max((_e189 - abs((_e190 - _e191))), 0f) / _e197);\n let _e201 = (*d);\n let _e202 = b_2;\n let _e205 = k_1;\n w = clamp((0.5f + ((_e201 - _e202) / (2f * _e205))), 0f, 1f);\n let _e213 = (*d);\n let _e214 = b_2;\n let _e216 = h_1;\n let _e217 = h_1;\n let _e219 = k_1;\n (*d) = (min(_e213, _e214) - (((_e216 * _e217) * _e219) * 0.25f));\n let _e224 = (*n_1);\n let _e225 = nb;\n let _e226 = w;\n (*n_1) = mix(_e224, _e225, vec2(_e226));\n let _e229 = (*n_1);\n let _e230 = (*n_1);\n (*n_1) = (_e229 / vec2(max(length(_e230), 0.00000001f)));\n return;\n}\n\nfn morphRawDistance(p_8: vec2<f32>) -> f32 {\n var p_9: vec2<f32>;\n var d_1: f32 = 10000000000f;\n var n_2: vec2<f32> = vec2(0f);\n\n p_9 = p_8;\n let _e149 = global.uMorphParams_slot;\n if (_e149.x > 0.5f) {\n let _e153 = p_9;\n let _e154 = global.uMorphShape0_slot;\n let _e155 = global.uMorphRadii0_slot;\n morphAdd(_e153, _e154, _e155.x, (&d_1), (&n_2));\n }\n let _e161 = global.uMorphParams_slot;\n if (_e161.x > 1.5f) {\n let _e165 = p_9;\n let _e166 = global.uMorphShape1_slot;\n let _e167 = global.uMorphRadii0_slot;\n morphAdd(_e165, _e166, _e167.y, (&d_1), (&n_2));\n }\n let _e173 = global.uMorphParams_slot;\n if (_e173.x > 2.5f) {\n let _e177 = p_9;\n let _e178 = global.uMorphShape2_slot;\n let _e179 = global.uMorphRadii0_slot;\n morphAdd(_e177, _e178, _e179.z, (&d_1), (&n_2));\n }\n let _e185 = global.uMorphParams_slot;\n if (_e185.x > 3.5f) {\n let _e189 = p_9;\n let _e190 = global.uMorphShape3_slot;\n let _e191 = global.uMorphRadii0_slot;\n morphAdd(_e189, _e190, _e191.w, (&d_1), (&n_2));\n }\n let _e197 = global.uMorphParams_slot;\n if (_e197.x > 4.5f) {\n let _e201 = p_9;\n let _e202 = global.uMorphShape4_slot;\n let _e203 = global.uMorphRadii1_slot;\n morphAdd(_e201, _e202, _e203.x, (&d_1), (&n_2));\n }\n let _e209 = global.uMorphParams_slot;\n if (_e209.x > 5.5f) {\n let _e213 = p_9;\n let _e214 = global.uMorphShape5_slot;\n let _e215 = global.uMorphRadii1_slot;\n morphAdd(_e213, _e214, _e215.y, (&d_1), (&n_2));\n }\n let _e221 = global.uMorphParams_slot;\n if (_e221.x > 6.5f) {\n let _e225 = p_9;\n let _e226 = global.uMorphShape6_slot;\n let _e227 = global.uMorphRadii1_slot;\n morphAdd(_e225, _e226, _e227.z, (&d_1), (&n_2));\n }\n let _e233 = global.uMorphParams_slot;\n if (_e233.x > 7.5f) {\n let _e237 = p_9;\n let _e238 = global.uMorphShape7_slot;\n let _e239 = global.uMorphRadii1_slot;\n morphAdd(_e237, _e238, _e239.w, (&d_1), (&n_2));\n }\n let _e245 = global.uMorphParams_slot;\n if (_e245.x > 8.5f) {\n let _e249 = p_9;\n let _e250 = global.uMorphShape8_slot;\n let _e251 = global.uMorphRadii2_slot;\n morphAdd(_e249, _e250, _e251.x, (&d_1), (&n_2));\n }\n let _e257 = global.uMorphParams_slot;\n if (_e257.x > 9.5f) {\n let _e261 = p_9;\n let _e262 = global.uMorphShape9_slot;\n let _e263 = global.uMorphRadii2_slot;\n morphAdd(_e261, _e262, _e263.y, (&d_1), (&n_2));\n }\n let _e269 = global.uMorphParams_slot;\n if (_e269.x > 10.5f) {\n let _e273 = p_9;\n let _e274 = global.uMorphShape10_slot;\n let _e275 = global.uMorphRadii2_slot;\n morphAdd(_e273, _e274, _e275.z, (&d_1), (&n_2));\n }\n let _e281 = global.uMorphParams_slot;\n if (_e281.x > 11.5f) {\n let _e285 = p_9;\n let _e286 = global.uMorphShape11_slot;\n let _e287 = global.uMorphRadii2_slot;\n morphAdd(_e285, _e286, _e287.w, (&d_1), (&n_2));\n }\n let _e293 = global.uMorphParams_slot;\n if (_e293.x > 12.5f) {\n let _e297 = p_9;\n let _e298 = global.uMorphShape12_slot;\n let _e299 = global.uMorphRadii3_slot;\n morphAdd(_e297, _e298, _e299.x, (&d_1), (&n_2));\n }\n let _e305 = global.uMorphParams_slot;\n if (_e305.x > 13.5f) {\n let _e309 = p_9;\n let _e310 = global.uMorphShape13_slot;\n let _e311 = global.uMorphRadii3_slot;\n morphAdd(_e309, _e310, _e311.y, (&d_1), (&n_2));\n }\n let _e317 = global.uMorphParams_slot;\n if (_e317.x > 14.5f) {\n let _e321 = p_9;\n let _e322 = global.uMorphShape14_slot;\n let _e323 = global.uMorphRadii3_slot;\n morphAdd(_e321, _e322, _e323.z, (&d_1), (&n_2));\n }\n let _e329 = global.uMorphParams_slot;\n if (_e329.x > 15.5f) {\n let _e333 = p_9;\n let _e334 = global.uMorphShape15_slot;\n let _e335 = global.uMorphRadii3_slot;\n morphAdd(_e333, _e334, _e335.w, (&d_1), (&n_2));\n }\n let _e341 = d_1;\n return _e341;\n}\n\nfn morphGradient(p_10: vec2<f32>) -> vec2<f32> {\n var p_11: vec2<f32>;\n var e: f32 = 0.1f;\n\n p_11 = p_10;\n let _e145 = p_11;\n let _e146 = e;\n let _e151 = morphRawDistance((_e145 + vec2<f32>(_e146, 0f)));\n let _e152 = p_11;\n let _e153 = e;\n let _e158 = morphRawDistance((_e152 - vec2<f32>(_e153, 0f)));\n let _e160 = p_11;\n let _e162 = e;\n let _e166 = morphRawDistance((_e160 + vec2<f32>(0f, _e162)));\n let _e167 = p_11;\n let _e169 = e;\n let _e173 = morphRawDistance((_e167 - vec2<f32>(0f, _e169)));\n let _e177 = e;\n return (vec2<f32>((_e151 - _e158), (_e166 - _e173)) / vec2((2f * _e177)));\n}\n\nfn morphNormal(p_12: vec2<f32>) -> vec2<f32> {\n var p_13: vec2<f32>;\n\n p_13 = p_12;\n let _e143 = p_13;\n let _e144 = morphGradient(_e143);\n return normalize((_e144 + vec2(0.00000001f)));\n}\n\nfn morphDistance(p_14: vec2<f32>) -> f32 {\n var p_15: vec2<f32>;\n var d_2: f32;\n var scale: f32;\n\n p_15 = p_14;\n let _e143 = p_15;\n let _e144 = morphRawDistance(_e143);\n d_2 = _e144;\n let _e146 = global.uMorphParams_slot;\n let _e150 = global.uMorphParams_slot;\n if ((_e146.x < 1.5f) || (_e150.y <= 0f)) {\n let _e155 = d_2;\n return _e155;\n }\n let _e157 = p_15;\n let _e158 = morphGradient(_e157);\n scale = (1f / clamp(length(_e158), 0.25f, 1f));\n let _e165 = d_2;\n let _e166 = scale;\n let _e170 = d_2;\n return (_e165 * mix(_e166, 1f, smoothstep(16f, 28f, -(_e170))));\n}\n\nfn materialDiffusionUnit() -> f32 {\n var local: f32;\n\n let _e99 = global.uMaterialUnits_slot;\n if (_e99.w > 0f) {\n let _e103 = global.uMaterialUnits_slot;\n local = _e103.w;\n } else {\n let _e105 = global.uMaterialUnits_slot;\n local = _e105.y;\n }\n let _e108 = local;\n return _e108;\n}\n\nfn materialProfile(d: f32, p_2: vec3<f32>) -> f32 {\n var d_1: f32;\n var p_3: vec3<f32>;\n var t: f32;\n\n d_1 = d;\n p_3 = p_2;\n let _e103 = d_1;\n let _e104 = p_3;\n let _e107 = p_3;\n t = clamp(((_e103 - _e104.z) / max(_e107.y, 0.000001f)), 0f, 1f);\n let _e116 = p_3;\n let _e119 = t;\n let _e121 = t;\n return (_e116.x * (1f - sqrt((_e119 * (2f - _e121)))));\n}\n\nfn materialLevel(radius_2: f32) -> f32 {\n var radius_3: f32;\n var local_1: f32;\n\n radius_3 = radius_2;\n let _e102 = radius_3;\n if (_e102 < 2f) {\n let _e106 = radius_3;\n local_1 = (1f + (_e106 * 0.5f));\n } else {\n let _e110 = radius_3;\n local_1 = _e110;\n }\n let _e112 = local_1;\n return max(0f, log2(_e112));\n}\n\nfn materialMip(uv: vec2<f32>, level: f32) -> vec3<f32> {\n var uv_1: vec2<f32>;\n var level_1: f32;\n\n uv_1 = uv;\n level_1 = level;\n let _e103 = uv_1;\n let _e104 = global.uInputClamp_slot;\n let _e106 = global.uInputClamp_slot;\n let _e109 = level_1;\n let _e110 = textureSampleLevel(uTexture_texture, sourceSampler, clamp(_e103, _e104.xy, _e106.zw), _e109);\n return _e110.xyz;\n}\n\nfn tabBarOptics() -> bool {\n return (global.uTabBarOptics_slot.x > 0.5f);\n}\n\nfn materialTwoTapFill(uv: vec2<f32>, lod: f32) -> vec3<f32> {\n let offset = (vec2((lod * 0.25f)) / vec2<f32>(vec2<i32>(textureDimensions(uTexture_texture, 0i))));\n return (0.5f * (materialMip((uv + offset), lod) + materialMip((uv - offset), lod)));\n}\n\nfn materialSharp(uv: vec2<f32>) -> vec3<f32> {\n let halfPixel = (vec2(0.5f) / vec2<f32>(textureDimensions(uSource_texture, 0i)));\n let low = halfPixel;\n let high = (vec2(1f) - halfPixel);\n let centre = (uv / global.kernelScale_slot.xy);\n let a = textureSampleLevel(uSource_texture, sourceSampler, clamp((centre + halfPixel), low, high), 0f);\n let b = textureSampleLevel(uSource_texture, sourceSampler, clamp((centre - halfPixel), low, high), 0f);\n let c = textureSampleLevel(uSource_texture, sourceSampler, clamp((centre + vec2<f32>(halfPixel.x, -(halfPixel.y))), low, high), 0f);\n let d = textureSampleLevel(uSource_texture, sourceSampler, clamp((centre + vec2<f32>(-(halfPixel.x), halfPixel.y)), low, high), 0f);\n return (0.25f * (((a.xyz + b.xyz) + c.xyz) + d.xyz));\n}\n\nfn materialDiagonal(uv_2: vec2<f32>, level_2: f32) -> vec3<f32> {\n var uv_3: vec2<f32>;\n var level_3: f32;\n var o: vec2<f32>;\n\n uv_3 = uv_2;\n level_3 = level_2;\n if ((level_2 <= 0f) && tabBarOptics()) {\n return materialSharp(uv_2);\n }\n let _e103 = level_3;\n let _e107 = textureDimensions(uTexture_texture, 0i);\n o = (vec2((_e103 * 0.25f)) / vec2<f32>(vec2<i32>(_e107)));\n let _e114 = uv_3;\n let _e115 = o;\n let _e117 = level_3;\n let _e118 = materialMip((_e114 + _e115), _e117);\n let _e119 = uv_3;\n let _e120 = o;\n let _e122 = level_3;\n let _e123 = materialMip((_e119 - _e120), _e122);\n let _e125 = uv_3;\n let _e126 = o;\n let _e128 = o;\n let _e133 = level_3;\n let _e134 = materialMip((_e125 + vec2<f32>(_e126.x, -(_e128.y))), _e133);\n let _e136 = uv_3;\n let _e137 = o;\n let _e140 = o;\n let _e144 = level_3;\n let _e145 = materialMip((_e136 + vec2<f32>(-(_e137.x), _e140.y)), _e144);\n return (0.25f * (((_e118 + _e123) + _e134) + _e145));\n}\n\nfn materialSpectrum(uv_4: vec2<f32>, delta: vec2<f32>, level_4: f32) -> vec3<f32> {\n var uv_5: vec2<f32>;\n var delta_1: vec2<f32>;\n var level_5: f32;\n\n uv_5 = uv_4;\n delta_1 = delta;\n level_5 = level_4;\n let _e105 = uv_5;\n let _e106 = delta_1;\n let _e110 = level_5;\n let _e111 = materialDiagonal((_e105 + (_e106 * 1f)), _e110);\n let _e117 = uv_5;\n let _e118 = delta_1;\n let _e122 = level_5;\n let _e123 = materialDiagonal((_e117 + (_e118 * 0.6666667f)), _e122);\n let _e130 = uv_5;\n let _e131 = delta_1;\n let _e135 = level_5;\n let _e136 = materialDiagonal((_e130 + (_e131 * 0.33333334f)), _e135);\n let _e143 = uv_5;\n let _e144 = delta_1;\n let _e148 = level_5;\n let _e149 = materialDiagonal((_e143 + (_e144 * 0f)), _e148);\n let _e156 = uv_5;\n let _e157 = delta_1;\n let _e162 = level_5;\n let _e163 = materialDiagonal((_e156 + (_e157 * -0.33333334f)), _e162);\n let _e170 = uv_5;\n let _e171 = delta_1;\n let _e176 = level_5;\n let _e177 = materialDiagonal((_e170 + (_e171 * -0.6666667f)), _e176);\n let _e184 = uv_5;\n let _e185 = delta_1;\n let _e190 = level_5;\n let _e191 = materialDiagonal((_e184 + (_e185 * -1f)), _e190);\n return (((((((_e111 * vec3<f32>(0.5f, 0f, 0f)) + (_e123 * vec3<f32>(0.33333334f, 0.11111111f, 0f))) + (_e136 * vec3<f32>(0.16666667f, 0.22222222f, 0f))) + (_e149 * vec3<f32>(0f, 0.33333334f, 0f))) + (_e163 * vec3<f32>(0f, 0.22222222f, 0.16666667f))) + (_e177 * vec3<f32>(0f, 0.11111111f, 0.33333334f))) + (_e191 * vec3<f32>(0f, 0f, 0.5f)));\n}\n\nfn materialRamp(x: f32, a: f32, b: f32) -> f32 {\n var x_1: f32;\n var a_1: f32;\n var b_1: f32;\n var local_2: f32;\n\n x_1 = x;\n a_1 = a;\n b_1 = b;\n let _e105 = b_1;\n let _e106 = a_1;\n if (abs((_e105 - _e106)) < 0.000001f) {\n let _e111 = a_1;\n let _e112 = x_1;\n local_2 = step(_e111, _e112);\n } else {\n let _e114 = x_1;\n let _e115 = a_1;\n let _e117 = b_1;\n let _e118 = a_1;\n local_2 = clamp(((_e114 - _e115) / (_e117 - _e118)), 0f, 1f);\n }\n let _e125 = local_2;\n return _e125;\n}\n\nfn materialRadius(z: f32) -> f32 {\n var z_1: f32;\n var ramps: vec3<f32>;\n\n z_1 = z;\n let _e101 = z_1;\n let _e102 = global.uMaterialBlurDistances_slot;\n let _e104 = global.uMaterialBlurDistances_slot;\n let _e106 = materialRamp(_e101, _e102.x, _e104.y);\n let _e107 = z_1;\n let _e108 = global.uMaterialBlurDistances_slot;\n let _e110 = global.uMaterialBlurDistances_slot;\n let _e112 = materialRamp(_e107, _e108.y, _e110.z);\n let _e113 = z_1;\n let _e114 = global.uMaterialBlurDistances_slot;\n let _e116 = global.uMaterialBlurDistances_slot;\n let _e118 = materialRamp(_e113, _e114.z, _e116.w);\n ramps = vec3<f32>(_e106, _e112, _e118);\n let _e122 = global.uMaterialBlend_slot;\n let _e124 = global.uMaterialBlurDifferences_slot;\n let _e126 = global.uMaterialBlurDifferences_slot;\n let _e128 = ramps;\n return max(0f, (_e122.w * (_e124.x - dot(_e126.yzw, _e128))));\n}\n\nfn materialFill(uv: vec2<f32>, lod: f32) -> vec3<f32> {\n let level = min(floor(max(0f, (lod - 0.5f))), (f32(textureNumLevels(uTexture_texture)) - 1f));\n let halfTexel = (vec2(0.5f) / vec2<f32>(textureDimensions(uTexture_texture, i32(level))));\n let a = materialMip((uv + halfTexel), level);\n let b = materialMip((uv - halfTexel), level);\n let c = materialMip((uv + vec2<f32>(halfTexel.x, -(halfTexel.y))), level);\n let d = materialMip((uv + vec2<f32>(-(halfTexel.x), halfTexel.y)), level);\n return (0.25f * (((a + b) + c) + d));\n}\n\nfn materialTransmission(signedPt: f32, n: vec2<f32>, uv_6: vec2<f32>) -> vec3<f32> {\n var signedPt_1: f32;\n var n_1: vec2<f32>;\n var uv_7: vec2<f32>;\n var s: f32;\n var fi: f32;\n var fo: f32;\n var pointToUv: vec2<f32>;\n var displacement: vec2<f32>;\n var v: vec2<f32>;\n var delta_2: vec2<f32>;\n var physicalPixelsPerPoint: f32;\n var inner: vec3<f32>;\n var lod: f32;\n var fill: vec3<f32>;\n var weights: vec2<f32>;\n var response: vec3<f32>;\n var outer: vec3<f32>;\n var w: f32;\n\n signedPt_1 = signedPt;\n n_1 = n;\n uv_7 = uv_6;\n let _e105 = signedPt_1;\n let _e106 = global.uMaterialUnits_slot;\n let _e109 = global.uMaterialUnits_slot;\n s = ((_e105 * _e106.x) + _e109.z);\n let _e113 = s;\n let _e115 = global.uMaterialInner_slot;\n let _e117 = materialProfile(-(_e113), _e115.xyz);\n fi = _e117;\n let _e119 = s;\n let _e121 = global.uMaterialOuter_slot;\n let _e123 = materialProfile(-(_e119), _e121.xyz);\n fo = _e123;\n let _e125 = global.uInputSize_slot;\n pointToUv = _e125.zw;\n let _e128 = n_1;\n let _e129 = global.uMaterialUnits_slot;\n let _e132 = pointToUv;\n displacement = ((_e128 * _e129.y) * _e132);\n let _e135 = global.uMaterialAberrationDirection_slot;\n v = _e135.xy;\n let _e138 = s;\n let _e140 = global.uMaterialAberration_slot;\n let _e142 = materialProfile(-(_e138), _e140.xyz);\n let _e143 = global.uMaterialUnits_slot;\n let _e146 = pointToUv;\n let _e148 = v;\n let _e150 = n_1;\n let _e153 = v;\n let _e155 = n_1;\n let _e160 = pointToUv;\n let _e162 = v;\n let _e164 = n_1;\n let _e167 = v;\n let _e169 = n_1;\n delta_2 = ((_e142 * _e143.y) * vec2<f32>((_e146.y * ((_e148.y * _e150.x) + (_e153.x * _e155.y))), (_e160.x * ((_e162.x * _e164.x) - (_e167.y * _e169.y)))));\n let _e178 = textureDimensions(uTexture_texture, 0i);\n let _e182 = global.uInputSize_slot;\n physicalPixelsPerPoint = (f32(vec2<i32>(_e178).x) * _e182.z);\n let _e186 = uv_7;\n let _e187 = displacement;\n let _e188 = fi;\n let _e191 = delta_2;\n let _e192 = s;\n let _e193 = fi;\n let _e195 = materialRadius((_e192 + _e193));\n let _e196 = materialDiffusionUnit();\n let _e198 = physicalPixelsPerPoint;\n let _e200 = materialLevel(((_e195 * _e196) * _e198));\n let _e201 = materialSpectrum((_e186 + (_e187 * _e188)), _e191, _e200);\n inner = _e201;\n let _e203 = global.uMaterialBlurFill_slot;\n if (_e203.x > 0f) {\n {\n let _e207 = global.uMaterialBlurFill_slot;\n let _e209 = materialDiffusionUnit();\n let _e211 = physicalPixelsPerPoint;\n let _e213 = materialLevel(((_e207.x * _e209) * _e211));\n lod = _e213;\n if (tabBarOptics()) {\n fill = materialFill(uv_7, lod);\n } else {\n fill = materialTwoTapFill(uv_7, lod);\n }\n let _e239 = global.uMaterialBlurFill_slot;\n weights = clamp(_e239.yz, vec2(0f), vec2(1f));\n let _e247 = weights;\n let _e249 = weights;\n let _e251 = weights;\n weights = (_e247 / vec2(max(1f, (_e249.x + _e251.y))));\n let _e257 = weights;\n let _e259 = inner;\n let _e260 = fill;\n let _e263 = weights;\n let _e265 = inner;\n let _e266 = fill;\n let _e271 = weights;\n let _e274 = weights;\n let _e277 = inner;\n response = (((_e257.y * min(_e259, _e260)) + (_e263.x * max(_e265, _e266))) + (((1f - _e271.x) - _e274.y) * _e277));\n let _e281 = response;\n let _e282 = fill;\n let _e283 = global.uMaterialBlurFill_slot;\n inner = mix(_e281, _e282, vec3(clamp(_e283.w, 0f, 1f)));\n }\n }\n let _e290 = uv_7;\n let _e291 = displacement;\n let _e292 = fo;\n let _e295 = s;\n let _e296 = fo;\n let _e298 = materialRadius((_e295 + _e296));\n let _e299 = materialDiffusionUnit();\n let _e301 = physicalPixelsPerPoint;\n let _e303 = materialLevel(((_e298 * _e299) * _e301));\n let _e304 = materialMip((_e290 + (_e291 * _e292)), _e303);\n outer = _e304;\n let _e306 = global.uMaterialBlend_slot;\n let _e308 = s;\n let _e309 = global.uMaterialBlend_slot;\n let _e312 = global.uMaterialBlend_slot;\n let _e314 = global.uMaterialBlend_slot;\n w = (_e306.z * clamp(((_e308 - _e309.x) / max((_e312.y - _e314.x), 0.000001f)), 0f, 1f));\n let _e325 = inner;\n let _e326 = outer;\n let _e327 = w;\n return mix(_e325, _e326, vec3(_e327));\n}\n\nfn materialLobe(d_2: f32, n_2: vec2<f32>, p_4: vec4<f32>, angle: f32, offset_1: f32) -> f32 {\n var d_3: f32;\n var n_3: vec2<f32>;\n var p_5: vec4<f32>;\n var angle_1: f32;\n var offset_2: f32;\n var z_2: f32;\n var fw: f32;\n var q_1: f32;\n var local_3: f32;\n var W: f32;\n var x_2: f32;\n\n d_3 = d_2;\n n_3 = n_2;\n p_5 = p_4;\n angle_1 = angle;\n offset_2 = offset_1;\n let _e109 = d_3;\n let _e110 = offset_2;\n z_2 = (_e109 - _e110);\n let _e113 = d_3;\n let _e114 = fwidth(_e113);\n fw = max(_e114, 0.0001f);\n let _e119 = z_2;\n let _e120 = p_5;\n q_1 = (1f - clamp((_e119 / max(_e120.x, 0.000001f)), 0f, 1f));\n let _e130 = q_1;\n if (_e130 > 0f) {\n let _e135 = q_1;\n local_3 = select((0.25f + (0.75f * _e135)), _e135, tabBarOptics());\n } else {\n local_3 = 0f;\n }\n let _e140 = local_3;\n let _e142 = z_2;\n let _e143 = fw;\n let _e151 = p_5;\n let _e153 = z_2;\n let _e155 = fw;\n W = ((_e140 * clamp((0.5f + (_e142 / _e143)), 0f, 1f)) * clamp((0.5f + ((_e151.x - _e153) / _e155)), 0f, 1f));\n let _e163 = W;\n let _e164 = angle_1;\n let _e166 = angle_1;\n let _e169 = n_3;\n let _e171 = p_5;\n let _e175 = p_5;\n x_2 = (_e163 * clamp(((dot(vec2<f32>(cos(_e164), sin(_e166)), _e169) - _e171.y) / max((1f - _e175.y), 0.000001f)), 0f, 1f));\n let _e186 = p_5;\n let _e188 = x_2;\n let _e191 = p_5;\n let _e194 = x_2;\n return ((_e186.w * _e188) / max((1f + (_e191.z * (1f - _e194))), 0.000001f));\n}\n\nfn materialAffine(c: vec3<f32>, r: vec4<f32>, g: vec4<f32>, b_2: vec4<f32>) -> vec3<f32> {\n var c_1: vec3<f32>;\n var r_1: vec4<f32>;\n var g_1: vec4<f32>;\n var b_3: vec4<f32>;\n\n c_1 = c;\n r_1 = r;\n g_1 = g;\n b_3 = b_2;\n let _e107 = c_1;\n let _e114 = r_1;\n let _e116 = c_1;\n let _e123 = g_1;\n let _e125 = c_1;\n let _e132 = b_3;\n return vec3<f32>(dot(vec4<f32>(_e107.x, _e107.y, _e107.z, 1f), _e114), dot(vec4<f32>(_e116.x, _e116.y, _e116.z, 1f), _e123), dot(vec4<f32>(_e125.x, _e125.y, _e125.z, 1f), _e132));\n}\n\nfn materialShadow(signedPt_2: f32, n_4: vec2<f32>, uv_8: vec2<f32>) -> vec4<f32> {\n var signedPt_3: f32;\n var n_5: vec2<f32>;\n var uv_9: vec2<f32>;\n var s_1: f32;\n var x_3: f32;\n var x2_: f32;\n var response_1: f32;\n var displacement_1: f32;\n var lod_1: f32;\n var c_2: vec3<f32>;\n var contribution: f32;\n var rgb: vec3<f32>;\n var alpha: f32;\n\n signedPt_3 = signedPt_2;\n n_5 = n_4;\n uv_9 = uv_8;\n let _e105 = signedPt_3;\n let _e106 = global.uMaterialUnits_slot;\n let _e109 = global.uMaterialUnits_slot;\n let _e112 = n_5;\n let _e113 = global.uMaterialShadowOffset_slot;\n s_1 = (((_e105 * _e106.x) + _e109.z) - dot(_e112, _e113.xy));\n let _e121 = s_1;\n let _e123 = global.uMaterialShadowResponse_slot;\n x_3 = ((4f * clamp((0.5f + ((0.25f * _e121) / max(_e123.x, 0.000001f))), 0f, 1f)) - 2f);\n let _e136 = x_3;\n let _e137 = x_3;\n x2_ = (_e136 * _e137);\n let _e141 = x2_;\n let _e145 = x2_;\n let _e149 = x2_;\n let _e153 = x_3;\n response_1 = clamp(((((((((0.002954483f * _e141) - 0.034454346f) * _e145) + 0.16821289f) * _e149) - 0.5605469f) * _e153) + 0.5f), 0f, 1f);\n let _e161 = s_1;\n let _e163 = global.uMaterialShadowField_slot;\n let _e165 = materialProfile(-(_e161), _e163.xyz);\n displacement_1 = _e165;\n let _e167 = global.uMaterialShadowField_slot;\n let _e169 = materialDiffusionUnit();\n let _e172 = textureDimensions(uTexture_texture, 0i);\n let _e177 = global.uInputSize_slot;\n let _e180 = materialLevel((((_e167.w * _e169) * f32(vec2<i32>(_e172).x)) * _e177.z));\n lod_1 = _e180;\n let _e182 = uv_9;\n let _e183 = n_5;\n let _e184 = displacement_1;\n let _e186 = global.uMaterialUnits_slot;\n let _e189 = global.uInputSize_slot;\n let _e193 = lod_1;\n let _e194 = materialMip((_e182 + (((_e183 * _e184) * _e186.y) * _e189.zw)), _e193);\n c_2 = _e194;\n let _e196 = global.uMaterialShadowResponse_slot;\n contribution = _e196.z;\n let _e199 = c_2;\n let _e200 = global.uMaterialShadow0_slot;\n let _e203 = c_2;\n let _e204 = global.uMaterialShadow1_slot;\n let _e207 = c_2;\n let _e208 = global.uMaterialShadow2_slot;\n let _e212 = contribution;\n let _e214 = global.uMaterialShadow0_slot;\n let _e216 = global.uMaterialShadow1_slot;\n let _e218 = global.uMaterialShadow2_slot;\n rgb = ((vec3<f32>(dot(_e199, _e200.xyz), dot(_e203, _e204.xyz), dot(_e207, _e208.xyz)) * _e212) + vec3<f32>(_e214.w, _e216.w, _e218.w));\n let _e223 = global.uMaterialShadowResponse_slot;\n let _e226 = contribution;\n alpha = mix(_e223.w, 1f, _e226);\n let _e229 = rgb;\n let _e230 = alpha;\n let _e235 = response_1;\n let _e237 = global.uMaterialShadowResponse_slot;\n return ((vec4<f32>(_e229.x, _e229.y, _e229.z, _e230) * _e235) * _e237.y);\n}\n\nfn materialBoundary(signedPt_4: f32, n_6: vec2<f32>, uv_10: vec2<f32>) -> vec4<f32> {\n var signedPt_5: f32;\n var n_7: vec2<f32>;\n var uv_11: vec2<f32>;\n var s_2: f32;\n var peak: f32;\n var raw: vec3<f32>;\n var biased: vec3<f32>;\n\n signedPt_5 = signedPt_4;\n n_7 = n_6;\n uv_11 = uv_10;\n let _e105 = global.uMaterialRim_slot;\n if (_e105.z == 0f) {\n return vec4(0f);\n }\n let _e112 = signedPt_5;\n let _e113 = global.uMaterialUnits_slot;\n let _e116 = global.uMaterialUnits_slot;\n s_2 = ((_e112 * _e113.x) + _e116.z);\n let _e121 = s_2;\n let _e122 = global.uMaterialRim_slot;\n let _e126 = global.uMaterialRim_slot;\n peak = clamp((1f - (abs((_e121 - _e122.y)) / max(_e126.x, 0.000001f))), 0f, 1f);\n let _e136 = uv_11;\n let _e138 = materialMip(_e136, 0f);\n raw = _e138;\n let _e140 = raw;\n let _e142 = global.uMaterialRim_slot;\n let _e146 = raw;\n biased = clamp((_e140 * (vec3(1f) + (_e142.z * (vec3(3f) - (2f * _e146))))), vec3(0f), vec3(1f));\n let _e160 = biased;\n let _e162 = global.uMaterialContourAngular_slot;\n let _e164 = n_7;\n let _e166 = n_7;\n let _e168 = n_7;\n let _e170 = n_7;\n let _e177 = biased;\n biased = clamp((_e160 * (vec3(1f) + (dot(_e162, vec4<f32>(1f, _e164.x, _e166.y, (_e168.x * _e170.x))) * (vec3(3f) - (2f * _e177))))), vec3(0f), vec3(1f));\n let _e190 = peak;\n let _e191 = n_7;\n let _e193 = n_7;\n peak = (_e190 * (_e191.x * _e193.x));\n let _e197 = biased;\n let _e198 = peak;\n let _e199 = (_e197 * _e198);\n let _e200 = peak;\n return vec4<f32>(_e199.x, _e199.y, _e199.z, _e200);\n}\n\nfn materialMaterial(signedPt_6: f32, n_8: vec2<f32>, uv_12: vec2<f32>, c_3: vec3<f32>) -> vec3<f32> {\n var signedPt_7: f32;\n var n_9: vec2<f32>;\n var uv_13: vec2<f32>;\n var c_4: vec3<f32>;\n var s_3: f32;\n var L: f32;\n var g_2: f32;\n var adjusted: vec3<f32>;\n var face: vec3<f32>;\n var lb: f32;\n var ramp: f32;\n var darken: f32;\n var w_1: f32;\n var bleed: vec3<f32>;\n var P: vec3<f32>;\n var backgroundH: f32;\n var d_4: f32;\n var key: vec4<f32>;\n var fill_1: vec4<f32>;\n var H: f32;\n var peak_1: f32;\n var contour: f32;\n\n signedPt_7 = signedPt_6;\n n_9 = n_8;\n uv_13 = uv_12;\n c_4 = c_3;\n let _e107 = signedPt_7;\n let _e108 = global.uMaterialUnits_slot;\n let _e111 = global.uMaterialUnits_slot;\n s_3 = ((_e107 * _e108.x) + _e111.z);\n let _e115 = c_4;\n L = dot(_e115, vec3<f32>(0.2126f, 0.7152f, 0.0722f));\n let _e123 = L;\n let _e124 = global.uMaterialColour_slot;\n g_2 = clamp((1f - (_e123 * _e124.x)), 0f, 1f);\n let _e132 = g_2;\n let _e133 = L;\n let _e136 = g_2;\n let _e137 = c_4;\n let _e142 = g_2;\n adjusted = mix(vec3((_e132 * _e133)), (_e136 * _e137), vec3((1f + (0.3f * (1f - _e142)))));\n let _e149 = c_4;\n let _e150 = adjusted;\n let _e151 = global.uMaterialFace0_slot;\n let _e152 = global.uMaterialFace1_slot;\n let _e153 = global.uMaterialFace2_slot;\n let _e154 = materialAffine(_e150, _e151, _e152, _e153);\n let _e155 = global.uMaterialColour_slot;\n face = mix(_e149, _e154, vec3(_e155.y));\n let _e160 = face;\n lb = clamp(dot(_e160, vec3<f32>(0.2125f, 0.7154f, 0.0721f)), 0f, 1f);\n let _e170 = s_3;\n let _e171 = global.uMaterialBleed_slot;\n let _e173 = global.uMaterialBleed_slot;\n let _e175 = materialRamp(_e170, _e171.x, _e173.y);\n ramp = _e175;\n let _e177 = global.uMaterialBleed_slot;\n let _e179 = lb;\n let _e181 = global.uMaterialBleed_slot;\n darken = ((_e177.z * _e179) + _e181.w);\n let _e185 = global.uMaterialColour_slot;\n let _e187 = darken;\n let _e188 = darken;\n let _e190 = ramp;\n w_1 = (_e185.z * pow(((_e187 * _e188) * _e190), 2f));\n let _e196 = uv_13;\n let _e197 = n_9;\n let _e198 = s_3;\n let _e200 = global.uMaterialBleedField_slot;\n let _e202 = materialProfile(-(_e198), _e200.xyz);\n let _e204 = global.uMaterialUnits_slot;\n let _e207 = global.uInputSize_slot;\n let _e211 = global.uMaterialBleedField_slot;\n let _e213 = materialDiffusionUnit();\n let _e216 = textureDimensions(uTexture_texture, 0i);\n let _e221 = global.uInputSize_slot;\n let _e224 = materialLevel((((_e211.w * _e213) * f32(vec2<i32>(_e216).x)) * _e221.z));\n let _e225 = materialMip((_e196 + (((_e197 * _e202) * _e204.y) * _e207.zw)), _e224);\n bleed = _e225;\n let _e227 = face;\n let _e228 = bleed;\n let _e229 = global.uMaterialBleed0_slot;\n let _e230 = global.uMaterialBleed1_slot;\n let _e231 = global.uMaterialBleed2_slot;\n let _e232 = materialAffine(_e228, _e229, _e230, _e231);\n let _e233 = w_1;\n P = mix(_e227, _e232, vec3(_e233));\n let _e237 = s_3;\n let _e239 = n_9;\n let _e240 = global.uMaterialBackgroundKey_slot;\n let _e241 = global.uMaterialBackgroundLight_slot;\n let _e244 = global.uMaterialBackgroundLight_slot;\n let _e247 = materialLobe(-(_e237), _e239, _e240, _e241.x, _e244.y);\n let _e248 = s_3;\n let _e250 = n_9;\n let _e252 = global.uMaterialBackgroundKey_slot;\n let _e253 = global.uMaterialBackgroundLight_slot;\n let _e256 = global.uMaterialBackgroundLight_slot;\n let _e259 = materialLobe(-(_e248), -(_e250), _e252, _e253.x, _e256.y);\n backgroundH = (_e247 + _e259);\n let _e262 = P;\n let _e264 = backgroundH;\n let _e267 = P;\n P = (_e262 * (vec3(1f) + (_e264 * (vec3(3f) - (2f * _e267)))));\n let innerShade = global.uInnerShade_slot;\n let shadeDepth = -(signedPt_7);\n let shadeBand = (smoothstep(0f, innerShade.y, shadeDepth) * (1f - smoothstep(innerShade.z, innerShade.w, shadeDepth)));\n let shadeFacing = max(-(n_9.y), 0f);\n let shadeBase = P;\n let shadeWeight = smoothstep(0.05f, 0.5f, dot(shadeBase, vec3<f32>(0.2126f, 0.7152f, 0.0722f)));\n P = (shadeBase * (vec3(1f) + ((((select(0f, innerShade.x, tabBarOptics()) * shadeBand) * (shadeFacing * shadeFacing)) * shadeWeight) * (vec3(3f) - (2f * shadeBase)))));\n let _e275 = signedPt_7;\n let _e277 = global.uMaterialSdfProjection_slot;\n let _e280 = global.uMaterialSdfProjection_slot;\n d_4 = ((-(_e275) * _e277.x) + _e280.y);\n let _e284 = global.uMaterialSdfKey_slot;\n key = _e284;\n let _e286 = global.uMaterialSdfFill_slot;\n fill_1 = _e286;\n let _e289 = key;\n let _e291 = global.uMaterialSdfProjection_slot;\n key.w = (_e289.w * _e291.w);\n let _e295 = fill_1;\n let _e297 = global.uMaterialSdfProjection_slot;\n fill_1.w = (_e295.w * _e297.w);\n let _e300 = d_4;\n let _e301 = n_9;\n let _e302 = key;\n let _e303 = global.uMaterialSdfAngles_slot;\n let _e305 = global.uMaterialSdfProjection_slot;\n let _e308 = global.uMaterialSdfAngles_slot;\n let _e310 = materialLobe(_e300, _e301, _e302, (_e303.x + _e305.z), _e308.z);\n let _e311 = d_4;\n let _e312 = n_9;\n let _e313 = fill_1;\n let _e314 = global.uMaterialSdfAngles_slot;\n let _e316 = global.uMaterialSdfProjection_slot;\n let _e319 = global.uMaterialSdfAngles_slot;\n let _e321 = materialLobe(_e311, _e312, _e313, (_e314.y + _e316.z), _e319.w);\n H = (_e310 + _e321);\n let _e324 = global.uMaterialSdfKey_slot;\n key = _e324;\n let _e325 = global.uMaterialSdfFill_slot;\n fill_1 = _e325;\n let _e327 = key;\n let _e329 = global.uMaterialSdfDiffuse_slot;\n key.x = (_e327.x * _e329.x);\n let _e333 = fill_1;\n let _e335 = global.uMaterialSdfDiffuse_slot;\n fill_1.x = (_e333.x * _e335.x);\n let _e339 = key;\n let _e346 = global.uMaterialSdfDiffuse_slot;\n key.y = cos((acos(clamp(_e339.y, -1f, 1f)) * _e346.y));\n let _e351 = fill_1;\n let _e358 = global.uMaterialSdfDiffuse_slot;\n fill_1.y = cos((acos(clamp(_e351.y, -1f, 1f)) * _e358.y));\n let _e363 = key;\n let _e365 = global.uMaterialSdfDiffuse_slot;\n let _e367 = global.uMaterialSdfDiffuse_slot;\n key.w = (_e363.w * (_e365.z * _e367.w));\n let _e372 = fill_1;\n let _e374 = global.uMaterialSdfDiffuse_slot;\n let _e376 = global.uMaterialSdfDiffuse_slot;\n fill_1.w = (_e372.w * (_e374.z * _e376.w));\n let _e380 = H;\n let _e381 = d_4;\n let _e382 = n_9;\n let _e383 = key;\n let _e384 = global.uMaterialSdfAngles_slot;\n let _e386 = global.uMaterialSdfProjection_slot;\n let _e389 = global.uMaterialSdfAngles_slot;\n let _e391 = materialLobe(_e381, _e382, _e383, (_e384.x + _e386.z), _e389.z);\n let _e392 = d_4;\n let _e393 = n_9;\n let _e394 = fill_1;\n let _e395 = global.uMaterialSdfAngles_slot;\n let _e397 = global.uMaterialSdfProjection_slot;\n let _e400 = global.uMaterialSdfAngles_slot;\n let _e402 = materialLobe(_e392, _e393, _e394, (_e395.y + _e397.z), _e400.w);\n H = (_e380 + (_e391 + _e402));\n let _e405 = P;\n let _e406 = H;\n let _e407 = P;\n let _e408 = global.uMaterialSdf0_slot;\n let _e409 = global.uMaterialSdf1_slot;\n let _e410 = global.uMaterialSdf2_slot;\n let _e411 = materialAffine(_e407, _e408, _e409, _e410);\n let _e412 = P;\n P = (_e405 + (_e406 * (_e411 - _e412)));\n let _e417 = s_3;\n let _e418 = global.uMaterialRim_slot;\n let _e422 = global.uMaterialRim_slot;\n peak_1 = clamp((1f - (abs((_e417 - _e418.y)) / max(_e422.x, 0.000001f))), 0f, 1f);\n let _e432 = P;\n let _e434 = global.uMaterialRim_slot;\n let _e436 = peak_1;\n let _e438 = n_9;\n let _e441 = n_9;\n let _e446 = P;\n P = (_e432 * (vec3(1f) + ((((_e434.z * _e436) * _e438.x) * _e441.x) * (vec3(3f) - (2f * _e446)))));\n let _e454 = global.uMaterialContourAngular_slot;\n let _e456 = n_9;\n let _e458 = n_9;\n let _e460 = n_9;\n let _e462 = n_9;\n contour = dot(_e454, vec4<f32>(1f, _e456.x, _e458.y, (_e460.x * _e462.x)));\n let _e468 = P;\n let _e470 = contour;\n let _e471 = peak_1;\n let _e475 = P;\n P = (_e468 * (vec3(1f) + ((_e470 * _e471) * (vec3(3f) - (2f * _e475)))));\n let _e483 = P;\n return clamp(_e483, vec3(0f), vec3(1f));\n}\n\nfn main_1() {\n var p_20: vec2<f32>;\n var local_5: f32;\n var sd: f32;\n var q_4: vec2<f32>;\n var cap: vec2<f32>;\n var extent: f32;\n var local_6: vec2<f32>;\n var local_7: vec2<f32>;\n var n_13: vec2<f32>;\n var boundary: vec4<f32>;\n var shadow: vec4<f32>;\n var transmitted: vec3<f32>;\n var material: vec3<f32>;\n var aa: f32;\n var alpha_1: f32;\n var shadow_1: vec4<f32>;\n var boundary_1: vec4<f32>;\n\n let _e141 = vFilterCoord_1;\n let _e142 = global.uResolution_slot;\n let _e145 = global.uShape_slot;\n p_20 = ((_e141 * _e142.xy) - _e145.xy);\n let _e149 = global.uMorphParams_slot;\n if (_e149.x > 0.5f) {\n let _e153 = vFilterCoord_1;\n let _e154 = global.uResolution_slot;\n let _e157 = morphDistance((_e153 * _e154.xy));\n local_5 = _e157;\n } else {\n let _e158 = p_20;\n let _e159 = global.uShape_slot;\n let _e161 = global.uRadius_slot;\n let _e163 = sdRoundRect(_e158, _e159.zw, _e161.x);\n local_5 = _e163;\n }\n let _e165 = local_5;\n sd = _e165;\n let _e167 = p_20;\n let _e169 = global.uShape_slot;\n let _e172 = global.uRadius_slot;\n q_4 = ((abs(_e167) - _e169.zw) + vec2(_e172.x));\n let _e177 = q_4;\n cap = max(_e177, vec2(0f));\n let _e183 = cap;\n extent = length(_e183);\n let _e186 = extent;\n if (_e186 > 0f) {\n let _e189 = p_20;\n let _e191 = cap;\n let _e193 = extent;\n local_7 = ((sign(_e189) * _e191) / vec2(_e193));\n } else {\n let _e196 = q_4;\n let _e198 = q_4;\n if (_e196.x > _e198.y) {\n let _e201 = p_20;\n local_6 = vec2<f32>(sign(_e201.x), 0f);\n } else {\n let _e208 = p_20;\n local_6 = vec2<f32>(0f, sign(_e208.y));\n }\n let _e214 = local_6;\n local_7 = _e214;\n }\n let _e216 = local_7;\n n_13 = _e216;\n let _e218 = global.uMorphParams_slot;\n if (_e218.x > 0.5f) {\n let _e222 = vFilterCoord_1;\n let _e223 = global.uResolution_slot;\n let _e226 = morphNormal((_e222 * _e223.xy));\n n_13 = _e226;\n }\n let _e227 = global.uDiagnosticOutput_slot;\n let _e231 = sd;\n let _e234 = global.uCoverageWidth_slot;\n if ((_e227.x <= 0f) && (_e231 > max(1f, (6f * _e234.x)))) {\n {\n let _e240 = sd;\n let _e241 = n_13;\n let _e242 = vTextureCoord_1;\n let _e243 = materialBoundary(_e240, _e241, _e242);\n let _e244 = global.uMaterialMix_slot;\n boundary = (_e243 * _e244.x);\n let _e248 = sd;\n let _e249 = n_13;\n let _e250 = vTextureCoord_1;\n let _e251 = materialShadow(_e248, _e249, _e250);\n let _e252 = global.uMaterialMix_slot;\n shadow = (_e251 * _e252.x);\n let _e256 = boundary;\n let _e257 = shadow;\n let _e259 = boundary;\n finalColor = (_e256 + (_e257 * (1f - _e259.w)));\n return;\n }\n }\n let _e264 = sd;\n let _e265 = n_13;\n let _e266 = vTextureCoord_1;\n let _e267 = materialTransmission(_e264, _e265, _e266);\n transmitted = _e267;\n let _e269 = global.uDiagnosticOutput_slot;\n if (_e269.x > 0f) {\n {\n let _e273 = transmitted;\n finalColor = vec4<f32>(_e273.x, _e273.y, _e273.z, 1f);\n return;\n }\n }\n let _e280 = sd;\n let _e281 = n_13;\n let _e282 = vTextureCoord_1;\n let _e283 = transmitted;\n let _e284 = materialMaterial(_e280, _e281, _e282, _e283);\n material = _e284;\n if (global.uTouchLight_slot.w > 0.0) {\n let lightPoint = vFilterCoord_1 * global.uResolution_slot.xy;\n let lightDistance = length(lightPoint - global.uTouchLight_slot.xy);\n let lightWeight = 1.0 - smoothstep(0.0, global.uTouchLight_slot.z, lightDistance);\n material = mix(material, global.uTouchLightColour_slot.xyz,\n lightWeight * global.uTouchLight_slot.w);\n }\n let _e286 = global.uCoverageWidth_slot;\n let _e289 = sd;\n let _e290 = fwidth(_e289);\n aa = max(_e286.x, (0.5f * _e290));\n let _e295 = aa;\n let _e297 = aa;\n let _e298 = sd;\n let _e301 = global.uMaterialMix_slot;\n alpha_1 = ((1f - smoothstep(-(_e295), _e297, _e298)) * _e301.x);\n let _e305 = sd;\n let _e306 = n_13;\n let _e307 = vTextureCoord_1;\n let _e308 = materialShadow(_e305, _e306, _e307);\n let _e309 = global.uMaterialMix_slot;\n shadow_1 = (_e308 * _e309.x);\n let _e313 = sd;\n let _e314 = n_13;\n let _e315 = vTextureCoord_1;\n let _e316 = materialBoundary(_e313, _e314, _e315);\n let _e317 = global.uMaterialMix_slot;\n boundary_1 = (_e316 * _e317.x);\n let _e321 = material;\n let _e322 = alpha_1;\n let _e323 = (_e321 * _e322);\n let _e324 = alpha_1;\n let _e329 = boundary_1;\n let _e330 = shadow_1;\n let _e332 = boundary_1;\n let _e338 = alpha_1;\n finalColor = (vec4<f32>(_e323.x, _e323.y, _e323.z, _e324) + ((_e329 + (_e330 * (1f - _e332.w))) * (1f - _e338)));\n return;\n}\n\n@fragment \nfn main(@location(0) vTextureCoord: vec2<f32>, @location(1) vFilterCoord: vec2<f32>) -> FragmentOutput {\n vTextureCoord_1 = vTextureCoord;\n vFilterCoord_1 = vFilterCoord;\n main_1();\n let _e151 = finalColor;\n return FragmentOutput(_e151);\n}\n';
4
- readonly uniforms: readonly ['uInputSize', 'uInputClamp', 'uResolution', 'uShape', 'uRadius', 'uMorphParams', 'uMorphShape0', 'uMorphShape1', 'uMorphShape2', 'uMorphShape3', 'uMorphShape4', 'uMorphShape5', 'uMorphShape6', 'uMorphShape7', 'uMorphShape8', 'uMorphShape9', 'uMorphShape10', 'uMorphShape11', 'uMorphShape12', 'uMorphShape13', 'uMorphShape14', 'uMorphShape15', 'uMorphRadii0', 'uMorphRadii1', 'uMorphRadii2', 'uMorphRadii3', 'uMaterialUnits', 'uMaterialInner', 'uMaterialOuter', 'uMaterialBlend', 'uMaterialBlurFill', 'uMaterialBlurDistances', 'uMaterialBlurDifferences', 'uMaterialAberration', 'uMaterialAberrationDirection', 'uMaterialFace0', 'uMaterialFace1', 'uMaterialFace2', 'uMaterialBleed0', 'uMaterialBleed1', 'uMaterialBleed2', 'uMaterialShadow0', 'uMaterialShadow1', 'uMaterialShadow2', 'uMaterialShadowField', 'uMaterialShadowResponse', 'uMaterialShadowOffset', 'uMaterialColour', 'uMaterialBleed', 'uMaterialBleedField', 'uMaterialBackgroundKey', 'uMaterialBackgroundLight', 'uMaterialKey', 'uMaterialFill', 'uMaterialLight', 'uMaterialRim', 'uMaterialContourAngular', 'uMaterialSdfProjection', 'uMaterialSdfDiffuse', 'uMaterialSdfKey', 'uMaterialSdfFill', 'uMaterialSdfAngles', 'uMaterialSdf0', 'uMaterialSdf1', 'uMaterialSdf2', 'uMaterialMix', 'uCoverageWidth', 'uDiagnosticOutput', 'uInnerShade', 'uTouchLight', 'uTouchLightColour', 'uTabBarOptics'];
3
+ readonly wgsl: string;
4
+ readonly uniforms: readonly ['uInputSize', 'uInputClamp', 'uResolution', 'uShape', 'uRadius', 'uMorphParams', 'uMorphShape0', 'uMorphShape1', 'uMorphShape2', 'uMorphShape3', 'uMorphShape4', 'uMorphShape5', 'uMorphShape6', 'uMorphShape7', 'uMorphShape8', 'uMorphShape9', 'uMorphShape10', 'uMorphShape11', 'uMorphShape12', 'uMorphShape13', 'uMorphShape14', 'uMorphShape15', 'uMorphRadii0', 'uMorphRadii1', 'uMorphRadii2', 'uMorphRadii3', 'uMaterialUnits', 'uMaterialInner', 'uMaterialOuter', 'uMaterialBlend', 'uMaterialBlurFill', 'uMaterialBlurDistances', 'uMaterialBlurDifferences', 'uMaterialAberration', 'uMaterialAberrationDirection', 'uMaterialFace0', 'uMaterialFace1', 'uMaterialFace2', 'uMaterialBleed0', 'uMaterialBleed1', 'uMaterialBleed2', 'uMaterialShadow0', 'uMaterialShadow1', 'uMaterialShadow2', 'uMaterialShadowField', 'uMaterialShadowResponse', 'uMaterialShadowOffset', 'uMaterialColour', 'uMaterialBleed', 'uMaterialBleedField', 'uMaterialBackgroundKey', 'uMaterialBackgroundLight', 'uMaterialKey', 'uMaterialFill', 'uMaterialLight', 'uMaterialRim', 'uMaterialContourAngular', 'uMaterialSdfProjection', 'uMaterialSdfDiffuse', 'uMaterialSdfKey', 'uMaterialSdfFill', 'uMaterialSdfAngles', 'uMaterialSdf0', 'uMaterialSdf1', 'uMaterialSdf2', 'uMaterialMix', 'uCoverageWidth', 'uDiagnosticOutput', 'uInnerShade', 'uTouchLight', 'uTouchLightColour', 'uTabBarOptics', 'uControlRim', 'uControlSpecular', 'uControlSize'];
5
5
  readonly textures: readonly ['uTexture', 'uSource'];
6
6
  };
7
7
  menu: {
@@ -135,6 +135,7 @@ export declare class ProductionGlassRuntime {
135
135
  private pointerX;
136
136
  private pointerStart;
137
137
  private pointerIndex;
138
+ private padSearch?;
138
139
  private minimize;
139
140
  minimizeDom?: WorkerMinimize;
140
141
  navigationRoutes: NavigationGlassState['routes'];
@@ -1,3 +1,4 @@
1
+ import { PadSearchBarMotion } from '../../search/padSearchBarMotion.js';
1
2
  import { SCROLL_INSERTION_MOTION } from '../../scroll/insertionMotion.js';
2
3
  import { KEYBOARD_CARRIER_MOTION } from '../../safe-area/keyboardCarrierGeometry.js';
3
4
  import { keyboardBackdrop } from './keyboardBackdrop.js';
@@ -148,6 +149,7 @@ export class ProductionGlassRuntime {
148
149
  pointerX = 0;
149
150
  pointerStart = 0;
150
151
  pointerIndex = 0;
152
+ padSearch;
151
153
  minimize = new TabMinimizeIntent();
152
154
  minimizeDom;
153
155
  navigationRoutes = [];
@@ -385,6 +387,10 @@ export class ProductionGlassRuntime {
385
387
  element.style.cssText =
386
388
  'position:absolute;inset:0;overflow:visible;clip-path:none;transform:none';
387
389
  this.canvas.style.cssText = `position:absolute;left:0;top:0;width:${geometry.width}px;height:${geometry.height}px;pointer-events:none`;
390
+ if (!this.client.documentOwned) {
391
+ this.canvas.style.objectFit = 'contain';
392
+ this.canvas.style.objectPosition = 'left bottom';
393
+ }
388
394
  this.canvas.dataset.satinWebgpu = 'production';
389
395
  // Chrome canvases start as one pixel; each preparation places them on the band their surfaces
390
396
  // reach. A remount (geometry change, rebind) keeps the band the worker is drawing for until the
@@ -1406,7 +1412,7 @@ export class ProductionGlassRuntime {
1406
1412
  /** A source change during tab-bar minimize/restore is applied when the motion finishes
1407
1413
  * (its track schedules a preparation): reinstalling every surface mid-motion stalled worker frames. */
1408
1414
  schedulePrepare(afterMinimize = false, windowRecentre = false) {
1409
- if (!afterMinimize && this.minimizeDom?.active)
1415
+ if (!afterMinimize && (this.minimizeDom?.active || this.padSearch?.active))
1410
1416
  return;
1411
1417
  if (this.prepareFrame ||
1412
1418
  this.resumeFrame ||
@@ -1702,6 +1708,29 @@ export class ProductionGlassRuntime {
1702
1708
  const previous = this.options.geometry;
1703
1709
  this.options = { ...this.options, geometry: { ...previous, ...next } };
1704
1710
  this.minimizeDom?.update(this.options);
1711
+ if (previous.tabBarPlacement === 'top' &&
1712
+ next.tabBarOpacity !== undefined &&
1713
+ previous.tabBarOpacity !== next.tabBarOpacity) {
1714
+ const spec = this.currentSpecs().find(candidate => candidate.id === 'dock');
1715
+ if (spec) {
1716
+ if (!this.pointer)
1717
+ this.tabInput('reset', this.options.geometry.tabBarSelectedIndex ?? 0, true);
1718
+ const track = (this.padSearch ??= new PadSearchBarMotion()).start(this.options.elements.chrome.dock, 1 - next.tabBarOpacity, spec);
1719
+ if (track.duration)
1720
+ this.track('dock', track.specs, track.duration, track.at);
1721
+ else {
1722
+ const region = this.regionIds.get('dock');
1723
+ this.specs.set('dock', spec);
1724
+ if (region)
1725
+ this.fire({ type: 'region-spec', id: region, spec });
1726
+ }
1727
+ void track.finished.then(() => {
1728
+ if (!this.padSearch?.active)
1729
+ this.schedulePrepare(true);
1730
+ });
1731
+ return;
1732
+ }
1733
+ }
1705
1734
  if (previous.tabBarPlacement !== this.options.geometry.tabBarPlacement) {
1706
1735
  this.minimize.rebase(this.options.elements.scroller.scrollTop);
1707
1736
  if (this.options.geometry.tabBarPlacement === 'top')
@@ -1852,6 +1881,7 @@ export class ProductionGlassRuntime {
1852
1881
  this.teardown();
1853
1882
  }
1854
1883
  teardown() {
1884
+ this.padSearch?.dispose();
1855
1885
  this.unbindAppearance();
1856
1886
  if (this.minimizeDom && (this.minimizeDom.active || this.minimize.compact)) {
1857
1887
  const dock = this.currentSpecs().find(spec => spec.id === 'dock');
@@ -37,6 +37,19 @@ export declare class WebGPURaster {
37
37
  private overlayPipeline;
38
38
  private presentPipeline;
39
39
  private format;
40
+ private presentationRoot?;
41
+ private presentationOrigin?;
42
+ private presentationMembers;
43
+ private presentationSequence?;
44
+ private collectingPresentation;
45
+ /** Member samples encode their materials first. The root then presents the whole frame once. */
46
+ withSharedPresentation(draw: () => void): void;
47
+ /** Retain independent material sampling, but store overlapping fixed chrome once. */
48
+ joinPresentation(root: WebGPURaster, origin: {
49
+ x: number;
50
+ y: number;
51
+ }): void;
52
+ leavePresentation(): void;
40
53
  private lost;
41
54
  private suspended;
42
55
  private covered;
@@ -172,8 +185,10 @@ export declare class WebGPURaster {
172
185
  * region presenter's layer already is its sample rectangle and keeps layer space. */
173
186
  private localResult;
174
187
  /** Device-pixel offset of this layer's canvas within its layer. */
188
+ private presentationViewport;
175
189
  private canvasOffset;
176
190
  private canvasSize;
191
+ private resizeCanvas;
177
192
  /** Size the shared layer canvas to a band of its layer (the element is placed there by
178
193
  * the page): a lift overlay presents a strip, not a second full-screen canvas. */
179
194
  setCanvasViewport(viewport: readonly [number, number, number, number] | undefined): void;
@@ -201,6 +216,9 @@ export declare class WebGPURaster {
201
216
  * Returns false, drawing nothing, when the canvas already shows exactly this (see
202
217
  * `presentedLayers`): the same results at the same places, or nothing at all. */
203
218
  static presentLayer(encoder: GPUCommandEncoder, rasters: readonly WebGPURaster[]): boolean;
219
+ private presentationOffset;
220
+ private groupPresentUniform;
221
+ private groupPresentScissor;
204
222
  private presentDraw;
205
223
  /** Scroll-attached glass is part of the scrolling content, and the navigation bar's scroll-edge
206
224
  * effect is painted over that content (CSS, a layer above the scroll container). Its own