diff --git a/docs/public/images/features/120-fps-recordings.png b/docs/public/images/features/120-fps-recordings.png new file mode 100644 index 00000000..f6460db5 Binary files /dev/null and b/docs/public/images/features/120-fps-recordings.png differ diff --git a/docs/public/images/features/app-directory-access.png b/docs/public/images/features/app-directory-access.png new file mode 100644 index 00000000..499d1a96 Binary files /dev/null and b/docs/public/images/features/app-directory-access.png differ diff --git a/docs/public/images/features/captures.png b/docs/public/images/features/captures.png new file mode 100644 index 00000000..513afc49 Binary files /dev/null and b/docs/public/images/features/captures.png differ diff --git a/docs/public/images/features/design-comparison-landscape.png b/docs/public/images/features/design-comparison-landscape.png new file mode 100644 index 00000000..a8cc6fa5 Binary files /dev/null and b/docs/public/images/features/design-comparison-landscape.png differ diff --git a/docs/public/images/features/floating-window-trimming.png b/docs/public/images/features/floating-window-trimming.png new file mode 100644 index 00000000..f2c853a4 Binary files /dev/null and b/docs/public/images/features/floating-window-trimming.png differ diff --git a/docs/public/images/features/grids.png b/docs/public/images/features/grids.png new file mode 100644 index 00000000..c237da05 Binary files /dev/null and b/docs/public/images/features/grids.png differ diff --git a/docs/public/images/features/location-routes.png b/docs/public/images/features/location-routes.png new file mode 100644 index 00000000..cab582e9 Binary files /dev/null and b/docs/public/images/features/location-routes.png differ diff --git a/docs/public/images/features/magnifier.png b/docs/public/images/features/magnifier.png new file mode 100644 index 00000000..2b6f8eb3 Binary files /dev/null and b/docs/public/images/features/magnifier.png differ diff --git a/docs/public/images/features/privacy-permissions.png b/docs/public/images/features/privacy-permissions.png new file mode 100644 index 00000000..8aa0769d Binary files /dev/null and b/docs/public/images/features/privacy-permissions.png differ diff --git a/docs/public/images/features/push-notifications.png b/docs/public/images/features/push-notifications.png new file mode 100644 index 00000000..bc0ec506 Binary files /dev/null and b/docs/public/images/features/push-notifications.png differ diff --git a/docs/public/images/features/screenshots-in-presentation.png b/docs/public/images/features/screenshots-in-presentation.png new file mode 100644 index 00000000..fb2ad3e6 Binary files /dev/null and b/docs/public/images/features/screenshots-in-presentation.png differ diff --git a/docs/public/images/features/slow-animations.png b/docs/public/images/features/slow-animations.png new file mode 100644 index 00000000..4052ccd9 Binary files /dev/null and b/docs/public/images/features/slow-animations.png differ diff --git a/docs/src/assets/features/120-fps-recordings.png b/docs/src/assets/features/120-fps-recordings.png new file mode 100644 index 00000000..f6460db5 Binary files /dev/null and b/docs/src/assets/features/120-fps-recordings.png differ diff --git a/docs/src/assets/features/app-directory-access.png b/docs/src/assets/features/app-directory-access.png new file mode 100644 index 00000000..499d1a96 Binary files /dev/null and b/docs/src/assets/features/app-directory-access.png differ diff --git a/docs/src/assets/features/build-insights-incremental-builds.png b/docs/src/assets/features/build-insights-incremental-builds.png new file mode 100644 index 00000000..722196e6 Binary files /dev/null and b/docs/src/assets/features/build-insights-incremental-builds.png differ diff --git a/docs/src/assets/features/captures.jpg b/docs/src/assets/features/captures.jpg deleted file mode 100644 index b5ff27f8..00000000 Binary files a/docs/src/assets/features/captures.jpg and /dev/null differ diff --git a/docs/src/assets/features/deeplinks-universal-links.png b/docs/src/assets/features/deeplinks-universal-links.png new file mode 100644 index 00000000..a2a8e76d Binary files /dev/null and b/docs/src/assets/features/deeplinks-universal-links.png differ diff --git a/docs/src/assets/features/environment-overrides.jpg b/docs/src/assets/features/environment-overrides.jpg deleted file mode 100644 index 4e4f9a70..00000000 Binary files a/docs/src/assets/features/environment-overrides.jpg and /dev/null differ diff --git a/docs/src/assets/features/grids.jpg b/docs/src/assets/features/grids.jpg deleted file mode 100644 index cc9eebf6..00000000 Binary files a/docs/src/assets/features/grids.jpg and /dev/null differ diff --git a/docs/src/assets/features/location-routes.jpg b/docs/src/assets/features/location-routes.jpg deleted file mode 100644 index 10a349bc..00000000 Binary files a/docs/src/assets/features/location-routes.jpg and /dev/null differ diff --git a/docs/src/assets/features/privacy-permissions.png b/docs/src/assets/features/privacy-permissions.png new file mode 100644 index 00000000..8aa0769d Binary files /dev/null and b/docs/src/assets/features/privacy-permissions.png differ diff --git a/docs/src/assets/features/push-notifications.png b/docs/src/assets/features/push-notifications.png new file mode 100644 index 00000000..bc0ec506 Binary files /dev/null and b/docs/src/assets/features/push-notifications.png differ diff --git a/docs/src/assets/features/recent-builds.jpg b/docs/src/assets/features/recent-builds.jpg deleted file mode 100644 index 96617bc6..00000000 Binary files a/docs/src/assets/features/recent-builds.jpg and /dev/null differ diff --git a/docs/src/assets/features/rulers.jpg b/docs/src/assets/features/rulers.jpg deleted file mode 100644 index f0c76184..00000000 Binary files a/docs/src/assets/features/rulers.jpg and /dev/null differ diff --git a/docs/src/assets/features/team-build-insights.png b/docs/src/assets/features/team-build-insights.png new file mode 100644 index 00000000..b171df4e Binary files /dev/null and b/docs/src/assets/features/team-build-insights.png differ diff --git a/docs/src/assets/features/toggles-dynamic-text.png b/docs/src/assets/features/toggles-dynamic-text.png new file mode 100644 index 00000000..67f611f8 Binary files /dev/null and b/docs/src/assets/features/toggles-dynamic-text.png differ diff --git a/docs/src/assets/features/touch-indicators.png b/docs/src/assets/features/touch-indicators.png new file mode 100644 index 00000000..b5983c3d Binary files /dev/null and b/docs/src/assets/features/touch-indicators.png differ diff --git a/docs/src/collections/feature-page/accessibility.md b/docs/src/collections/feature-page/accessibility.md new file mode 100644 index 00000000..d6a6fe47 --- /dev/null +++ b/docs/src/collections/feature-page/accessibility.md @@ -0,0 +1,7 @@ +--- +title: "Accessibility" +description: "Test accessibility with environment overrides, VoiceOver Navigator, and dynamic text controls." +hero: + title: "Accessibility" + subtitle: "Make your app accessible to everyone" +--- diff --git a/docs/src/collections/feature-page/app-actions.md b/docs/src/collections/feature-page/app-actions.md new file mode 100644 index 00000000..1fe4717c --- /dev/null +++ b/docs/src/collections/feature-page/app-actions.md @@ -0,0 +1,32 @@ +--- +title: "App Actions" +description: "Configurable quick actions for deeplinks, push notifications, locations, permissions, and more." +hero: + title: "App Actions" + subtitle: "Configurable actions to boost your development speed" +bento: + enable: true + list: + firstServiceRow: + landscapeColumn: + title: "Location Simulation" + subtitle: "Single locations or automobile and walking routes, tested right in the Simulator." + image: "/images/features/location-routes.png" + imageAlign: "center" + squareColumn: + title: "Quick Actions" + subtitle: "Configurable actions for Deeplinks, Push Notifications, and locations." + image: "/images/features/privacy-permissions.png" + imageAlign: "center-top" + secondServiceRow: + squareColumn: + title: "Push Notifications" + subtitle: "Send test push notifications to your Simulator app without a server." + image: "/images/features/push-notifications.png" + imageAlign: "left-center" + landscapeColumn: + title: "App Directory Access" + subtitle: "One-click access to your app's sandbox, documents, caches, and derived data directories." + image: "/images/features/app-directory-access.png" + imageAlign: "center-bottom" +--- diff --git a/docs/src/collections/feature-page/build-insights.md b/docs/src/collections/feature-page/build-insights.md new file mode 100644 index 00000000..8dfab989 --- /dev/null +++ b/docs/src/collections/feature-page/build-insights.md @@ -0,0 +1,7 @@ +--- +title: "Build Insights" +description: "Track recent builds with quick actions and team build insights to boost productivity." +hero: + title: "Build Insights" + subtitle: "Quick actions and insights for your recent builds" +--- diff --git a/docs/src/collections/feature-page/design-comparison.md b/docs/src/collections/feature-page/design-comparison.md new file mode 100644 index 00000000..e30718e6 --- /dev/null +++ b/docs/src/collections/feature-page/design-comparison.md @@ -0,0 +1,32 @@ +--- +title: "Design Comparison" +description: "Compare designs with overlays, grids, rulers, slow animations, and magnification to achieve pixel-perfect implementations." +hero: + title: "Design Comparison" + subtitle: "Pixel-perfect implementations, verified right in the Simulator" +bento: + enable: true + list: + firstServiceRow: + landscapeColumn: + title: "Grids & Rulers" + subtitle: "Perfectly align elements with grid overlays and precise rulers." + image: "/images/features/grids.png" + imageAlign: "center-top" + squareColumn: + title: "Slow Animations" + subtitle: "Slow down animations to optimize them for perfection." + image: "/images/features/slow-animations.png" + imageAlign: "center-top" + secondServiceRow: + squareColumn: + title: "Magnify for Precision" + subtitle: "Hold Shift and move mouse to magnify. Pick colors as SwiftUI, NSColor, or UIColor." + image: "/images/features/magnifier.png" + imageAlign: "center" + landscapeColumn: + title: "Compare Designs" + subtitle: "Use overlays or slide comparisons to spot differences between implementation and design." + image: "/images/features/design-comparison-landscape.png" + imageAlign: "center-top" +--- diff --git a/docs/src/collections/feature-page/networking.md b/docs/src/collections/feature-page/networking.md new file mode 100644 index 00000000..323346c1 --- /dev/null +++ b/docs/src/collections/feature-page/networking.md @@ -0,0 +1,7 @@ +--- +title: "Networking" +description: "Monitor network requests in realtime, control network speed, and simulate airplane mode." +hero: + title: "Networking" + subtitle: "Inspect, throttle, and control your app's network traffic" +--- diff --git a/docs/src/collections/feature-page/screenshots-recordings.md b/docs/src/collections/feature-page/screenshots-recordings.md new file mode 100644 index 00000000..3fbad976 --- /dev/null +++ b/docs/src/collections/feature-page/screenshots-recordings.md @@ -0,0 +1,32 @@ +--- +title: "Screenshots & Recordings" +description: "Create professional screenshots and recordings with device bezels, touch indicators, and App Store Connect optimization." +hero: + title: "Screenshots & Recordings" + subtitle: "Professional captures that make your app shine" +bento: + enable: true + list: + firstServiceRow: + landscapeColumn: + title: "120 FPS Recordings" + subtitle: "Record at 120 FPS for ultra-smooth video output. Great for smooth scrolling, animations, and transitions." + image: "/images/features/120-fps-recordings.png" + imageAlign: "center-top" + squareColumn: + title: "Floating Windows" + subtitle: "Stack multiple captures in floating windows and drag them anywhere." + image: "/images/features/floating-window-trimming.png" + imageAlign: "right-top" + secondServiceRow: + squareColumn: + title: "Professional Recordings & Screenshots" + subtitle: "Capture MP4, GIF, or PNG with device bezels and audio recorded." + image: "/images/features/captures.png" + imageAlign: "center-top" + landscapeColumn: + title: "Professional Recordings & Screenshots" + subtitle: "Capture MP4, GIF, or PNG with device bezels and audio recorded." + image: "/images/features/screenshots-in-presentation.png" + imageAlign: "center-top" +--- diff --git a/docs/src/collections/feature-page/simulator-camera.md b/docs/src/collections/feature-page/simulator-camera.md new file mode 100644 index 00000000..4f82701d --- /dev/null +++ b/docs/src/collections/feature-page/simulator-camera.md @@ -0,0 +1,7 @@ +--- +title: "Simulator Camera" +description: "Stream your macOS camera to test AVCapture APIs directly in the Simulator." +hero: + title: "Simulator Camera" + subtitle: "Test camera functionality without a physical device" +--- diff --git a/docs/src/collections/feature-page/status-bar.md b/docs/src/collections/feature-page/status-bar.md new file mode 100644 index 00000000..cf2977fe --- /dev/null +++ b/docs/src/collections/feature-page/status-bar.md @@ -0,0 +1,7 @@ +--- +title: "Status Bar Editing" +description: "Customize the Simulator status bar to match Apple's keynote designs with any time, battery status, and more." +hero: + title: "Status Bar Editing" + subtitle: "09:41 — A historical moment in time" +--- diff --git a/docs/src/collections/feature-page/user-defaults-editor.md b/docs/src/collections/feature-page/user-defaults-editor.md new file mode 100644 index 00000000..1cf17b90 --- /dev/null +++ b/docs/src/collections/feature-page/user-defaults-editor.md @@ -0,0 +1,7 @@ +--- +title: "User Defaults Editor" +description: "Edit Standard and Group User Defaults in realtime to quickly test how your app responds to state changes." +hero: + title: "User Defaults Editor" + subtitle: "Edit Standard & Group User Defaults in realtime" +--- diff --git a/docs/src/collections/feature/01-network-monitoring.md b/docs/src/collections/feature/01-network-monitoring.md index 22f90fd0..5caa3d7c 100644 --- a/docs/src/collections/feature/01-network-monitoring.md +++ b/docs/src/collections/feature/01-network-monitoring.md @@ -1,8 +1,10 @@ --- +showOnHomepage: true name: "Network Monitor" youtubeLink: "https://www.youtube.com/watch?v=ihVwU9usxgQ" tagLine: "Inspect Network Requests in realtime" blogId: 20 +featurePage: "networking" asset: type: "video" path: "/features/network-monitoring-demo.mp4" diff --git a/docs/src/collections/feature/02-network-speed-control.md b/docs/src/collections/feature/02-network-speed-control.md index 6f66ebb7..5baad170 100644 --- a/docs/src/collections/feature/02-network-speed-control.md +++ b/docs/src/collections/feature/02-network-speed-control.md @@ -1,6 +1,8 @@ --- +showOnHomepage: true name: "Network Speed Control" youtubeLink: "https://www.youtube.com/watch?v=xK3iI5TzuA4" +featurePage: "networking" asset: type: "image" path: "../../assets/features/network-speed-control.png" diff --git a/docs/src/collections/feature/03-simulator-airplane-mode.md b/docs/src/collections/feature/03-simulator-airplane-mode.md index 35205333..8b000686 100644 --- a/docs/src/collections/feature/03-simulator-airplane-mode.md +++ b/docs/src/collections/feature/03-simulator-airplane-mode.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Simulator Airplane Mode" +featurePage: "networking" asset: type: "video" path: "/features/simulator-airplane-mode.mp4" diff --git a/docs/src/collections/feature/04-simulator-camera.md b/docs/src/collections/feature/04-simulator-camera.md index 245fbd8e..29f1312c 100644 --- a/docs/src/collections/feature/04-simulator-camera.md +++ b/docs/src/collections/feature/04-simulator-camera.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Simulator Camera" +featurePage: "simulator-camera" asset: type: "video" path: "/features/simulator-camera.mov" diff --git a/docs/src/collections/feature/05-compare-designs.md b/docs/src/collections/feature/05-compare-designs.md index a1ed242e..f96caf7b 100644 --- a/docs/src/collections/feature/05-compare-designs.md +++ b/docs/src/collections/feature/05-compare-designs.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Compare designs" +featurePage: "design-comparison" tagLine: "Use overlays or slide comparisons to spot differences between the implementation and the design." asset: type: "video" diff --git a/docs/src/collections/feature/06-grids.md b/docs/src/collections/feature/06-grids.md index 827b65dc..6d007b2a 100644 --- a/docs/src/collections/feature/06-grids.md +++ b/docs/src/collections/feature/06-grids.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Grids" +featurePage: "design-comparison" asset: type: "image" path: "../../assets/features/grids.png" diff --git a/docs/src/collections/feature/07-rulers.md b/docs/src/collections/feature/07-rulers.md index 42d46cd4..4e57aba1 100644 --- a/docs/src/collections/feature/07-rulers.md +++ b/docs/src/collections/feature/07-rulers.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Rulers" +featurePage: "design-comparison" asset: type: "image" path: "../../assets/features/rulers.png" diff --git a/docs/src/collections/feature/08-slow-animations.md b/docs/src/collections/feature/08-slow-animations.md index e4d88de2..d8e0afeb 100644 --- a/docs/src/collections/feature/08-slow-animations.md +++ b/docs/src/collections/feature/08-slow-animations.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Slow Animations" +featurePage: "design-comparison" asset: type: "video" path: "/features/slow-animations.mp4" diff --git a/docs/src/collections/feature/09-magnify.md b/docs/src/collections/feature/09-magnify.md index 48422115..70557578 100644 --- a/docs/src/collections/feature/09-magnify.md +++ b/docs/src/collections/feature/09-magnify.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Magnify for precision" +featurePage: "design-comparison" tagLine: "Hold ⇧ Shift and move mouse or scroll wheel to magnify" asset: type: "video" diff --git a/docs/src/collections/feature/10-user-defaults-editor.md b/docs/src/collections/feature/10-user-defaults-editor.md index 4b742e19..e2eda637 100644 --- a/docs/src/collections/feature/10-user-defaults-editor.md +++ b/docs/src/collections/feature/10-user-defaults-editor.md @@ -1,7 +1,9 @@ --- +showOnHomepage: true name: "User Defaults Editor" tagLine: "Edit Standard & Group User Defaults in realtime" youtubeLink: "https://www.youtube.com/watch?v=zTbQck3ofcc" +featurePage: "user-defaults-editor" asset: type: "video" path: "/features/user-defaults-editor.mp4" diff --git a/docs/src/collections/feature/11-quick-actions.md b/docs/src/collections/feature/11-quick-actions.md index 82ac46a9..5a6b152d 100644 --- a/docs/src/collections/feature/11-quick-actions.md +++ b/docs/src/collections/feature/11-quick-actions.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Quick Actions" +featurePage: "app-actions" asset: type: "video" path: "/features/quick-actions.mp4" diff --git a/docs/src/collections/feature/12-location-simulation.md b/docs/src/collections/feature/12-location-simulation.md index f78965a5..4ae25af9 100644 --- a/docs/src/collections/feature/12-location-simulation.md +++ b/docs/src/collections/feature/12-location-simulation.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Location Simulation" +featurePage: "app-actions" tagLine: "Single locations or automobile and walking routes: Test them right in the Simulator" asset: type: "image" diff --git a/docs/src/collections/feature/13-recent-builds.md b/docs/src/collections/feature/13-recent-builds.md index 9b3a7237..e83053d8 100644 --- a/docs/src/collections/feature/13-recent-builds.md +++ b/docs/src/collections/feature/13-recent-builds.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Recent builds" +featurePage: "app-actions" youtubeLink: "https://www.youtube.com/watch?v=zukRdke1cP8" asset: type: "image" diff --git a/docs/src/collections/feature/14-environment-overrides.md b/docs/src/collections/feature/14-environment-overrides.md index aa056bca..ca10e357 100644 --- a/docs/src/collections/feature/14-environment-overrides.md +++ b/docs/src/collections/feature/14-environment-overrides.md @@ -1,6 +1,8 @@ --- +showOnHomepage: true name: "Environment Overrides" youtubeLink: "https://www.youtube.com/watch?v=RQ7tXHyY5Ic" +featurePage: "accessibility" asset: type: "image" path: "../../assets/features/environment-overrides.png" diff --git a/docs/src/collections/feature/15-professional-captures.md b/docs/src/collections/feature/15-professional-captures.md index 43d4589e..0224f1d3 100644 --- a/docs/src/collections/feature/15-professional-captures.md +++ b/docs/src/collections/feature/15-professional-captures.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Professional recordings & screenshots" +featurePage: "screenshots-recordings" asset: type: "image" path: "../../assets/features/captures.png" diff --git a/docs/src/collections/feature/16-floating-window.md b/docs/src/collections/feature/16-floating-window.md index b3df9ad1..5839a319 100644 --- a/docs/src/collections/feature/16-floating-window.md +++ b/docs/src/collections/feature/16-floating-window.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "Floating windows for quick access" +featurePage: "screenshots-recordings" asset: type: "image" path: "../../assets/features/floating-window-trimming.png" diff --git a/docs/src/collections/feature/17-status-bar-editing.md b/docs/src/collections/feature/17-status-bar-editing.md index 3f73665f..2c6e0e84 100644 --- a/docs/src/collections/feature/17-status-bar-editing.md +++ b/docs/src/collections/feature/17-status-bar-editing.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "09:41 - A historical moment in time" +featurePage: "status-bar" asset: type: "image" path: "../../assets/features/status-bar-overrides.png" diff --git a/docs/src/collections/feature/18-recording-example.md b/docs/src/collections/feature/18-recording-example.md index 86c7561a..2751d4bb 100644 --- a/docs/src/collections/feature/18-recording-example.md +++ b/docs/src/collections/feature/18-recording-example.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "A RocketSim recording in action" +featurePage: "screenshots-recordings" tagLine: "Touches + Bezels = Professional Recording." asset: type: "video" diff --git a/docs/src/collections/feature/19-asc-drag-drop-video.md b/docs/src/collections/feature/19-asc-drag-drop-video.md index a616d7ec..0140643f 100644 --- a/docs/src/collections/feature/19-asc-drag-drop-video.md +++ b/docs/src/collections/feature/19-asc-drag-drop-video.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "The Power of Drag and Drop" +featurePage: "screenshots-recordings" tagLine: "App Store Connect. GitHub. Slack. Twitter. iMessage." asset: type: "video" diff --git a/docs/src/collections/feature/20-voiceover-navigator.md b/docs/src/collections/feature/20-voiceover-navigator.md index e4fe42f9..cf35f2f9 100644 --- a/docs/src/collections/feature/20-voiceover-navigator.md +++ b/docs/src/collections/feature/20-voiceover-navigator.md @@ -1,5 +1,7 @@ --- +showOnHomepage: true name: "VoiceOver Navigator" +featurePage: "accessibility" tagLine: "Visualize VoiceOver element order right on the Simulator" asset: type: "image" diff --git a/docs/src/collections/feature/21-toggles-dynamic-text.md b/docs/src/collections/feature/21-toggles-dynamic-text.md new file mode 100644 index 00000000..247c24ee --- /dev/null +++ b/docs/src/collections/feature/21-toggles-dynamic-text.md @@ -0,0 +1,12 @@ +--- +name: "Toggles and Dynamic Text" +featurePage: "accessibility" +asset: + type: "image" + path: "../../assets/features/toggles-dynamic-text.png" + alt: "Toggle accessibility features like bold text, reduce motion, and change dynamic type sizes right from the side window." + alignment: "left" + columnSpan: 6 +--- + +**Toggle accessibility features** like bold text, reduce motion, and change dynamic type sizes — right from the side window, without navigating through Settings. diff --git a/docs/src/collections/feature/22-push-notifications.md b/docs/src/collections/feature/22-push-notifications.md new file mode 100644 index 00000000..3d0e652a --- /dev/null +++ b/docs/src/collections/feature/22-push-notifications.md @@ -0,0 +1,12 @@ +--- +name: "Push Notifications" +featurePage: "app-actions" +asset: + type: "image" + path: "../../assets/features/push-notifications.png" + alt: "Test push notifications on the Simulator without a physical device." + alignment: "right" + columnSpan: 6 +--- + +**Test push notifications** on the Simulator without a physical device. Create JSON payloads, send test notifications, and debug notification handling. diff --git a/docs/src/collections/feature/23-deeplinks-universal-links.md b/docs/src/collections/feature/23-deeplinks-universal-links.md new file mode 100644 index 00000000..84176370 --- /dev/null +++ b/docs/src/collections/feature/23-deeplinks-universal-links.md @@ -0,0 +1,12 @@ +--- +name: "Deeplinks & Universal Links" +featurePage: "app-actions" +asset: + type: "image" + path: "../../assets/features/deeplinks-universal-links.png" + alt: "Test deep links and universal links directly from the side window." + alignment: "left" + columnSpan: 6 +--- + +**Test deep links and universal links** directly from the side window. Save, organize, and trigger your app's URL schemes and associated domains. diff --git a/docs/src/collections/feature/24-privacy-permissions.md b/docs/src/collections/feature/24-privacy-permissions.md new file mode 100644 index 00000000..95c7751b --- /dev/null +++ b/docs/src/collections/feature/24-privacy-permissions.md @@ -0,0 +1,15 @@ +--- +name: "Privacy Permissions" +featurePage: "app-actions" +asset: + type: "image" + path: "../../assets/features/privacy-permissions.png" + alt: "Grant, revoke, or reset permissions like camera, location, contacts, photos, and more without reinstalling your app." + alignment: "right" + columnSpan: 6 +--- + +**Grant, revoke, or reset permissions** like camera, location, contacts, photos, and more — without reinstalling your app. + +- **15 supported permission types** including push notifications +- **Reset to "not determined"** state so the system dialog appears again diff --git a/docs/src/collections/feature/25-app-directory-access.md b/docs/src/collections/feature/25-app-directory-access.md new file mode 100644 index 00000000..0bfd2f68 --- /dev/null +++ b/docs/src/collections/feature/25-app-directory-access.md @@ -0,0 +1,12 @@ +--- +name: "App Directory Access" +featurePage: "app-actions" +asset: + type: "image" + path: "../../assets/features/app-directory-access.png" + alt: "One-click access to your app's sandbox, documents, caches, derived data, and app group directories." + alignment: "left" + columnSpan: 6 +--- + +**One-click access** to your app's sandbox, documents, caches, derived data, and app group directories. No more digging through CoreSimulator paths. diff --git a/docs/src/collections/feature/26-touch-indicators.md b/docs/src/collections/feature/26-touch-indicators.md new file mode 100644 index 00000000..3ef81be2 --- /dev/null +++ b/docs/src/collections/feature/26-touch-indicators.md @@ -0,0 +1,12 @@ +--- +name: "Touch Indicators" +featurePage: "screenshots-recordings" +asset: + type: "image" + path: "../../assets/features/touch-indicators.png" + alt: "Show touch indicators in your recordings and screenshots with Touch Attention Mode." + alignment: "left" + columnSpan: 6 +--- + +**Show touch indicators** in your recordings and screenshots. Enable **Touch Attention Mode** for a constant indicator that follows your pointer — the same technique Apple uses in their demo videos. diff --git a/docs/src/collections/feature/27-120-fps-recordings.md b/docs/src/collections/feature/27-120-fps-recordings.md new file mode 100644 index 00000000..8affc828 --- /dev/null +++ b/docs/src/collections/feature/27-120-fps-recordings.md @@ -0,0 +1,12 @@ +--- +name: "120 FPS Recordings" +featurePage: "screenshots-recordings" +asset: + type: "image" + path: "../../assets/features/120-fps-recordings.png" + alt: "Record at 120 FPS for ultra-smooth video output with HEVC codec." + alignment: "right" + columnSpan: 6 +--- + +**Record at 120 FPS** for ultra-smooth video output. Great for recording smooth scrolling, animations, and transitions. Uses the HEVC codec for optimal quality. diff --git a/docs/src/collections/feature/28-build-insights-inapp.md b/docs/src/collections/feature/28-build-insights-inapp.md new file mode 100644 index 00000000..4d7cccab --- /dev/null +++ b/docs/src/collections/feature/28-build-insights-inapp.md @@ -0,0 +1,15 @@ +--- +name: "Build Insights" +featurePage: "build-insights" +asset: + type: "image" + path: "../../assets/features/build-insights-incremental-builds.png" + alt: "Build Insights view showing incremental builds over three months, Xcode versions, and build statistics." + alignment: "left" + columnSpan: 6 +--- + +**Track every Xcode build** you make and see trends over time. Compare incremental vs. clean builds, monitor build duration across Xcode versions, and spot regressions early. + +- **Build statistics** — Total, Typical (P75), Top (P95), and 7-Day Average +- **Filter by scheme** for accurate per-target breakdowns diff --git a/docs/src/collections/feature/29-team-dashboard-overview.md b/docs/src/collections/feature/29-team-dashboard-overview.md new file mode 100644 index 00000000..0a642e36 --- /dev/null +++ b/docs/src/collections/feature/29-team-dashboard-overview.md @@ -0,0 +1,15 @@ +--- +name: "Team Build Insights Overview" +featurePage: "build-insights" +asset: + type: "image" + path: "../../assets/features/team-build-insights.png" + alt: "Overview of Xcode projects tracked by RocketSim's team build insights dashboard." + alignment: "right" + columnSpan: 6 +--- + +**Get an overview of all Xcode projects** your team is building. RocketSim automatically collects build data in the background — no setup required. + +- **Projects at a glance** — see all tracked projects in one place +- **Click to drill down** into detailed build insights for any project diff --git a/docs/src/collections/feature/30-team-build-insights.md b/docs/src/collections/feature/30-team-build-insights.md new file mode 100644 index 00000000..daee7bf8 --- /dev/null +++ b/docs/src/collections/feature/30-team-build-insights.md @@ -0,0 +1,15 @@ +--- +name: "Team Build Insights" +featurePage: "build-insights" +asset: + type: "video" + path: "/features/team-insights-dashboard.mp4" + alt: "RocketSim for Teams dashboard showing build times, build count and breakdown charts for an Xcode project." + alignment: "full-width" + columnSpan: 12 +--- + +**Compare Xcode build performance** across your entire team. Measure the impact of different machines, Xcode versions, and SDK changes on build duration. + +- **Online dashboard** at teams.rocketsim.app with P75 and P95 breakdowns +- **Automatic background sync** — no build phase scripts required diff --git a/docs/src/config/menu.json b/docs/src/config/menu.json index c4dae0e2..77ca9f65 100644 --- a/docs/src/config/menu.json +++ b/docs/src/config/menu.json @@ -1,8 +1,8 @@ { "main": [ { - "name": "All Features", - "url": "/" + "name": "Features", + "url": "/features" }, { "name": "For Teams", @@ -29,8 +29,8 @@ ], "footer": [ { - "name": "All features", - "url": "/" + "name": "Features", + "url": "/features" }, { "name": "For Teams", diff --git a/docs/src/content.config.ts b/docs/src/content.config.ts index 22e880ed..fa48d202 100644 --- a/docs/src/content.config.ts +++ b/docs/src/content.config.ts @@ -4,6 +4,8 @@ import { docsLoader } from "@astrojs/starlight/loaders"; import { docsSchema } from "@astrojs/starlight/schema"; import { + featurePageSchema, + featuresPageCollection, pricingCollection, privacyCollection, teamInsightsCollection, @@ -27,9 +29,24 @@ const feature = defineCollection({ schema: ({ image }) => z.object({ name: z.string(), + showOnHomepage: z.boolean().default(false), tagLine: z.string().optional(), + docPath: z.string().optional(), blogId: z.number().optional(), youtubeLink: z.string().url().optional(), + featurePage: z + .enum([ + "accessibility", + "app-actions", + "build-insights", + "design-comparison", + "networking", + "screenshots-recordings", + "simulator-camera", + "status-bar", + "user-defaults-editor", + ]) + .optional(), asset: z.discriminatedUnion("type", [ z.object({ type: z.literal("image"), @@ -56,8 +73,18 @@ const docs = defineCollection({ schema: docsSchema(), }); +const featurePage = defineCollection({ + loader: glob({ + pattern: "**/[^_]*.md", + base: "./src/collections/feature-page", + }), + schema: featurePageSchema, +}); + export const collections = { feature, + "feature-page": featurePage, + features: featuresPageCollection, pricing: pricingCollection, privacy: privacyCollection, "team-insights": teamInsightsCollection, diff --git a/docs/src/content/features/-index.md b/docs/src/content/features/-index.md new file mode 100644 index 00000000..9e1c5c5a --- /dev/null +++ b/docs/src/content/features/-index.md @@ -0,0 +1,8 @@ +--- +title: "Features - RocketSim" +meta_title: "RocketSim Features - Enhance your Xcode Simulator" +description: "Explore all RocketSim features: network monitoring, design comparison, recordings, accessibility testing, and more for the iOS Simulator." +draft: false +hero: + title: "All RocketSim Features" +--- diff --git a/docs/src/layouts/Base.astro b/docs/src/layouts/Base.astro index 3313ae74..40d16efb 100755 --- a/docs/src/layouts/Base.astro +++ b/docs/src/layouts/Base.astro @@ -205,7 +205,10 @@ const { seo, structuredData } = Astro.props; }); document.addEventListener("astro:after-swap", () => { - aosInit(); + // Remove leftover AOS state so animations re-trigger on the new page + document.querySelectorAll("[data-aos]").forEach((el) => { + el.classList.remove("aos-animate", "aos-init"); + }); }); diff --git a/docs/src/old/components/Feature.astro b/docs/src/layouts/components/Feature.astro similarity index 100% rename from docs/src/old/components/Feature.astro rename to docs/src/layouts/components/Feature.astro diff --git a/docs/src/layouts/components/ImageMod.astro b/docs/src/layouts/components/ImageMod.astro index 6364baf2..8123b610 100644 --- a/docs/src/layouts/components/ImageMod.astro +++ b/docs/src/layouts/components/ImageMod.astro @@ -6,8 +6,8 @@ import { Image } from "astro:assets"; interface Props { src: string; alt: string; - width: number; - height: number; + width?: number; + height?: number; quality?: "low" | "mid" | "high" | "max"; loading?: "eager" | "lazy" | null | undefined; decoding?: "async" | "auto" | "sync" | null | undefined; @@ -57,6 +57,7 @@ const imageQuality = quality ? quality : "mid"; height={height} loading={loading} decoding={decoding} + layout="constrained" class={className} format={format} style={style} diff --git a/docs/src/layouts/partials/FeatureBento.astro b/docs/src/layouts/partials/FeatureBento.astro new file mode 100644 index 00000000..30565868 --- /dev/null +++ b/docs/src/layouts/partials/FeatureBento.astro @@ -0,0 +1,211 @@ +--- +import ImageMod from "@/components/ImageMod.astro"; +import { markdownify } from "@/lib/utils/textConverter"; + +interface BentoColumn { + title: string; + subtitle: string; + image: string; + href?: string; + imageAlign?: + | "left-top" + | "center-top" + | "right-top" + | "left-center" + | "center" + | "right-center" + | "left-bottom" + | "center-bottom" + | "right-bottom"; +} + +interface Props { + title?: string; + viewAllHref?: string; + viewAllText?: string; + list: { + firstServiceRow: { + landscapeColumn: BentoColumn; + squareColumn: BentoColumn; + }; + secondServiceRow: { + landscapeColumn: BentoColumn; + squareColumn: BentoColumn; + }; + }; +} + +const { title, viewAllHref, viewAllText, list } = Astro.props; + +function toObjectPosition(align?: string): string { + if (!align) return "left top"; + return align === "center" ? "center" : align.replace("-", " "); +} +--- + +
+
+ +
+
diff --git a/docs/src/layouts/partials/FeatureGrid.astro b/docs/src/layouts/partials/FeatureGrid.astro new file mode 100644 index 00000000..569860dd --- /dev/null +++ b/docs/src/layouts/partials/FeatureGrid.astro @@ -0,0 +1,35 @@ +--- +import { getCollection } from "astro:content"; + +const rawFeaturePages = await getCollection("feature-page"); +const featurePages = rawFeaturePages + .filter((page) => !page.data.draft) + .sort((a, b) => a.id.localeCompare(b.id)); +--- + +
+
+
+ { + featurePages.map((page, index) => { + return ( + +

+ {page.data.hero.title} +

+

{page.data.description}

+ + Learn more → + +
+ ); + }) + } +
+
+
diff --git a/docs/src/layouts/partials/FeatureItems.astro b/docs/src/layouts/partials/FeatureItems.astro new file mode 100644 index 00000000..ec662b9e --- /dev/null +++ b/docs/src/layouts/partials/FeatureItems.astro @@ -0,0 +1,68 @@ +--- +import { getCollection, render } from "astro:content"; + +import Feature from "@/components/Feature.astro"; + +interface Props { + featurePage: string; + title?: string; +} + +const { featurePage, title } = Astro.props; + +const rawFeatures = await getCollection("feature", (entry) => { + return entry.data.featurePage === featurePage; +}); + +const features = await Promise.all( + rawFeatures + .sort((a, b) => a.id.localeCompare(b.id)) + .map(async (feature) => { + const { Content } = await render(feature); + return { data: feature.data, Content }; + }), +); +--- + + + +
+
+
+ { + title && ( +
+

+ {title} +

+
+ ) + } +
+ { + features.map(({ data, Content }) => ( +
+ + + +
+ )) + } +
+
+
+
diff --git a/docs/src/layouts/partials/PageHeader.astro b/docs/src/layouts/partials/PageHeader.astro index 049f55c8..f31618c8 100644 --- a/docs/src/layouts/partials/PageHeader.astro +++ b/docs/src/layouts/partials/PageHeader.astro @@ -34,19 +34,19 @@ const { /> ) : ( -
+

-
+

{featuredTestimonial && ( diff --git a/docs/src/old/components/Features.astro b/docs/src/old/components/Features.astro index 814c0835..bdc58808 100644 --- a/docs/src/old/components/Features.astro +++ b/docs/src/old/components/Features.astro @@ -1,9 +1,12 @@ --- import { getCollection, render } from "astro:content"; -import Feature from "./Feature.astro"; +import Feature from "@/components/Feature.astro"; -const rawFeatures = await getCollection("feature"); +const rawFeatures = await getCollection( + "feature", + (entry) => entry.data.showOnHomepage === true, +); const features = await Promise.all( rawFeatures .sort((a, b) => a.id.localeCompare(b.id)) diff --git a/docs/src/old/components/Insights.astro b/docs/src/old/components/Insights.astro index 97b8859e..e8d5fa9f 100644 --- a/docs/src/old/components/Insights.astro +++ b/docs/src/old/components/Insights.astro @@ -1,6 +1,6 @@ --- import SectionHeader from "./SectionHeader.astro"; -import Feature from "./Feature.astro"; +import Feature from "@/components/Feature.astro"; import featureImage from "../../assets/features/build-insights.png"; --- diff --git a/docs/src/old/components/Navigation.astro b/docs/src/old/components/Navigation.astro index f9395768..e6337323 100644 --- a/docs/src/old/components/Navigation.astro +++ b/docs/src/old/components/Navigation.astro @@ -75,7 +75,7 @@ const { showLogin = false } = Astro.props; @media (min-width: 800px) { flex-direction: row; - gap: 3rem; + gap: 2rem; } } diff --git a/docs/src/old/components/NavigationLink.astro b/docs/src/old/components/NavigationLink.astro index 73da0cbc..880760c9 100644 --- a/docs/src/old/components/NavigationLink.astro +++ b/docs/src/old/components/NavigationLink.astro @@ -1,10 +1,17 @@ --- interface Props extends astroHTML.JSX.AnchorHTMLAttributes { asButton?: boolean; + asSecondaryButton?: boolean; className?: string; } -const { asButton, className, ...rest } = Astro.props; +const { asButton, asSecondaryButton, className, ...rest } = Astro.props; + +const baseClass = asButton + ? "button" + : asSecondaryButton + ? "button button--secondary" + : "link"; ---

  • -
  • diff --git a/docs/src/old/components/OnlineTeamManager.astro b/docs/src/old/components/OnlineTeamManager.astro index 156ec27d..f95f30b4 100644 --- a/docs/src/old/components/OnlineTeamManager.astro +++ b/docs/src/old/components/OnlineTeamManager.astro @@ -1,5 +1,5 @@ --- -import Feature from "./Feature.astro"; +import Feature from "@/components/Feature.astro"; import userSettingsImage from "../../assets/features/user-settings.png"; import subscriptionSettingsImage from "../../assets/features/subscription-settings.png"; diff --git a/docs/src/old/components/TeamInsights.astro b/docs/src/old/components/TeamInsights.astro index b821b098..5c8db1b5 100644 --- a/docs/src/old/components/TeamInsights.astro +++ b/docs/src/old/components/TeamInsights.astro @@ -1,6 +1,6 @@ --- import SectionHeader from "./SectionHeader.astro"; -import Feature from "./Feature.astro"; +import Feature from "@/components/Feature.astro"; import FeatureImage from "../../assets/features/build-insights.png"; --- diff --git a/docs/src/pages/features/[featurePageSlug].astro b/docs/src/pages/features/[featurePageSlug].astro new file mode 100644 index 00000000..9ac0e3ae --- /dev/null +++ b/docs/src/pages/features/[featurePageSlug].astro @@ -0,0 +1,78 @@ +--- +import { getCollection } from "astro:content"; + +import config from "@/config/config.json"; +import Base from "@/layouts/Base.astro"; +import PageHeader from "@/partials/PageHeader.astro"; +import CallToAction from "@/partials/CallToAction.astro"; +import FeatureBento from "@/partials/FeatureBento.astro"; +import FeatureItems from "@/partials/FeatureItems.astro"; + +export async function getStaticPaths() { + const pages = await getCollection("feature-page"); + return pages + .filter((page) => !page.data.draft) + .map((page) => ({ + params: { featurePageSlug: page.id }, + props: { page }, + })); +} + +const { page } = Astro.props; +const { title, description, hero, bento } = page.data; +const { + site: { base_url }, +} = config; + +const seo = { + title: page.data.meta_title || `${title} - RocketSim`, + description, + canonical: `${base_url}/features/${page.id}`, +}; + +const structuredData = { + type: "static" as const, +}; +--- + + + + + {bento?.enable && } + + + + + + + diff --git a/docs/src/pages/features/index.astro b/docs/src/pages/features/index.astro new file mode 100644 index 00000000..4fec2142 --- /dev/null +++ b/docs/src/pages/features/index.astro @@ -0,0 +1,33 @@ +--- +import { getEntry } from "astro:content"; + +import config from "@/config/config.json"; +import Base from "@/layouts/Base.astro"; +import PageHeader from "@/partials/PageHeader.astro"; +import FeatureGrid from "@/partials/FeatureGrid.astro"; +import FaqSection from "@/partials/FaqSection.astro"; +import CallToAction from "@/partials/CallToAction.astro"; + +const pageIndex = await getEntry("features", "-index"); +if (!pageIndex) return null; +const { hero, title, meta_title, description } = pageIndex.data; +const { + site: { base_url }, +} = config; + +const seo = { + title: meta_title || `${title} - RocketSim`, + description, + canonical: `${base_url}/features`, +}; + +const structuredData = { + type: "static" as const, +}; +--- + + + + + + diff --git a/docs/src/pages/index.astro b/docs/src/pages/index.astro index f59a47b8..f2a905ff 100644 --- a/docs/src/pages/index.astro +++ b/docs/src/pages/index.astro @@ -60,6 +60,11 @@ const seo = { className="plausible-event-name=CTA:+Homepage+Hero+-+For+Teams" >For Teams → + All features → diff --git a/docs/src/styles/animations.css b/docs/src/styles/animations.css index e40aa86a..d4bbcdc6 100644 --- a/docs/src/styles/animations.css +++ b/docs/src/styles/animations.css @@ -115,6 +115,15 @@ opacity: 1; } } +[data-aos="fade-left-sm"] { + transform: translateX(15px); + opacity: 0; + transition-property: transform, opacity; + &.aos-animate { + transform: translateX(0); + opacity: 1; + } +} [data-aos="zoom-out-sm"] { transform: scale(1.05); opacity: 0.5; diff --git a/docs/src/types/pages.collection.ts b/docs/src/types/pages.collection.ts index e1a6c843..28ace169 100644 --- a/docs/src/types/pages.collection.ts +++ b/docs/src/types/pages.collection.ts @@ -43,6 +43,66 @@ export const termsCollection = defineCollection({ }), }); +// Features Page collection schema +export const featuresPageCollection = defineCollection({ + schema: z.object({ + title: z.string(), + meta_title: z.string().optional(), + description: z.string().optional(), + draft: z.boolean(), + hero: z.object({ + title: z.string().optional(), + }), + }), +}); + +// Feature Page schema (consolidated feature category pages) +const bentoColumnSchema = z.object({ + title: z.string(), + subtitle: z.string(), + image: z.string(), + imageAlign: z + .enum([ + "left-top", + "center-top", + "right-top", + "left-center", + "center", + "right-center", + "left-bottom", + "center-bottom", + "right-bottom", + ]) + .optional(), +}); + +export const featurePageSchema = z.object({ + title: z.string(), + meta_title: z.string().optional(), + description: z.string(), + draft: z.boolean().default(false), + hero: z.object({ + title: z.string(), + subtitle: z.string().optional(), + }), + bento: z + .object({ + enable: z.boolean(), + title: z.string().optional(), + list: z.object({ + firstServiceRow: z.object({ + landscapeColumn: bentoColumnSchema, + squareColumn: bentoColumnSchema, + }), + secondServiceRow: z.object({ + landscapeColumn: bentoColumnSchema, + squareColumn: bentoColumnSchema, + }), + }), + }) + .optional(), +}); + // Thank you collection schema export const thankYouCollection = defineCollection({ schema: z.object({