Skip to content
Skip
3k

Showcase (Fuse)

A comprehensive demonstration app for Skip, showcasing cross-platform SwiftUI development for iOS and Android. This is a Skip Fuse app where Swift runs natively on both platforms, with SkipUI converting SwiftUI views into Jetpack Compose on Android.

The app contains 90+ interactive playgrounds, each demonstrating a specific SwiftUI component, layout technique, or framework integration. Every playground renders natively on both iOS and Android from the same Swift source code.

Download on the Google Play Store Download on the Apple App Store
iPhone Screenshot iPhone Screenshot iPhone Screenshot iPhone Screenshot iPhone Screenshot
Android Screenshot Android Screenshot Android Screenshot Android Screenshot Android Screenshot

The app uses a three-tab layout defined in ContentView.swift:

  • About — App info and version details
  • Showcase — Searchable list of all playgrounds (PlaygroundListView.swift)
  • Settings — Appearance and configuration

Each playground is registered as a case in the PlaygroundType enum, which provides the title and view. The list is searchable and navigable via NavigationStack.

The showcase integrates 10 Skip framework libraries beyond the core SkipUI, demonstrating how optional frameworks can be composed into a single app:

FrameworkRepositoryPurpose
SkipFuseUIskip-fuse-uiCore SwiftUI-to-Compose bridge for Fuse mode
SkipKitskip-kitPermissions, document/media pickers, haptics, device info
SkipAVskip-avVideo playback (AVKit on iOS, ExoPlayer on Android)
SkipWebskip-webEmbedded web views (WKWebView / android.webkit.WebView)
SkipDeviceskip-deviceSensors (accelerometer, gyroscope, magnetometer, barometer) and location
SkipMotionskip-motionLottie animations
SkipKeychainskip-keychainKeychain / EncryptedSharedPreferences
SkipSQLskip-sqlSQLite database access
SkipNotifyskip-notifyPush and local notifications
SkipAuthenticationServicesskip-authentication-servicesWeb authentication sessions (OAuth flows)

Every playground file is in Sources/ShowcaseFuse/ and links to its source via the toolbar “Source” button. The entries below link to the playground source code and the relevant SkipUI documentation for each component.

Interactive input elements that accept user actions.

PlaygroundComponentsSource
ButtonButton, Label, button roles, .bordered, .borderedProminent, .plain stylesButtonPlayground.swift
ToggleToggle, .labelsHidden, .tint, .disabledTogglePlayground.swift
SliderSlider with ranges, steps, onEditingChangedSliderPlayground.swift
StepperStepper with Int/Double values, custom boundsStepperPlayground.swift
PickerPicker with .segmented, .menu stylesPickerPlayground.swift
DatePickerDatePicker with date/time modesDatePickerPlayground.swift
MenuMenu with primary action, sections, dividersMenuPlayground.swift
ProgressViewCircular and linear progress, determinate/indeterminateProgressViewPlayground.swift

Text display, input, and formatting.

PlaygroundComponentsSource
TextText with bold, italic, strikethrough, underline, markdown, all font sizes, custom fontsTextPlayground.swift
TextFieldTextField with .roundedBorder, .plain, custom stylesTextFieldPlayground.swift
SecureFieldSecureField with prompts, disabled statesSecureFieldPlayground.swift
TextEditorMulti-line text editingTextEditorPlayground.swift
LabelLabel with .titleAndIcon, .titleOnly, .iconOnly stylesLabelPlayground.swift
Line Spacing.lineSpacing modifier with various valuesLineSpacingPlayground.swift
Tracking.tracking modifier for letter spacingTrackingPlayground.swift
MinimumScaleFactor.minimumScaleFactor for responsive text sizingMinimumScaleFactorPlayground.swift

Spatial arrangement of views.

PlaygroundComponentsSource
StacksHStack, VStack, fixed vs expanding, nested stacksStackPlayground.swift
SpacerSpacer with minLength, variable dimensionsSpacerPlayground.swift
Frame.frame with width, height, .infinity, aspect ratioFramePlayground.swift
GridsLazyVGrid, LazyHGrid with .adaptive, .flexible, .fixed columnsGridPlayground.swift
DividerHorizontal/vertical dividers, custom dimensionsDividerPlayground.swift
GeometryReaderSize reading, safe area insets, local vs global framesGeometryReaderPlayground.swift
GeometryChangeonGeometryChange for size/position trackingGeometryChangePlayground.swift
SafeArea.ignoresSafeArea, edge-to-edge renderingSafeAreaPlayground.swift
ViewThatFitsAdaptive layout along horizontal/vertical axesViewThatFitsPlayground.swift
ContentMargins.contentMargins, scrollContentPlacementContentMarginsPlayground.swift

Screen flow and modal presentation.

PlaygroundComponentsSource
NavigationStackNavigationStack, NavigationLink, path binding, navigationDestinationNavigationStackPlayground.swift
SheetSheet, FullScreenCover, PresentationDetent, onDismissSheetPlayground.swift
AlertAlert with text/secure field inputsAlertPlayground.swift
ConfirmationDialogAction sheets with custom cancel, scrolling contentConfirmationDialogPlayground.swift
ContextMenuLong-press menus with labels and destructive actionsContextMenuPlayground.swift
TabViewTabs with badges, custom icons, programmatic selectionTabViewPlayground.swift
ToolbarToolbarItem placement, custom bar colors, ToolbarTitleMenuToolbarPlayground.swift

Lists, scroll views, and content presentation.

PlaygroundComponentsSource
ListSections, edit actions (move/delete), refresh, badges, plain styleListPlayground.swift
ScrollViewScrollViewReader, LazyVStack/LazyHStack, scroll targets, anchorsScrollViewPlayground.swift
FormForm with mixed control types, button styling, nested sectionsFormPlayground.swift
DisclosureGroupExpandable sections, isExpanded binding, nested groupsDisclosureGroupPlayground.swift
Searchable.searchable on List, Grid, LazyVStack, onSubmitSearchablePlayground.swift

Visual appearance customization.

PlaygroundComponentsSource
ColorSystem colors, RGB, HSV, opacity, custom asset colorsColorPlayground.swift
ColorScheme.preferredColorScheme, light/dark switchingColorSchemePlayground.swift
Color Effects.brightness, .contrast, .saturation, .hueRotation, .grayscale, .colorInvertColorEffectsPlayground.swift
GradientLinearGradient, RadialGradient, EllipticalGradientGradientPlayground.swift
Background.background with colors, gradients, shapesBackgroundPlayground.swift

Drawing, shapes, and visual modifiers.

PlaygroundComponentsSource
ShapeCircle, Capsule, Rectangle, RoundedRectangle, Ellipse, UnevenRoundedRectangleShapePlayground.swift
Border.border, padding, .clipShapeBorderPlayground.swift
Blur.blur(radius:) on shapes and textBlurPlayground.swift
Shadow.shadow with color, radius, x/y offsetShadowPlayground.swift
BlendMode.blendMode (multiply, screen, overlay, and 10+ others)BlendModePlayground.swift
Mask.mask with shapes, gradients, and textMaskPlayground.swift
Overlay.overlay with colors, shapes, custom contentOverlayPlayground.swift
Redacted.redacted(reason: .placeholder) content maskingRedactedPlayground.swift
ZIndex.zIndex for layering control in ZStackZIndexPlayground.swift

Image display, remote loading, and iconography.

PlaygroundComponentsSource
ImageAsset images (JPEG, SVG), system images, AsyncImage (remote URLs), .aspectRatio, .clipShapeImagePlayground.swift
IconsCustom asset icons with various colorsIconPlayground.swift
SymbolImage(systemName:) with font sizing, multiple variationsSymbolPlayground.swift
Graphics.grayscale, image composition, rotation effectsGraphicsPlayground.swift

Touch handling and user input.

PlaygroundComponentsSource
GestureTapGesture, LongPressGesture, DragGesture, MagnificationGesture, RotationGesture, @GestureStateGesturePlayground.swift
Offset/Position.offset(x:y:), .position, coordinate visualizationOffsetPositionPlayground.swift
Transform.rotation3DEffect, .scaleEffect with anchorsTransformPlayground.swift
Haptic FeedbackSensoryFeedback types (success, warning, error, impact, selection)HapticFeedbackPlayground.swift

Animated property changes and view transitions.

PlaygroundComponentsSource
Animation.animation modifier for opacity, blur, brightness, saturation, scale, border, corner radiusAnimationPlayground.swift
Transition.transition, withAnimation, .id(), combined scale/opacityTransitionPlayground.swift

State management, observation, and persistence.

PlaygroundComponentsSource
State@State, @Binding, struct mutations, optional stateStatePlayground.swift
Observable@Observable (Observation framework), @EnvironmentObservablePlayground.swift
EnvironmentCustom EnvironmentKey, @Environment, @BindableEnvironmentPlayground.swift
PreferencesCustom PreferenceKey, onPreferenceChangePreferencePlayground.swift
Storage@AppStorage for Bool, Double, and Enum typesStoragePlayground.swift
OnSubmit.onSubmit with nested form submission handlersOnSubmitPlayground.swift

Input method customization.

PlaygroundComponentsSource
Keyboard.keyboardType, .autocorrectionDisabled, .scrollDismissesKeyboard, .submitLabel, .textInputAutocapitalizationKeyboardPlayground.swift
FocusState@FocusState with boolean and enum bindings, programmatic focusFocusStatePlayground.swift

Platform features accessible through SwiftUI.

PlaygroundComponentsSource
ScenePhase@Environment(\.scenePhase) monitoring (active, background, inactive)ScenePhasePlayground.swift
LocalizationBundle localizations, LocalizedStringResource, locale-aware date formattingLocalizationPlayground.swift
Accessibility.accessibilityLabel, .accessibilityValue, .accessibilityAddTraits, .accessibilityHiddenAccessibilityPlayground.swift
LinkLink, @Environment(\.openURL), OpenURLActionLinkPlayground.swift
ShareLinkShareLink with text and URL sharing, subject/messageShareLinkPlayground.swift
PasteboardUIPasteboard.general for copy/paste operationsPasteboardPlayground.swift
TimerTimer-based updates and schedulingTimerPlayground.swift

Playgrounds that demonstrate optional Skip framework libraries beyond core SkipUI.

PlaygroundFrameworkWhat it demonstratesSource
Video PlayerSkipAVVideoPlayer with local, remote, and HLS sources; loopingVideoPlayerPlayground.swift
Lottie AnimationSkipMotionLottie playback, speed control, loop modes, progress scrubbingLottiePlayground.swift
WebViewSkipWebWebEngine, navigation, JavaScript evaluationWebViewPlayground.swift
WebBrowserSkipKitEmbedded/system browser launch, custom actionsWebBrowserPlayground.swift
Web Auth SessionSkipAuthenticationServicesOAuth-style web authentication, callback URL parsingWebAuthenticationSessionPlayground.swift
Document/Media PickersSkipKitDocument and media picking, camera integrationDocumentPickerPlayground.swift
KeychainSkipKeychainKeychain read/write, key managementKeychainPlayground.swift
NotificationsSkipNotifyPush permission, local notificationsNotificationPlayground.swift
SQLSkipSQLSQLite CRUD operations, observable database listSQLPlayground.swift
MapMapKit (iOS) / Google Maps Compose (Android)Map display with coordinates, platform-specific renderingMapPlayground.swift
SensorsSkipDeviceAccelerometer, gyroscope, magnetometer, barometer, locationSensorsPlayground.swift

These playgrounds demonstrate Skip’s escape hatches for accessing native Android APIs from SwiftUI.

PlaygroundTechniqueSource
ComposeComposeView with custom ContentComposer for direct Jetpack Compose renderingComposePlayground.swift
Modifiers.composeModifier() for applying native Compose modifiers, custom ViewModifierModifierPlayground.swift
PlaygroundDescriptionSource
Easter EggA complete Block Blast game with drag-and-drop piece placement, line clearing, combos, scoring, and haptic feedback. Demonstrates complex state management with @Observable, GeometryReader for board sizing, and DragGesture with global coordinate space.GamePlayground.swift

Several playgrounds demonstrate how to provide platform-specific implementations when SwiftUI alone is insufficient. The MapPlayground is the clearest example: it uses SwiftUI Map on iOS and ComposeView with Google Maps Compose on Android, sharing the same coordinate data.

The ComposePlayground shows how to embed raw Jetpack Compose code within a SwiftUI hierarchy using ComposeView and a custom ContentComposer. This is Skip’s escape hatch for rendering Android-native UI that has no SwiftUI equivalent. The MapPlayground uses this technique in production to embed Google Maps.

The ModifierPlayground demonstrates reusable ViewModifier implementations (like DismissModifier) and the .composeModifier() API for applying native Compose modifiers on Android. This is useful for Material 3 theming or Android-specific visual effects.

The GamePlayground demonstrates managing complex interactive state across a game board, piece tray, and score system using @Observable and multiple @State variables. It shows how DragGesture with .global coordinate space, GeometryReader for layout measurement, and DispatchQueue.main.asyncAfter for timed effects all work cross-platform.

The SensorsPlayground demonstrates AsyncThrowingStream consumption from device sensors using the .task(id:) modifier pattern. Each sensor card starts/stops monitoring based on a boolean toggle, and the task automatically cancels when the toggle changes. Location monitoring includes runtime permission handling via PermissionManager.

The Map playground requires an Android Gradle dependency for Google Maps Compose. This is configured in Sources/ShowcaseFuse/Skip/skip.yml:

build:
contents:
- block: 'dependencies'
contents:
- 'implementation("com.google.maps.android:maps-compose:6.4.1")'

This project is both a stand-alone Swift Package Manager module, as well as an Xcode project that builds and transpiles the project into a Kotlin Gradle project for Android using the Skip plugin.

The module can be tested using the standard swift test command or by running the test target for the macOS destination in Xcode, which will run the Swift tests as well as the transpiled Kotlin JUnit tests in the Robolectric Android simulation environment.

Parity testing can be performed with skip test, which will output a table of the test results for both platforms.

Xcode and Android Studio must be downloaded and installed in order to run the app in the iOS simulator / Android emulator. An Android emulator must already be running, which can be launched from Android Studio’s Device Manager.

To run both the Swift and Kotlin apps simultaneously, launch the ShowcaseFuseApp target from Xcode. A build phases runs the “Launch Android APK” script that will deploy the transpiled app a running Android emulator or connected device. Logging output for the iOS app can be viewed in the Xcode console, and in Android Studio’s logcat tab for the transpiled Kotlin app.