authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-08-28 17:22:38-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-08-29 00:22:38+00:00
logac3a331918b7b25271058ae7e12f1e15772fb3de
tree3abb9c2a8042692028aae45ae4b76c1a80cdc264
parent8fc7f22941969d7a2c06929dc29aa86ae1b02f33
signature Signed by PGP key B5690EEEBB952194

Remove Messages Glass Lab experiment (#8599)


4 files changed, 48 insertions(+), 729 deletions(-)

experiments/messages-glass-lab/MessagesGlassLab.xcodeproj/project.pbxproj deleted-285
...@@ -1,285 +0,0 @@
1// !$*UTF8*$!
2{
3 archiveVersion = 1;
4 classes = {
5 };
6 objectVersion = 77;
7 objects = {
8
9/* Begin PBXBuildFile section */
10 8A01A0012D10000100A00001 /* MessagesGlassLabApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A01A0002D10000100A00001 /* MessagesGlassLabApp.swift */; };
11 8A01A0032D10000100A00001 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A01A0022D10000100A00001 /* ContentView.swift */; };
12/* End PBXBuildFile section */
13
14/* Begin PBXFileReference section */
15 8A01A0002D10000100A00001 /* MessagesGlassLabApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesGlassLabApp.swift; sourceTree = "<group>"; };
16 8A01A0022D10000100A00001 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
17 8A01A0102D10000100A00001 /* MessagesGlassLab.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MessagesGlassLab.app; sourceTree = BUILT_PRODUCTS_DIR; };
18/* End PBXFileReference section */
19
20 8A01A0202D10000100A00001 /* MessagesGlassLab */ = {
21 isa = PBXGroup;
22 children = (
23 8A01A0002D10000100A00001 /* MessagesGlassLabApp.swift */,
24 8A01A0022D10000100A00001 /* ContentView.swift */,
25 );
26 path = MessagesGlassLab;
27 sourceTree = "<group>";
28 };
29
30/* Begin PBXFrameworksBuildPhase section */
31 8A01A0112D10000100A00001 /* Frameworks */ = {
32 isa = PBXFrameworksBuildPhase;
33 buildActionMask = 2147483647;
34 files = (
35 );
36 runOnlyForDeploymentPostprocessing = 0;
37 };
38/* End PBXFrameworksBuildPhase section */
39
40/* Begin PBXGroup section */
41 8A01A0302D10000100A00001 = {
42 isa = PBXGroup;
43 children = (
44 8A01A0202D10000100A00001 /* MessagesGlassLab */,
45 8A01A0312D10000100A00001 /* Products */,
46 );
47 sourceTree = "<group>";
48 };
49 8A01A0312D10000100A00001 /* Products */ = {
50 isa = PBXGroup;
51 children = (
52 8A01A0102D10000100A00001 /* MessagesGlassLab.app */,
53 );
54 name = Products;
55 sourceTree = "<group>";
56 };
57/* End PBXGroup section */
58
59/* Begin PBXNativeTarget section */
60 8A01A0402D10000100A00001 /* MessagesGlassLab */ = {
61 isa = PBXNativeTarget;
62 buildConfigurationList = 8A01A0502D10000100A00001 /* Build configuration list for PBXNativeTarget "MessagesGlassLab" */;
63 buildPhases = (
64 8A01A0412D10000100A00001 /* Sources */,
65 8A01A0112D10000100A00001 /* Frameworks */,
66 8A01A0422D10000100A00001 /* Resources */,
67 );
68 buildRules = (
69 );
70 dependencies = (
71 );
72 name = MessagesGlassLab;
73 packageProductDependencies = (
74 );
75 productName = MessagesGlassLab;
76 productReference = 8A01A0102D10000100A00001 /* MessagesGlassLab.app */;
77 productType = "com.apple.product-type.application";
78 };
79/* End PBXNativeTarget section */
80
81/* Begin PBXProject section */
82 8A01A0602D10000100A00001 /* Project object */ = {
83 isa = PBXProject;
84 attributes = {
85 BuildIndependentTargetsInParallel = 1;
86 LastSwiftUpdateCheck = 2700;
87 LastUpgradeCheck = 2700;
88 TargetAttributes = {
89 8A01A0402D10000100A00001 = {
90 CreatedOnToolsVersion = 27.0;
91 };
92 };
93 };
94 buildConfigurationList = 8A01A0612D10000100A00001 /* Build configuration list for PBXProject "MessagesGlassLab" */;
95 compatibilityVersion = "Xcode 16.0";
96 developmentRegion = en;
97 hasScannedForEncodings = 0;
98 knownRegions = (
99 en,
100 Base,
101 );
102 mainGroup = 8A01A0302D10000100A00001;
103 minimizedProjectReferenceProxies = 1;
104 preferredProjectObjectVersion = 77;
105 productRefGroup = 8A01A0312D10000100A00001 /* Products */;
106 projectDirPath = "";
107 projectRoot = "";
108 targets = (
109 8A01A0402D10000100A00001 /* MessagesGlassLab */,
110 );
111 };
112/* End PBXProject section */
113
114/* Begin PBXResourcesBuildPhase section */
115 8A01A0422D10000100A00001 /* Resources */ = {
116 isa = PBXResourcesBuildPhase;
117 buildActionMask = 2147483647;
118 files = (
119 );
120 runOnlyForDeploymentPostprocessing = 0;
121 };
122/* End PBXResourcesBuildPhase section */
123
124/* Begin PBXSourcesBuildPhase section */
125 8A01A0412D10000100A00001 /* Sources */ = {
126 isa = PBXSourcesBuildPhase;
127 buildActionMask = 2147483647;
128 files = (
129 8A01A0012D10000100A00001 /* MessagesGlassLabApp.swift in Sources */,
130 8A01A0032D10000100A00001 /* ContentView.swift in Sources */,
131 );
132 runOnlyForDeploymentPostprocessing = 0;
133 };
134/* End PBXSourcesBuildPhase section */
135
136/* Begin XCBuildConfiguration section */
137 8A01A0622D10000100A00001 /* Debug */ = {
138 isa = XCBuildConfiguration;
139 buildSettings = {
140 ALWAYS_SEARCH_USER_PATHS = NO;
141 CLANG_ENABLE_MODULES = YES;
142 CLANG_ENABLE_OBJC_ARC = YES;
143 CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
144 CLANG_WARN_BOOL_CONVERSION = YES;
145 CLANG_WARN_COMMA = YES;
146 CLANG_WARN_CONSTANT_CONVERSION = YES;
147 CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
148 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
149 CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
150 CLANG_WARN_EMPTY_BODY = YES;
151 CLANG_WARN_ENUM_CONVERSION = YES;
152 CLANG_WARN_INFINITE_RECURSION = YES;
153 CLANG_WARN_INT_CONVERSION = YES;
154 CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
155 CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
156 CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
157 CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
158 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
159 CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
160 CLANG_WARN_STRICT_PROTOTYPES = YES;
161 CLANG_WARN_SUSPICIOUS_MOVE = YES;
162 CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
163 CLANG_WARN_UNREACHABLE_CODE = YES;
164 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
165 COPY_PHASE_STRIP = NO;
166 DEBUG_INFORMATION_FORMAT = dwarf;
167 ENABLE_STRICT_OBJC_MSGSEND = YES;
168 ENABLE_TESTABILITY = YES;
169 GCC_C_LANGUAGE_STANDARD = gnu17;
170 GCC_DYNAMIC_NO_PIC = NO;
171 GCC_NO_COMMON_BLOCKS = YES;
172 GCC_OPTIMIZATION_LEVEL = 0;
173 GCC_PREPROCESSOR_DEFINITIONS = (
174 "DEBUG=1",
175 "$(inherited)",
176 );
177 GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
178 GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
179 GCC_WARN_UNDECLARED_SELECTOR = YES;
180 GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
181 GCC_WARN_UNUSED_FUNCTION = YES;
182 GCC_WARN_UNUSED_VARIABLE = YES;
183 IPHONEOS_DEPLOYMENT_TARGET = 27.0;
184 MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
185 MTL_FAST_MATH = YES;
186 ONLY_ACTIVE_ARCH = YES;
187 SDKROOT = iphoneos;
188 SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
189 SWIFT_OPTIMIZATION_LEVEL = "-Onone";
190 SWIFT_VERSION = 6.0;
191 };
192 name = Debug;
193 };
194 8A01A0632D10000100A00001 /* Release */ = {
195 isa = XCBuildConfiguration;
196 buildSettings = {
197 ALWAYS_SEARCH_USER_PATHS = NO;
198 CLANG_ENABLE_MODULES = YES;
199 CLANG_ENABLE_OBJC_ARC = YES;
200 COPY_PHASE_STRIP = NO;
201 DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
202 ENABLE_NS_ASSERTIONS = NO;
203 GCC_C_LANGUAGE_STANDARD = gnu17;
204 IPHONEOS_DEPLOYMENT_TARGET = 27.0;
205 MTL_FAST_MATH = YES;
206 SDKROOT = iphoneos;
207 SWIFT_COMPILATION_MODE = wholemodule;
208 SWIFT_VERSION = 6.0;
209 VALIDATE_PRODUCT = YES;
210 };
211 name = Release;
212 };
213 8A01A0512D10000100A00001 /* Debug */ = {
214 isa = XCBuildConfiguration;
215 buildSettings = {
216 ASSETCATALOG_COMPILER_APPICON_NAME = "";
217 CODE_SIGNING_ALLOWED = NO;
218 CODE_SIGNING_REQUIRED = NO;
219 CODE_SIGN_STYLE = Automatic;
220 DEVELOPMENT_TEAM = "";
221 GENERATE_INFOPLIST_FILE = YES;
222 INFOPLIST_KEY_CFBundleDisplayName = "Messages Glass Lab";
223 INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
224 INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
225 INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
226 INFOPLIST_KEY_UILaunchScreen_Generation = YES;
227 INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
228 IPHONEOS_DEPLOYMENT_TARGET = 27.0;
229 PRODUCT_BUNDLE_IDENTIFIER = com.t3tools.messagesglasslab;
230 PRODUCT_NAME = "$(TARGET_NAME)";
231 SWIFT_EMIT_LOC_STRINGS = YES;
232 SWIFT_VERSION = 6.0;
233 TARGETED_DEVICE_FAMILY = "1,2";
234 };
235 name = Debug;
236 };
237 8A01A0522D10000100A00001 /* Release */ = {
238 isa = XCBuildConfiguration;
239 buildSettings = {
240 ASSETCATALOG_COMPILER_APPICON_NAME = "";
241 CODE_SIGNING_ALLOWED = NO;
242 CODE_SIGNING_REQUIRED = NO;
243 CODE_SIGN_STYLE = Automatic;
244 DEVELOPMENT_TEAM = "";
245 GENERATE_INFOPLIST_FILE = YES;
246 INFOPLIST_KEY_CFBundleDisplayName = "Messages Glass Lab";
247 INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
248 INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
249 INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
250 INFOPLIST_KEY_UILaunchScreen_Generation = YES;
251 INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
252 IPHONEOS_DEPLOYMENT_TARGET = 27.0;
253 PRODUCT_BUNDLE_IDENTIFIER = com.t3tools.messagesglasslab;
254 PRODUCT_NAME = "$(TARGET_NAME)";
255 SWIFT_EMIT_LOC_STRINGS = YES;
256 SWIFT_VERSION = 6.0;
257 TARGETED_DEVICE_FAMILY = "1,2";
258 };
259 name = Release;
260 };
261/* End XCBuildConfiguration section */
262
263/* Begin XCConfigurationList section */
264 8A01A0612D10000100A00001 /* Build configuration list for PBXProject "MessagesGlassLab" */ = {
265 isa = XCConfigurationList;
266 buildConfigurations = (
267 8A01A0622D10000100A00001 /* Debug */,
268 8A01A0632D10000100A00001 /* Release */,
269 );
270 defaultConfigurationIsVisible = 0;
271 defaultConfigurationName = Debug;
272 };
273 8A01A0502D10000100A00001 /* Build configuration list for PBXNativeTarget "MessagesGlassLab" */ = {
274 isa = XCConfigurationList;
275 buildConfigurations = (
276 8A01A0512D10000100A00001 /* Debug */,
277 8A01A0522D10000100A00001 /* Release */,
278 );
279 defaultConfigurationIsVisible = 0;
280 defaultConfigurationName = Debug;
281 };
282/* End XCConfigurationList section */
283 };
284 rootObject = 8A01A0602D10000100A00001 /* Project object */;
285}
experiments/messages-glass-lab/MessagesGlassLab/ContentView.swift deleted-386
...@@ -1,386 +0,0 @@
1import SwiftUI
2
3struct LabThread: Identifiable, Hashable {
4 let id = UUID()
5 let title: String
6 let subtitle: String
7 let time: String
8 let initials: String
9 let tint: Color
10 let preview: String
11}
12
13private let threads: [LabThread] = [
14 .init(title: "Markdown rendering test", subtitle: "t3code · Julius’s Mac mini", time: "14h", initials: "MD", tint: .blue, preview: "Renderer stress test, terminal snippets, code blocks, and a very long markdown transcript."),
15 .init(title: "iPad rectly text correction", subtitle: "Julius’s Mac mini · main", time: "16h", initials: "IP", tint: .purple, preview: "Fix iPad layout, search behavior, hardware keyboard, and trackpad scrolling."),
16 .init(title: "Preview Webview Persists Off Panel", subtitle: "codething-mvp · Julius’s MacBook Pro", time: "22m", initials: "PW", tint: .teal, preview: "The browser preview should not leak outside the active panel when switching threads."),
17 .init(title: "Add file preview action buttons", subtitle: "codex/connection-preview", time: "10d", initials: "FP", tint: .orange, preview: "Open files at exact lines and expose copy/open actions in the renderer."),
18 .init(title: "Investigate v2 pipeline slowdown", subtitle: "codex-turn-runner", time: "1d", initials: "V2", tint: .gray, preview: "Compare orchestration traces and find why streamed events are delayed under load."),
19 .init(title: "Fix dark-mode header glass", subtitle: "t3code/ipad-responsive-mobile-layout", time: "2h", initials: "DG", tint: .indigo, preview: "Compare dark scroll-edge material against Messages and Mail, then map the behavior back to React Native Screens."),
20 .init(title: "Magic Keyboard sidebar scroll", subtitle: "mobile/input-polish", time: "3h", initials: "MK", tint: .cyan, preview: "Trackpad scrolling should remain fluid while swipe actions still work for touch gestures."),
21 .init(title: "Terminal tab key routing", subtitle: "terminal/native-pty", time: "5h", initials: "⌘", tint: .green, preview: "Hardware Tab should go to the terminal session instead of escaping to the thread search field."),
22 .init(title: "Diff renderer split inspector", subtitle: "review-diff/native", time: "8h", initials: "Δ", tint: .red, preview: "Keep file navigation, sticky headers, and selected hunk state stable in a three-column iPad layout."),
23 .init(title: "Composer glass affordance", subtitle: "composer/liquid-glass", time: "9h", initials: "CG", tint: .pink, preview: "Prototype a bottom composer that feels native without covering too much content while scrolling."),
24 .init(title: "Search placement audit", subtitle: "navigation/native-search", time: "11h", initials: "SP", tint: .mint, preview: "Validate whether search belongs in the bottom toolbar on iPhone and the sidebar chrome on iPad."),
25 .init(title: "Thread row density pass", subtitle: "home/messages-list", time: "12h", initials: "TR", tint: .brown, preview: "Tune row height, separators, preview text, chevrons, and status glyphs to match native list rhythm."),
26 .init(title: "Files navigator polish", subtitle: "files/inspector", time: "1d", initials: "FN", tint: .yellow, preview: "Make the file explorer feel like an iPad side inspector instead of a cramped web sidebar."),
27 .init(title: "Toolbar grouping experiment", subtitle: "native-toolbar-glass", time: "2d", initials: "TB", tint: .blue.opacity(0.7), preview: "Compare separate glass buttons with merged toolbar groups and spacing behavior."),
28 .init(title: "Scroll-edge fade comparison", subtitle: "swiftui/messages-lab", time: "3d", initials: "SE", tint: .purple.opacity(0.8), preview: "Record scroll positions to see where native headers start becoming visible over content."),
29 .init(title: "iPad sidebar selection state", subtitle: "split-view/sidebar", time: "4d", initials: "SS", tint: .teal.opacity(0.75), preview: "Find the right selected-row treatment for dark and light mode in a persistent sidebar."),
30 .init(title: "Preview webview panel bug", subtitle: "preview/browser", time: "5d", initials: "WB", tint: .orange.opacity(0.8), preview: "Ensure preview browser surfaces stay clipped to the active detail pane during navigation."),
31 .init(title: "Keyboard shortcuts overlay", subtitle: "hardware-keyboard", time: "6d", initials: "KS", tint: .gray.opacity(0.9), preview: "Expose discoverable commands and keep focus behavior aligned with iPadOS keyboard conventions."),
32 .init(title: "Thread loading skeleton", subtitle: "mobile/perceived-performance", time: "1w", initials: "LS", tint: .green.opacity(0.75), preview: "Replace jarring empty states with native-feeling loading rows while snapshots hydrate."),
33 .init(title: "Connection recovery UX", subtitle: "lan-pairing", time: "2w", initials: "CR", tint: .red.opacity(0.75), preview: "Make reconnect banners and retry affordances less intrusive during scroll and composition."),
34]
35
36struct ContentView: View {
37 @Environment(\.horizontalSizeClass) private var horizontalSizeClass
38 @State private var searchText = ""
39 @State private var selectedThread: LabThread? = threads[0]
40
41 var body: some View {
42 if horizontalSizeClass == .regular {
43 NativeSplitLab(searchText: $searchText, selectedThread: $selectedThread)
44 } else {
45 NativePhoneLab(searchText: $searchText, selectedThread: $selectedThread)
46 }
47 }
48}
49
50private var filteredThreads: [LabThread] {
51 threads
52}
53
54private let glassDebugCodeLines: [String] = [
55 "# Native RNS glass debug route",
56 "",
57 "This screen intentionally avoids Expo Router headers.",
58 "The native header below is owned by react-native-screens.",
59 "",
60 "Expected iOS 26 behavior:",
61 "- At rest: header should feel like app background",
62 "- While scrolled: content should blur behind the header",
63 "- No gray custom overlay",
64 "- No JS blur view",
65 "",
66 "Scroll edge effect should sample actual content:",
67 "const header = { translucent: true }",
68 "const scrollEdgeEffects = { top: 'soft' }",
69 "",
70 "Bright rows below make sampling failures obvious.",
71 "",
72 "node_modules",
73 "/.pnp",
74 ".pnp.*",
75 ".yarn/*",
76 "!.yarn/patches",
77 "!.yarn/plugins",
78 "!.yarn/releases",
79 "!.yarn/versions",
80 "",
81 "# testing",
82 "/coverage",
83 ".convex",
84 "e2e/.local-dev.json",
85 "e2e/playwright-report",
86 "e2e/test-results",
87 "",
88 "# app surfaces",
89 "threads",
90 "terminal",
91 "diff renderer",
92 "file explorer",
93 "composer",
94 "native header",
95 "scroll edge",
96 "liquid glass",
97]
98
99private let glassDebugSwatches: [Color] = [
100 .blue,
101 .green,
102 .orange,
103 .purple,
104 .cyan,
105 .pink,
106]
107
108struct NativePhoneLab: View {
109 @Binding var searchText: String
110 @Binding var selectedThread: LabThread?
111
112 var body: some View {
113 NavigationStack {
114 NativeThreadLab(thread: selectedThread ?? threads[0])
115 }
116 }
117}
118
119struct NativeSplitLab: View {
120 @Binding var searchText: String
121 @Binding var selectedThread: LabThread?
122
123 var body: some View {
124 NavigationSplitView {
125 List(filteredThreads, selection: $selectedThread) { thread in
126 MessageSidebarRow(thread: thread)
127 .tag(thread)
128 }
129 .listStyle(.sidebar)
130 .navigationTitle("Threads")
131 .searchable(text: $searchText, placement: .sidebar, prompt: "Search")
132 .toolbar {
133 ToolbarItemGroup(placement: .topBarTrailing) {
134 Menu {
135 Button("All Threads", systemImage: "tray.full") {}
136 Button("Ready", systemImage: "checkmark.circle") {}
137 Button("Running", systemImage: "bolt.circle") {}
138 } label: {
139 Image(systemName: "line.3.horizontal.decrease")
140 }
141 .buttonStyle(.glass)
142
143 Button {} label: {
144 Image(systemName: "gearshape")
145 }
146 .buttonStyle(.glass)
147
148 Button {} label: {
149 Image(systemName: "square.and.pencil")
150 }
151 .buttonStyle(.glass)
152 }
153 }
154 } detail: {
155 if let selectedThread {
156 NativeThreadLab(thread: selectedThread)
157 } else {
158 ContentUnavailableView("Select a thread", systemImage: "sidebar.left")
159 }
160 }
161 }
162}
163
164struct MessageListRow: View {
165 let thread: LabThread
166
167 var body: some View {
168 HStack(alignment: .top, spacing: 14) {
169 Circle()
170 .fill(thread.tint.gradient)
171 .frame(width: 52, height: 52)
172 .overlay {
173 Text(thread.initials)
174 .font(.headline.weight(.bold))
175 .foregroundStyle(.white)
176 }
177
178 VStack(alignment: .leading, spacing: 4) {
179 HStack {
180 Text(thread.title)
181 .font(.headline.weight(.semibold))
182 .lineLimit(1)
183 Spacer(minLength: 8)
184 Text(thread.time)
185 .foregroundStyle(.secondary)
186 Image(systemName: "chevron.right")
187 .font(.caption.weight(.semibold))
188 .foregroundStyle(.tertiary)
189 }
190
191 Text(thread.preview)
192 .font(.subheadline)
193 .foregroundStyle(.secondary)
194 .lineLimit(2)
195 }
196 .padding(.vertical, 12)
197 }
198 }
199}
200
201struct MessageSidebarRow: View {
202 let thread: LabThread
203
204 var body: some View {
205 VStack(alignment: .leading, spacing: 4) {
206 HStack {
207 Text(thread.title)
208 .font(.headline.weight(.semibold))
209 .lineLimit(1)
210 Spacer()
211 Text(thread.time)
212 .font(.subheadline)
213 .foregroundStyle(.secondary)
214 }
215 Text(thread.subtitle)
216 .font(.subheadline)
217 .foregroundStyle(.secondary)
218 .lineLimit(1)
219 }
220 .padding(.vertical, 6)
221 }
222}
223
224struct NativeThreadLab: View {
225 let thread: LabThread
226 @State private var draft = "Ask the repo agent, or run a command..."
227 @State private var scrollStep = 0
228
229 private let scrollTimer = Timer.publish(every: 2.8, on: .main, in: .common).autoconnect()
230 private let scrollTargets = ["top", "swatches", "top", "code", "card"]
231
232 var body: some View {
233 ScrollViewReader { proxy in
234 ScrollView {
235 LazyVStack(alignment: .leading, spacing: 22) {
236 Color.clear
237 .frame(height: 0)
238 .id("top")
239
240 hero
241 .padding(.top, 8)
242
243 swatches
244 .id("swatches")
245
246 explanationCard
247 .id("card")
248
249 codeCard
250 .id("code")
251 }
252 .padding(.horizontal, 18)
253 .padding(.top, 8)
254 .padding(.bottom, 96)
255 }
256 .background(Color(uiColor: .systemBackground))
257 .onReceive(scrollTimer) { _ in
258 guard !scrollTargets.isEmpty else { return }
259
260 let target = scrollTargets[scrollStep % scrollTargets.count]
261 scrollStep += 1
262
263 withAnimation(.smooth(duration: 1.0)) {
264 proxy.scrollTo(target, anchor: .top)
265 }
266 }
267 }
268 .navigationTitle("RNS Glass")
269 .navigationSubtitle("plain react-native-screens")
270 .toolbar {
271 ToolbarItemGroup(placement: .topBarTrailing) {
272 Button {} label: { Image(systemName: "plus") }
273 .buttonStyle(.glass)
274 Button {} label: { Image(systemName: "magnifyingglass") }
275 .buttonStyle(.glass)
276 }
277 }
278 .safeAreaInset(edge: .bottom) {
279 composer
280 }
281 }
282
283 private var hero: some View {
284 VStack(alignment: .leading, spacing: 10) {
285 Text("plain react-native-screens")
286 .font(.subheadline.weight(.bold))
287 .textCase(.uppercase)
288 .tracking(0.5)
289 .foregroundStyle(.secondary)
290
291 Text("Native scroll-edge glass")
292 .font(.system(size: 48, weight: .heavy, design: .default))
293 .lineLimit(nil)
294 .minimumScaleFactor(0.72)
295
296 Text("This route uses RNS directly. The script scrolls automatically so the native header is captured both at rest and with bright content behind it.")
297 .font(.title3)
298 .foregroundStyle(.secondary)
299 }
300 }
301
302 private var swatches: some View {
303 LazyVGrid(
304 columns: [GridItem(.adaptive(minimum: 60), spacing: 12)],
305 alignment: .leading,
306 spacing: 12
307 ) {
308 ForEach(Array(glassDebugSwatches.enumerated()), id: \.offset) { index, color in
309 Circle()
310 .fill(color.gradient)
311 .frame(width: 60, height: 60)
312 .overlay {
313 Text("\(index + 1)")
314 .font(.title2.weight(.heavy))
315 .foregroundStyle(.white)
316 }
317 }
318 }
319 }
320
321 private var explanationCard: some View {
322 VStack(alignment: .leading, spacing: 10) {
323 Text("What this isolates")
324 .font(.title2.weight(.bold))
325
326 Text("Native transparent header + iOS 26 scroll edge effect. No Expo Router header config, no custom blur overlay, no large title requirement.")
327 .font(.title3)
328 .foregroundStyle(.secondary)
329 }
330 .padding(22)
331 .frame(maxWidth: .infinity, alignment: .leading)
332 .background(.thinMaterial, in: RoundedRectangle(cornerRadius: 28, style: .continuous))
333 .overlay {
334 RoundedRectangle(cornerRadius: 28, style: .continuous)
335 .stroke(.separator.opacity(0.35), lineWidth: 0.5)
336 }
337 }
338
339 private var codeCard: some View {
340 VStack(alignment: .leading, spacing: 0) {
341 ForEach(Array((glassDebugCodeLines + glassDebugCodeLines).enumerated()), id: \.offset) { index, line in
342 HStack(alignment: .top, spacing: 16) {
343 Text("\(index + 1)")
344 .foregroundStyle(.secondary)
345 .frame(width: 34, alignment: .trailing)
346
347 Text(line.isEmpty ? " " : line)
348 .frame(maxWidth: .infinity, alignment: .leading)
349 }
350 .font(.system(size: 16, design: .monospaced))
351 .lineSpacing(4)
352 .padding(.horizontal, 16)
353 .padding(.vertical, 3)
354 }
355 }
356 .padding(.vertical, 14)
357 .background(.thinMaterial, in: RoundedRectangle(cornerRadius: 24, style: .continuous))
358 .overlay {
359 RoundedRectangle(cornerRadius: 24, style: .continuous)
360 .stroke(.separator.opacity(0.35), lineWidth: 0.5)
361 }
362 }
363
364 private var composer: some View {
365 HStack(spacing: 10) {
366 Text(draft)
367 .foregroundStyle(.secondary)
368 .lineLimit(1)
369 Spacer()
370 Image(systemName: "arrow.up")
371 .font(.headline.weight(.bold))
372 .frame(width: 44, height: 44)
373 .glassEffect(.regular.interactive(), in: Circle())
374 }
375 .padding(.leading, 18)
376 .padding(.trailing, 6)
377 .frame(height: 56)
378 .glassEffect(.clear.interactive(), in: Capsule())
379 .padding(.horizontal)
380 .padding(.vertical, 8)
381 }
382}
383
384#Preview {
385 ContentView()
386}
experiments/messages-glass-lab/MessagesGlassLab/MessagesGlassLabApp.swift deleted-10
...@@ -1,10 +0,0 @@
1import SwiftUI
2
3@main
4struct MessagesGlassLabApp: App {
5 var body: some Scene {
6 WindowGroup {
7 ContentView()
8 }
9 }
10}
pnpm-lock.yaml+48-48
...@@ -248,7 +248,7 @@ importers:...@@ -248,7 +248,7 @@ importers:
248 version: 7.3.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)248 version: 7.3.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
249 '@react-navigation/native-stack':249 '@react-navigation/native-stack':
250 specifier: 7.17.6250 specifier: 7.17.6
251 version: 7.17.6(patch_hash=0365b727005b3a830af80ccbd0b637666cc0338d33ddcb7a25b6de51a21ea027)(7ffd26361d0ffb9781446d1519df37be)251 version: 7.17.6(patch_hash=0365b727005b3a830af80ccbd0b637666cc0338d33ddcb7a25b6de51a21ea027)(e49ba4adb65ddb2cde0c8b8b274b705b)
252 '@shikijs/core':252 '@shikijs/core':
253 specifier: 4.2.0253 specifier: 4.2.0
254 version: 4.2.0254 version: 4.2.0
...@@ -12252,7 +12252,7 @@ snapshots:...@@ -12252,7 +12252,7 @@ snapshots:
12252 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)12252 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12253 zod: 3.25.7612253 zod: 3.25.76
12254 optionalDependencies:12254 optionalDependencies:
12255 expo-router: 56.2.11(e1497a99e5bc5be76c1cdb733671f865)12255 expo-router: 56.2.11(b91ff5333bc046aa08fb7484e4e065d6)
12256 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)12256 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
12257 transitivePeerDependencies:12257 transitivePeerDependencies:
12258 - '@expo/dom-webview'12258 - '@expo/dom-webview'
...@@ -12328,7 +12328,7 @@ snapshots:...@@ -12328,7 +12328,7 @@ snapshots:
12328 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)12328 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12329 zod: 3.25.7612329 zod: 3.25.76
12330 optionalDependencies:12330 optionalDependencies:
12331 expo-router: 56.2.11(80beea6a31a5d2003a696c1401258797)12331 expo-router: 56.2.11(f8b3939b2a15129a8b59814542a58c1b)
12332 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)12332 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
12333 transitivePeerDependencies:12333 transitivePeerDependencies:
12334 - '@expo/dom-webview'12334 - '@expo/dom-webview'
...@@ -12668,7 +12668,7 @@ snapshots:...@@ -12668,7 +12668,7 @@ snapshots:
12668 react: 19.2.312668 react: 19.2.3
12669 optionalDependencies:12669 optionalDependencies:
12670 '@expo/metro-runtime': 56.0.15(@expo/log-box@56.0.13)(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)12670 '@expo/metro-runtime': 56.0.15(@expo/log-box@56.0.13)(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
12671 expo-router: 56.2.11(e1497a99e5bc5be76c1cdb733671f865)12671 expo-router: 56.2.11(b91ff5333bc046aa08fb7484e4e065d6)
12672 react-dom: 19.2.3(react@19.2.3)12672 react-dom: 19.2.3(react@19.2.3)
12673 transitivePeerDependencies:12673 transitivePeerDependencies:
12674 - supports-color12674 - supports-color
...@@ -12683,7 +12683,7 @@ snapshots:...@@ -12683,7 +12683,7 @@ snapshots:
12683 react: 19.2.612683 react: 19.2.6
12684 optionalDependencies:12684 optionalDependencies:
12685 '@expo/metro-runtime': 56.0.15(@expo/log-box@56.0.13)(expo@56.0.12)(react-dom@19.2.6(react@19.2.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)12685 '@expo/metro-runtime': 56.0.15(@expo/log-box@56.0.13)(expo@56.0.12)(react-dom@19.2.6(react@19.2.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
12686 expo-router: 56.2.11(80beea6a31a5d2003a696c1401258797)12686 expo-router: 56.2.11(f8b3939b2a15129a8b59814542a58c1b)
12687 react-dom: 19.2.6(react@19.2.6)12687 react-dom: 19.2.6(react@19.2.6)
12688 transitivePeerDependencies:12688 transitivePeerDependencies:
12689 - supports-color12689 - supports-color
...@@ -14268,7 +14268,7 @@ snapshots:...@@ -14268,7 +14268,7 @@ snapshots:
14268 optionalDependencies:14268 optionalDependencies:
14269 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)14269 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1427014270
14271 '@react-navigation/native-stack@7.17.6(patch_hash=0365b727005b3a830af80ccbd0b637666cc0338d33ddcb7a25b6de51a21ea027)(7ffd26361d0ffb9781446d1519df37be)':14271 '@react-navigation/native-stack@7.17.6(patch_hash=0365b727005b3a830af80ccbd0b637666cc0338d33ddcb7a25b6de51a21ea027)(e49ba4adb65ddb2cde0c8b8b274b705b)':
14272 dependencies:14272 dependencies:
14273 '@react-navigation/elements': 2.9.26(c6a2ad0e2c930f8e3896e77c3ba11bc4)14273 '@react-navigation/elements': 2.9.26(c6a2ad0e2c930f8e3896e77c3ba11bc4)
14274 '@react-navigation/native': 7.3.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)14274 '@react-navigation/native': 7.3.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
...@@ -17062,47 +17062,47 @@ snapshots:...@@ -17062,47 +17062,47 @@ snapshots:
17062 - supports-color17062 - supports-color
17063 - typescript17063 - typescript
1706417064
17065 expo-router@56.2.11(80beea6a31a5d2003a696c1401258797):17065 expo-router@56.2.11(b91ff5333bc046aa08fb7484e4e065d6):
17066 dependencies:17066 dependencies:
17067 '@expo/log-box': 56.0.13(@expo/dom-webview@56.0.5)(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17067 '@expo/log-box': 56.0.13(@expo/dom-webview@56.0.5)(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17068 '@expo/metro-runtime': 56.0.15(@expo/log-box@56.0.13)(expo@56.0.12)(react-dom@19.2.6(react@19.2.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17068 '@expo/metro-runtime': 56.0.15(@expo/log-box@56.0.13)(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17069 '@expo/schema-utils': 56.0.117069 '@expo/schema-utils': 56.0.1
17070 '@expo/ui': 56.0.18(32843e0c0883df8bccfa0b8323659df5)17070 '@expo/ui': 56.0.18(3cdc0dde9f93166d952f1e1bd0cb25c0)
17071 '@radix-ui/react-slot': 1.2.4(@types/react@19.2.16)(react@19.2.6)17071 '@radix-ui/react-slot': 1.2.4(@types/react@19.2.16)(react@19.2.3)
17072 '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)17072 '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
17073 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17073 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17074 '@testing-library/jest-dom': 6.9.117074 '@testing-library/jest-dom': 6.9.1
17075 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)17075 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
17076 client-only: 0.0.117076 client-only: 0.0.1
17077 color: 4.2.317077 color: 4.2.3
17078 debug: 4.4.317078 debug: 4.4.3
17079 escape-string-regexp: 4.0.017079 escape-string-regexp: 4.0.0
17080 expo: 56.0.12(deb8cbf3e0f411b34ba85a995c9982ba)17080 expo: 56.0.12(8895228379997a2a064f9644cda56ed0)
17081 expo-constants: 56.0.18(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))17081 expo-constants: 56.0.18(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17082 expo-glass-effect: 56.0.4(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17082 expo-glass-effect: 56.0.4(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17083 expo-linking: 56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17083 expo-linking: 56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17084 expo-server: 56.0.517084 expo-server: 56.0.5
17085 expo-symbols: 56.0.6(expo-font@56.0.7)(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17085 expo-symbols: 56.0.6(expo-font@56.0.7)(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17086 fast-deep-equal: 3.1.317086 fast-deep-equal: 3.1.3
17087 invariant: 2.2.417087 invariant: 2.2.4
17088 nanoid: 3.3.1217088 nanoid: 3.3.12
17089 query-string: 7.1.317089 query-string: 7.1.3
17090 react: 19.2.617090 react: 19.2.3
17091 react-fast-compare: 3.2.217091 react-fast-compare: 3.2.2
17092 react-is: 19.2.717092 react-is: 19.2.7
17093 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)17093 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17094 react-native-drawer-layout: 4.2.4(de9b2f2dc96a3557fdc0df187a8417ee)17094 react-native-drawer-layout: 4.2.4(05364bd849de538917a7364cc7dee3f5)
17095 react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17095 react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17096 react-native-screens: 4.25.2(patch_hash=b3d86ac8bf77b40f4112672f92225853bce6faca485a4aeb609a07a70162a5cc)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17096 react-native-screens: 4.25.2(patch_hash=b3d86ac8bf77b40f4112672f92225853bce6faca485a4aeb609a07a70162a5cc)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17097 server-only: 0.0.117097 server-only: 0.0.1
17098 sf-symbols-typescript: 2.2.017098 sf-symbols-typescript: 2.2.0
17099 shallowequal: 1.1.017099 shallowequal: 1.1.0
17100 standard-navigation: 0.0.517100 standard-navigation: 0.0.5
17101 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)17101 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
17102 optionalDependencies:17102 optionalDependencies:
17103 react-dom: 19.2.6(react@19.2.6)17103 react-dom: 19.2.3(react@19.2.3)
17104 react-native-gesture-handler: 2.31.2(patch_hash=808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d3)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17104 react-native-gesture-handler: 2.31.2(patch_hash=808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d3)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17105 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)17105 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17106 transitivePeerDependencies:17106 transitivePeerDependencies:
17107 - '@babel/core'17107 - '@babel/core'
17108 - '@testing-library/dom'17108 - '@testing-library/dom'
...@@ -17113,47 +17113,47 @@ snapshots:...@@ -17113,47 +17113,47 @@ snapshots:
17113 - supports-color17113 - supports-color
17114 optional: true17114 optional: true
1711517115
17116 expo-router@56.2.11(e1497a99e5bc5be76c1cdb733671f865):17116 expo-router@56.2.11(f8b3939b2a15129a8b59814542a58c1b):
17117 dependencies:17117 dependencies:
17118 '@expo/log-box': 56.0.13(@expo/dom-webview@56.0.5)(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17118 '@expo/log-box': 56.0.13(@expo/dom-webview@56.0.5)(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17119 '@expo/metro-runtime': 56.0.15(@expo/log-box@56.0.13)(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17119 '@expo/metro-runtime': 56.0.15(@expo/log-box@56.0.13)(expo@56.0.12)(react-dom@19.2.6(react@19.2.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17120 '@expo/schema-utils': 56.0.117120 '@expo/schema-utils': 56.0.1
17121 '@expo/ui': 56.0.18(3cdc0dde9f93166d952f1e1bd0cb25c0)17121 '@expo/ui': 56.0.18(32843e0c0883df8bccfa0b8323659df5)
17122 '@radix-ui/react-slot': 1.2.4(@types/react@19.2.16)(react@19.2.3)17122 '@radix-ui/react-slot': 1.2.4(@types/react@19.2.16)(react@19.2.6)
17123 '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)17123 '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
17124 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17124 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17125 '@testing-library/jest-dom': 6.9.117125 '@testing-library/jest-dom': 6.9.1
17126 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)17126 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
17127 client-only: 0.0.117127 client-only: 0.0.1
17128 color: 4.2.317128 color: 4.2.3
17129 debug: 4.4.317129 debug: 4.4.3
17130 escape-string-regexp: 4.0.017130 escape-string-regexp: 4.0.0
17131 expo: 56.0.12(8895228379997a2a064f9644cda56ed0)17131 expo: 56.0.12(deb8cbf3e0f411b34ba85a995c9982ba)
17132 expo-constants: 56.0.18(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))17132 expo-constants: 56.0.18(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
17133 expo-glass-effect: 56.0.4(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17133 expo-glass-effect: 56.0.4(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17134 expo-linking: 56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17134 expo-linking: 56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17135 expo-server: 56.0.517135 expo-server: 56.0.5
17136 expo-symbols: 56.0.6(expo-font@56.0.7)(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17136 expo-symbols: 56.0.6(expo-font@56.0.7)(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17137 fast-deep-equal: 3.1.317137 fast-deep-equal: 3.1.3
17138 invariant: 2.2.417138 invariant: 2.2.4
17139 nanoid: 3.3.1217139 nanoid: 3.3.12
17140 query-string: 7.1.317140 query-string: 7.1.3
17141 react: 19.2.317141 react: 19.2.6
17142 react-fast-compare: 3.2.217142 react-fast-compare: 3.2.2
17143 react-is: 19.2.717143 react-is: 19.2.7
17144 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)17144 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17145 react-native-drawer-layout: 4.2.4(05364bd849de538917a7364cc7dee3f5)17145 react-native-drawer-layout: 4.2.4(de9b2f2dc96a3557fdc0df187a8417ee)
17146 react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17146 react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17147 react-native-screens: 4.25.2(patch_hash=b3d86ac8bf77b40f4112672f92225853bce6faca485a4aeb609a07a70162a5cc)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17147 react-native-screens: 4.25.2(patch_hash=b3d86ac8bf77b40f4112672f92225853bce6faca485a4aeb609a07a70162a5cc)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17148 server-only: 0.0.117148 server-only: 0.0.1
17149 sf-symbols-typescript: 2.2.017149 sf-symbols-typescript: 2.2.0
17150 shallowequal: 1.1.017150 shallowequal: 1.1.0
17151 standard-navigation: 0.0.517151 standard-navigation: 0.0.5
17152 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)17152 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
17153 optionalDependencies:17153 optionalDependencies:
17154 react-dom: 19.2.3(react@19.2.3)17154 react-dom: 19.2.6(react@19.2.6)
17155 react-native-gesture-handler: 2.31.2(patch_hash=808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d3)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17155 react-native-gesture-handler: 2.31.2(patch_hash=808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d3)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17156 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)17156 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17157 transitivePeerDependencies:17157 transitivePeerDependencies:
17158 - '@babel/core'17158 - '@babel/core'
17159 - '@testing-library/dom'17159 - '@testing-library/dom'