Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,6 @@ mise.local.toml
.env
.env.*
!.env.example

# JavaScript tooling
node_modules/
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
- `mise run doctor`
- `mise run bootstrap`
- `mise run generate`
- `mise run tokens`
- `mise run test`
- `mise run build`
- `mise run verify`
Expand All @@ -27,6 +28,7 @@
- Run `mise run bootstrap` in a fresh checkout or worktree
- Run `mise run verify` before handoff
- Change targets and settings in `Project.swift`, never in generated Xcode files
- Change design tokens in `putio-design`, then bump the locked package and regenerate; never edit `PutioTheme+Generated.swift`
- Use Swift Package Manager for dependencies
- Keep platform-specific UI, lifecycle, focus, playback, and download behavior in the matching app shell
- Put only genuinely cross-platform models, session, API, and feature logic in `PutioCore`
Expand Down
13 changes: 9 additions & 4 deletions Apps/iOS/Sources/PutioApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ struct PutioApp: App {
var body: some Scene {
WindowGroup {
SignedOutView(presentation: presentation)
.preferredColorScheme(.dark)
.onAppear {
if SignedOutPresentation.isHarnessExercise(arguments: ProcessInfo.processInfo.arguments) {
SignedOutPresentation.signalHarnessExercise()
Expand All @@ -19,16 +20,20 @@ struct PutioApp: App {
}

private struct SignedOutView: View {
@Environment(\.colorScheme) private var colorScheme

Comment thread
altaywtf marked this conversation as resolved.
let presentation: SignedOutPresentation

var body: some View {
VStack(spacing: 12) {
VStack(spacing: PutioTheme.Spacing.space3) {
Text(presentation.title)
.font(.largeTitle.bold())
.putioFont(PutioTheme.Typography.title)
.foregroundStyle(PutioTheme.Colors.text.resolve(for: colorScheme))
Text(presentation.message)
.foregroundStyle(.secondary)
.putioFont(PutioTheme.Typography.body)
.foregroundStyle(PutioTheme.Colors.textSecondary.resolve(for: colorScheme))
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.preferredColorScheme(.dark)
.background(PutioTheme.Colors.appBg.resolve(for: colorScheme))
}
}
13 changes: 9 additions & 4 deletions Apps/tvOS/Sources/PutioTVApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ struct PutioTVApp: App {
var body: some Scene {
WindowGroup {
SignedOutView(presentation: presentation)
.preferredColorScheme(.dark)
.onAppear {
if SignedOutPresentation.isHarnessExercise(arguments: ProcessInfo.processInfo.arguments) {
SignedOutPresentation.signalHarnessExercise()
Expand All @@ -19,16 +20,20 @@ struct PutioTVApp: App {
}

private struct SignedOutView: View {
@Environment(\.colorScheme) private var colorScheme

Comment thread
altaywtf marked this conversation as resolved.
let presentation: SignedOutPresentation

var body: some View {
VStack(spacing: 20) {
VStack(spacing: PutioTheme.TV.Spacing.small) {
Text(presentation.title)
.font(.largeTitle.bold())
.putioFont(PutioTheme.TV.Typography.heading)
.foregroundStyle(PutioTheme.TV.Colors.text1)
Text(presentation.message)
.foregroundStyle(.secondary)
.putioFont(PutioTheme.TV.Typography.body)
.foregroundStyle(PutioTheme.TV.Colors.text2)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.preferredColorScheme(.dark)
.background(PutioTheme.Colors.appBg.resolve(for: colorScheme))
}
}
14 changes: 10 additions & 4 deletions Apps/watchOS/Sources/PutioWatchApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ struct PutioWatchApp: App {
var body: some Scene {
WindowGroup {
SignedOutView(presentation: presentation)
.preferredColorScheme(.dark)
.onAppear {
if SignedOutPresentation.isHarnessExercise(arguments: ProcessInfo.processInfo.arguments) {
SignedOutPresentation.signalHarnessExercise()
Expand All @@ -19,16 +20,21 @@ struct PutioWatchApp: App {
}

private struct SignedOutView: View {
@Environment(\.colorScheme) private var colorScheme

Comment thread
altaywtf marked this conversation as resolved.
let presentation: SignedOutPresentation

var body: some View {
VStack(spacing: 6) {
VStack(spacing: PutioTheme.Spacing.space1) {
Text(presentation.title)
.font(.headline)
.putioFont(PutioTheme.Typography.subheading)
.foregroundStyle(PutioTheme.Colors.text.resolve(for: colorScheme))
Text(presentation.message)
.font(.footnote)
.foregroundStyle(.secondary)
.putioFont(PutioTheme.Typography.caption)
.foregroundStyle(PutioTheme.Colors.textSecondary.resolve(for: colorScheme))
.multilineTextAlignment(.center)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(PutioTheme.Colors.appBg.resolve(for: colorScheme))
}
}
14 changes: 12 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ mise install
mise run bootstrap
```

Bootstrap validates Xcode, installs the pinned Tuist release through mise, resolves package dependencies, and generates `Putio.xcworkspace`. It requires no Tuist login or private configuration.
Bootstrap validates Xcode, installs the pinned Tuist, Node.js, and pnpm releases through mise, resolves package dependencies, and generates `Putio.xcworkspace`. It requires no Tuist login or private configuration.

For a machine-readable environment report:

Expand All @@ -32,13 +32,23 @@ mise run open

Source changes inside existing `buildableFolders` appear without regenerating. Regenerate after manifest or dependency-graph changes.

### Design tokens

The committed `PutioTheme+Generated.swift` adapter comes from the exact `@putdotio/design` version in `pnpm-lock.yaml`.

```bash
mise run tokens
```

Do not edit the generated Swift or token values directly. Update tokens in `putio-design`, bump the package version here, regenerate, and commit the lockfile and generated output together. The verification lane fails when they drift.

## Verification

```bash
mise run verify
```

This runs the `PutioCore` and harness tests, then builds the iOS, watchOS, and tvOS schemes against generic simulators. Exercise the affected shell with the headless harness when a change alters runtime behavior.
This installs the locked token tooling, checks generated-output drift, runs the `PutioCore` and harness tests, then builds the iOS, watchOS, and tvOS schemes against generic simulators. Exercise the affected shell with the headless harness when a change alters runtime behavior.

Use the headless harness for runtime-sensitive changes:

Expand Down
Loading