commit 934f82d805ec39a2a267edf0d48207f8464121fd Author: Pauljd Date: Sun Nov 1 17:25:30 2026 +0000 Orbit TV at 0.16.0-tuning-screen First commit, imported from the working folder: Android TV app, loopback guide server, design sources and per-release verification notes. Includes the 0.16 tuning screen, built and tested but not yet confirmed on the box. Co-Authored-By: Claude Opus 5.5 (1M context) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d85c9d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.tooling/ +android/.gradle/ +android/local.properties +android/**/build/ +server/node_modules/ +server/dist/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..0ab3c95 --- /dev/null +++ b/README.md @@ -0,0 +1,139 @@ +# Orbit TV — local prototype + +A native Android TV prototype for review on Paul's Xiaomi TV Box S 3rd Gen. + +## Revision 0.6.0 — one scheduled Emby channel + +Paul confirmed the 0.5.0 strip hides and displays correctly. The next increment adds a +sample guide for one real channel: Menu → Connect Emby → Check 20 items → Create sample channel. +It checks at most five media-source metadata responses and keeps up to three eligible titles. +A precise UTC timeline repeats the lineup, joins in progress and advances automatically. +Watch channel uses the ordinary clock; Check transition jumps near an end for a quick handover +check and is labelled as a test. It may affect normal provider viewing history. +Now/Next in the strip and sample guide comes from that timeline. Pause/seek remain on-demand +features; the scheduled channel follows the clock. Back returns to the sample guide. +No channel, credentials or tokens are persisted yet. See docs/sample-scheduled-channel.md. +This version needs approval before TV installation and real channel/rollover acceptance testing. + +## Revision 0.5.0 — Classic programme strip + +Paul confirmed 0.4.0 played real provider media. This visual revision replaces its persistent +top banner/stock controller with a bottom classic programme strip that hides after five seconds +of active playback. OK reveals it; while visible OK toggles pause/play, and left/right seek. +The channel/guide/subtitle legend is visual only for now, as requested. Back still returns +to the sample. The stock subtitle/audio menu is not shown in this presentation pass. +See docs/classic-programme-strip.md. Logo artwork also loses the CRT's white cabinet outline. +The new presentation needs its own TV acceptance check and approval before installation. + +## Revision 0.4.0 — small-sample playback test + +The 20-item connection check succeeded on Paul's Xiaomi box. The next revision makes those +sample items playable, retaining the temporary login in memory until the sample screen exits. +Select a title, use fullscreen pause/seek/audio/subtitle controls, and Back to return to the sample. +Direct streaming is tested first: no automatic video transcoding, full scan or saved credentials. +Playback may update normal provider watch history. See docs/emby-playback-test.md for boundaries. + +The 0.4.0 APK was installed, and Paul confirmed real media playback. An original gold/charcoal +OrbOffice drive-in ticket logo concept is included in design/, separately from the app interface. +Brand-name clearance is not established. The Android CLI skill was assessed, not installed. + +## Revision 0.3.0 — Connect Emby + +Menu → Connect Emby opens an on-TV username/password form for the selected provider. +Check 20 items performs one sign-in, one metadata-page request and a temporary-session logout. +The sample shows titles, media types, durations and available container/codec metadata. +No password, token or sample is persisted. Credentials stay out of chat and the APK. +The connection screen blocks screenshots and clears transient data when backgrounded. +The fixed provider URL is displayed before submission; no real account has been used in tests. +This does not yet import a library or play Emby video. See docs/emby-connection-check.md. + +The prior 0.2.0 APK was installed and verified on Paul's Xiaomi box. The 0.3.0 build was subsequently installed; Paul confirmed the 20-record sample succeeded. +Later profile requirements are recorded in docs/profiles-roadmap.md. + +## Revision 0.2.0 + +- Top navigation is now 1 Menu / 2 TV Guide / 3 Box Office. +- Menu links to the guide, OrbOffice and Services (including the OrbHive Bedlam roadmap). +- OrbOffice has two selectable fictional event ticket previews with an original perforated stub design. +- Barlow and Barlow Condensed are bundled for the new sections; their OFL licences are in licenses/. +- Existing guide and fullscreen playback-bar styling is preserved. +- Proper logo work is deferred; Paul wants a centred mark with safe padding in the TV app tile. +- Reproduce the design previews with design/render-designs.sh (requires FigCraft CLI and Pillow). + Fonts are loaded from a project-local XDG data directory, without a system font installation. + +The first APK was installed on Paul's Xiaomi box. Paul confirmed navigation, tuning, +fullscreen playback and the bottom programme bar worked. Revision 0.2.0 was subsequently installed and verified on the box. + +## What works in source + +- Offline TV guide with three fictional channels and three half-hour columns. +- D-pad focus, programme descriptions, OK to tune the current show, Back to the guide. +- Current programme is determined from fixed UTC slots, not app launch time. +- Media3 joins the original 30-minute local demo video at the scheduled offset. +- One player moves between guide preview and fullscreen; playback pauses in background. +- Box Office is a ticket preview; Services keeps OrbHive Bedlam as an explicit roadmap item. +- Independent loopback-only TypeScript guide API, with no runtime npm dependencies. +- Editable FigCraft mockup and VectorCraft wordmark. + +The Android app uses its bundled Kotlin schedule. It does not call the TypeScript service yet. +The same fictional titles and slot algorithm are duplicated for this proof of concept; +replace these with an API contract before adding real channel editing. +All channels use the same silent original test signal. This is not an Emby integration. +Titles and synopses are fictional. No third-party programme footage is included. + +## Build + +Prerequisites: Java 21; Android platform 36, build-tools 36.0.0 and platform-tools. +The inspected SDK is /opt/android-sdk. android/local.properties records that machine-local path +and is excluded from version control. Set ANDROID_HOME on another machine and create an +appropriate local.properties if needed. + +Run `./build-android.sh` from the project root. The checked-in wrapper downloads the +SHA-256-pinned Gradle 9.3.1 distribution. Google/Maven Central access is needed initially. +Build dependencies, debug signing key and Gradle caches stay under .tooling/ when using the script. +The build uses AGP 9.1.1 and its built-in Kotlin support, with Compose compiler 2.2.10. +APK: android/app/build/outputs/apk/debug/app-debug.apk +Tests: android/app/build/test-results/testDebugUnitTest/ +Lint: android/app/build/reports/lint-results-debug.html + +## Backend + +Requires Node 24 and npm. This PikaOS Node package lacks native TypeScript support, +so compilation uses the pinned TypeScript dev dependency. + +``` +cd server +npm ci --ignore-scripts +npm test +npm start +``` + +The development server binds only to 127.0.0.1:4317. Stop with Ctrl+C. +GET /health; GET /guide; optional ?at=&count=1..48. +`node smoke-test.mjs` starts the service, checks responses and stops it automatically. + +## Xiaomi hardware testing + +The PC was paired with Paul's box; 0.1.0 and 0.2.0 were installed successfully. Ask before installing a new revision. +After approving a connection method, use Google's platform-tools to pair/connect as +supported by the box, then install the debug APK with `adb install -r `. +The launcher entry is Orbit TV. Pairing prompts and IP/port details come from the device; +do not guess them or expose ADB outside your trusted network. +The demo runs entirely on-device and needs no PC backend connection. + +Acceptance checks on hardware: +1. Navigate every guide cell using only arrows and OK; check readable focus and text at sofa distance. +2. Tune each current programme, return with Back, open future programme information. +3. Open at 18 minutes past a half-hour and confirm Media3 joins around 18 minutes. +4. Cross a half-hour boundary in fullscreen and guide; ensure guide and video switch together. +5. Background/resume across a slot boundary; verify the current schedule is rejoined. +6. Check Box Office and Services return paths. Record Android version and output resolution. + +## Remaining work + +Paul confirmed playback, focus and remote navigation on 0.1.0 and praised the installed 0.2.0 revision. New connection form/keyboard behaviour needs hardware testing. No emulator was installed. +No Emby credentials or authenticated library have been accessed by development tools. +The provider's public identification API was checked read-only. No VPS administration was performed. No services or firewall were changed. +Emby indexing, incremental reconciliation, parental rules, calendar programming blocks, +channel editing, theme switching, seasonal events and OrbHive Bedlam are not implemented. +Open-source licensing and final branding remain decisions for Paul. diff --git a/VERIFICATION-0.10.0.md b/VERIFICATION-0.10.0.md new file mode 100644 index 0000000..edac1bf --- /dev/null +++ b/VERIFICATION-0.10.0.md @@ -0,0 +1,15 @@ +# Orbit TV 0.10.0 — shortlist and episode metadata + +The Toonami working shortlist now includes 23 terms: the previous five plus Dragon Ball, Sailor Moon, Voltron, ReBoot, Beast Wars, Jonny Quest, Robotech, Ronin Warriors, Gundam Wing, Tenchi Muyo, Outlaw Star, The Big O, Cardcaptors, Zoids, Dragon Ball GT, Naruto, Samurai Jack, Justice League. Some terms intentionally omit punctuation/subtitles to expose provider naming variants; Paul approves actual titles/years. This is his programming direction, not a verified historical broadcast list. + +Searches run in explicit batches of at most five, ten candidates per term, accumulating in the temporary session. Check next five series advances only after a successful batch. Existing matches/approvals survive subsequent batches. Batch failure stops without automatic retry. Cancellation is checked between network requests. Individual requests retain the existing timeouts and response size limit. + +For the sample, approve up to three distinct series. Check sample episodes performs at most three GET /Shows/{id}/Episodes requests, one per selected series, Limit=5 and StartIndex=0 with user ID and header token, images/user data disabled. Results are capped locally even if the provider ignores the limit, IDs/types/returned SeriesId validated, duplicates removed. Returned sample episodes are sorted locally by known season/episode numbers; this does not prove the returned page contains the earliest five episodes. Unknown order/runtime is labelled; runtime must be 1 second to 7 days to be shown as usable metadata. Missing/invalid metadata is not invented. Episode results appear above matches and scroll into view. Changing approval clears previous episode results. + +No new playback eligibility is asserted or tested: these are metadata pages only, no PlaybackInfo or video request, no watch-history updates from the check. Channel 103 is not scheduled yet. Channel 102 and optional advert/ident modules remain future work. The existing working 101 playback integration is unchanged apart from the client version string. + +Validation: cached/offline assembleDebug, testDebugUnitTest and lintDebug passed; 61 unit tests, zero failures/errors. Added tests for later/final search batches, cancellation between searches, bounded episode pages, ordering of returned sample, source identity validation, unknown order/runtime, invalid/oversized approvals and stopping on rate limits. APK signature verified. Reviewed request bounds, session-only state and error handling. No real credentials/catalogue/media/logs accessed by development tools. Provider endpoint compatibility, remote navigation and layout still need the Xiaomi test after installation. No new dependency/device permission, VPS, firewall or service changes. + +Official references checked: +https://dev.emby.media/reference/RestAPI/ItemsService/getItems.html +https://dev.emby.media/reference/RestAPI/TvShowsService/getShowsByIdEpisodes.html diff --git a/VERIFICATION-0.11.0.md b/VERIFICATION-0.11.0.md new file mode 100644 index 0000000..84c125f --- /dev/null +++ b/VERIFICATION-0.11.0.md @@ -0,0 +1,15 @@ +# Orbit TV 0.11.0 — playable channel 103 + +Approved scope: create a repeating clock-based channel from the checked sample of one to three approved series. Flow: sign in → check shortlist → approve versions → check sample episodes → Create playable 103 → Watch channel. Existing channel 101 can also be built in the session; the guide header offers switching between 101 and 103 when both exist. This is a guide switch, not yet channel-up/down remote tuning. Channel 102 and adverts remain future work. + +A session retains the latest checked episode metadata (maximum three series × five episodes). The builder interleaves each show's returned sample in ascending season/episode order, e.g. A1,B1,C1,A2,B2,C2, continuing remaining shows when sample lengths differ. Missing season/episode, specials (season zero), duplicate positions or duplicate IDs reject the build rather than inventing order. Only the returned sample is ordered; earlier library pages/episode gaps are not discovered or repaired. The complete sample repeats, returning to each show's first sampled episode on the next cycle. No persisted viewing progression or complete-library episode rotation is claimed. + +At most 15 PlaybackInfo metadata probes, IsPlayback=false, no live opening/transcoding. Every sampled episode must offer an eligible direct source and valid runtime; an unsupported episode stops the build rather than skipping ahead. Source runtimes and IDs are locked into the timeline. The existing UTC clock, join-in-progress seek, boundary handover, Now/Next, transition check, manual joining Retry and green number overlay are reused; overlay reads 103 for this channel. Decoder compatibility is still a hardware question. + +Playback authorization now additionally accepts canonical episode records from the current checked page or retained built-103 lineup. Arbitrary IDs still fail before any request. These allowlists are bounded (at most 15 checked + 15 built episode records), in memory only, cleared at sign-out. No private catalogue or video was accessed by development tools. Actual watching sends normal Emby playback reports and may update watch history; transition check remains explicitly labelled. + +Validation: offline assembleDebug, testDebugUnitTest and lintDebug passed. 66 tests passed, zero failures/errors. New fictional fixtures cover interleaving uneven series, rejecting unknown/special/duplicate order, 15-item schedule cap and clock boundaries, episode allowlisting, IsPlayback=false probes, source runtime preference/locking, and stopping at an unsupported episode. Source reviewed for boundedness, temporary ownership, guide navigation and API scope. Signature verified. Provider eligibility, 103 playback/rollover and 101↔103 navigation still require the Xiaomi remote test after installation. + +No dependency/device permission, VPS/firewall/service, full importer or persistent credential changes. Previous Emby playback API references remain applicable: +https://dev.emby.media/reference/RestAPI/MediaInfoService/postItemsByIdPlaybackinfo.html +https://dev.emby.media/doc/restapi/Playback-Guidelines.html diff --git a/VERIFICATION-0.12.0.md b/VERIFICATION-0.12.0.md new file mode 100644 index 0000000..f45206b --- /dev/null +++ b/VERIFICATION-0.12.0.md @@ -0,0 +1,11 @@ +# Orbit TV 0.12.0 — compatible source selection and diagnostics + +Report: Create playable 103 failed with the app's unsupported-container message, from selections among the original five search terms. The precise selected shows, source container and availability of alternate sources are not yet known. No real metadata/account/device logs were collected. The real failure cannot yet be attributed to a particular format. + +Inspection found an independent selection defect: prepare chose the first direct source, then rejected its container, ignoring later compatible direct sources. It now filters eligible direct sources by the existing supported-container set before choosing. A previously locked scheduled source is still mandatory and cannot silently change to another version. Container tokens are trimmed and case-normalized; supported set is unchanged (mp4,mkv,mov,m4v,webm,ts,mpegts). No unsupported extractor/decoder capability is invented. + +If no eligible direct source has a supported container, the error includes at most three short sanitized format labels. Arbitrary paths, URLs and long strings become unknown. A failed Toonami builder identifies the series/episode using its already displayed local title and retains HTTP status when wrapping errors. It still stops instead of skipping episodes. No transcoding, remuxing, fallback server process or full importer added. If this provider only offers an unsupported format, this build will explain it rather than necessarily make the episode playable. + +Validation: cached/offline assembleDebug, testDebugUnitTest and lintDebug passed; 68 tests, zero failures/errors. Added regression coverage with a first unsupported AVI candidate followed by supported MKV: MKV is selected; a lock to the AVI source still fails. Tests cover container whitespace/case normalization, unsupported diagnostics and raw-URL/oversized-label rejection. Signature verified. Real provider behavior and specific blocker still require the Xiaomi test after installation. No dependency, device permission, VPS/firewall/service or private-data persistence changes. + +Official format capabilities checked: https://developer.android.com/media/media3/exoplayer/supported-formats . No claim that the fixture AVI value is the user's actual container. diff --git a/VERIFICATION-0.13.0.md b/VERIFICATION-0.13.0.md new file mode 100644 index 0000000..16edc59 --- /dev/null +++ b/VERIFICATION-0.13.0.md @@ -0,0 +1,13 @@ +# Orbit TV 0.13.0 — 3GP and duplicate-entry details + +Report: Powerpuff Girls S1 E2 failed direct container eligibility with 3gp. Batman Beyond has two search entries. We have not read actual private account metadata or media from development tooling, and do not know what distinguishes those two entries. + +The pinned Media3 1.8.0 MP4 Sniffer accepts file brands beginning 3gp. The app's direct-container set now includes 3gp, shared between the advertised Emby DirectPlayProfile and local validation. URLs retain stream.3gp; files are not renamed, transcoded or remuxed. This removes the app-level block; actual codecs, provider delivery, seeking and hardware decoding still require the box test. No claim that every 3GP file is playable. + +Same-title/same-year series records with distinct IDs remain separate and are labelled Entry 1 of N, Entry 2 of N within that search. Different years remain distinct without duplicate labels. No automatic merging or guessed 1080p/4K/remux designation. Episode samples request Fields=MediaStreams and show returned video dimensions, container and video/audio codec names where available; missing fields remain absent. These describe the returned sample episode, not a guarantee that every episode of a series shares its format. The episode section repeats the entry label to aid comparison before choosing a version. No extra per-series network probes are added. + +Validation: offline assembleDebug, testDebugUnitTest and lintDebug passed; 71 tests, zero failures/errors. New tests cover 3GP profile/URL consistency, neutral duplicate labels with distinct IDs and years, returned resolution/container/codecs, and absence of guessed quality when metadata is missing. APK signature verified. Source reviewed for bounded parsing, original-ID preservation, in-memory session handling and no changes to source locks. Provider compatibility, 3GP playback and duplicate comparison layout still need the Xiaomi remote test after installation. No new dependencies/device permissions, VPS/firewall/services or persistent private-data changes. + +Primary evidence: +https://github.com/androidx/media/blob/1.8.0/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Sniffer.java (isCompatibleBrand accepts 3gp prefix) +https://dev.emby.media/reference/RestAPI/ItemsService/getItems.html (Fields=MediaStreams and stream Width/Height/Codec) diff --git a/VERIFICATION-0.14.0.md b/VERIFICATION-0.14.0.md new file mode 100644 index 0000000..6c72025 --- /dev/null +++ b/VERIFICATION-0.14.0.md @@ -0,0 +1,19 @@ +# Orbit TV 0.14.0 — remembered connection and setup + +Scope approved: remember sign-in and saved channel choices, before building out the standard 101 Orbit One / 102 Orbit After Dark / 103 classic-action-animation lineup. Custom user channel presets, recommendation/availability ticks, full indexing/refresh, original multi-channel grid, seasonal rules and adverts remain future increments. Channel 102 is not added here. + +The app now stores an access token, provider-scoped user ID and consistent generated device ID, the existing bounded sample metadata, shortlist results/progress, approved versions, episode pages, built 101/103 lineups/source IDs/runtimes and selected guide channel. Password and username text fields are never persisted. A new sign-in is needed once after installing this first persistence build because earlier versions saved nothing. + +Storage is AES-256/GCM with fresh provider-generated 96-bit IV per write, 128-bit authentication tag, fixed schema-specific AAD and an AndroidKeyStore key. Only ciphertext is written with AtomicFile in app-private noBackupFilesDir; allowBackup=false remains. No plaintext fallback, additional dependency/device permission or external storage. Schema/origin/IDs/counts/text lengths and channel bounds are validated. Saved plaintext is capped at 512 KiB; decrypted state stays in memory. No hardware-backed-key guarantee is made: actual KeyStore support and reopen behavior require the Xiaomi test. + +Writes serialize through a process-wide store, with generation tickets invalidated before Disconnect/new-connection cleanup to prevent an older in-flight save rewriting forgotten state. Disconnect removes the file and key, clears visible choices and attempts normal provider logout. Clear failures produce a Settings/app-data instruction instead of claiming success. Connected UI shows Setup saved on this device after a successful write. Saves are briefly debounced; wait for confirmation before force-stopping or cutting power. + +On a fresh launch the app decrypts the saved record and validates its token with GET /Users/{savedId} using the same saved generated DeviceId. It checks the returned user identity before exposing/restoring private setup. No password authentication, full scan, fresh sample import or schedule rebuild occurs during successful restore. Restoring saved source runtimes/lineup order preserves the existing UTC schedule. Source availability/runtime is still rechecked through normal tuning. Network errors retain the saved record and offer Retry saved connection. 401/403 removes the active saved token and asks for sign-in; matching-account sign-in can restore choices. Different-account sign-in cannot apply prior choices. Corrupt ciphertext/unavailable key fails closed, never reads it as plaintext, and requests sign-in. + +Home/background stops playback and sends a normal stop report while retaining login/setup. The player progress loop checks foreground state. Owner disposal detaches local session state without revoking the saved provider token. This is remembered-token login, not a promise that provider tokens never expire. A token expiring during a live session still produces the existing sign-in-again error; return to Connect Emby to authenticate. Refreshing catalogue changes is not added in this increment. + +Validation: final cached/offline assembleDebug, testDebugUnitTest and lintDebug passed; 79 tests, zero failures/errors. New fake-fixture tests cover encryption round trip and preserved timeline, distinct nonces, tampering/wrong keys, schema/origin/identity/approval bounds, oversized records, token removal with retained choices, validation-only resume with restored episode allowlisting, expired login with no password/logout request, cross-account rejection and stop-without-logout detach. Signature verified. Reviewed at-rest handling, fixed-origin/user binding, generation/forget races, background playback and request limits. No actual credentials/private catalogue/video or device app data/logs were read by tools. Platform Keystore/AtomicFile operations and TV lifecycle/UI are not instrumented tests; actual restoration, Disconnect and process-restart need the hardware test after installation. No VPS/firewall/service changes. + +Primary references: +https://developer.android.com/privacy-and-security/keystore +https://dev.emby.media/reference/RestAPI/UserService/getUsersById.html diff --git a/VERIFICATION-0.15.0.md b/VERIFICATION-0.15.0.md new file mode 100644 index 0000000..cdb94dc --- /dev/null +++ b/VERIFICATION-0.15.0.md @@ -0,0 +1,15 @@ +# Orbit TV 0.15.0 — Orbit After Dark 102 + +Approved scope: a small explicit film-selection flow and playable channel 102 using the existing engine, with the approved silver/magenta branding and lit-window background. The user's later motion request is delivered as a separate optional-ident proof, not injected into playback. + +Flow: restored connection (or sign in) → Menu → Connect Emby → 102 Orbit After Dark — choose films → Check Horror / Check Thriller / Check Science Fiction → select two or three films → Create / rebuild 102 → Watch channel. One GET /Items request per explicit category action, Movie only, Genres filter, StartIndex=0, Limit=20, Fields=Genres,MediaStreams, images/userdata disabled. At most 20 returned records parsed; requires returned genre evidence, valid Movie IDs, bounded strings/genre lists. Genre labels differing from configured names may return no confirmed matches. No returned matches is not proof the whole library lacks suitable films. Candidate accumulation deduplicates IDs and caps at 60. Initial selection is empty; no automatically approved replacements. This is a sample, not a full importer or refresh engine. Horror/Thriller/Science Fiction are initial candidate pools for broader late-night/cult programming; no explicit-content or age-control feature is claimed. + +Two or three approved film IDs must belong to the checked cache. Each gets PlaybackInfo with IsPlayback=false, no live opening/transcoding. Every selected film needs an eligible direct container/source/runtime; errors identify the film and stop the build without publishing a partial replacement. Source IDs and real runtimes are locked. Existing UTC join/rollover, Now/Next, transition check, Retry and green tuning number are reused. Existing 102 lineup remains until a new build succeeds. Normal watching reports to Emby as before. + +Saved state adds optional afterDark/darkMovies/approvedDark fields under the existing encrypted schema/key/AAD. Missing fields default empty for 0.14 records. Selected channel has a new optional selectedChannel field; legacy selected stays 101 when new selection is 102, preserving readable legacy navigation fields. Tests prove loading pre-102 records and preserving 101/103/102 timelines after a round trip. All three built channels appear as guide switch choices. Login/token lifecycle unchanged. Downgrading to older APKs can drop unrecognised 102 fields on a subsequent save; downgrade is not a 102-preserving rollback strategy. + +Approved static compact logo and lit-window WebP background are compiled resources. A small ChannelBrands registry maps the existing 102 number to the orbit-after-dark asset identity. After Dark review and guide use the background and logo; network navy/yellow focus remains. Other channels retain their existing presentation. No persistent bottom-left bug, ident playback or new settings are added; those remain optional integration increments. Original multi-channel time grid remains a future step. + +Validation: final offline assembleDebug, testDebugUnitTest and lintDebug passed; 87 unit tests, zero failures/errors. Eight new tests cover genre query/token scope, returned genre evidence, ID/type rejection, server ignoring limits, cache caps/deduplication, explicit approval bounds, metadata-only source probes/runtime/source locking, rate-limit stop, legacy records and all three saved timelines/guide ordering. APK signature verified. No private account/catalogue/media, device app data or logs accessed by tools. Provider genre behavior, remote layout/focus, 102 playback/rollover and persistent three-channel navigation require the Xiaomi test after installation. No dependencies, device permissions, VPS/firewall/services or full-library queries added. + +Motion proof 03: 4.2-second/720p/25fps silent H.264. Twelve separately animated windows, editable vector Trim Paths trail, then logo reveal. Fully decoded and inspected via contact sheet and final native frame; collected EffectCraft project includes relative footage and source assets. It is not an APK asset and cannot delay channel playback. diff --git a/VERIFICATION-0.2.0.md b/VERIFICATION-0.2.0.md new file mode 100644 index 0000000..8a9e03a --- /dev/null +++ b/VERIFICATION-0.2.0.md @@ -0,0 +1,33 @@ +# Orbit TV 0.2.0 — review notes + +## Changes + +Top navigation: 1 Menu / 2 TV Guide / 3 Box Office. Menu includes Services. +OrbOffice has an original perforated admission-ticket design and two selectable fictional events. +Barlow and Barlow Condensed are bundled for new sections; OFL notices are included in the APK and source. +Proper logo work is deferred. Paul wants it centred with safe padding in the TV's app tile. + +## Validation + +- Final Android debug build, unit tests and lint: passed. +- Four Kotlin scheduler tests: passed; five backend scheduler tests: passed. +- Android lint: zero errors, nine warnings (seven available-version notices, orientation and backup advisories). +- APK signature verified and signing certificate matches the installed 0.1.0 build. +- Fullscreen video and bottom programme-bar source compared with the original source ZIP: unchanged. +- Fonts inspected with fc-scan; FigCraft font report confirms Barlow and Barlow Condensed available with the project-local font loader. +- Design previews regenerated and visually inspected. VectorCraft conversion reported no warnings. +- New code reviewed for focus return, navigation/back paths, local asset loading and playback preservation. + +## Hardware evidence and limits + +Paul confirmed 0.1.0 loads on his Xiaomi TV Box S 3rd Gen: remote navigation, channel selection, +fullscreen playback and the bottom programme bar work. The 0.2.0 APK has not been installed on the box yet. +Preview PNGs are design mockups, not captures of 0.2.0 running on the TV. +No Emby integration or event playback is implemented. Tickets represent fictional events. +No device, VPS, service or firewall changes were made in this increment. + +## Next TV check + +After approval, update the existing app with the 0.2.0 APK. Check all three tabs, Menu → Services, +Back navigation, switching event ticket previews, and returning to the guide. Recheck fullscreen playback. +Use design/open-design.sh to open editable FigCraft files with the included fonts available. diff --git a/VERIFICATION-0.3.0.md b/VERIFICATION-0.3.0.md new file mode 100644 index 0000000..716cd12 --- /dev/null +++ b/VERIFICATION-0.3.0.md @@ -0,0 +1,42 @@ +# Orbit TV 0.3.0 — Connect Emby + +## Reviewable result + +Menu → Connect Emby. On-TV username and always-hidden password fields, explicit provider address, +and Check 20 items. One sign-in, one metadata page, then temporary-session logout. +Sample contains titles, types, runtimes and any returned container/codec details. +No full import or Emby video playback. The existing demo guide and fullscreen bar remain. + +## Validation + +- Debug APK build, all 19 Android unit tests and Android lint passed. +- 15 Emby protocol/boundary tests and four scheduler tests; no failures or skipped tests. +- Tests use scripted fake replies and fake credentials. No live provider login was attempted. +- Intentional removal of the 20-item cap failed its regression test; source was restored, + then the complete build/tests/lint passed again. +- Tested: one-page limit even if ignored by server; password preservation; scoped token/header use; + incorrect credentials; denial of library access; malformed JSON/identity/token; rate limit and redirect + responses; logout after errors; failed logout; response-size bound; UTF-8; bounded provider text. +- APK signature verified; certificate matches the installed 0.2.0 build. +- Fullscreen playback/programme-bar source matches the TV-tested previous revision. +- Security review: fixed HTTPS origin, default certificate checks, no redirects, bounded reads and + I/O timeouts, no retries, no persistent credentials/tokens/sample, no request/response logging, + secure password field, FLAG_SECURE while connection screen is displayed, lifecycle clearing. +- Lint: zero errors; ten warnings (eight version-update notices and two existing platform advisories). +- The org.json dependency is test-only; the app uses Android's JSONObject implementation. + +## Limits and next check + +The new APK has not been installed on the box. Remote keyboard entry and real account permissions +must be tested by Paul on the Xiaomi. No password, token or authenticated library data was received +by development tools. Do not send credentials or screenshots of library results back into chat. +Only the provider's public identification endpoint was previously checked, returning version 4.9.1.23. + +After approval to install: Menu → Connect Emby → enter credentials on TV → Check 20 items. +Report only success/count, or the fixed error message. Demo channels do not change. +This version intentionally requires signing in again for another check; persistent connection and +large-library indexing are separate increments. A later initial-setup flow and named/icon profiles, +Kids restrictions and a four-digit adult PIN are recorded in the roadmap, not implemented here. + +No device update, VPS, service or firewall changes were made during this build increment. +See docs/emby-connection-check.md for the request contract and retention details. diff --git a/VERIFICATION-0.4.0.md b/VERIFICATION-0.4.0.md new file mode 100644 index 0000000..2ddc434 --- /dev/null +++ b/VERIFICATION-0.4.0.md @@ -0,0 +1,64 @@ +# Orbit TV 0.4.0 — small-sample playback test + +Prepared 1 November 2026, Europe/London. + +## Result + +The current 20-item sample becomes selectable for on-demand fullscreen playback. The temporary +login stays in memory during testing and attempts logout when leaving/backgrounding the screen. +The player provides pause/resume, ten-second seeks, audio settings and available subtitle tracks. +No full-library import, scheduled real channels, stored login or automatic video transcoding is added. +The established demo guide and its fullscreen programme bar remain independent and unchanged. + +## Evidence + +- Android debug build and lint: passed, zero lint errors. +- 31 Android unit tests: 15 authentication/metadata, 12 playback/session/media-address, four scheduler. +- Coverage includes sample membership, direct-source negotiation, refusal of transcoding/live-opening + sources, source-ID validation, origin-scoped tokens, API-key removal from provider media URLs, + HTTPS/URL validation, subtitle URL validation, byte-range start validation, local-address rejection, + normal playback reporting, logout, stale-report positions and invalidation of late login results. +- An intentional change forwarding credentials to every media host failed its regression test. + The safe implementation was restored and all checks rerun successfully. +- Existing Emby metadata tests remain fake-transport checks; new playback tests also use only + fake tokens and URLs. No authenticated provider/media access was performed by development tools. +- Media3's custom data-source/controller APIs have explicit UnstableApi opt-ins. +- The background lifecycle handler stops the player directly before asynchronous session cleanup. +- Source review checked main-thread player access, preserving sample list/focus during loading, + safe error messages, redirect/header handling, request bounds and cleanup ownership. +- The APK signing certificate matches the installed previous version, allowing a normal update. +- Lint warnings are dependency-update/platform advisories and two optional KTX suggestions. + +## Hardware limits + +Paul confirmed 0.3.0 received 20 records from his provider on the Xiaomi TV Box S 3rd Gen. +Real video, audio, remote controller navigation, seeking and subtitles in 0.4.0 remain unverified +until the approved APK is installed and Paul selects a sample title on the TV. +Direct-stream container support does not guarantee every codec/profile decodes on this box. +External subtitle support is initially SRT/WebVTT only when the provider supplies a delivery URL. +No HLS/transcoding fallback, live-source opening or special CDN request headers are implemented. +HTTPS redirects are supported without forwarding the Emby token to another origin. DNS results +are checked for private addresses, but Java's second DNS resolution is not pinned against rebinding. +Playback reports may update normal provider watch history, as regular viewing does. + +## Logo direction + +An original OrbOffice drive-in ticket concept is supplied as SVG, FigCraft and VectorCraft artwork, +with a PNG proof. It uses a ringed cinema-screen emblem, gold/charcoal, original one-word lettering +and a detachable stub. It is separate from the installed application's interface. +The supplied historic logo was a reference, not traced or redistributed with this project. +OrbOffice name availability and trade-mark clearance have not been established. + +## Linked skill + +The exact MCP Market page could not be read. An official Android CLI Specialist reference was +found and assessed. It is relevant to SDK/device diagnostics and repeatable UI journey testing. +The android CLI is absent from PATH. No new skill/CLI was installed; existing Gradle/ADB remains in use. +https://developer.android.com/agents/skills/devtools/android-cli/skill + +## Next step + +Ask Paul before updating the TV box. After installation: Menu → Connect Emby → sign in on TV → +Check 20 items → select a title. Check picture/sound, pause/resume, forward/backward seeking, +audio/subtitles when available, Back to the same sample, then a second title. +Report only pass/fail and fixed error messages; do not collect credentials or media URLs. diff --git a/VERIFICATION-0.5.0.md b/VERIFICATION-0.5.0.md new file mode 100644 index 0000000..a10f076 --- /dev/null +++ b/VERIFICATION-0.5.0.md @@ -0,0 +1,40 @@ +# Orbit TV 0.5.0 — classic bottom programme strip + +## Changes + +Paul confirmed 0.4.0 played provider media on the Xiaomi. He requested a classic bottom +programme strip, removal of the persistent top banner, an icon legend without coloured +remote-key boxes, and removal of the CRT logo's white outline. + +The sample player now shows a pale channel/time header, blue NOW/PAUSED and INFO rows, +and a plain Channel ▲▼ / back-to-guide icon / CC legend. It is positioned at the bottom, +hides after five seconds of active playback and is revealed by OK. Paused/buffering states +keep it visible. The old permanent top banner and stock controller are removed. + +The legend is visual only in this pass, as Paul requested. It does not switch channels, +open the guide or change subtitles. Physical Back still returns to the sample. OK toggles +play/pause when the strip is already visible; left/right seek ten seconds. The standard +subtitle/audio selector from 0.4.0 is not shown in this visual revision. + +The separate logo artwork retains the dark CRT, curved gold screen and white Office +lettering but removes the cream/white outer cabinet border and pale feet. + +## Validation + +Final debug APK build, 31 existing Android tests and lint passed. Zero lint errors. +APK signature verified and certificate matches the installed previous revision. +Code review covered remote-key event handling, five-second timeout reset, playback-state +visibility and retaining the existing error/background/session-cleanup paths. +FigCraft OSD mockup and logo renders were visually inspected; VectorCraft conversion +reported no warnings. No redundant implementation-mirroring tests were added for this UI pass. + +## Limits and TV check + +The new layout and timer need a hardware check after approval to install 0.5.0. +The preview PNG is a design mockup using an original abstract background, not a capture +of provider video. No credentials, library titles, media URLs or provider images were read +by development tools. No real provider login was performed during this increment. +Check: select a sample title, wait five seconds, press OK to reveal the strip, pause/resume, +try left/right seeking and Back to sample. Confirm readability and absence of the old top banner. +The existing fictional guide remains unchanged. No full import or new channel engine is added. +No TV installation, VPS, firewall or service change was performed during this build increment. diff --git a/VERIFICATION-0.6.0.md b/VERIFICATION-0.6.0.md new file mode 100644 index 0000000..afad84e --- /dev/null +++ b/VERIFICATION-0.6.0.md @@ -0,0 +1,62 @@ +# Orbit TV 0.6.0 — one real scheduled sample channel + +Prepared 1 November 2026, Europe/London. + +## Result + +Menu → Connect Emby → Check 20 items → Create sample channel. +Builds 101 Orbit One from up to three distinct direct-stream-eligible titles, after at most +five media-source metadata probes within the existing 20-item sample. At least two are required. +The new sample guide displays real Now/Next and upcoming start/end times. Watch channel joins +the current programme in progress and automatically follows subsequent wall-clock slots. +Back returns to that guide. The main three-channel fictional guide remains separate. + +Actual source runtimes retain millisecond precision, and the selected source ID is locked for +tuning. The repeating UTC timeline is independent of launching or watching the app. The same +lineup and durations recreate the same schedule; no channel, token or password is persisted. +Scheduled mode follows the clock, with pause/seeking reserved for the existing on-demand mode. +The previously accepted auto-hiding programme strip is preserved and gains genuine Now/Next. + +Check transition temporarily joins near a boundary, using real durations and the same rollover +path. It is labelled Transition check and returns to the ordinary clock when closed. The guide +notes that joining near the end can affect normal provider viewing history. + +## Validation + +- Final Android debug build, all 47 unit tests and lint passed; zero lint errors. +- 16 auth/metadata tests, 15 playback/source tests, 12 channel/timeline tests, four demo-schedule tests. +- Tested precise source/catalogue runtimes, exact boundaries, lineup repetition, UTC continuity + across midnight/DST dates, negative epochs, deterministic recreation, immutable snapshots, + duration/count validation, transition checking, a three-title/five-probe limit, early stop on + expired login/rate limit, selected-source locking and null playback identity handling. +- An intentionally incorrect inclusive end boundary failed its regression test. The correct + strict boundary was restored, then the complete build/tests/lint passed again. +- Review checked wall-clock effect keys, old-plan suppression at rollover, cancellation, + serialization of slow metadata preparation, post-buffer join adjustment, real guide focus, + source-runtime drift handling, Back navigation and the existing background/session cleanup. +- The debug signing certificate matches installed 0.5.0, allowing a standard update. +- No new runtime dependency, device permission, server administration or full scan was added. + +## Evidence limits + +Paul confirmed 0.4.0 played provider media and 0.5.0's programme strip hides correctly. +Real 0.6.0 channel tuning and automatic rollover remain unverified until TV installation. +All new tests use fictional items, fake credentials and scripted API responses; development +tools did not sign in, read private library metadata, retrieve video or capture provider images. +Metadata eligibility is not a guarantee every codec/profile decodes on the Xiaomi. +Buffering can occur between titles; this is not a gapless server broadcast. Current access is +session-scoped. A changed provider sample/runtime can change the rebuilt lineup. +A source runtime change beyond two seconds triggers a rebuild message instead of timeline drift. +The detailed request/lifecycle limits remain in docs/sample-scheduled-channel.md. + +## TV acceptance check after approval + +1. Sign in on the TV and load the existing sample. +2. Create sample channel, then Watch channel; check join-in-progress and the true Next title/time. +3. Back should return to the real sample guide without another login. +4. Check transition should join near an end and automatically move to the next programme. +5. Close the test and confirm the guide returns to the ordinary wall clock. +6. Back to sample should retain on-demand playback; leaving the connection flow ends the session. + +Report pass/fail and any fixed error text only. Keep credentials, private titles and URLs on the TV. +No device update was performed during this build increment; ask Paul before installation. diff --git a/VERIFICATION-0.7.0.md b/VERIFICATION-0.7.0.md new file mode 100644 index 0000000..b67c51d --- /dev/null +++ b/VERIFICATION-0.7.0.md @@ -0,0 +1,9 @@ +# Orbit TV 0.7.0 — main guide integration + +Orbit One now appears under the main 2 TV Guide tab after Menu → Connect Emby → Check 20 items → Create sample channel. The connected single-channel guide replaces the fictional demo guide for that temporary session. Watch channel joins in progress; Back returns to this main guide. Menu and Box Office remain accessible without signing in again. + +The connection component remains composed across main navigation. A Disconnect button clears the temporary connection and channel. Backgrounding the app or disposing its owner still cancels pending work, clears credentials and attempts logout. Password and username fields clear when leaving connection setup; unfinished operations are cancelled. Returning to the guide does not automatically restart a previously closed channel player. + +Private connection and connected catalogue screens retain screenshot protection. Credentials, tokens and catalogue stay in memory. No persistence, dependency changes, full-library imports, VPS, firewall or service changes. Green 101 in the top-right is recorded as the direction for a later tuning animation; it is not included in this increment. + +Validation: final offline Gradle assembleDebug, testDebugUnitTest and lintDebug passed. All 47 unit tests passed (16 client, 15 playback, 12 scheduled-channel, 4 demo schedule). APK signature verification passed. Navigation/session lifecycle changes were reviewed in source; there is no on-device UI automation or new UI-test coverage. Hardware navigation, background sign-out and playback return need Paul's remote test after installation. No private account/media was accessed by development tools. diff --git a/VERIFICATION-0.8.0.md b/VERIFICATION-0.8.0.md new file mode 100644 index 0000000..989914d --- /dev/null +++ b/VERIFICATION-0.8.0.md @@ -0,0 +1,7 @@ +# Orbit TV 0.8.0 — Retry and classic tuning number + +The scheduled channel joining-error screen now offers Retry, focused for the remote. Each click runs a fresh preparation against the current wall-clock programme using the same temporary session and locked media source. The existing mutex serializes preparation. Retry is manual, disappears while preparation runs and does not reauthenticate or create an automatic retry loop. Back still returns to the main TV Guide. This does not establish or fix the cause of the previously reported intermittent provider connection failure. + +A green monospace channel number appears at the top-right during preparation and for two seconds after player readiness. Current channel is 101. No artificial loading delay, new dependency or EffectCraft asset is needed for this native text overlay. No separate retry is added to full-screen decoder/media errors in this increment. + +Validation: offline assembleDebug, testDebugUnitTest and lintDebug passed. All 48 unit tests passed (16 client, 16 playback, 12 channel, 4 demo schedule). Added a fake-transport check that one failed preparation can be explicitly retried using the same login and source without reauthentication; this is protocol coverage, not automated UI coverage. APK signature verification passed. Green number positioning/timing and Retry focus/click still require the Xiaomi remote test. No private account, catalogue, video or device logs were read. No VPS/firewall/services/dependency changes. APK not installed as part of preparation. diff --git a/VERIFICATION-0.9.0.md b/VERIFICATION-0.9.0.md new file mode 100644 index 0000000..5bba40d --- /dev/null +++ b/VERIFICATION-0.9.0.md @@ -0,0 +1,11 @@ +# Orbit TV 0.9.0 — channel 103 series check + +Approved direction: 101 Orbit One (mixed entertainment), 102 Orbit After Dark (horror/thriller/cult), 103 Toonami (working name, classic action animation). Only 101 has scheduled playback today. This increment adds candidate discovery and temporary approval for 103, not a playable 103 or 102. + +After sign-in, Menu → Connect Emby → 103 Toonami — check five series. Uses the existing temporary session to make five serial authenticated GET /Items queries with UserId, Recursive, IncludeItemTypes=Series, SearchTerm, StartIndex=0, Limit=10, images/userdata disabled. Terms: Dragon Ball Z, Batman Beyond, Superman, Powerpuff Girls, ThunderCats. At most ten records processed per response even if the provider ignores the limit. Valid series IDs only; titles/rating bounded, year validated, IDs deduplicated within each search. Authentication/rate-limit/network failures stop the check. No automatic retry, no episode queries, no playback, no account edits. Returned names are possible matches, never automatically accepted; lack of search results is not proof of absence from the entire library. + +The review lists titles, returned years and ratings for choosing versions. Approve toggles an in-memory set of series IDs. Navigation retains it during this session; disconnect/background clears it. It is not persisted or scheduled. Episode availability, ordering, duration and playback eligibility are future checks. Existing 101, classic green tuning number and manual joining Retry remain. + +Validation: offline assembleDebug, testDebugUnitTest, lintDebug successful; 53 tests passed with zero failures/errors. Five new fake-transport tests cover the five-query bound, encoding/header credentials, provider ignoring limits, invalid/non-series/duplicate results, empty results, and immediate stop on 401/429. Signature verification passed. Source reviewed for scope, request bounds and secret handling. No real account/catalogue/media accessed by development tools. Actual provider series-search compatibility and remote focus/layout require Paul's Xiaomi test after installation. No new dependency, device permission, VPS/firewall/service or persisted private data. + +Official API reference checked: https://dev.emby.media/reference/RestAPI/ItemsService/getItems.html (SearchTerm, IncludeItemTypes, Limit, UserId, EnableImages, EnableUserData). diff --git a/VERIFICATION.md b/VERIFICATION.md new file mode 100644 index 0000000..256d417 --- /dev/null +++ b/VERIFICATION.md @@ -0,0 +1,38 @@ +# Orbit TV prototype verification — 31 October 2026 + +Project: /home/pauljd/Documents/Codex/orbit-tv +Target for manual testing: Xiaomi TV Box S 3rd Gen (not connected). + +- Final Android debug APK build: passed. +- Android schedule tests: 4 passed, 0 failed, 0 skipped. +- TypeScript compilation and scheduler tests: 5 passed, 0 failed. +- HTTP smoke test: health and guide 200; invalid count 400; missing route 404; POST 405. Temporary process stopped. +- Boundary mutation: intentionally rounding slots up made the backend tests fail; original logic restored and tests passed. +- APK signing verified with apksigner (debug certificate, APK signature v2). +- Media probe: original silent local test signal, 1800 seconds. +- FigCraft mockup: rendered and visually inspected; editable native file has 63 nodes. +- VectorCraft wordmark conversion: no import/export warnings. +- Final code review: corrected stale programme detail on half-hour rollover, paused playback outside guide, + added playback error/retry handling and actual player elapsed-time overlay, moved banner to drawable-nodpi. + +## Limits + +APK has not been launched on hardware or an emulator. Remote focus, playback decoder behaviour, +preview/fullscreen switching and resume timing require Xiaomi acceptance testing in README.md. +The design PNG is a mockup, not a screenshot of the running Android app. +No Emby performance or compatibility claim has been tested. No VPS or media library was accessed. +No project commit, deployment, TV pairing, firewall change or persistent service was created. + +## Android lint + +No errors. Remaining warnings: + +- AndroidGradlePluginVersion: A newer version of Gradle than 9.3.1 is available: 9.8.2 +- GradleDependency: A newer version of androidx.compose:compose-bom than 2025.08.01 is available: 2026.09.00 +- GradleDependency: A newer version of androidx.activity:activity-compose than 1.10.1 is available: 1.13.0 +- GradleDependency: A newer version of androidx.lifecycle:lifecycle-runtime-compose than 2.9.2 is available: 2.11.0 +- GradleDependency: A newer version of androidx.tv:tv-material than 1.0.0 is available: 1.1.0 +- GradleDependency: A newer version of androidx.media3:media3-exoplayer than 1.8.0 is available: 1.11.1 +- GradleDependency: A newer version of androidx.media3:media3-ui than 1.8.0 is available: 1.11.1 +- DiscouragedApi: Fixed screen orientations will be ignored in most cases, starting from Android 16. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. +- DataExtractionRules: The attribute `android:allowBackup` is deprecated from Android 12 and higher and may be removed in future versions. Consider adding the attribute `android:dataExtractionRules` specifying an `@xml` resource which configures cloud backups and device transfers on Android 12 and higher. diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..fdc1a20 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,30 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.plugin.compose") +} +android { + namespace = "tv.orbit.classic" + compileSdk = 36 + defaultConfig { + applicationId = "tv.orbit.classic" + minSdk = 26 + targetSdk = 36 + versionCode = 16 + versionName = "0.16.0-tuning-screen" + } + buildFeatures { compose = true } + compileOptions { sourceCompatibility = JavaVersion.VERSION_17; targetCompatibility = JavaVersion.VERSION_17 } +} +dependencies { + implementation(platform("androidx.compose:compose-bom:2025.08.01")) + implementation("androidx.activity:activity-compose:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-compose:2.9.2") + implementation("androidx.compose.foundation:foundation") + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.tv:tv-material:1.0.0") + implementation("androidx.media3:media3-exoplayer:1.8.0") + implementation("androidx.media3:media3-ui:1.8.0") + testImplementation("junit:junit:4.13.2") + testImplementation("org.json:json:20250107") +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..581f284 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android/app/src/main/assets/font-licenses/barlow-OFL.txt b/android/app/src/main/assets/font-licenses/barlow-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/android/app/src/main/assets/font-licenses/barlow-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/android/app/src/main/assets/font-licenses/barlow-condensed-OFL.txt b/android/app/src/main/assets/font-licenses/barlow-condensed-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/android/app/src/main/assets/font-licenses/barlow-condensed-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/android/app/src/main/assets/orbit-demo.mp4 b/android/app/src/main/assets/orbit-demo.mp4 new file mode 100644 index 0000000..1eaead7 Binary files /dev/null and b/android/app/src/main/assets/orbit-demo.mp4 differ diff --git a/android/app/src/main/java/tv/orbit/classic/AfterDarkMovies.kt b/android/app/src/main/java/tv/orbit/classic/AfterDarkMovies.kt new file mode 100644 index 0000000..f266245 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/AfterDarkMovies.kt @@ -0,0 +1,39 @@ +package tv.orbit.classic + +import java.net.URLEncoder + +internal val AfterDarkGenres = listOf("Horror", "Thriller", "Science Fiction") +internal data class AfterDarkMovie(val item: SampleItem, val year: Int?, val rating: String, val genres: List) + +/** One explicit genre query, at most twenty films. Genre evidence must be returned. */ +internal fun discoverAfterDarkMovies(transport: EmbyTransport, userId: String, token: () -> String, + genre: String): List { + require(EmbyClient.validId(userId) && genre in AfterDarkGenres) + val filter = URLEncoder.encode(genre, "UTF-8") + val reply = transport.execute(EmbyRequest("GET", "/Items?UserId=$userId&Recursive=true&IncludeItemTypes=Movie&Genres=$filter&StartIndex=0&Limit=20&SortBy=SortName&SortOrder=Ascending&Fields=Genres,MediaStreams&EnableImages=false&EnableUserData=false", token = token())) + EmbyClient.expectSuccess(reply.status, false) + val rows = EmbyClient.parse(reply.body).optJSONArray("Items") ?: throw EmbyCheckException("The provider did not return a film sample.") + return (0 until minOf(rows.length(), 20)).mapNotNull { index -> + val row = rows.optJSONObject(index) ?: return@mapNotNull null + val id = row.optString("Id") + if (!EmbyClient.validId(id) || row.optString("Type") != "Movie") return@mapNotNull null + val tags = row.optJSONArray("Genres") + val genres = (0 until minOf(tags?.length() ?: 0, 8)).mapNotNull { i -> + (tags?.opt(i) as? String)?.let { EmbyClient.clean(it, 40) }?.takeIf { it.isNotBlank() } + }.distinct() + if (genres.none { it.equals(genre, ignoreCase = true) }) return@mapNotNull null + val title = EmbyClient.clean(row.optString("Name"), 160).takeIf { it.isNotBlank() } ?: return@mapNotNull null + val duration = (row.optLong("RunTimeTicks", 0) / 10_000).takeIf { it in 1_000..SampleChannel.MAX_DURATION_MS } + AfterDarkMovie(SampleItem(title, "Movie", duration?.div(60_000), episodeMediaLabel(row).take(160), id, duration), + row.optInt("ProductionYear").takeIf { it in 1800..2200 }, EmbyClient.clean(row.optString("OfficialRating"), 40), genres) + }.distinctBy { it.item.id } +} + +internal fun mergeAfterDarkMovies(current: List, incoming: List): List = + (current + incoming).distinctBy { it.item.id }.take(60) + +internal fun approvedAfterDarkItems(candidates: List, ids: Set): List { + if (ids.size !in 2..3 || !candidates.map { it.item.id }.containsAll(ids)) + throw EmbyCheckException("Approve two or three films from the checked After Dark sample first.") + return candidates.filter { it.item.id in ids }.distinctBy { it.item.id }.map { it.item } +} diff --git a/android/app/src/main/java/tv/orbit/classic/AfterDarkReviewScreen.kt b/android/app/src/main/java/tv/orbit/classic/AfterDarkReviewScreen.kt new file mode 100644 index 0000000..e20f4d6 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/AfterDarkReviewScreen.kt @@ -0,0 +1,54 @@ +package tv.orbit.classic + +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.tv.material3.Text + +@Composable +internal fun AfterDarkReviewScreen(movies: List, approved: Set, busy: Boolean, + message: String?, modifier: Modifier, onGenre: (String) -> Unit, onToggle: (String) -> Unit, + onBuild: () -> Unit, onBack: () -> Unit) { + BackHandler(onBack = onBack) + Box(modifier.fillMaxWidth().background(Navy)) { + Image(painterResource(R.drawable.orbit_after_dark_background), null, Modifier.matchParentSize(), contentScale = ContentScale.Crop, alpha = .45f) + Column(Modifier.fillMaxSize().padding(18.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) { + Image(painterResource(R.drawable.orbit_after_dark_epg), "102 Orbit After Dark", Modifier.width(230.dp).height(65.dp)) + Text("Late-night and cult cinema. Check a category, then choose two or three films.", color = Color.White, fontSize = 17.sp) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + AfterDarkGenres.forEach { genre -> OrbitButton("Check $genre", enabled = !busy, onClick = { onGenre(genre) }) } + } + if (busy) Text("Checking your film sample…", color = Yellow, fontSize = 15.sp) + message?.let { Text(it, color = Yellow, fontSize = 15.sp, maxLines = 3) } + if (movies.isEmpty() && !busy) Text("No checked films yet. Each category checks up to 20 records; this is a small sample of your library.", color = Muted, fontSize = 16.sp) + LazyColumn(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(8.dp)) { + items(movies, key = { it.item.id }) { movie -> + Column(Modifier.fillMaxWidth().background(Panel.copy(alpha = .94f)).padding(10.dp)) { + Text(movie.item.title + (movie.year?.let { " ($it)" } ?: ""), color = Color.White, fontSize = 20.sp, maxLines = 2) + val details = listOfNotNull(movie.rating.takeIf { it.isNotBlank() }, movie.item.minutes?.let { "$it min" }, movie.item.format.takeIf { it.isNotBlank() }) + if (details.isNotEmpty()) Text(details.joinToString(" • "), color = Muted, fontSize = 14.sp) + Text("Categories: ${movie.genres.joinToString(", ")}", color = Muted, fontSize = 14.sp, maxLines = 2) + OrbitButton(if (movie.item.id in approved) "✓ Remove from selection" else "+ Add to channel", + selected = movie.item.id in approved, enabled = !busy && (movie.item.id in approved || approved.size < 3), + onClick = { onToggle(movie.item.id) }) + } + } + } + Text("${approved.size}/3 selected • Existing schedules change only when you create or rebuild this channel.", color = Muted, fontSize = 13.sp) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OrbitButton("Create / rebuild 102", enabled = !busy && approved.size in 2..3, onClick = onBuild) + OrbitButton("Back", onClick = onBack) + } + } + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/ChannelBranding.kt b/android/app/src/main/java/tv/orbit/classic/ChannelBranding.kt new file mode 100644 index 0000000..d2c84df --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/ChannelBranding.kt @@ -0,0 +1,11 @@ +package tv.orbit.classic + +internal data class ChannelBranding(val presetId: String, val logo: Int, val background: Int) + +internal object ChannelBrands { + private val brands = mapOf(102 to ChannelBranding("orbit-after-dark", R.drawable.orbit_after_dark_epg, R.drawable.orbit_after_dark_background)) + fun forNumber(number: Int): ChannelBranding? = brands[number] +} + +internal fun availableSampleChannels(vararg channels: SampleChannel?): List = + channels.filterNotNull().distinctBy { it.number }.sortedBy { it.number } diff --git a/android/app/src/main/java/tv/orbit/classic/ChannelTuningBackdrop.kt b/android/app/src/main/java/tv/orbit/classic/ChannelTuningBackdrop.kt new file mode 100644 index 0000000..984e89e --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/ChannelTuningBackdrop.kt @@ -0,0 +1,31 @@ +package tv.orbit.classic + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.tv.material3.Text + +/** Presentation only: no timers, media requests or schedule changes. */ +@Composable +internal fun ChannelTuningBackdrop(number: Int, modifier: Modifier = Modifier) { + val branding = ChannelBrands.forNumber(number) + Box(modifier.fillMaxSize().background(Navy)) { + if (branding != null) { + Image(painterResource(branding.background), null, Modifier.matchParentSize(), contentScale = ContentScale.Crop) + Image(painterResource(branding.logo), null, + Modifier.align(Alignment.TopStart).padding(start = 40.dp, top = 32.dp).width(200.dp).height(62.dp)) + } + ClassicTuningNumber(number, Modifier.align(Alignment.TopEnd).padding(top = 32.dp, end = 44.dp)) + Column(Modifier.align(Alignment.BottomStart).padding(start = 40.dp, bottom = 36.dp), verticalArrangement = Arrangement.spacedBy(6.dp)) { + Text("Tuning…", color = Muted, fontSize = 17.sp) + Text("Back for TV guide", color = Muted, fontSize = 13.sp) + } + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/ClassicProgrammeStrip.kt b/android/app/src/main/java/tv/orbit/classic/ClassicProgrammeStrip.kt new file mode 100644 index 0000000..44c8f0d --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/ClassicProgrammeStrip.kt @@ -0,0 +1,58 @@ +package tv.orbit.classic + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.tv.material3.Text +import kotlinx.coroutines.delay +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +/** First visual pass: the icon row previews the future scheduled-channel controls. */ +@Composable +internal fun ClassicProgrammeStrip(item: SampleItem, playing: Boolean, modifier: Modifier = Modifier, scheduled: ScheduledPlayback? = null) { + var now by remember { mutableLongStateOf(System.currentTimeMillis()) } + LaunchedEffect(Unit) { while (true) { delay(1000); now = System.currentTimeMillis() } } + val paper = Color(0xFFE8EDF5) + Column(modifier.border(1.dp, paper)) { + Row(Modifier.fillMaxWidth().background(paper).padding(horizontal = 12.dp, vertical = 3.dp), verticalAlignment = Alignment.CenterVertically) { + Text(scheduled?.let { "${it.channel.number} ${it.channel.name}${if (it.clockOffsetMs != 0L) " / Transition check" else ""}" } ?: "Orbit Preview", color = Navy, fontWeight = FontWeight.Bold, fontSize = 14.sp) + Spacer(Modifier.weight(1f)) + Text(SimpleDateFormat("HH:mm EEE d MMM", Locale.UK).format(Date(now)), color = Navy, fontSize = 13.sp) + } + Column(Modifier.fillMaxWidth().background(Blue).padding(horizontal = 14.dp, vertical = 8.dp), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Row(verticalAlignment = Alignment.CenterVertically) { + Text(if (playing || scheduled != null) "NOW" else "PAUSED", Modifier.width(70.dp), color = Yellow, fontWeight = FontWeight.Bold, fontSize = 14.sp) + Text(item.title, color = Color.White, fontWeight = FontWeight.Bold, fontSize = 20.sp, maxLines = 1, overflow = TextOverflow.Ellipsis) + } + Row(verticalAlignment = Alignment.CenterVertically) { + Text(if (scheduled == null) "INFO" else "NEXT", Modifier.width(70.dp), color = Muted, fontWeight = FontWeight.Bold, fontSize = 13.sp) + Text(scheduled?.let { "${clock(it.next.startMs)} ${it.next.media.item.title}" } ?: listOf(item.type, item.minutes?.let { "$it min" }.orEmpty()).filter { it.isNotBlank() }.joinToString(" • "), + color = Color.White, fontSize = 14.sp, maxLines = 1, overflow = TextOverflow.Ellipsis) + } + } + Row(Modifier.fillMaxWidth().background(paper).padding(horizontal = 14.dp, vertical = 5.dp), + horizontalArrangement = Arrangement.spacedBy(30.dp), verticalAlignment = Alignment.CenterVertically) { + Legend("▲ ▼", "Channel") + Legend("↶", "TV guide") + Legend("CC", "Subtitles") + } + } +} + +@Composable +private fun Legend(icon: String, label: String) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Text(icon, color = Navy, fontSize = 16.sp, fontWeight = FontWeight.Bold) + Text(label, color = Navy, fontSize = 14.sp, fontWeight = FontWeight.Bold) + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/DirectContainers.kt b/android/app/src/main/java/tv/orbit/classic/DirectContainers.kt new file mode 100644 index 0000000..5957bfd --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/DirectContainers.kt @@ -0,0 +1,11 @@ +package tv.orbit.classic + +internal const val DirectVideoContainers = "mp4,mkv,mov,m4v,webm,ts,mpegts,3gp" + +internal fun supportedDirectContainer(value: String): String? = value.trim().lowercase(java.util.Locale.ROOT) + .takeIf { it in DirectVideoContainers.split(",") } + +/** Only a short format label may reach diagnostics; never a raw URL/path from metadata. */ +internal fun safeContainerLabel(value: String): String = value.trim().lowercase(java.util.Locale.ROOT) + .takeIf { it.length in 1..16 && it.all { ch -> ch in 'a'..'z' || ch in '0'..'9' || ch == '-' || ch == '_' } } + ?: "unknown" diff --git a/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt b/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt new file mode 100644 index 0000000..d4c4ed3 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt @@ -0,0 +1,137 @@ +package tv.orbit.classic + +import org.json.JSONObject +import java.io.ByteArrayOutputStream +import java.io.InputStream +import java.net.URL +import java.util.UUID +import javax.net.ssl.HttpsURLConnection + +internal class EmbyCheckException(message: String, val httpStatus: Int? = null) : Exception(message) +internal data class SampleItem(val title: String, val type: String, val minutes: Long?, val format: String, val id: String = "", val durationMs: Long? = minutes?.takeIf { it in 1..(Long.MAX_VALUE / 60_000) }?.times(60_000)) +internal data class EmbySample(val items: List, val total: Long?) +internal class EmbyRequest(val method: String, val path: String, val body: String? = null, val token: String? = null) +internal class EmbyReply(val status: Int, val body: String) +internal fun interface EmbyTransport { fun execute(request: EmbyRequest): EmbyReply } + +/** Network boundary: fixed HTTPS origin, standard TLS checks, no redirects or response logging. */ +internal class HttpsEmbyTransport(internal val deviceId: String = UUID.randomUUID().toString()) : EmbyTransport { + companion object { + const val SERVER = "https://bk2.appboxmanager.xyz" + const val MAX_RESPONSE_BYTES = 2 * 1024 * 1024 + internal fun readBounded(stream: InputStream): String { + val output = ByteArrayOutputStream() + val buffer = ByteArray(8192) + while (true) { + val count = stream.read(buffer) + if (count == -1) break + if (output.size() + count > MAX_RESPONSE_BYTES) throw EmbyCheckException("The provider response was too large for this sample check.") + output.write(buffer, 0, count) + } + return output.toString(Charsets.UTF_8.name()) + } + } + override fun execute(request: EmbyRequest): EmbyReply { + // Paths come from the protocol below, never from a provider response or a text field. + require(request.path.startsWith("/") && !request.path.startsWith("//")) + val connection = URL("$SERVER/emby${request.path}").openConnection() as HttpsURLConnection + try { + connection.requestMethod = request.method + connection.instanceFollowRedirects = false + connection.connectTimeout = 10_000 + connection.readTimeout = if (request.path == "/Sessions/Logout") 5_000 else 15_000 + connection.setRequestProperty("Accept", "application/json") + connection.setRequestProperty("X-Emby-Authorization", "Emby Client=\"Orbit TV\", Device=\"Orbit TV\", DeviceId=\"$deviceId\", Version=\"0.16.0\"") + request.token?.let { connection.setRequestProperty("X-Emby-Token", it) } + if (request.method == "POST") { + val bytes = request.body.orEmpty().toByteArray(Charsets.UTF_8) + connection.doOutput = true + connection.setRequestProperty("Content-Type", "application/json; charset=utf-8") + connection.setFixedLengthStreamingMode(bytes.size) + connection.outputStream.use { it.write(bytes) } + } + val status = connection.responseCode + if (status !in 200..299 || request.path == "/Sessions/Logout") return EmbyReply(status, "") + if (connection.contentLengthLong > MAX_RESPONSE_BYTES) throw EmbyCheckException("The provider response was too large for this sample check.") + val body = connection.inputStream.use { readBounded(it) } + return EmbyReply(status, body) + } catch (e: EmbyCheckException) { throw e } + catch (_: javax.net.ssl.SSLException) { throw EmbyCheckException("The secure connection could not be verified. No insecure fallback was used.") } + catch (_: java.io.IOException) { throw EmbyCheckException("The provider could not be reached. Check your connection and try again.") } + finally { connection.disconnect() } + } +} + +/** One explicit sign-in and one bounded metadata page; ownership passes to the sample screen. */ +internal class EmbyClient(private val transport: EmbyTransport = HttpsEmbyTransport()) { + fun connect(username: String, password: String): EmbySampleSession { + if (username.isBlank() || username.length > 256 || password.isEmpty() || password.length > 1024) + throw EmbyCheckException("Enter your username and password to check the connection.") + val login = transport.execute(EmbyRequest("POST", "/Users/AuthenticateByName", + JSONObject().put("Username", username).put("Pw", password).toString())) + expectSuccess(login.status, true) + val authentication = parse(login.body) + val token = authentication.opt("AccessToken") as? String + ?: throw EmbyCheckException("The provider returned an unusable login response.") + if (token.isBlank() || token.length > 4096 || token.any { it.code !in 33..126 }) + throw EmbyCheckException("The provider returned an unusable login response.") + var success = false + try { + val userId = authentication.optJSONObject("User")?.optString("Id").orEmpty() + if (!validId(userId)) throw EmbyCheckException("The provider returned an unusable user identity.") + val reply = transport.execute(EmbyRequest("GET", "/Users/$userId/Items?Recursive=true&IncludeItemTypes=Movie,Episode&StartIndex=0&Limit=20&SortBy=SortName&SortOrder=Ascending&Fields=MediaStreams&EnableImages=false&EnableUserData=false", token = token)) + expectSuccess(reply.status, false) + val page = parse(reply.body) + val records = page.optJSONArray("Items") ?: throw EmbyCheckException("The provider did not return a library sample.") + val items = (0 until minOf(records.length(), 20)).mapNotNull { index -> + val item = records.optJSONObject(index) ?: return@mapNotNull null + val id = item.optString("Id") + if (!validId(id)) return@mapNotNull null + val type = item.optString("Type") + if (type !in listOf("Movie", "Episode")) return@mapNotNull null + val title = clean(item.optString("Name"), 160).ifBlank { "Untitled programme" } + val ticks = item.optLong("RunTimeTicks", 0) + val streams = item.optJSONArray("MediaStreams") + val codecs = (0 until minOf(streams?.length() ?: 0, 32)).mapNotNull { streamIndex -> + val stream = streams?.optJSONObject(streamIndex) ?: return@mapNotNull null + if (stream.optString("Type") in listOf("Video", "Audio")) clean(stream.optString("Codec"), 24).ifBlank { null } else null + }.distinct().take(3) + SampleItem(title, type, if (ticks > 0) ticks / 600_000_000 else null, + (listOf(clean(item.optString("Container"), 24)) + codecs).filter { it.isNotBlank() }.joinToString(" / "), id, (ticks / 10_000).takeIf { it > 0 }) + } + val total = if (page.has("TotalRecordCount")) page.optLong("TotalRecordCount", -1).takeIf { it >= 0 } else null + val session = EmbySampleSession(transport, token, userId, EmbySample(items, total)) + success = true + return session + } finally { + if (!success) try { transport.execute(EmbyRequest("POST", "/Sessions/Logout", token = token)) } + catch (_: Exception) { } + } + } + fun resume(saved: RememberedState): EmbySampleSession { + val identity = saved.identity + val token = identity.token ?: throw EmbyCheckException("Sign in to restore your saved channel choices.") + require(validId(identity.userId) && validId(identity.deviceId)) + val reply = transport.execute(EmbyRequest("GET", "/Users/${identity.userId}", token = token)) + expectSuccess(reply.status, false) + if (parse(reply.body).optString("Id") != identity.userId) + throw EmbyCheckException("The saved connection could not be verified. Sign in again.") + return EmbySampleSession(transport, token, identity.userId, saved.sample).also { it.restoreRemembered(saved) } + } + companion object { + internal fun validId(value: String) = Regex("[A-Za-z0-9_-]{1,128}").matches(value) + internal fun parse(body: String): JSONObject = try { JSONObject(body) } + catch (_: Exception) { throw EmbyCheckException("The provider returned a response this version cannot read.") } + internal fun clean(value: String, limit: Int) = value.filter { !it.isISOControl() }.take(limit) + internal fun expectSuccess(status: Int, login: Boolean) { + when (status) { + in 200..299 -> return + 401 -> throw EmbyCheckException(if (login) "Sign-in failed. Check your username and password." else "The temporary login expired. Try the connection check again.", status) + 403 -> throw EmbyCheckException("The provider did not permit this connection or library request.", status) + 429 -> throw EmbyCheckException("The provider asked us to slow down. Wait before trying again.", status) + in 300..399 -> throw EmbyCheckException("The provider redirected the request. The login was not forwarded to another address.") + else -> throw EmbyCheckException("The provider could not complete this check (HTTP $status).") + } + } + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/EmbyConnectionScreen.kt b/android/app/src/main/java/tv/orbit/classic/EmbyConnectionScreen.kt new file mode 100644 index 0000000..12b724d --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/EmbyConnectionScreen.kt @@ -0,0 +1,468 @@ +package tv.orbit.classic + +import android.view.KeyEvent +import android.view.WindowManager +import androidx.activity.compose.LocalActivity +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.BasicSecureTextField +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.text.input.InputTransformation +import androidx.compose.foundation.text.input.TextFieldState +import androidx.compose.foundation.text.input.TextObfuscationMode +import androidx.compose.foundation.text.input.maxLength +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.input.key.onPreviewKeyEvent +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.tv.material3.Text +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +@Composable +internal fun EmbyConnectionScreen(modifier: Modifier = Modifier, visible: Boolean, + mainGuide: Boolean, onChannelAvailable: (Boolean) -> Unit, onGuide: () -> Unit, + onBack: () -> Unit) { + val appContext = androidx.compose.ui.platform.LocalContext.current.applicationContext + val savedStore = remember { RememberedConnectionStore.get(appContext) } + var setupSaved by remember { mutableStateOf(false) } + var pendingSaved by remember { mutableStateOf(null) } + var restoring by remember { mutableStateOf(true) } + var restoreAttempt by remember { mutableIntStateOf(0) } + var saveTicket by remember { mutableLongStateOf(savedStore.ticket()) } + var username by remember { mutableStateOf("") } + // Deliberately not rememberSaveable: credentials never enter saved instance state. + val password = remember { TextFieldState() } + var busy by remember { mutableStateOf(false) } + var seriesMatches by remember { mutableStateOf?>(null) } + var episodeSamples by remember { mutableStateOf?>(null) } + var reviewingSeries by remember { mutableStateOf(false) } + var approvedSeries by remember { mutableStateOf>(emptySet()) } + var sample by remember { mutableStateOf(null) } + var session by remember { mutableStateOf(null) } + var playback by remember { mutableStateOf(null) } + var darkMovies by remember { mutableStateOf>(emptyList()) } + var approvedDark by remember { mutableStateOf>(emptySet()) } + var reviewingDark by remember { mutableStateOf(false) } + var afterDarkChannel by remember { mutableStateOf(null) } + var toonamiChannel by remember { mutableStateOf(null) } + var selectedNumber by remember { mutableIntStateOf(101) } + var channel by remember { mutableStateOf(null) } + var watchingChannel by remember { mutableStateOf(false) } + var channelClockOffset by remember { mutableLongStateOf(0) } + var busyLabel by remember { mutableStateOf("Connecting…") } + val sessionSlot = remember { EmbySessionSlot() } + var message by remember { mutableStateOf(null) } + var nextAttemptAt by remember { mutableLongStateOf(0) } + var now by remember { mutableLongStateOf(System.currentTimeMillis()) } + var job by remember { mutableStateOf(null) } + val scope = rememberCoroutineScope() + val keyboard = LocalSoftwareKeyboardController.current + val focus = LocalFocusManager.current + val passwordFocus = remember { FocusRequester() } + val submitFocus = remember { FocusRequester() } + val activity = LocalActivity.current + val lifecycle = LocalLifecycleOwner.current.lifecycle + val imeVisible = WindowInsets.ime.getBottom(LocalDensity.current) > 0 + fun clearPassword() { password.edit { replace(0, length, "") } } + fun applyChoices(saved: RememberedState) { + seriesMatches = saved.matches.takeIf { it.isNotEmpty() }; approvedSeries = saved.approved + episodeSamples = saved.episodes; channel = saved.orbitOne; toonamiChannel = saved.toonami + darkMovies = saved.darkMovies; approvedDark = saved.approvedDark; afterDarkChannel = saved.afterDark + val available = availableSampleChannels(channel, afterDarkChannel, toonamiChannel) + selectedNumber = available.firstOrNull { it.number == saved.selectedNumber }?.number ?: available.firstOrNull()?.number ?: 101 + onChannelAvailable(available.isNotEmpty()) + } + fun closeSession(forget: Boolean = false) { + setupSaved = false + savedStore.invalidate() + if (forget) { + pendingSaved = null + try { savedStore.clear() } + catch (_: Exception) { message = "The saved connection could not be removed. Clear Orbit TV app data in Android Settings before leaving this device." } + } + seriesMatches = null; episodeSamples = null; reviewingSeries = false; approvedSeries = emptySet() + darkMovies = emptyList(); approvedDark = emptySet(); reviewingDark = false; afterDarkChannel = null + playback = null; session = null; sample = null; channel = null; toonamiChannel = null; selectedNumber = 101; watchingChannel = false + onChannelAvailable(false) + sessionSlot.clear()?.let { active -> EmbyCleanup.run { active.close() } } + } + BackHandler(imeVisible) { keyboard?.hide(); focus.clearFocus() } + val protectScreen = visible || session != null || busy + DisposableEffect(activity, protectScreen) { + val alreadySecure = (activity?.window?.attributes?.flags ?: 0) and WindowManager.LayoutParams.FLAG_SECURE != 0 + if (protectScreen) activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + onDispose { + if (protectScreen && !alreadySecure) activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } + DisposableEffect(lifecycle) { + val observer = LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_STOP) { + clearPassword(); job?.cancel(); playback = null; watchingChannel = false; busy = false + if (session == null && !restoring) sessionSlot.clear()?.let { active -> EmbyCleanup.run { active.close() } } + } + } + lifecycle.addObserver(observer) + onDispose { + clearPassword(); job?.cancel(); lifecycle.removeObserver(observer) + sessionSlot.clear()?.let { active -> EmbyCleanup.run { active.detach() } } + } + } + LaunchedEffect(restoreAttempt) { + restoring = true + try { + val saved = withContext(Dispatchers.IO) { savedStore.load() } + pendingSaved = saved + if (saved?.identity?.token != null && session == null) { + val slotTicket = sessionSlot.ticket() + val resumed = withContext(Dispatchers.IO) { + val active = EmbyClient(HttpsEmbyTransport(saved.identity.deviceId)).resume(saved) + if (!sessionSlot.attach(active, slotTicket)) { active.detach(); throw CancellationException() } + active + } + session = resumed; sample = resumed.sample; applyChoices(saved) + saveTicket = savedStore.ticket() + message = "Saved connection restored." + } else if (saved != null && session == null) message = "Sign in again to restore your saved channel choices." + } catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { + if (failure.httpStatus == 401 || failure.httpStatus == 403) { + pendingSaved = pendingSaved?.withoutToken() + try { pendingSaved?.let { value -> withContext(Dispatchers.IO) { savedStore.save(value, savedStore.ticket()) } } } + catch (cancelled: CancellationException) { throw cancelled } + catch (_: Exception) { /* Keep the expired token out of active use even if secure storage is unavailable. */ } + message = "Your saved login expired. Sign in again; choices restore for the same account." + } else message = "The saved connection could not be reached. Retry saved connection or sign in again." + } catch (_: Exception) { + // A corrupt file or unavailable key is never read as plaintext. + try { withContext(Dispatchers.IO) { savedStore.clear() } } catch (_: Exception) { } + pendingSaved = null + message = "The saved connection could not be opened. Sign in again." + } finally { restoring = false } + } + LaunchedEffect(session, seriesMatches, approvedSeries, episodeSamples, channel, toonamiChannel, selectedNumber, restoring, afterDarkChannel, darkMovies, approvedDark) { + val active = session + if (active != null && !restoring) { + setupSaved = false + delay(100) + try { + val saved = RememberedState(active.rememberedIdentity(), active.sample, seriesMatches.orEmpty(), + approvedSeries, episodeSamples, channel, toonamiChannel, selectedNumber, afterDarkChannel, darkMovies, approvedDark) + val ticket = saveTicket + if (withContext(Dispatchers.IO) { savedStore.save(saved, ticket) }) { + pendingSaved = saved; setupSaved = true + } + } catch (cancelled: CancellationException) { throw cancelled } + catch (_: Exception) { message = "Connected, but this setup could not be saved securely. It will need sign-in after restart." } + } + } + LaunchedEffect(Unit) { while (true) { now = System.currentTimeMillis(); delay(1000) } } + LaunchedEffect(visible) { + if (!visible) { + clearPassword(); username = ""; keyboard?.hide() + if (busy && !restoring) { + job?.cancel() + if (session == null) closeSession() + busy = false + } + playback = null + } + } + LaunchedEffect(mainGuide) { + if (!mainGuide) { watchingChannel = false; channelClockOffset = 0 } + } + val ready = !busy && !restoring && now >= nextAttemptAt && username.isNotBlank() && password.text.isNotEmpty() + playback?.let { plan -> session?.let { active -> EmbyPlaybackDialog(active, plan, onClose = { playback = null }) } } + val liveSession = session + val availableChannels = availableSampleChannels(channel, afterDarkChannel, toonamiChannel) + val liveChannel = availableChannels.firstOrNull { it.number == selectedNumber } + if (mainGuide && liveSession != null && liveChannel != null) { + if (watchingChannel) ScheduledChannelPlayer(liveSession, liveChannel, channelClockOffset, + onClose = { watchingChannel = false; channelClockOffset = 0 }) + SampleChannelGuide(liveChannel, modifier, onTune = { offset -> + channelClockOffset = offset; watchingChannel = true + }, onBack = onBack, otherChannels = availableChannels.filter { it.number != selectedNumber }, + onSwitch = { selectedNumber = it; watchingChannel = false; channelClockOffset = 0 }) + return + } + if (!visible) return + if (reviewingDark) { + AfterDarkReviewScreen(darkMovies, approvedDark, busy, message, modifier, + onGenre = { genre -> + val active = session + if (!busy && active != null) { + busy = true; message = null + job = scope.launch { + try { + darkMovies = withContext(Dispatchers.IO) { active.checkAfterDarkMovies(genre) } + message = "${darkMovies.size} checked films in this sample. If a category has no matches, it may have no results or incomplete genre metadata in its first page." + } catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { message = failure.message } + catch (_: Exception) { message = "The film check could not finish. Try again later." } + finally { busy = false } + } + } + }, onToggle = { id -> + if (!busy) approvedDark = if (id in approvedDark) approvedDark - id else if (approvedDark.size < 3) approvedDark + id else approvedDark + }, onBuild = { + val active = session + if (!busy && active != null && approvedDark.size in 2..3) { + busy = true; message = null + job = scope.launch { + try { + val built = withContext(Dispatchers.IO) { + val context = coroutineContext + active.buildAfterDarkChannel(approvedDark) { context.ensureActive() } + } + afterDarkChannel = built; selectedNumber = 102; reviewingDark = false + onChannelAvailable(true); onGuide() + } catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { message = failure.message } + catch (_: Exception) { message = "Channel 102 could not be prepared. Try again later." } + finally { busy = false } + } + } + }, onBack = { job?.cancel(); busy = false; reviewingDark = false }) + return + } + fun checkMoreSeries() { + val active = session ?: return + if (busy) return + val start = seriesMatches?.size ?: 0 + if (start >= ToonamiSearches.size) return + busy = true; busyLabel = "Checking next five series…"; message = null + job = scope.launch { + try { + val batch = withContext(Dispatchers.IO) { + val context = coroutineContext + active.checkToonamiSeries(start) { context.ensureActive() } + } + seriesMatches = seriesMatches.orEmpty() + batch + reviewingSeries = true + } catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { message = failure.message } + catch (_: Exception) { message = "The series check could not finish. Try again later." } + finally { busy = false } + } + } + if (reviewingSeries) { + SeriesReviewScreen(seriesMatches.orEmpty(), approvedSeries, episodeSamples, busy, message, modifier, + onToggle = { id -> + if (!busy) { + approvedSeries = if (id in approvedSeries) approvedSeries - id else if (approvedSeries.size < 3) approvedSeries + id else approvedSeries + episodeSamples = null + } + }, onMore = { checkMoreSeries() }, onEpisodes = { + val active = session + val selected = seriesMatches.orEmpty().flatMap { it.candidates }.distinctBy { it.id }.filter { it.id in approvedSeries } + if (!busy && active != null && selected.size in 1..3) { + busy = true; message = null; episodeSamples = null + job = scope.launch { + try { + episodeSamples = withContext(Dispatchers.IO) { + val context = coroutineContext + active.checkSeriesEpisodes(selected) { context.ensureActive() } + } + } catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { message = failure.message } + catch (_: Exception) { message = "The episode check could not finish. Try again later." } + finally { busy = false } + } + } + }, onBuild = { + val active = session + if (!busy && active != null && episodeSamples != null) { + busy = true; message = null + job = scope.launch { + try { + val built = withContext(Dispatchers.IO) { + val context = coroutineContext + active.buildToonamiChannel { context.ensureActive() } + } + toonamiChannel = built; selectedNumber = 103 + reviewingSeries = false; onChannelAvailable(true); onGuide() + } catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { message = failure.message } + catch (_: Exception) { message = "Channel 103 could not be prepared. Try again later." } + finally { busy = false } + } + } + }, onBack = { job?.cancel(); busy = false; reviewingSeries = false }) + return + } + Row(modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(24.dp)) { + Column(Modifier.weight(1f).fillMaxHeight().verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text("Connect Emby", color = Yellow, fontSize = 27.sp) + Text(HttpsEmbyTransport.SERVER, color = Muted, fontSize = 15.sp) + Text("Sign in for a 20-item playback sample, then create your TV channel.", color = Color.White, fontSize = 16.sp) + Text("Username", color = Muted, fontSize = 14.sp) + var userFocused by remember { mutableStateOf(false) } + BasicTextField(value = username, onValueChange = { if (it.length <= 256) username = it.replace("\n", "") }, + enabled = !busy && !restoring, singleLine = true, textStyle = TextStyle(color = Color.White, fontSize = 18.sp), + cursorBrush = SolidColor(Yellow), + keyboardOptions = KeyboardOptions(autoCorrectEnabled = false, imeAction = ImeAction.Next), + keyboardActions = KeyboardActions(onNext = { passwordFocus.requestFocus(); keyboard?.show() }), + modifier = Modifier.fillMaxWidth().onFocusChanged { userFocused = it.isFocused } + .background(Panel).border(2.dp, if (userFocused) Yellow else Blue) + .onPreviewKeyEvent { event -> + if (event.nativeKeyEvent.keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { + if (event.nativeKeyEvent.action == KeyEvent.ACTION_UP) keyboard?.show() + true + } else false + }.padding(12.dp)) + Text("Password", color = Muted, fontSize = 14.sp) + var passwordFocused by remember { mutableStateOf(false) } + BasicSecureTextField(state = password, enabled = !busy && !restoring, + textObfuscationMode = TextObfuscationMode.Hidden, + inputTransformation = InputTransformation.maxLength(1024), + textStyle = TextStyle(color = Color.White, fontSize = 18.sp), cursorBrush = SolidColor(Yellow), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Done), + onKeyboardAction = { keyboard?.hide(); if (ready) submitFocus.requestFocus() else focus.clearFocus() }, + modifier = Modifier.fillMaxWidth().focusRequester(passwordFocus) + .onFocusChanged { passwordFocused = it.isFocused } + .background(Panel).border(2.dp, if (passwordFocused) Yellow else Blue) + .onPreviewKeyEvent { event -> + if (event.nativeKeyEvent.keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { + if (event.nativeKeyEvent.action == KeyEvent.ACTION_UP) keyboard?.show() + true + } else false + }.padding(12.dp)) + OrbitButton(if (busy) "Checking connection…" else if (now < nextAttemptAt) "Wait before trying again" else "Check 20 items", + Modifier.fillMaxWidth().focusRequester(submitFocus), enabled = ready, onClick = { + if (!ready) return@OrbitButton + val loginName = username.trim() + val secret = password.text.toString() + clearPassword(); keyboard?.hide(); focus.clearFocus() + closeSession() + val ticket = sessionSlot.ticket() + busyLabel = "Connecting…" + busy = true; message = null; sample = null + nextAttemptAt = System.currentTimeMillis() + 15_000 + job = scope.launch { + try { + val connected = withContext(Dispatchers.IO) { + val opened = EmbyClient().connect(loginName, secret) + if (!sessionSlot.attach(opened, ticket)) { opened.close(); throw CancellationException() } + opened + } + val saved = pendingSaved + if (saved != null && connected.matchesAccount(saved.identity)) { + connected.restoreRemembered(saved); applyChoices(saved) + } + session = connected; sample = connected.sample + saveTicket = savedStore.ticket() + } + catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { message = failure.message } + catch (_: Exception) { message = "The connection check could not finish. Try again later." } + finally { busy = false } + } + }) + Text("This device remembers the session token and channel choices using encrypted storage. Your password is never saved.", color = Muted, fontSize = 13.sp) + if (setupSaved && session != null) Text("Setup saved on this device", color = Yellow, fontSize = 14.sp) + if (session != null) OrbitButton("Disconnect", Modifier.fillMaxWidth(), onClick = { job?.cancel(); closeSession(forget = true) }) + if (session == null && pendingSaved?.identity?.token != null) + OrbitButton("Retry saved connection", Modifier.fillMaxWidth(), enabled = !restoring && !busy, + onClick = { restoreAttempt++ }) + if (session == null && pendingSaved != null) + OrbitButton("Forget saved connection", Modifier.fillMaxWidth(), enabled = !restoring && !busy, + onClick = { closeSession(forget = true) }) + if (restoring) Text("Restoring saved connection…", color = Yellow, fontSize = 14.sp) + OrbitButton("Return to Menu", Modifier.fillMaxWidth(), onClick = onBack) + } + Column(Modifier.weight(1.15f).fillMaxHeight().background(Panel).padding(16.dp)) { + Text(if (sample != null) "Sample received" else "Connection check", color = Yellow, fontSize = 24.sp) + Spacer(Modifier.height(10.dp)) + val result = sample + when { + busy && result == null -> Text(busyLabel, color = Color.White, fontSize = 18.sp) + message != null && result == null -> Text(message.orEmpty(), color = Color.White, fontSize = 18.sp) + result != null -> { + if (busy) Text(busyLabel, color = Yellow, fontSize = 14.sp) + message?.let { Text(it, color = Yellow, fontSize = 14.sp) } + Text("${result.items.size} records received${result.total?.let { " • $it available to this account" }.orEmpty()}", color = Color.White, fontSize = 16.sp) + Text("Select a title, or create one channel from up to three playable titles.", color = Muted, fontSize = 13.sp) + OrbitButton(if (channel == null) "Create sample channel" else "Open TV Guide", + Modifier.fillMaxWidth(), enabled = !busy && session != null, onClick = { + if (channel != null) { selectedNumber = 101; onGuide() } else { + val active = session ?: return@OrbitButton + busyLabel = "Preparing your channel…"; busy = true; message = null + job = scope.launch { + try { + channel = withContext(Dispatchers.IO) { active.buildSampleChannel() } + selectedNumber = 101 + onChannelAvailable(true) + onGuide() + } catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { message = failure.message } + catch (_: Exception) { message = "The sample channel could not be created. Try again later." } + finally { busy = false } + } + } + }) + OrbitButton("102 Orbit After Dark — choose films", Modifier.fillMaxWidth(), + enabled = !busy && session != null, onClick = { message = null; reviewingDark = true }) + OrbitButton(if (seriesMatches == null) "103 Toonami — check shortlist" else "103 Toonami — review matches", + Modifier.fillMaxWidth(), enabled = !busy && session != null, onClick = { + if (seriesMatches != null) reviewingSeries = true else checkMoreSeries() + }) + Spacer(Modifier.height(8.dp)) + if (result.items.isEmpty()) Text("No movies or episodes were returned for this account.", color = Color.White, fontSize = 17.sp) + LazyColumn(verticalArrangement = Arrangement.spacedBy(6.dp)) { + itemsIndexed(result.items) { index, item -> + var focused by remember { mutableStateOf(false) } + Column(Modifier.fillMaxWidth().onFocusChanged { focused = it.isFocused } + .border(1.dp, if (focused) Yellow else Blue).clickable(enabled = session != null) { + if (busy) return@clickable + val active = session ?: return@clickable + busyLabel = "Preparing selected title…"; busy = true; message = null + job = scope.launch { + try { playback = withContext(Dispatchers.IO) { active.prepare(item) } } + catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { message = failure.message } + catch (_: Exception) { message = "This sample could not be opened. Try another title." } + finally { busy = false } + } + }.padding(10.dp)) { + Text("${index + 1}. ${item.title}", color = Color.White, fontSize = 17.sp, maxLines = 2) + Text(listOf(item.type, item.minutes?.let { "$it min" }.orEmpty(), item.format) + .filter { it.isNotBlank() }.joinToString(" • "), color = Muted, fontSize = 13.sp) + } + } + } + } + else -> Text("Enter your provider login on the TV. Read a small sample, then create Orbit One in the main TV Guide.", color = Muted, fontSize = 18.sp) + } + } + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackDialog.kt b/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackDialog.kt new file mode 100644 index 0000000..a3aaae6 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackDialog.kt @@ -0,0 +1,164 @@ +package tv.orbit.classic + +import android.view.KeyEvent +import android.os.SystemClock +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import androidx.compose.ui.window.SecureFlagPolicy +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player +import androidx.media3.datasource.DataSource +import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.exoplayer.source.DefaultMediaSourceFactory +import androidx.media3.ui.PlayerView +import androidx.tv.material3.Text +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext + +@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class) +@Composable +internal fun EmbyPlaybackDialog(session: EmbySampleSession, plan: EmbyPlaybackPlan, onClose: () -> Unit, scheduled: ScheduledPlayback? = null) { + val context = LocalContext.current + var failure by remember { mutableStateOf(null) } + var tuningNumberVisible by remember { mutableStateOf(true) } + var ready by remember { mutableStateOf(false) } + var playing by remember { mutableStateOf(false) } + var infoVisible by remember { mutableStateOf(true) } + var lastInteraction by remember { mutableLongStateOf(SystemClock.elapsedRealtime()) } + fun showInfo() { infoVisible = true; lastInteraction = SystemClock.elapsedRealtime() } + val player = remember(session, plan) { + val factory = DataSource.Factory { SecureMediaDataSource(session) } + ExoPlayer.Builder(context).setMediaSourceFactory(DefaultMediaSourceFactory(factory)) + .setSeekBackIncrementMs(10_000).setSeekForwardIncrementMs(10_000).build().apply { + setMediaItem(MediaItem.Builder().setUri(plan.url).setSubtitleConfigurations(plan.subtitles.map { subtitle -> + MediaItem.SubtitleConfiguration.Builder(android.net.Uri.parse(subtitle.url)).setMimeType(subtitle.mime) + .setLanguage(subtitle.language).setLabel(subtitle.label).build() + }).build()) + if (scheduled != null) seekTo(scheduled.programme.offsetAt(scheduled.nowMs())) + prepare(); playWhenReady = true + } + } + val lifecycle = LocalLifecycleOwner.current.lifecycle + var foreground by remember { mutableStateOf(lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) } + DisposableEffect(player, lifecycle) { + var stopReported = false + val observer = LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_START) foreground = true + if (event == Lifecycle.Event.ON_STOP) { + foreground = false + val position = player.currentPosition + player.stop(); ready = false + stopReported = true + EmbyCleanup.run { session.report(plan, "Playing/Stopped", position, true) } + } + } + lifecycle.addObserver(observer) + var joinedSchedule = false + val listener = object : Player.Listener { + override fun onPlayerError(error: PlaybackException) { + val safeReason = generateSequence(error.cause) { it.cause }.filterIsInstance().firstOrNull()?.message + failure = safeReason ?: "Playback could not continue (${error.errorCodeName}). Try another sample title, or return and report this code." + ready = false + } + override fun onIsPlayingChanged(isPlaying: Boolean) { playing = isPlaying } + override fun onPlaybackStateChanged(state: Int) { + if (state == Player.STATE_READY) { + if (scheduled != null && !joinedSchedule) { + joinedSchedule = true + val target = scheduled.programme.offsetAt(scheduled.nowMs()) + if (kotlin.math.abs(player.currentPosition - target) > 2_000) player.seekTo(target) + } + ready = true + } + } + } + player.addListener(listener) + onDispose { + val position = player.currentPosition + lifecycle.removeObserver(observer) + player.removeListener(listener); player.release() + if (!stopReported) EmbyCleanup.run { session.report(plan, "Playing/Stopped", position, true) } + } + } + LaunchedEffect(player, ready) { + if (ready) { delay(2_000); tuningNumberVisible = false } + } + LaunchedEffect(player, ready) { + if (ready && foreground) { + val startPosition = player.currentPosition; val startPaused = !player.isPlaying + withContext(Dispatchers.IO) { if (foreground) session.report(plan, "Playing", startPosition, startPaused) } + while (foreground) { + delay(10_000) + if (!foreground) break + val position = player.currentPosition; val paused = !player.isPlaying + withContext(Dispatchers.IO) { if (foreground) session.report(plan, "Playing/Progress", position, paused) } + } + } + } + LaunchedEffect(infoVisible, lastInteraction, playing, ready) { + if (infoVisible && playing && ready) { delay(5_000); infoVisible = false } + } + Dialog(onDismissRequest = onClose, properties = DialogProperties(usePlatformDefaultWidth = false, + decorFitsSystemWindows = false, securePolicy = SecureFlagPolicy.SecureOn)) { + Box(Modifier.fillMaxSize().background(Color.Black)) { + AndroidView(modifier = Modifier.fillMaxSize(), factory = { nativeContext -> + PlayerView(nativeContext).apply { + useController = false + setOnKeyListener { _, code, event -> + val supported = code in listOf(KeyEvent.KEYCODE_DPAD_CENTER, KeyEvent.KEYCODE_ENTER, + KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_RIGHT, KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_DPAD_DOWN, + KeyEvent.KEYCODE_CHANNEL_UP, KeyEvent.KEYCODE_CHANNEL_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, + KeyEvent.KEYCODE_MEDIA_PLAY, KeyEvent.KEYCODE_MEDIA_PAUSE, KeyEvent.KEYCODE_MEDIA_REWIND, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) + if (!supported) false else { + if (event.action == KeyEvent.ACTION_UP) { + when (code) { + KeyEvent.KEYCODE_DPAD_CENTER, KeyEvent.KEYCODE_ENTER -> { + if (scheduled == null && infoVisible) { if (player.isPlaying) player.pause() else player.play() } + } + KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_MEDIA_REWIND -> if (scheduled == null) player.seekBack() + KeyEvent.KEYCODE_DPAD_RIGHT, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD -> if (scheduled == null) player.seekForward() + KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> if (scheduled == null) { if (player.isPlaying) player.pause() else player.play() } + KeyEvent.KEYCODE_MEDIA_PLAY -> player.play() + KeyEvent.KEYCODE_MEDIA_PAUSE -> if (scheduled == null) player.pause() + } + showInfo() + } + true + } + } + setShowBuffering(PlayerView.SHOW_BUFFERING_WHEN_PLAYING) + this.player = player + isFocusable = true; isFocusableInTouchMode = true + post { requestFocus() } + } + }, update = { it.player = player }, onRelease = { it.player = null }) + if (scheduled != null && !ready && failure == null && foreground) + ChannelTuningBackdrop(scheduled.channel.number) + if (scheduled != null && ready && tuningNumberVisible && failure == null) + ClassicTuningNumber(scheduled.channel.number, + Modifier.align(Alignment.TopEnd).padding(top = 32.dp, end = 44.dp)) + if (infoVisible && failure == null && ready) ClassicProgrammeStrip(plan.item, playing, + Modifier.align(Alignment.BottomCenter).fillMaxWidth(.86f).padding(bottom = 26.dp), scheduled = scheduled) + if (failure != null) Column(Modifier.align(Alignment.Center).widthIn(max = 620.dp).background(Navy).padding(24.dp)) { + Text(failure.orEmpty(), color = Color.White, fontSize = 20.sp) + Spacer(Modifier.height(16.dp)) + OrbitButton("Return to sample", onClick = onClose) + } + } + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackProtocol.kt b/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackProtocol.kt new file mode 100644 index 0000000..d0090a6 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackProtocol.kt @@ -0,0 +1,225 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import java.net.URI +import java.net.URLDecoder +import java.net.URLEncoder + +internal class PlaybackSubtitle(val url: String, val mime: String, val language: String?, val label: String) +internal class EmbyPlaybackPlan(val item: SampleItem, val url: String, val sourceId: String, + val playSessionId: String, val subtitles: List, val durationMs: Long? = item.durationMs) + +internal object PlaybackUrls { + private val origin = URI(HttpsEmbyTransport.SERVER) + fun isProvider(uri: URI) = uri.scheme.equals("https", true) && uri.host.equals(origin.host, true) && (uri.port == -1 || uri.port == 443) + fun resolve(value: String, base: String = HttpsEmbyTransport.SERVER + "/emby/", token: String = ""): String { + try { + val uri = URI(base).resolve(value) + if (!uri.scheme.equals("https", true) || uri.host.isNullOrBlank() || uri.userInfo != null || uri.fragment != null) + throw EmbyCheckException("This stream does not provide a supported secure media address.") + if (!isProvider(uri) && token.isNotEmpty() && (URLDecoder.decode(uri.rawPath, "UTF-8").contains(token) || uri.rawAuthority.contains(token))) + throw EmbyCheckException("The provider login cannot be sent to another media host.") + val query = uri.rawQuery?.split("&")?.filter { pair -> + val key = URLDecoder.decode(pair.substringBefore('='), "UTF-8") + val item = URLDecoder.decode(pair.substringAfter('=', ""), "UTF-8") + if (!isProvider(uri) && token.isNotEmpty() && (item.contains(token) || uri.rawPath.contains(token))) + throw EmbyCheckException("The provider login cannot be sent to another media host.") + !(isProvider(uri) && (key.equals("api_key", true) || key.equals("X-Emby-Token", true))) + }?.joinToString("&") + val suffix = if (query.isNullOrEmpty()) "" else "?$query" + return "${uri.scheme}://${uri.rawAuthority}${uri.rawPath}$suffix" + } catch (e: EmbyCheckException) { throw e } + catch (_: Exception) { throw EmbyCheckException("This stream does not provide a supported secure media address.") } + } +} + +/** A temporary session is owned by the sample screen, never by persistent storage. */ +internal class EmbySampleSession(private val transport: EmbyTransport, private var token: String?, + private val userId: String, sample: EmbySample) { + var sample: EmbySample = sample + private set + private val reportLock = Any() + @Volatile private var checkedEpisodes: List = emptyList() + @Volatile private var channelEpisodes: Map = emptyMap() + @Volatile private var candidateEpisodes: Map = emptyMap() + @Volatile private var darkCandidates: List = emptyList() + @Volatile private var darkLineup: Map = emptyMap() + @Volatile private var active: EmbyPlaybackPlan? = null + @Volatile private var lastPositionMs = 0L + fun rememberedIdentity() = RememberedIdentity(userId, currentToken(), + (transport as? HttpsEmbyTransport)?.deviceId ?: "fixture-device") + fun matchesAccount(identity: RememberedIdentity) = userId == identity.userId + fun restoreRemembered(saved: RememberedState) { + require(matchesAccount(saved.identity)) + sample = saved.sample + checkedEpisodes = saved.episodes.orEmpty() + candidateEpisodes = checkedEpisodes.flatMap { group -> group.episodes.map { episodeSampleItem(group.series, it) } }.associateBy { it.id } + channelEpisodes = saved.toonami?.lineup.orEmpty().associate { it.item.id to it.item } + darkCandidates = saved.darkMovies + darkLineup = saved.afterDark?.lineup.orEmpty().associate { it.item.id to it.item } + } + /** End local use without invalidating the token saved for the next launch. */ + fun detach() = synchronized(reportLock) { + active?.let { report(it, "Playing/Stopped", lastPositionMs, true) } + synchronized(this) { token = null } + checkedEpisodes = emptyList(); candidateEpisodes = emptyMap(); channelEpisodes = emptyMap(); darkCandidates = emptyList(); darkLineup = emptyMap() + } + private fun currentToken() = synchronized(this) { token ?: throw EmbyCheckException("This sample session has ended. Sign in again.") } + fun mediaUrl(value: String, base: String = HttpsEmbyTransport.SERVER + "/emby/") = PlaybackUrls.resolve(value, base, currentToken()) + fun mediaHeaders(url: String): Map { + val auth = currentToken() + return if (PlaybackUrls.isProvider(URI(url))) mapOf("X-Emby-Token" to auth) else emptyMap() + } + fun prepare(item: SampleItem, isPlayback: Boolean = true, preferredSourceId: String? = null): EmbyPlaybackPlan { + if (preferredSourceId != null && !EmbyClient.validId(preferredSourceId)) throw EmbyCheckException("The channel source is no longer usable.") + if (item.id.isBlank() || sample.items.none { it.id == item.id } && candidateEpisodes[item.id] != item && channelEpisodes[item.id] != item && darkCandidates.none { it.item == item } && darkLineup[item.id] != item) throw EmbyCheckException("Choose a title from the current sample.") + val request = JSONObject().put("UserId", userId).put("IsPlayback", isPlayback) + .put("EnableDirectPlay", true).put("EnableDirectStream", true).put("EnableTranscoding", false) + .put("AutoOpenLiveStream", false) + .put("DeviceProfile", JSONObject().put("Name", "Orbit TV playback test") + .put("DirectPlayProfiles", JSONArray().put(JSONObject().put("Type", "Video").put("Container", DirectVideoContainers))) + .put("TranscodingProfiles", JSONArray()) + .put("SubtitleProfiles", JSONArray().put(JSONObject().put("Format", "srt").put("Method", "External")) + .put(JSONObject().put("Format", "vtt").put("Method", "External")))) + if (preferredSourceId != null) request.put("MediaSourceId", preferredSourceId) + val response = transport.execute(EmbyRequest("POST", "/Items/${item.id}/PlaybackInfo", request.toString(), currentToken())) + EmbyClient.expectSuccess(response.status, false) + val info = EmbyClient.parse(response.body) + if (!info.isNull("ErrorCode") && !info.optString("ErrorCode").let { it.isBlank() || it == "0" || it == "None" }) throw EmbyCheckException("The provider did not offer a playable source for this account.") + val sources = info.optJSONArray("MediaSources") ?: throw EmbyCheckException("The provider did not return a media source.") + val directSources = (0 until minOf(sources.length(), 20)).mapNotNull { sources.optJSONObject(it) }.filter { + (preferredSourceId == null || it.optString("Id") == preferredSourceId) && + (it.optBoolean("SupportsDirectStream") || it.optBoolean("SupportsDirectPlay")) && !it.optBoolean("RequiresOpening") && !it.optBoolean("RequiresClosing") + } + if (directSources.isEmpty()) throw EmbyCheckException("This title needs a playback method outside the current direct-stream test. Try another sample title.") + val source = directSources.firstOrNull { supportedDirectContainer(it.optString("Container")) != null } + ?: throw EmbyCheckException("Unsupported direct container: ${directSources.map { safeContainerLabel(it.optString("Container")) }.distinct().take(3).joinToString(", ")}. Choose another series version for this sample.") + val sourceId = source.optString("Id") + if (!EmbyClient.validId(sourceId)) throw EmbyCheckException("The provider returned an unusable media source.") + val playId = (if (info.isNull("PlaySessionId")) "" else info.optString("PlaySessionId")).ifBlank { java.util.UUID.randomUUID().toString() } + if (!EmbyClient.validId(playId)) throw EmbyCheckException("The provider returned an unusable playback identity.") + val container = requireNotNull(supportedDirectContainer(source.optString("Container"))) + val url = "${HttpsEmbyTransport.SERVER}/emby/Videos/${item.id}/stream.$container?Static=true&MediaSourceId=${encode(sourceId)}&PlaySessionId=${encode(playId)}" + val streams = source.optJSONArray("MediaStreams") + val subtitles = (0 until minOf(streams?.length() ?: 0, 32)).mapNotNull { index -> + val stream = streams?.optJSONObject(index) ?: return@mapNotNull null + if (stream.optString("Type") != "Subtitle" || !stream.optBoolean("IsExternal")) return@mapNotNull null + val mime = when (stream.optString("DeliveryFormat").ifBlank { stream.optString("Codec") }.lowercase()) { + "srt", "subrip" -> "application/x-subrip" + "vtt", "webvtt" -> "text/vtt" + else -> return@mapNotNull null + } + val delivery = stream.optString("DeliveryUrl").takeIf { it.isNotBlank() } ?: return@mapNotNull null + val safe = try { mediaUrl(delivery) } catch (_: EmbyCheckException) { return@mapNotNull null } + PlaybackSubtitle(safe, mime, stream.optString("Language").take(16).ifBlank { null }, + EmbyClient.clean(stream.optString("DisplayTitle").ifBlank { "Subtitles ${index + 1}" }, 80)) + } + val runtime = (source.optLong("RunTimeTicks", 0) / 10_000).takeIf { it > 0 } ?: item.durationMs + return EmbyPlaybackPlan(item, url, sourceId, playId, subtitles, runtime) + } + fun checkToonamiSeries(startIndex: Int = 0, checkActive: () -> Unit = {}): List = + discoverToonamiSeries(transport, userId, ::currentToken, startIndex, checkActive) + fun checkSeriesEpisodes(series: List, checkActive: () -> Unit = {}): List { + val checked = discoverSeriesEpisodes(transport, userId, ::currentToken, series, checkActive) + checkActive() + currentToken() + checkedEpisodes = checked + candidateEpisodes = checked.flatMap { group -> group.episodes.map { episode -> episodeSampleItem(group.series, episode) } }.associateBy { it.id } + return checked + } + fun buildToonamiChannel(checkActive: () -> Unit = {}): SampleChannel { + val checked = checkedEpisodes + val ordered = toonamiEpisodeOrder(checked) + val media = ordered.map { item -> + checkActive() + val plan = try { prepare(item, isPlayback = false) } + catch (failure: EmbyCheckException) { + throw EmbyCheckException("${item.title}: ${failure.message}", failure.httpStatus) + } + val duration = plan.durationMs?.takeIf { it in 1_000..SampleChannel.MAX_DURATION_MS } + ?: throw EmbyCheckException("An episode has no usable runtime. Check the sample again.") + ScheduledMedia(item, plan.sourceId, duration) + } + checkActive(); currentToken() + val channel = SampleChannel(media, "Toonami", 103) + channelEpisodes = ordered.associateBy { it.id } + return channel + } + + fun checkAfterDarkMovies(genre: String): List { + val found = discoverAfterDarkMovies(transport, userId, ::currentToken, genre) + currentToken() + darkCandidates = mergeAfterDarkMovies(darkCandidates, found) + return darkCandidates + } + fun buildAfterDarkChannel(approved: Set, checkActive: () -> Unit = {}): SampleChannel { + val items = approvedAfterDarkItems(darkCandidates, approved) + val entries = items.map { item -> + checkActive() + val plan = try { prepare(item, isPlayback = false) } + catch (failure: EmbyCheckException) { throw EmbyCheckException("${item.title}: ${failure.message}", failure.httpStatus) } + val duration = plan.durationMs?.takeIf { it in 1_000..SampleChannel.MAX_DURATION_MS } + ?: throw EmbyCheckException("${item.title}: no usable source runtime.") + ScheduledMedia(item, plan.sourceId, duration) + } + checkActive(); currentToken() + return SampleChannel(entries, "Orbit After Dark", 102).also { darkLineup = items.associateBy { it.id } } + } + + fun buildSampleChannel(): SampleChannel { + val entries = mutableListOf() + for (item in sample.items.take(5)) { + if (entries.any { it.item.id == item.id }) continue + try { + val source = prepare(item, isPlayback = false) + val duration = source.durationMs ?: continue + if (duration !in 1_000..SampleChannel.MAX_DURATION_MS) continue + entries += ScheduledMedia(item.copy(minutes = duration / 60_000, durationMs = duration), source.sourceId, duration) + if (entries.size == 3) break + } catch (failure: EmbyCheckException) { + if (failure.httpStatus == 401 || failure.httpStatus == 429) throw failure + } + } + if (entries.size < 2) throw EmbyCheckException("This sample needs at least two direct-stream titles with usable runtimes to create a channel.") + return SampleChannel(entries.toList()) + } + fun report(plan: EmbyPlaybackPlan, event: String, positionMs: Long, paused: Boolean) = synchronized(reportLock) { + require(event in listOf("Playing", "Playing/Progress", "Playing/Stopped")) + if (synchronized(this) { token } == null) return@synchronized + if (event == "Playing") active = plan + val position = positionMs.coerceAtLeast(0) + if (active === plan) lastPositionMs = position + val payload = JSONObject().put("ItemId", plan.item.id).put("MediaSourceId", plan.sourceId) + .put("PlaySessionId", plan.playSessionId).put("PositionTicks", position.coerceAtMost(Long.MAX_VALUE / 10_000) * 10_000) + .put("IsPaused", paused).put("CanSeek", true).put("PlayMethod", "DirectStream") + try { transport.execute(EmbyRequest("POST", "/Sessions/$event", payload.toString(), currentToken())) } + catch (_: Exception) { /* Playback reports are best effort; never log response bodies or URLs. */ } + if (event == "Playing/Stopped" && active === plan) active = null + } + fun close(): Boolean = synchronized(reportLock) { + val auth = synchronized(this) { token } ?: return@synchronized true + active?.let { report(it, "Playing/Stopped", lastPositionMs, true) } + synchronized(this) { token = null } + checkedEpisodes = emptyList(); candidateEpisodes = emptyMap(); channelEpisodes = emptyMap(); darkCandidates = emptyList(); darkLineup = emptyMap() + try { transport.execute(EmbyRequest("POST", "/Sessions/Logout", token = auth)).status in 200..299 } + catch (_: Exception) { false } + } + private fun encode(value: String) = URLEncoder.encode(value, "UTF-8") +} + +/** Invalidates an in-flight sign-in when its screen leaves or is backgrounded. */ +internal class EmbySessionSlot { + private var generation = 0 + private var session: EmbySampleSession? = null + @Synchronized fun ticket(): Int = generation + @Synchronized fun attach(value: EmbySampleSession, ticket: Int): Boolean { + if (ticket != generation || session != null) return false + session = value; return true + } + @Synchronized fun clear(): EmbySampleSession? { generation++; return session.also { session = null } } +} +internal object EmbyCleanup { + private val executor = java.util.concurrent.Executors.newSingleThreadExecutor { task -> Thread(task, "Orbit-session-cleanup").apply { isDaemon = true } } + fun run(task: () -> Unit) { executor.execute { try { task() } catch (_: Exception) { } } } +} diff --git a/android/app/src/main/java/tv/orbit/classic/EpisodeDiscovery.kt b/android/app/src/main/java/tv/orbit/classic/EpisodeDiscovery.kt new file mode 100644 index 0000000..cc0902c --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/EpisodeDiscovery.kt @@ -0,0 +1,45 @@ +package tv.orbit.classic + +internal data class EpisodeCandidate(val id: String, val title: String, val season: Int?, val episode: Int?, val durationMs: Long?, val mediaLabel: String = "") +internal data class SeriesEpisodes(val series: SeriesCandidate, val episodes: List, val moreAvailable: Boolean) + +/** Metadata only: three approved series, one page of five episodes per series. */ +internal fun discoverSeriesEpisodes(transport: EmbyTransport, userId: String, token: () -> String, + approved: List, checkActive: () -> Unit = {}): List { + require(EmbyClient.validId(userId)) + require(approved.size in 1..3 && approved.map { it.id }.distinct().size == approved.size) + require(approved.all { EmbyClient.validId(it.id) }) + return approved.map { series -> + checkActive() + val response = transport.execute(EmbyRequest("GET", "/Shows/${series.id}/Episodes?UserId=$userId&StartIndex=0&Limit=5&Fields=MediaStreams&EnableImages=false&EnableUserData=false", token = token())) + EmbyClient.expectSuccess(response.status, false) + val body = EmbyClient.parse(response.body) + val records = body.optJSONArray("Items") ?: throw EmbyCheckException("The provider did not return an episode sample.") + val episodes = (0 until minOf(records.length(), 5)).mapNotNull { index -> + val item = records.optJSONObject(index) ?: return@mapNotNull null + val id = item.optString("Id") + if (!EmbyClient.validId(id) || item.optString("Type") != "Episode") return@mapNotNull null + val seriesId = item.optString("SeriesId") + if (seriesId.isNotEmpty() && seriesId != series.id) return@mapNotNull null + EpisodeCandidate(id, EmbyClient.clean(item.optString("Name"), 160).ifBlank { "Untitled episode" }, + item.optInt("ParentIndexNumber", -1).takeIf { it >= 0 }, + item.optInt("IndexNumber", -1).takeIf { it >= 0 }, + (item.optLong("RunTimeTicks", 0) / 10_000).takeIf { it in 1_000..SampleChannel.MAX_DURATION_MS }, episodeMediaLabel(item)) + }.distinctBy { it.id }.sortedWith(compareBy { it.season ?: Int.MAX_VALUE }.thenBy { it.episode ?: Int.MAX_VALUE }.thenBy { it.id }) + SeriesEpisodes(series, episodes, body.optLong("TotalRecordCount", records.length().toLong()) > 5) + } +} + +internal fun episodeMediaLabel(item: org.json.JSONObject): String { + val streams = item.optJSONArray("MediaStreams") + val media = (0 until minOf(streams?.length() ?: 0, 32)).mapNotNull { streams?.optJSONObject(it) } + val video = media.firstOrNull { it.optString("Type") == "Video" } + val width = (video?.optInt("Width", 0) ?: item.optInt("Width", 0)).takeIf { it in 1..16384 } + val height = (video?.optInt("Height", 0) ?: item.optInt("Height", 0)).takeIf { it in 1..16384 } + val resolution = if (width != null && height != null) "${width}×${height}" else null + val container = item.optString("Container").takeIf { it.isNotBlank() }?.let(::safeContainerLabel) + val codecs = media.filter { it.optString("Type") in listOf("Video", "Audio") } + .mapNotNull { EmbyClient.clean(it.optString("Codec"), 24).takeIf { value -> value.isNotBlank() } }.distinct().take(3) + .joinToString(" / ").takeIf { it.isNotEmpty() } + return listOfNotNull(resolution, container, codecs).joinToString(" • ") +} diff --git a/android/app/src/main/java/tv/orbit/classic/MainActivity.kt b/android/app/src/main/java/tv/orbit/classic/MainActivity.kt new file mode 100644 index 0000000..8a24b56 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/MainActivity.kt @@ -0,0 +1,230 @@ +package tv.orbit.classic + +import android.os.Bundle +import android.view.WindowManager +import androidx.activity.ComponentActivity +import androidx.activity.compose.BackHandler +import androidx.activity.compose.setContent +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.media3.common.MediaItem +import androidx.media3.common.Player +import androidx.media3.common.PlaybackException +import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.ui.PlayerView +import androidx.tv.material3.MaterialTheme +import androidx.tv.material3.Text +import kotlinx.coroutines.delay +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +internal val Navy = Color(0xFF071632) +internal val Panel = Color(0xFF12356B) +internal val Blue = Color(0xFF194C91) +internal val Yellow = Color(0xFFFFDE59) +internal val Muted = Color(0xFFB7CBE8) +private fun elapsed(time: Long): String = "%02d:%02d".format(Locale.UK, time / 60000, (time / 1000) % 60) +internal fun clock(time: Long) = SimpleDateFormat("HH:mm", Locale.UK).format(Date(time)) + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + setContent { MaterialTheme { OrbitApp() } } + } +} + +@Composable +internal fun OrbitButton(label: String, modifier: Modifier = Modifier, selected: Boolean = false, + enabled: Boolean = true, onFocus: () -> Unit = {}, onClick: () -> Unit) { + var focused by remember { mutableStateOf(false) } + Box(modifier.onFocusChanged { focused = it.isFocused; if (it.isFocused) onFocus() } + .background(if (focused) Yellow else if (selected) Blue else Panel) + .border(if (focused) 2.dp else 1.dp, if (focused) Color.White else Color(0xFF38629A)) + .clickable(enabled = enabled, onClick = onClick).padding(horizontal = 14.dp, vertical = 8.dp)) { + Text(label, color = if (focused) Navy else Color.White, fontSize = 14.sp, maxLines = 1, overflow = androidx.compose.ui.text.style.TextOverflow.Ellipsis, + fontWeight = if (focused || selected) FontWeight.Bold else FontWeight.Normal) + } +} + +@Composable +private fun OrbitApp() { + var now by remember { mutableLongStateOf(System.currentTimeMillis()) } + LaunchedEffect(Unit) { while (true) { now = System.currentTimeMillis(); delay(1000) } } + var realChannelAvailable by remember { mutableStateOf(false) } + var section by remember { mutableStateOf("TV Guide") } + var tuned by remember { mutableIntStateOf(0) } + var fullscreen by remember { mutableStateOf(false) } + var selectedChannel by remember { mutableIntStateOf(0) } + var selectedColumn by remember { mutableIntStateOf(0) } + val selected = Schedule.guide(Schedule.channels[selectedChannel], now)[selectedColumn] + var pinned by remember { mutableStateOf(false) } + val tabFocus = remember { List(3) { FocusRequester() } } + val programme = Schedule.programme(Schedule.channels[tuned], now) + val context = androidx.compose.ui.platform.LocalContext.current + val player = remember { ExoPlayer.Builder(context).build().apply { + setMediaItem(MediaItem.fromUri("asset:///orbit-demo.mp4")); prepare(); playWhenReady = true + } } + DisposableEffect(player) { onDispose { player.release() } } + var playbackError by remember { mutableStateOf(null) } + DisposableEffect(player) { + val listener = object : Player.Listener { + override fun onPlayerError(error: PlaybackException) { playbackError = "Demo video could not play. Return to the guide and try again." } + override fun onPlaybackStateChanged(state: Int) { if (state == Player.STATE_READY) playbackError = null } + } + player.addListener(listener) + onDispose { player.removeListener(listener) } + } + val lifecycle = LocalLifecycleOwner.current.lifecycle + DisposableEffect(player, lifecycle, section, fullscreen, realChannelAvailable) { + val observer = LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_STOP) player.pause() + if (event == Lifecycle.Event.ON_START && ((section == "TV Guide" && !realChannelAvailable) || fullscreen)) player.play() + } + lifecycle.addObserver(observer) + onDispose { lifecycle.removeObserver(observer) } + } + LaunchedEffect(section, fullscreen, realChannelAvailable) { + if ((section == "TV Guide" && !realChannelAvailable) || fullscreen) player.play() else player.pause() + } + LaunchedEffect(tuned, programme.start) { + player.seekTo(programme.offsetAt(System.currentTimeMillis())); if ((section == "TV Guide" && !realChannelAvailable) || fullscreen) player.play() + } + // Recheck on resume: a stopped app must rejoin the wall-clock schedule. + DisposableEffect(lifecycle, tuned) { + val observer = LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_RESUME) { + val time = System.currentTimeMillis() + player.seekTo(Schedule.programme(Schedule.channels[tuned], time).offsetAt(time)) + } + } + lifecycle.addObserver(observer) + onDispose { lifecycle.removeObserver(observer) } + } + BackHandler(fullscreen || pinned || section != "TV Guide") { + when { fullscreen -> fullscreen = false; pinned -> pinned = false; section == "Services" || section == "Connect Emby" -> section = "Menu"; else -> section = "TV Guide" } + } + LaunchedEffect(section, fullscreen) { + if (!fullscreen) { + val tab = when (section) { "TV Guide" -> 1; "Box Office" -> 2; else -> 0 } + tabFocus[tab].requestFocus() + } + } + Box(Modifier.fillMaxSize().background(Navy)) { + if (fullscreen) { + Video(player, Modifier.fillMaxSize()) + Column(Modifier.align(Alignment.BottomStart).fillMaxWidth().background(Navy.copy(alpha = .92f)).padding(24.dp)) { + Text("${Schedule.channels[tuned].number} ${Schedule.channels[tuned].name}", color = Yellow, fontSize = 20.sp) + Text(programme.title, color = Color.White, fontSize = 26.sp, fontWeight = FontWeight.Bold) + Text(playbackError ?: "${clock(programme.start)}–${clock(programme.end)} • Demo signal ${elapsed(player.currentPosition)} / 30:00 • Back for guide", color = Muted, fontSize = 15.sp) + } + } else Column(Modifier.fillMaxSize().padding(horizontal = 36.dp, vertical = 16.dp)) { + Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Text("◉ orbit", color = Color.White, fontSize = 30.sp, fontWeight = FontWeight.Bold) + Text(" / Classic", color = Muted, fontSize = 19.sp) + Spacer(Modifier.weight(1f)) + Text(SimpleDateFormat("EEE d MMM HH:mm", Locale.UK).format(Date(now)), color = Color.White, fontSize = 17.sp) + } + Spacer(Modifier.height(8.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + listOf("Menu", "TV Guide", "Box Office").forEachIndexed { index, title -> + OrbitButton("${index + 1} $title", Modifier.focusRequester(tabFocus[index]), + section == title, onClick = { section = title; pinned = false }) + } + } + Spacer(Modifier.height(8.dp)) + if (section == "TV Guide" && !realChannelAvailable) { + Row(Modifier.fillMaxWidth().height(120.dp), horizontalArrangement = Arrangement.spacedBy(20.dp)) { + Box(Modifier.width(256.dp).fillMaxHeight().border(1.dp, Muted)) { + Video(player, Modifier.fillMaxSize()) + Text(if (playbackError == null) "Demo transmission" else "Video unavailable", Modifier.align(Alignment.BottomStart).background(Navy).padding(5.dp), color = Yellow, fontSize = 12.sp) + } + Column(Modifier.weight(1f)) { + Text(if (pinned) "Programme information" else "${Schedule.channels[selectedChannel].name} / ${clock(selected.start)}–${clock(selected.end)}", color = Yellow, fontSize = 15.sp) + Spacer(Modifier.height(6.dp)) + Text(selected.title, color = Color.White, fontSize = 21.sp, fontWeight = FontWeight.Bold) + Spacer(Modifier.height(6.dp)) + Text(selected.synopsis, color = Muted, fontSize = 16.sp) + Spacer(Modifier.weight(1f)) + Text(if (pinned) "Future programme • Back to browse" else "All programmes and video in this prototype are fictional.", color = Muted, fontSize = 12.sp) + } + } + Spacer(Modifier.height(8.dp)) + Row(Modifier.fillMaxWidth().background(Blue).padding(vertical = 6.dp)) { + Text("Channel", Modifier.width(170.dp).padding(start = 12.dp), color = Color.White, fontSize = 14.sp) + repeat(3) { Text(clock(Math.floorDiv(now, Schedule.SLOT) * Schedule.SLOT + it * Schedule.SLOT), Modifier.weight(1f).padding(start = 12.dp), color = Color.White, fontSize = 14.sp) } + } + Column(Modifier.weight(1f).verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(5.dp)) { + Schedule.channels.forEachIndexed { channelIndex, channel -> + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(5.dp), verticalAlignment = Alignment.CenterVertically) { + Column(Modifier.width(165.dp).padding(start = 12.dp)) { + Text(channel.number.toString(), color = Yellow, fontSize = 15.sp) + Text(channel.name, color = Color.White, fontSize = 16.sp) + } + Schedule.guide(channel, now).forEachIndexed { columnIndex, show -> + OrbitButton(show.title, Modifier.weight(1f), onFocus = { + selectedColumn = columnIndex; selectedChannel = channelIndex; pinned = false + }, onClick = { + selectedColumn = columnIndex; selectedChannel = channelIndex + if (now >= show.start && now < show.end) { + tuned = channelIndex; fullscreen = true + if (playbackError != null) player.prepare() + player.seekTo(show.offsetAt(now)); player.play() + } else pinned = true + }) + } + } + } + } + Text("Arrows Browse OK Watch now / programme info Back Return", color = Muted, fontSize = 13.sp) + } else if (section == "Menu") { + OrbitMenu(Modifier.weight(1f), onNavigate = { section = it; pinned = false }) + } else if (section == "Connect Emby") { + // Connection content is kept composed below to retain the temporary session. + } else if (section == "Box Office") { + OrbOffice(Modifier.weight(1f), onGuide = { section = "TV Guide" }) + } else if (section != "TV Guide") { + Column(Modifier.fillMaxWidth().weight(1f).background(Panel).padding(28.dp)) { + Text("Welcome to Orbit Interactive", color = Yellow, fontSize = 27.sp, fontWeight = FontWeight.Bold) + Spacer(Modifier.height(20.dp)) + Text("OrbHive Bedlam is on the roadmap. Games, channel setup and theme selection will live here.", color = Color.White, fontSize = 21.sp) + Spacer(Modifier.height(24.dp)) + Text("Coming later", color = Muted, fontSize = 16.sp) + Spacer(Modifier.height(24.dp)) + OrbitButton("Return to TV Guide", onClick = { section = "TV Guide" }) + } + } + EmbyConnectionScreen(Modifier.weight(1f), visible = section == "Connect Emby", + mainGuide = section == "TV Guide" && realChannelAvailable, + onChannelAvailable = { realChannelAvailable = it }, + onGuide = { section = "TV Guide" }, onBack = { section = "Menu" }) + } + } +} + +@Composable +private fun Video(player: ExoPlayer, modifier: Modifier) { + AndroidView(modifier = modifier, factory = { context -> PlayerView(context).apply { + useController = false; isFocusable = false; descendantFocusability = android.view.ViewGroup.FOCUS_BLOCK_DESCENDANTS + this.player = player + } }, update = { it.player = player }, onRelease = { it.player = null }) +} diff --git a/android/app/src/main/java/tv/orbit/classic/OrbitSections.kt b/android/app/src/main/java/tv/orbit/classic/OrbitSections.kt new file mode 100644 index 0000000..2a8fda6 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/OrbitSections.kt @@ -0,0 +1,120 @@ +package tv.orbit.classic + +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathEffect +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.tv.material3.Text + +private val Barlow = FontFamily(Font(R.font.barlow_regular), Font(R.font.barlow_semibold, FontWeight.SemiBold)) +private val TicketType = FontFamily(Font(R.font.barlow_condensed_medium)) +private val Paper = Color(0xFFF7EAC8) + +private data class OfficeEvent(val title: String, val collection: String, val time: String, + val synopsis: String, val reference: String) +private val officeEvents = listOf( + OfficeEvent("The Last Shuttle Home", "Orbit premieres", "Tonight at 21:30", + "One final journey brings an unlikely crew together. A fictional premiere for your own front-row seat.", "ORB-001"), + OfficeEvent("Visitors at Dawn", "After dark", "Tonight at 23:00", + "First contact arrives in the quietest corner of Earth. A fictional late-night science-fiction special.", "ORB-002") +) + +@Composable +internal fun OrbitMenu(modifier: Modifier = Modifier, onNavigate: (String) -> Unit) { + Row(modifier.fillMaxWidth().background(Panel).padding(24.dp), horizontalArrangement = Arrangement.spacedBy(30.dp)) { + Column(Modifier.weight(1f)) { + Text("Your evening starts here.", color = Yellow, fontFamily = Barlow, fontWeight = FontWeight.SemiBold, fontSize = 30.sp) + Spacer(Modifier.height(10.dp)) + Text("Your collection. Your channels.\nYour television.", color = Color.White, fontFamily = Barlow, fontSize = 24.sp, lineHeight = 29.sp) + Spacer(Modifier.weight(1f)) + Text("Orbit Classic", color = Muted, fontFamily = TicketType, fontSize = 25.sp) + Text("The satellite spirit, in your universe.", color = Muted, fontFamily = Barlow, fontSize = 16.sp) + } + Column(Modifier.weight(1f).align(Alignment.CenterVertically), verticalArrangement = Arrangement.spacedBy(10.dp)) { + OrbitButton("Connect Emby / Check a small sample", Modifier.fillMaxWidth(), onClick = { onNavigate("Connect Emby") }) + OrbitButton("TV Guide / What's on now", Modifier.fillMaxWidth(), onClick = { onNavigate("TV Guide") }) + OrbitButton("OrbOffice / Special transmissions", Modifier.fillMaxWidth(), onClick = { onNavigate("Box Office") }) + OrbitButton("Services / Orbit Interactive", Modifier.fillMaxWidth(), onClick = { onNavigate("Services") }) + } + } +} + +@Composable +internal fun OrbOffice(modifier: Modifier = Modifier, onGuide: () -> Unit) { + var selectedEvent by remember { mutableIntStateOf(0) } + val event = officeEvents[selectedEvent] + Row(modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(24.dp)) { + Column(Modifier.weight(1.55f).fillMaxHeight()) { + Row(verticalAlignment = Alignment.Bottom) { + Text("OrbOffice", color = Yellow, fontFamily = TicketType, fontSize = 36.sp) + Text(" Your front-row seat.", color = Muted, fontFamily = Barlow, fontSize = 17.sp, modifier = Modifier.padding(bottom = 5.dp)) + } + Spacer(Modifier.height(10.dp)) + AdmissionTicket(event, Modifier.fillMaxWidth().weight(1f)) + Spacer(Modifier.height(8.dp)) + Text("Preview ticket • Fictional event • Included in your collection", color = Muted, fontFamily = Barlow, fontSize = 13.sp) + } + Column(Modifier.weight(1f).fillMaxHeight(), verticalArrangement = Arrangement.spacedBy(10.dp)) { + Text("Special transmissions", color = Color.White, fontFamily = Barlow, fontWeight = FontWeight.SemiBold, fontSize = 23.sp) + officeEvents.forEachIndexed { index, item -> + OrbitButton(item.collection, Modifier.fillMaxWidth(), selected = selectedEvent == index, + onFocus = { selectedEvent = index }, onClick = { selectedEvent = index }) + } + Text(event.synopsis, color = Muted, fontFamily = Barlow, fontSize = 18.sp, lineHeight = 23.sp) + Spacer(Modifier.weight(1f)) + Text("Event playback comes with the Emby connection. For now, explore the ticket and the guide.", color = Muted, fontFamily = Barlow, fontSize = 14.sp) + OrbitButton("Return to TV Guide", Modifier.fillMaxWidth(), onClick = onGuide) + } + } +} + +@Composable +private fun AdmissionTicket(event: OfficeEvent, modifier: Modifier = Modifier) { + Box(modifier.background(Paper)) { + Canvas(Modifier.matchParentSize()) { + val seam = size.width * .76f + drawLine(Navy.copy(alpha = .45f), Offset(seam, 0f), Offset(seam, size.height), + strokeWidth = 1.dp.toPx(), pathEffect = PathEffect.dashPathEffect(floatArrayOf(5.dp.toPx(), 5.dp.toPx()))) + for (i in 0..11) { + val y = (i + .5f) * size.height / 12 + drawCircle(Navy, 5.dp.toPx(), Offset(0f, y)) + drawCircle(Navy, 5.dp.toPx(), Offset(size.width, y)) + } + drawCircle(Navy, 9.dp.toPx(), Offset(seam, 0f)) + drawCircle(Navy, 9.dp.toPx(), Offset(seam, size.height)) + } + Row(Modifier.fillMaxSize()) { + Column(Modifier.weight(.76f).fillMaxHeight().padding(horizontal = 22.dp, vertical = 18.dp)) { + Text("OrbOffice", color = Navy, fontFamily = TicketType, fontSize = 27.sp) + Text(event.collection, color = Navy, fontFamily = Barlow, fontSize = 14.sp) + Spacer(Modifier.height(14.dp)) + Text(event.title, color = Navy, fontFamily = TicketType, fontSize = 33.sp, lineHeight = 35.sp, maxLines = 3) + Spacer(Modifier.weight(1f)) + Text(event.time, color = Navy, fontFamily = Barlow, fontWeight = FontWeight.SemiBold, fontSize = 18.sp) + Text("One universe. Best seat in the house.", color = Navy.copy(alpha = .75f), fontFamily = Barlow, fontSize = 14.sp) + Spacer(Modifier.height(12.dp)) + Text("Admit one", Modifier.background(Yellow).padding(horizontal = 14.dp, vertical = 5.dp), color = Navy, fontFamily = TicketType, fontSize = 23.sp) + } + Column(Modifier.weight(.24f).fillMaxHeight().padding(horizontal = 10.dp, vertical = 22.dp), horizontalAlignment = Alignment.CenterHorizontally) { + Text("orbit", color = Navy, fontFamily = Barlow, fontWeight = FontWeight.SemiBold, fontSize = 21.sp) + Text("Front row", color = Navy, fontFamily = TicketType, fontSize = 19.sp) + Spacer(Modifier.weight(1f)) + Text("01", color = Navy, fontFamily = TicketType, fontSize = 52.sp) + Text("Seat", color = Navy, fontFamily = Barlow, fontSize = 14.sp) + Spacer(Modifier.weight(1f)) + Text(event.reference, color = Navy, fontFamily = TicketType, fontSize = 17.sp) + Text("Preview", color = Navy.copy(alpha = .65f), fontFamily = Barlow, fontSize = 12.sp) + } + } + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/RememberedConnectionStore.kt b/android/app/src/main/java/tv/orbit/classic/RememberedConnectionStore.kt new file mode 100644 index 0000000..4f4d190 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/RememberedConnectionStore.kt @@ -0,0 +1,88 @@ +package tv.orbit.classic + +import android.content.Context +import android.security.keystore.KeyGenParameterSpec +import android.security.keystore.KeyProperties +import android.util.AtomicFile +import java.io.File +import java.security.KeyStore +import javax.crypto.Cipher +import javax.crypto.KeyGenerator +import javax.crypto.SecretKey +import javax.crypto.spec.GCMParameterSpec + +internal object ConnectionCipher { + private val aad = "tv.orbit.classic/remembered-connection/v1".toByteArray(Charsets.UTF_8) + fun seal(key: SecretKey, plain: ByteArray): ByteArray { + require(plain.size <= RememberedStateCodec.MAX_BYTES) + val cipher = Cipher.getInstance("AES/GCM/NoPadding") + cipher.init(Cipher.ENCRYPT_MODE, key); cipher.updateAAD(aad) + require(cipher.iv.size == 12) + return byteArrayOf(1) + cipher.iv + cipher.doFinal(plain) + } + fun open(key: SecretKey, envelope: ByteArray): ByteArray { + require(envelope.size in 29..(RememberedStateCodec.MAX_BYTES + 29) && envelope[0] == 1.toByte()) + val cipher = Cipher.getInstance("AES/GCM/NoPadding") + cipher.init(Cipher.DECRYPT_MODE, key, GCMParameterSpec(128, envelope.copyOfRange(1, 13))) + cipher.updateAAD(aad) + return cipher.doFinal(envelope.copyOfRange(13, envelope.size)) + } +} + +/** App-private, backup-excluded, authenticated ciphertext only. All operations serialize. */ +internal class RememberedConnectionStore private constructor(context: Context) { + companion object { + private var instance: RememberedConnectionStore? = null + @Synchronized fun get(context: Context): RememberedConnectionStore = instance + ?: RememberedConnectionStore(context.applicationContext).also { instance = it } + } + @Synchronized fun invalidate() { generation++ } + private val file = AtomicFile(File(context.noBackupFilesDir, "orbit-connection.v1")) + private val alias = "orbit-connection-key-v1" + private var generation = 0L + @Synchronized fun ticket() = generation + private fun key(create: Boolean): SecretKey { + val store = KeyStore.getInstance("AndroidKeyStore").apply { load(null) } + (store.getKey(alias, null) as? SecretKey)?.let { return it } + check(create) + return KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore").apply { + init(KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_GCM).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) + .setKeySize(256).setRandomizedEncryptionRequired(true).build()) + }.generateKey() + } + @Synchronized fun load(): RememberedState? { + if (!file.baseFile.exists() && !File(file.baseFile.path + ".bak").exists()) return null + return file.openRead().use { input -> + val bytes = input.readBytesLimited(RememberedStateCodec.MAX_BYTES + 29) + RememberedStateCodec.decode(ConnectionCipher.open(key(false), bytes)) + } + } + @Synchronized fun save(state: RememberedState, ticket: Long): Boolean { + if (ticket != generation) return false + val plain = RememberedStateCodec.encode(state) + // Validate the same bounded schema before committing it. + RememberedStateCodec.decode(plain) + val encrypted = ConnectionCipher.seal(key(true), plain) + val output = file.startWrite() + try { output.write(encrypted); file.finishWrite(output) } + catch (failure: Exception) { file.failWrite(output); throw failure } + return true + } + @Synchronized fun clear() { + generation++ + file.delete() + KeyStore.getInstance("AndroidKeyStore").apply { load(null); if (containsAlias(alias)) deleteEntry(alias) } + } +} + +private fun java.io.InputStream.readBytesLimited(max: Int): ByteArray { + val output = java.io.ByteArrayOutputStream() + val buffer = ByteArray(8192) + while (true) { + val count = read(buffer); if (count < 0) break + require(output.size() + count <= max) + output.write(buffer, 0, count) + } + return output.toByteArray() +} diff --git a/android/app/src/main/java/tv/orbit/classic/RememberedState.kt b/android/app/src/main/java/tv/orbit/classic/RememberedState.kt new file mode 100644 index 0000000..307bf38 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/RememberedState.kt @@ -0,0 +1,97 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject + +// Intentionally not data classes: default toString must never expose an access token. +internal class RememberedIdentity(val userId: String, val token: String?, val deviceId: String) +internal class RememberedState(val identity: RememberedIdentity, val sample: EmbySample, + val matches: List, val approved: Set, val episodes: List?, + val orbitOne: SampleChannel?, val toonami: SampleChannel?, val selectedNumber: Int, + val afterDark: SampleChannel? = null, val darkMovies: List = emptyList(), val approvedDark: Set = emptySet()) { + fun withoutToken() = RememberedState(RememberedIdentity(identity.userId, null, identity.deviceId), sample, + matches, approved, episodes, orbitOne, toonami, selectedNumber, afterDark, darkMovies, approvedDark) +} + +internal object RememberedStateCodec { + const val MAX_BYTES = 512 * 1024 + private fun arr(items: Iterable) = JSONArray().also { a -> items.forEach { a.put(it) } } + private fun candidate(s: SeriesCandidate) = JSONObject().put("id", s.id).put("title", s.title) + .put("year", s.year ?: JSONObject.NULL).put("rating", s.rating).put("variant", s.variantLabel) + private fun item(s: SampleItem) = JSONObject().put("id", s.id).put("title", s.title).put("type", s.type) + .put("format", s.format).put("duration", s.durationMs ?: JSONObject.NULL) + private fun channel(c: SampleChannel?) = c?.let { JSONObject().put("number", it.number).put("name", it.name) + .put("entries", arr(it.lineup.map { m -> JSONObject().put("item", item(m.item)).put("source", m.sourceId).put("duration", m.durationMs) })) } ?: JSONObject.NULL + fun encode(state: RememberedState): ByteArray { + val i = state.identity + val root = JSONObject().put("schema", 1).put("origin", HttpsEmbyTransport.SERVER) + .put("user", i.userId).put("token", i.token ?: JSONObject.NULL).put("device", i.deviceId) + .put("sample", arr(state.sample.items.map(::item))).put("total", state.sample.total ?: JSONObject.NULL) + .put("matches", arr(state.matches.map { m -> JSONObject().put("requested", m.requested).put("more", m.moreAvailable).put("candidates", arr(m.candidates.map(::candidate))) })) + .put("approved", JSONArray(state.approved.toList())).put("selected", if (state.selectedNumber == 102) 101 else state.selectedNumber) + .put("selectedChannel", state.selectedNumber).put("afterDark", channel(state.afterDark)) + .put("darkMovies", arr(state.darkMovies.map { movie -> JSONObject().put("item", item(movie.item)).put("year", movie.year ?: JSONObject.NULL) + .put("rating", movie.rating).put("genres", JSONArray(movie.genres)) })) + .put("approvedDark", JSONArray(state.approvedDark.toList())) + .put("one", channel(state.orbitOne)).put("toonami", channel(state.toonami)) + .put("episodes", state.episodes?.let { groups -> arr(groups.map { group -> JSONObject().put("series", candidate(group.series)).put("more", group.moreAvailable) + .put("items", arr(group.episodes.map { e -> JSONObject().put("id", e.id).put("title", e.title) + .put("season", e.season ?: JSONObject.NULL).put("episode", e.episode ?: JSONObject.NULL) + .put("duration", e.durationMs ?: JSONObject.NULL).put("media", e.mediaLabel) })) }) } ?: JSONObject.NULL) + return root.toString().toByteArray(Charsets.UTF_8).also { require(it.size <= MAX_BYTES) } + } + private fun text(o: JSONObject, key: String, max: Int, blank: Boolean = true): String = o.getString(key).also { + require(it.length <= max && (blank || it.isNotBlank()) && it.none(Char::isISOControl)) + } + private fun id(o: JSONObject, key: String) = text(o, key, 128, false).also { require(EmbyClient.validId(it)) } + private fun list(o: JSONObject, key: String, max: Int): List = o.getJSONArray(key).let { a -> + require(a.length() <= max); (0 until a.length()).map { a.getJSONObject(it) } + } + private fun duration(o: JSONObject) = if (o.isNull("duration")) null else o.getLong("duration").also { require(it in 1..SampleChannel.MAX_DURATION_MS) } + private fun readItem(o: JSONObject): SampleItem { + val d = duration(o) + return SampleItem(text(o, "title", 600, false), text(o, "type", 16).also { require(it in listOf("Movie", "Episode")) }, d?.div(60_000), text(o, "format", 160), id(o, "id"), d) + } + private fun readCandidate(o: JSONObject) = SeriesCandidate(id(o, "id"), text(o, "title", 160, false), + if (o.isNull("year")) null else o.getInt("year").also { require(it in 1800..2200) }, text(o, "rating", 40), text(o, "variant", 40)) + private fun readChannel(o: JSONObject, key: String, number: Int): SampleChannel? { + if (o.isNull(key)) return null + val c = o.getJSONObject(key); require(c.getInt("number") == number) + return SampleChannel(list(c, "entries", 15).map { m -> ScheduledMedia(readItem(m.getJSONObject("item")), id(m, "source"), requireNotNull(duration(m))) }, text(c, "name", 80, false), number) + } + fun decode(bytes: ByteArray): RememberedState { + require(bytes.size <= MAX_BYTES) + val o = JSONObject(bytes.toString(Charsets.UTF_8)); require(o.getInt("schema") == 1 && o.getString("origin") == HttpsEmbyTransport.SERVER) + val token = if (o.isNull("token")) null else o.getString("token").also { require(it.isNotEmpty() && it.length <= 4096 && it.all { c -> c.code in 33..126 }) } + val identity = RememberedIdentity(id(o, "user"), token, id(o, "device")) + val sample = EmbySample(list(o, "sample", 20).map(::readItem), if (o.isNull("total")) null else o.getLong("total").also { require(it >= 0) }) + val matches = list(o, "matches", ToonamiSearches.size).map { m -> SeriesMatches(text(m, "requested", 80).also { require(it in ToonamiSearches) }, list(m, "candidates", 10).map(::readCandidate), m.getBoolean("more")) } + require(matches.map { it.requested } == ToonamiSearches.take(matches.size)) + val approvedArray = o.getJSONArray("approved"); require(approvedArray.length() <= 3) + val approved = (0 until approvedArray.length()).map { approvedArray.getString(it) }.toSet() + require(approved.all { value -> matches.any { m -> m.candidates.any { it.id == value } } }) + val episodes = if (o.isNull("episodes")) null else list(o, "episodes", 3).map { group -> + val series = readCandidate(group.getJSONObject("series")); require(series.id in approved) + SeriesEpisodes(series, list(group, "items", 5).map { e -> EpisodeCandidate(id(e, "id"), text(e, "title", 160, false), + if (e.isNull("season")) null else e.getInt("season").also { require(it >= 0) }, + if (e.isNull("episode")) null else e.getInt("episode").also { require(it >= 0) }, duration(e), text(e, "media", 200)) }, group.getBoolean("more")) + } + val one = readChannel(o, "one", 101); val toonami = readChannel(o, "toonami", 103) + require(one == null || one.lineup.all { m -> sample.items.any { it.id == m.item.id } }) + val dark = readChannel(o, "afterDark", 102) + require(dark == null || (dark.lineup.size in 2..3 && dark.lineup.all { it.item.type == "Movie" })) + val darkMovies = if (!o.has("darkMovies")) emptyList() else list(o, "darkMovies", 60).map { movie -> + val media = readItem(movie.getJSONObject("item")); require(media.type == "Movie") + val genres = movie.getJSONArray("genres"); require(genres.length() <= 8) + AfterDarkMovie(media, if (movie.isNull("year")) null else movie.getInt("year").also { require(it in 1800..2200) }, + text(movie, "rating", 40), (0 until genres.length()).map { i -> genres.getString(i).also { require(it.length <= 40 && it.none(Char::isISOControl)) } }) + } + require(darkMovies.map { it.item.id }.distinct().size == darkMovies.size) + val darkApproval = o.optJSONArray("approvedDark") ?: JSONArray() + require(darkApproval.length() <= 3) + val approvedDark = (0 until darkApproval.length()).map { darkApproval.getString(it) }.toSet() + require(approvedDark.all { value -> darkMovies.any { it.item.id == value } }) + val selected = o.optInt("selectedChannel", o.getInt("selected")); require(selected in 101..103) + return RememberedState(identity, sample, matches, approved, episodes, one, toonami, selected, dark, darkMovies, approvedDark) + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/SampleChannel.kt b/android/app/src/main/java/tv/orbit/classic/SampleChannel.kt new file mode 100644 index 0000000..d1a0a88 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/SampleChannel.kt @@ -0,0 +1,44 @@ +package tv.orbit.classic + +internal data class ScheduledMedia(val item: SampleItem, val sourceId: String, val durationMs: Long) +internal data class SampleBroadcast(val media: ScheduledMedia, val startMs: Long) { + val endMs: Long get() = startMs + media.durationMs + fun offsetAt(timeMs: Long) = (timeMs - startMs).coerceIn(0, media.durationMs - 1) +} + +/** A repeating UTC timeline: it advances even when no screen or player exists. */ +internal class SampleChannel(entries: List, val name: String = "Orbit One", val number: Int = 101) { + val lineup = entries.toList() + companion object { const val MAX_DURATION_MS = 7 * 24 * 60 * 60 * 1000L } + init { + require(lineup.size in 2..15) + require(lineup.map { it.item.id }.distinct().size == lineup.size) + require(lineup.all { EmbyClient.validId(it.item.id) && EmbyClient.validId(it.sourceId) && it.durationMs in 1_000..MAX_DURATION_MS }) + } + val cycleMs = lineup.sumOf { it.durationMs } + fun at(timeMs: Long): SampleBroadcast { + require(timeMs in -8_000_000_000_000_000L..8_000_000_000_000_000L) + val position = Math.floorMod(timeMs, cycleMs) + var cursor = 0L + for (media in lineup) { + if (position < cursor + media.durationMs) return SampleBroadcast(media, timeMs - position + cursor) + cursor += media.durationMs + } + error("Unreachable channel position") + } + fun guide(timeMs: Long, count: Int = 6): List { + require(count in 1..48) + var current = at(timeMs) + return List(count) { current.also { current = at(it.endMs) } } + } + fun transitionCheckOffset(timeMs: Long): Long { + val programme = at(timeMs) + val remaining = minOf(10_000L, programme.media.durationMs / 2).coerceAtLeast(1) + return programme.endMs - remaining - timeMs + } +} + +internal data class ScheduledPlayback(val channel: SampleChannel, val programme: SampleBroadcast, + val next: SampleBroadcast, val clockOffsetMs: Long = 0) { + fun nowMs() = System.currentTimeMillis() + clockOffsetMs +} diff --git a/android/app/src/main/java/tv/orbit/classic/SampleChannelScreens.kt b/android/app/src/main/java/tv/orbit/classic/SampleChannelScreens.kt new file mode 100644 index 0000000..7308780 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/SampleChannelScreens.kt @@ -0,0 +1,149 @@ +package tv.orbit.classic + +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.Image +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.layout.ContentScale +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.focusable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import androidx.compose.ui.window.SecureFlagPolicy +import androidx.tv.material3.Text +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + +@Composable +internal fun SampleChannelGuide(channel: SampleChannel, modifier: Modifier = Modifier, + onTune: (Long) -> Unit, onBack: () -> Unit, otherChannels: List = emptyList(), onSwitch: (Int) -> Unit = {}) { + var now by remember { mutableLongStateOf(System.currentTimeMillis()) } + LaunchedEffect(Unit) { while (true) { delay(1000); now = System.currentTimeMillis() } } + val shows = channel.guide(now) + val tuneFocus = remember { FocusRequester() } + LaunchedEffect(Unit) { tuneFocus.requestFocus() } + BackHandler(onBack = onBack) + val branding = ChannelBrands.forNumber(channel.number) + Box(modifier.fillMaxWidth().background(if (branding != null) Navy else Panel)) { + if (branding != null) Image(painterResource(branding.background), null, Modifier.matchParentSize(), contentScale = ContentScale.Crop, alpha = .65f) + Column(Modifier.fillMaxSize().padding(18.dp), verticalArrangement = Arrangement.spacedBy(10.dp)) { + Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Text("TV Guide", color = Yellow, fontSize = 26.sp, fontWeight = FontWeight.Bold) + Spacer(Modifier.weight(1f)) + otherChannels.forEach { other -> OrbitButton("${other.number} ${other.name}", onClick = { onSwitch(other.number) }) } + Text(clock(now), color = Color.White, fontSize = 20.sp) + } + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(16.dp)) { + Column(Modifier.width(125.dp)) { + Text(channel.number.toString(), color = Yellow, fontSize = 36.sp, fontWeight = FontWeight.Bold) + if (branding != null) Image(painterResource(branding.logo), channel.name, Modifier.width(125.dp).height(40.dp)) + else Text(channel.name, color = Color.White, fontSize = 19.sp) + } + Column(Modifier.weight(1f)) { + Text("NOW ${clock(shows[0].startMs)}–${clock(shows[0].endMs)}", color = Yellow, fontSize = 15.sp) + Text(shows[0].media.item.title, color = Color.White, fontSize = 23.sp, maxLines = 2) + } + Column(Modifier.weight(1f)) { + Text("NEXT ${clock(shows[1].startMs)}", color = Muted, fontSize = 15.sp) + Text(shows[1].media.item.title, color = Color.White, fontSize = 21.sp, maxLines = 2) + } + } + LazyColumn(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(6.dp)) { + items(shows.drop(1), key = { it.startMs }) { show -> + var focused by remember { mutableStateOf(false) } + Row(Modifier.fillMaxWidth().onFocusChanged { focused = it.isFocused }.background(Blue) + .border(1.dp, if (focused) Yellow else Blue).focusable().padding(10.dp), horizontalArrangement = Arrangement.spacedBy(16.dp)) { + Text("${clock(show.startMs)}–${clock(show.endMs)}", color = Yellow, fontSize = 15.sp, modifier = Modifier.width(125.dp)) + Text(show.media.item.title, color = Color.White, fontSize = 16.sp, maxLines = 1) + } + } + } + Row(horizontalArrangement = Arrangement.spacedBy(10.dp)) { + OrbitButton("Watch channel", Modifier.focusRequester(tuneFocus), onClick = { onTune(0) }) + OrbitButton("Check transition", onClick = { onTune(channel.transitionCheckOffset(System.currentTimeMillis())) }) + OrbitButton("Menu", onClick = onBack) + } + Text("${channel.lineup.size} titles • Transition check joins near the end and may update your provider’s viewing history.", color = Muted, fontSize = 12.sp) + } + } +} + +@Composable +internal fun ScheduledChannelPlayer(session: EmbySampleSession, channel: SampleChannel, clockOffsetMs: Long, + onClose: () -> Unit) { + var now by remember { mutableLongStateOf(System.currentTimeMillis() + clockOffsetMs) } + LaunchedEffect(channel, clockOffsetMs) { while (true) { now = System.currentTimeMillis() + clockOffsetMs; delay(250) } } + val shows = channel.guide(now, 2) + val current = shows[0] + val prepareMutex = remember(channel) { Mutex() } + var prepared by remember(channel) { mutableStateOf(null) } + var preparedSlot by remember(channel) { mutableStateOf(null) } + var problem by remember(channel) { mutableStateOf(null) } + var retryAttempt by remember(channel) { mutableIntStateOf(0) } + // A new wall-clock slot disposes the old player before opening its successor. + LaunchedEffect(channel, current.startMs, retryAttempt) { + prepared = null; preparedSlot = null; problem = null + try { + val plan = prepareMutex.withLock { + withContext(Dispatchers.IO) { + session.prepare(current.media.item, preferredSourceId = current.media.sourceId) + } + } + if (plan.durationMs == null || kotlin.math.abs(plan.durationMs - current.media.durationMs) > 2_000) + throw EmbyCheckException("This programme's runtime changed. Return and rebuild the sample channel.") + preparedSlot = current.startMs; prepared = plan + } catch (cancelled: CancellationException) { throw cancelled } + catch (failure: EmbyCheckException) { problem = failure.message } + catch (_: Exception) { problem = "This scheduled programme could not be opened. Return to the guide and try again." } + } + // Suppress the preceding plan immediately at a boundary while the effect schedules its replacement. + val plan = prepared?.takeIf { it.item.id == current.media.item.id && preparedSlot == current.startMs && problem == null } + if (plan != null) { + key(current.startMs) { + EmbyPlaybackDialog(session, plan, onClose, + scheduled = ScheduledPlayback(channel, current, shows[1], clockOffsetMs)) + } + } else Dialog(onDismissRequest = onClose, properties = DialogProperties(usePlatformDefaultWidth = false, + decorFitsSystemWindows = false, securePolicy = SecureFlagPolicy.SecureOn)) { + if (problem == null) ChannelTuningBackdrop(channel.number) + else Box(Modifier.fillMaxSize().background(Navy)) { + Column(Modifier.align(Alignment.Center).widthIn(max = 620.dp).padding(32.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) { + Text(problem.orEmpty(), color = Color.White, fontSize = 20.sp) + val retryFocus = remember { FocusRequester() } + LaunchedEffect(problem) { retryFocus.requestFocus() } + OrbitButton("Retry", Modifier.focusRequester(retryFocus), onClick = { + problem = null + retryAttempt++ + }) + OrbitButton("Return to TV guide", onClick = onClose) + } + } + } + +} + +@Composable +internal fun ClassicTuningNumber(number: Int, modifier: Modifier = Modifier) { + Text(number.toString(), modifier = modifier, color = Color(0xFF47FF52), fontSize = 46.sp, + fontFamily = androidx.compose.ui.text.font.FontFamily.Monospace, + fontWeight = FontWeight.Bold, + style = androidx.compose.ui.text.TextStyle(shadow = androidx.compose.ui.graphics.Shadow( + Color.Black, androidx.compose.ui.geometry.Offset(2f, 2f), 2f))) +} diff --git a/android/app/src/main/java/tv/orbit/classic/Schedule.kt b/android/app/src/main/java/tv/orbit/classic/Schedule.kt new file mode 100644 index 0000000..a15aafd --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/Schedule.kt @@ -0,0 +1,35 @@ +package tv.orbit.classic + +/** Fixed UTC slots survive process restarts; only display formatting uses local time. */ +data class Programme(val title: String, val synopsis: String, val start: Long, val duration: Long) { + val end: Long get() = start + duration + fun offsetAt(now: Long): Long = (now - start).coerceIn(0, duration - 1) +} +data class Channel(val number: Int, val name: String, val shows: List>) +object Schedule { + const val SLOT = 1_800_000L + val channels = listOf( + Channel(101, "Orbit One", listOf( + "The Midnight Observatory" to "An astronomer follows a mysterious signal across the night sky.", + "Small Town, Big Orbit" to "An eccentric village prepares for its annual space festival.", + "Beyond the Blue" to "Explorers chart an ocean beneath an unfamiliar moon.", + "The Last Shuttle Home" to "One final journey brings an unlikely crew together.")), + Channel(202, "Orbit Sci-Fi", listOf( + "Signal from Europa" to "A research team discovers that the ice is listening.", + "Starbound Dispatch" to "Stories from the delivery route at the edge of the galaxy.", + "Visitors at Dawn" to "First contact arrives in the quietest corner of Earth.", + "Station Nine" to "Life, repairs and peculiar neighbours on a remote outpost.")), + Channel(401, "Orbit Kids", listOf( + "Moonbug Rangers" to "A brave little team protects a very big lunar garden.", + "The Comet Club" to "Saturday adventures with the galaxy's most curious friends.", + "Rocket Pocket" to "An inventor's tiny rocket causes enormous surprises.", + "Planet of Puzzles" to "Every new world has a puzzle waiting to be solved.")) + ) + fun programme(channel: Channel, time: Long): Programme { + val slot = Math.floorDiv(time, SLOT) + val show = channel.shows[Math.floorMod(slot, channel.shows.size.toLong()).toInt()] + return Programme(show.first, show.second, slot * SLOT, SLOT) + } + fun guide(channel: Channel, time: Long, count: Int = 3) = + List(count) { programme(channel, time + it * SLOT) } +} diff --git a/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt b/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt new file mode 100644 index 0000000..46f35c5 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt @@ -0,0 +1,103 @@ +package tv.orbit.classic + +import android.net.Uri +import androidx.media3.common.C +import androidx.media3.datasource.BaseDataSource +import androidx.media3.datasource.DataSpec +import java.io.IOException +import java.io.InputStream +import java.net.InetAddress +import java.net.URI +import java.net.URL +import javax.net.ssl.HttpsURLConnection + +/** Redirect handling is explicit so provider credentials never follow a stream to a CDN. */ +internal class MediaDeliveryException(message: String) : IOException(message) + +@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class) +internal class SecureMediaDataSource(private val session: EmbySampleSession) : BaseDataSource(true) { + private var connection: HttpsURLConnection? = null + private var stream: InputStream? = null + private var currentUri: Uri? = null + private var remaining = C.LENGTH_UNSET.toLong() + private var opened = false + override fun open(dataSpec: DataSpec): Long { + transferInitializing(dataSpec) + try { + var address = session.mediaUrl(dataSpec.uri.toString()) + for (redirect in 0..5) { + val host = URI(address).host + if (InetAddress.getAllByName(host).any { !isPublicMediaAddress(it) }) throw MediaDeliveryException("Media delivery resolved to a non-public address.") + val next = URL(address).openConnection() as HttpsURLConnection + connection = next + next.instanceFollowRedirects = false + next.connectTimeout = 10_000 + next.readTimeout = 20_000 + next.setRequestProperty("User-Agent", "OrbitTV/0.16.0") + next.setRequestProperty("Accept-Encoding", "identity") + session.mediaHeaders(address).forEach { (key, value) -> next.setRequestProperty(key, value) } + if (dataSpec.position != 0L || dataSpec.length != C.LENGTH_UNSET.toLong()) { + val end = if (dataSpec.length == C.LENGTH_UNSET.toLong()) "" else (dataSpec.position + dataSpec.length - 1).toString() + next.setRequestProperty("Range", "bytes=${dataSpec.position}-$end") + } + val status = next.responseCode + if (status in listOf(301, 302, 303, 307, 308)) { + val location = next.getHeaderField("Location") ?: throw MediaDeliveryException("The media redirect had no destination.") + if (redirect == 5) throw MediaDeliveryException("The stream redirected too many times.") + address = session.mediaUrl(location, address) + next.disconnect(); connection = null + continue + } + if (status !in 200..299) throw MediaDeliveryException("The media host returned HTTP $status.") + if (status == 200 && dataSpec.position > 0) throw MediaDeliveryException("The media host did not support byte-range seeking.") + if (status == 206 && !mediaRangeStartsAt(next.getHeaderField("Content-Range"), dataSpec.position)) + throw MediaDeliveryException("The media host returned an unexpected seek position.") + currentUri = Uri.parse(address) + val length = next.contentLengthLong + remaining = if (dataSpec.length != C.LENGTH_UNSET.toLong()) dataSpec.length else if (length >= 0) length else C.LENGTH_UNSET.toLong() + stream = next.inputStream + opened = true; transferStarted(dataSpec) + return remaining + } + throw MediaDeliveryException("The stream could not be opened.") + } catch (failure: IOException) { close(); throw if (failure is MediaDeliveryException) failure else IOException("The secure media connection could not be opened.") } + catch (_: Exception) { close(); throw IOException("The secure media connection could not be opened.") } + } + override fun read(buffer: ByteArray, offset: Int, length: Int): Int { + if (length == 0) return 0 + if (remaining == 0L) return C.RESULT_END_OF_INPUT + val count = if (remaining == C.LENGTH_UNSET.toLong()) length else minOf(length.toLong(), remaining).toInt() + val read = try { stream?.read(buffer, offset, count) ?: C.RESULT_END_OF_INPUT } + catch (_: IOException) { throw IOException("The media connection was interrupted.") } + if (read == -1) { + if (remaining > 0) throw IOException("The media stream ended before the expected length.") + return C.RESULT_END_OF_INPUT + } + if (remaining != C.LENGTH_UNSET.toLong()) remaining -= read + bytesTransferred(read) + return read + } + override fun getUri(): Uri? = currentUri + override fun getResponseHeaders(): Map> = connection?.getHeaderField("Content-Type")?.let { mapOf("Content-Type" to listOf(it)) } ?: emptyMap() + override fun close() { + try { stream?.close() } catch (_: IOException) { } + finally { + stream = null; connection?.disconnect(); connection = null; currentUri = null + if (opened) { opened = false; transferEnded() } + } + } +} + +internal fun isPublicMediaAddress(address: InetAddress): Boolean { + if (address.isAnyLocalAddress || address.isLoopbackAddress || address.isLinkLocalAddress || address.isSiteLocalAddress || address.isMulticastAddress) return false + val bytes = address.address.map { it.toInt() and 255 } + if (bytes.size == 16 && bytes[0] and 254 == 252) return false + if (bytes.size == 4 && (bytes[0] == 0 || bytes[0] >= 224 || (bytes[0] == 100 && bytes[1] in 64..127) || + (bytes[0] == 198 && bytes[1] in 18..19) || (bytes[0] == 192 && bytes[1] == 0 && bytes[2] == 0))) return false + return true +} + +internal fun mediaRangeStartsAt(header: String?, position: Long): Boolean { + val match = Regex("bytes ([0-9]+)-([0-9]+)/(?:[0-9]+|\\*)", RegexOption.IGNORE_CASE).matchEntire(header.orEmpty()) ?: return false + return match.groupValues[1].toLongOrNull() == position +} diff --git a/android/app/src/main/java/tv/orbit/classic/SeriesDiscovery.kt b/android/app/src/main/java/tv/orbit/classic/SeriesDiscovery.kt new file mode 100644 index 0000000..f2391ee --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/SeriesDiscovery.kt @@ -0,0 +1,50 @@ +package tv.orbit.classic + +import org.json.JSONObject +import java.net.URLEncoder + +internal data class SeriesCandidate(val id: String, val title: String, val year: Int?, val rating: String, val variantLabel: String = "") +internal data class SeriesMatches(val requested: String, val candidates: List, val moreAvailable: Boolean) +internal val ToonamiSearches = listOf("Dragon Ball Z", "Batman Beyond", "Superman", "Powerpuff Girls", "ThunderCats", + "Dragon Ball", "Sailor Moon", "Voltron", "ReBoot", "Beast Wars", + "Jonny Quest", "Robotech", "Ronin Warriors", "Gundam Wing", "Tenchi Muyo", + "Outlaw Star", "The Big O", "Cardcaptors", "Zoids", "Dragon Ball GT", + "Naruto", "Samurai Jack", "Justice League") + +/** At most five explicit series searches per action, ten candidates each. */ +internal fun discoverToonamiSeries(transport: EmbyTransport, userId: String, token: () -> String, startIndex: Int, checkActive: () -> Unit = {}): List { + require(EmbyClient.validId(userId)) + require(startIndex in 0..ToonamiSearches.size) + return ToonamiSearches.drop(startIndex).take(5).map { requested -> + checkActive() + val term = URLEncoder.encode(requested, "UTF-8") + val reply = transport.execute(EmbyRequest("GET", "/Items?UserId=$userId&Recursive=true&IncludeItemTypes=Series&SearchTerm=$term&StartIndex=0&Limit=10&SortBy=SortName&SortOrder=Ascending&EnableImages=false&EnableUserData=false", token = token())) + EmbyClient.expectSuccess(reply.status, false) + val body = EmbyClient.parse(reply.body) + val items = body.optJSONArray("Items") ?: throw EmbyCheckException("The provider did not return series search results.") + val candidates = (0 until minOf(items.length(), 10)).mapNotNull { index -> + val item = items.optJSONObject(index) ?: return@mapNotNull null + val id = item.optString("Id") + val title = EmbyClient.clean(item.optString("Name"), 160) + if (item.optString("Type") != "Series" || !EmbyClient.validId(id) || title.isBlank()) return@mapNotNull null + SeriesCandidate(id, title, item.optInt("ProductionYear").takeIf { it in 1800..2200 }, + EmbyClient.clean(item.optString("OfficialRating"), 40)) + }.distinctBy { it.id } + SeriesMatches(requested, labelSeriesVariants(candidates), body.optLong("TotalRecordCount", items.length().toLong()) > 10) + } +} + +internal fun discoverToonamiSeries(transport: EmbyTransport, userId: String, token: () -> String): List = + discoverToonamiSeries(transport, userId, token, 0) + +internal fun labelSeriesVariants(candidates: List): List { + fun key(series: SeriesCandidate) = series.title.trim().lowercase(java.util.Locale.ROOT) to series.year + val totals = candidates.groupingBy { key(it) }.eachCount() + val seen = mutableMapOf, Int>() + return candidates.map { series -> + val key = key(series) + val index = (seen[key] ?: 0) + 1 + seen[key] = index + series.copy(variantLabel = if ((totals[key] ?: 0) > 1) "Entry $index of ${totals[key]}" else "") + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/SeriesReviewScreen.kt b/android/app/src/main/java/tv/orbit/classic/SeriesReviewScreen.kt new file mode 100644 index 0000000..2bb688a --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/SeriesReviewScreen.kt @@ -0,0 +1,70 @@ +package tv.orbit.classic + +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.tv.material3.Text + +@Composable +internal fun SeriesReviewScreen(matches: List, approved: Set, episodes: List?, + busy: Boolean, message: String?, modifier: Modifier, + onToggle: (String) -> Unit, onMore: () -> Unit, onEpisodes: () -> Unit, onBuild: () -> Unit, onBack: () -> Unit) { + val listState = rememberLazyListState() + LaunchedEffect(episodes) { if (episodes != null) listState.scrollToItem(0) } + BackHandler(onBack = onBack) + Column(modifier.fillMaxWidth().background(Panel).padding(18.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text("103 Toonami / Series check", color = Yellow, fontSize = 26.sp) + Text("Choose up to three versions for this sample. Nothing is scheduled yet.", color = Muted, fontSize = 15.sp) + if (busy) Text("Preparing sample…", color = Yellow, fontSize = 15.sp) + message?.let { Text(it, color = Yellow, fontSize = 15.sp) } + LazyColumn(Modifier.weight(1f), state = listState, verticalArrangement = Arrangement.spacedBy(8.dp)) { + episodes?.forEach { sample -> + item("episodes-${sample.series.id}") { + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { + Text("Episode sample / ${sample.series.title} ${sample.series.variantLabel}", color = Yellow, fontSize = 21.sp) + if (sample.episodes.isEmpty()) Text("No usable episodes returned in this page.", color = Muted, fontSize = 15.sp) + sample.episodes.forEach { episode -> + val order = if (episode.season != null && episode.episode != null) "S${episode.season} E${episode.episode}" else "Order unknown" + val runtime = episode.durationMs?.let { "${it / 60_000} min" } ?: "Runtime unknown" + Text("$order • ${episode.title} • $runtime", color = Color.White, fontSize = 16.sp) + if (episode.mediaLabel.isNotBlank()) Text(episode.mediaLabel, color = Muted, fontSize = 14.sp) + } + Text(if (sample.moreAvailable) "Sample page only; more episodes exist." else "Sample page only.", color = Muted, fontSize = 13.sp) + } + } + } + matches.forEachIndexed { groupIndex, group -> + item("heading-$groupIndex") { + Text(group.requested, color = Yellow, fontSize = 21.sp) + if (group.candidates.isEmpty()) Text("No series match returned by this search.", color = Muted, fontSize = 15.sp) + if (group.moreAvailable) Text("Showing at most ten results; other versions may exist.", color = Muted, fontSize = 14.sp) + } + group.candidates.forEach { candidate -> + item("$groupIndex-${candidate.id}") { + val details = listOfNotNull(candidate.year?.toString(), candidate.rating.takeIf { it.isNotBlank() }, candidate.variantLabel.takeIf { it.isNotBlank() }).joinToString(" • ") + Column { + OrbitButton("${if (candidate.id in approved) "✓ Approved" else "+ Approve"} ${candidate.title}", + Modifier.fillMaxWidth(), selected = candidate.id in approved, enabled = !busy && (candidate.id in approved || approved.size < 3), onClick = { onToggle(candidate.id) }) + if (details.isNotEmpty()) Text(details, color = Color.White, fontSize = 14.sp) + } + } + } + } + } + Text("${matches.size}/${ToonamiSearches.size} searches • ${approved.size}/3 series approved • Sample repeats; direct sources checked before scheduling.", color = Muted, fontSize = 14.sp) + if (episodes != null) OrbitButton("Create playable 103", enabled = !busy, onClick = onBuild) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + if (matches.size < ToonamiSearches.size) OrbitButton("Check next five series", enabled = !busy, onClick = onMore) + OrbitButton("Check sample episodes", enabled = !busy && approved.isNotEmpty(), onClick = onEpisodes) + OrbitButton("Back", onClick = onBack) + } + } +} diff --git a/android/app/src/main/java/tv/orbit/classic/ToonamiChannel.kt b/android/app/src/main/java/tv/orbit/classic/ToonamiChannel.kt new file mode 100644 index 0000000..fcc4698 --- /dev/null +++ b/android/app/src/main/java/tv/orbit/classic/ToonamiChannel.kt @@ -0,0 +1,24 @@ +package tv.orbit.classic + +internal fun episodeSampleItem(series: SeriesCandidate, episode: EpisodeCandidate) = SampleItem( + "${series.title} / S${episode.season ?: "?"} E${episode.episode ?: "?"} / ${episode.title}", + "Episode", episode.durationMs?.div(60_000), "", episode.id, episode.durationMs) + +/** Interleave the returned sample, preserving each show's known regular-episode order. */ +internal fun toonamiEpisodeOrder(samples: List): List { + if (samples.size !in 1..3 || samples.map { it.series.id }.distinct().size != samples.size) + throw EmbyCheckException("Check episodes for one to three approved series first.") + val groups = samples.map { group -> + val episodes = group.episodes + if (episodes.size !in 1..5 || episodes.any { it.season == null || it.episode == null || it.season < 1 || it.episode < 1 }) + throw EmbyCheckException("This sample has missing episode order or specials. Choose another series for this test.") + if (episodes.map { it.season to it.episode }.distinct().size != episodes.size) + throw EmbyCheckException("This sample contains duplicate episode numbers. Choose another series version.") + episodes.sortedWith(compareBy { it.season }.thenBy { it.episode }) + .map { episodeSampleItem(group.series, it) } + } + val result = (0 until groups.maxOf { it.size }).flatMap { round -> groups.mapNotNull { it.getOrNull(round) } } + if (result.size < 2 || result.map { it.id }.distinct().size != result.size) + throw EmbyCheckException("This channel needs at least two distinct sample episodes.") + return result +} diff --git a/android/app/src/main/res/drawable-nodpi/orbit_after_dark_background.webp b/android/app/src/main/res/drawable-nodpi/orbit_after_dark_background.webp new file mode 100644 index 0000000..8baba23 Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/orbit_after_dark_background.webp differ diff --git a/android/app/src/main/res/drawable-nodpi/orbit_after_dark_epg.webp b/android/app/src/main/res/drawable-nodpi/orbit_after_dark_epg.webp new file mode 100644 index 0000000..df5b6bc Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/orbit_after_dark_epg.webp differ diff --git a/android/app/src/main/res/drawable-nodpi/orbit_banner.png b/android/app/src/main/res/drawable-nodpi/orbit_banner.png new file mode 100644 index 0000000..7fd1f0f Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/orbit_banner.png differ diff --git a/android/app/src/main/res/drawable/orbit_icon.xml b/android/app/src/main/res/drawable/orbit_icon.xml new file mode 100644 index 0000000..d060114 --- /dev/null +++ b/android/app/src/main/res/drawable/orbit_icon.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/app/src/main/res/font/barlow_condensed_medium.ttf b/android/app/src/main/res/font/barlow_condensed_medium.ttf new file mode 100644 index 0000000..eee49eb Binary files /dev/null and b/android/app/src/main/res/font/barlow_condensed_medium.ttf differ diff --git a/android/app/src/main/res/font/barlow_regular.ttf b/android/app/src/main/res/font/barlow_regular.ttf new file mode 100644 index 0000000..bb3faec Binary files /dev/null and b/android/app/src/main/res/font/barlow_regular.ttf differ diff --git a/android/app/src/main/res/font/barlow_semibold.ttf b/android/app/src/main/res/font/barlow_semibold.ttf new file mode 100644 index 0000000..7c974a4 Binary files /dev/null and b/android/app/src/main/res/font/barlow_semibold.ttf differ diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..35aeebb --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/app/src/test/java/tv/orbit/classic/AfterDarkMoviesTest.kt b/android/app/src/test/java/tv/orbit/classic/AfterDarkMoviesTest.kt new file mode 100644 index 0000000..9b3cd15 --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/AfterDarkMoviesTest.kt @@ -0,0 +1,101 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test + +class AfterDarkMoviesTest { + private fun movie(id: String, genre: String = "Horror") = JSONObject().put("Id", id).put("Type", "Movie") + .put("Name", "Fixture $id").put("ProductionYear", 1999).put("OfficialRating", "18") + .put("Genres", JSONArray().put(genre)).put("Container", "mkv").put("RunTimeTicks", 54_000_000_000L) + private fun page(items: JSONArray) = EmbyReply(200, JSONObject().put("Items", items).toString()) + private fun candidate(id: String) = AfterDarkMovie(SampleItem("Fixture $id", "Movie", 90, "mkv", id, 5_400_000), 1999, "18", listOf("Horror")) + @Test fun genreQueryIsMovieOnlyBoundedAndCredentialsStayInHeaders() { + val requests = mutableListOf() + val found = discoverAfterDarkMovies(EmbyTransport { r -> requests += r; page(JSONArray().put(movie("one", "Science Fiction"))) }, "fixture-user", { "fixture-token" }, "Science Fiction") + val r = requests.single(); assertEquals("GET", r.method); assertEquals("fixture-token", r.token) + assertTrue(r.path.contains("Genres=Science+Fiction&")); assertTrue(r.path.contains("Limit=20")); assertTrue(r.path.contains("IncludeItemTypes=Movie")) + assertFalse(r.path.contains("fixture-token")); assertEquals("one", found.single().item.id) + } + @Test fun requiresGenreEvidenceAndRejectsForeignTypesUnsafeIdsAndDuplicates() { + val items = JSONArray().put(movie("one")).put(movie("one")).put(movie("wrong", "Comedy")) + .put(movie("series").put("Type", "Series")).put(movie("../bad")).put(JSONObject().put("Type", "Movie").put("Id", "missing")) + val found = discoverAfterDarkMovies(EmbyTransport { page(items) }, "fixture-user", { "fixture-token" }, "Horror") + assertEquals(listOf("one"), found.map { it.item.id }) + } + @Test fun ignoresRecordsBeyondTheRequestedTwentyAndCapsAccumulation() { + val items = JSONArray(); repeat(50) { items.put(movie("id-$it")) } + assertEquals(20, discoverAfterDarkMovies(EmbyTransport { page(items) }, "fixture-user", { "fixture-token" }, "Horror").size) + val merged = mergeAfterDarkMovies(List(55) { candidate("id-$it") }, List(20) { candidate("id-${it + 50}") }) + assertEquals(60, merged.size); assertEquals(60, merged.map { it.item.id }.distinct().size) + } + @Test fun rejectsUnapprovedIdsAndDoesNotAutomaticallySelectFilms() { + val candidates = listOf(candidate("one"), candidate("two"), candidate("three")) + assertEquals(listOf("one", "three"), approvedAfterDarkItems(candidates, setOf("one", "three")).map { it.id }) + for (ids in listOf(emptySet(), setOf("one"), setOf("one", "unknown"), setOf("one", "two", "three", "four"))) { + try { approvedAfterDarkItems(candidates, ids); fail("Invalid approval accepted") } catch (_: EmbyCheckException) { } + } + } + private class Fake : EmbyTransport { + val requests = mutableListOf() + override fun execute(request: EmbyRequest): EmbyReply { + requests += request + if (request.method == "GET") { + val items = JSONArray() + for (id in listOf("one", "two")) items.put(JSONObject().put("Id", id).put("Type", "Movie").put("Name", "Fixture $id").put("Genres", JSONArray().put("Horror"))) + return EmbyReply(200, JSONObject().put("Items", items).toString()) + } + val id = request.path.substringAfter("/Items/").substringBefore('/') + return EmbyReply(200, JSONObject().put("MediaSources", JSONArray().put(JSONObject().put("Id", "$id-source").put("Container", "mkv") + .put("SupportsDirectStream", true).put("RunTimeTicks", 54_001_230_000L))).toString()) + } + } + @Test fun builds102FromExplicitCheckedFilmsWithoutOpeningPlayback() { + val fake = Fake(); val active = EmbySampleSession(fake, "fixture-token", "fixture-user", EmbySample(emptyList(), 0)) + active.checkAfterDarkMovies("Horror") + val channel = active.buildAfterDarkChannel(setOf("one", "two")) + assertEquals(102, channel.number); assertEquals("Orbit After Dark", channel.name) + assertEquals(5_400_123L, channel.lineup.first().durationMs) + assertEquals(3, fake.requests.size) + assertTrue(fake.requests.drop(1).all { !JSONObject(it.body!!).getBoolean("IsPlayback") }) + active.prepare(channel.lineup.first().item, preferredSourceId = "one-source") + assertEquals("one-source", JSONObject(fake.requests.last().body!!).getString("MediaSourceId")) + } + @Test fun rateLimitsStopWithoutRetryOrSelection() { + var count = 0 + try { discoverAfterDarkMovies(EmbyTransport { count++; EmbyReply(429, "private") }, "fixture-user", { "fixture-token" }, "Horror"); fail("Expected failure") } + catch (e: EmbyCheckException) { assertEquals(429, e.httpStatus) } + assertEquals(1, count) + } + @Test fun oldSavedSetupStillLoadsAnd102RoundTripKeepsTheExistingClock() { + val old = RememberedState(RememberedIdentity("fixture-user", "fixture-token", "fixture-device"), EmbySample(emptyList(), 0), emptyList(), emptySet(), null, null, null, 103) + val legacy = JSONObject(String(RememberedStateCodec.encode(old))) + for (key in listOf("afterDark", "darkMovies", "approvedDark", "selectedChannel")) legacy.remove(key) + val loaded = RememberedStateCodec.decode(legacy.toString().toByteArray()) + assertEquals(103, loaded.selectedNumber); assertNull(loaded.afterDark); assertTrue(loaded.darkMovies.isEmpty()) + val movies = listOf(candidate("one"), candidate("two")) + val channel = SampleChannel(movies.map { ScheduledMedia(it.item, "${it.item.id}-source", 5_400_123) }, "Orbit After Dark", 102) + val state = RememberedState(old.identity, old.sample, emptyList(), emptySet(), null, null, null, 102, channel, movies, setOf("one", "two")) + val restored = RememberedStateCodec.decode(RememberedStateCodec.encode(state)) + assertEquals(channel.guide(1_793_491_234_567L), restored.afterDark!!.guide(1_793_491_234_567L)) + assertEquals(102, restored.selectedNumber); assertEquals(state.approvedDark, restored.approvedDark) + assertEquals(102, state.withoutToken().afterDark!!.number) + assertEquals(101, JSONObject(String(RememberedStateCodec.encode(state))).getInt("selected")) + } + @Test fun adding102Preserves101And103AndThreeWayGuideOrder() { + val movies = listOf(candidate("one"), candidate("two")) + val one = SampleChannel(movies.map { ScheduledMedia(it.item, "${it.item.id}-source", 5_400_000) }) + val toonami = SampleChannel(List(2) { i -> ScheduledMedia(SampleItem("Fixture episode", "Episode", 24, "mkv", "ep-$i", 1_440_000), "ep-$i-source", 1_440_000) }, "Toonami", 103) + val dark = SampleChannel(one.lineup, "Orbit After Dark", 102) + val saved = RememberedState(RememberedIdentity("fixture-user", "fixture-token", "fixture-device"), EmbySample(movies.map { it.item }, 2), + emptyList(), emptySet(), null, one, toonami, 102, dark, movies, setOf("one", "two")) + val restored = RememberedStateCodec.decode(RememberedStateCodec.encode(saved)) + val time = 1_793_491_234_567L + assertEquals(one.guide(time), restored.orbitOne!!.guide(time)) + assertEquals(toonami.guide(time), restored.toonami!!.guide(time)) + assertEquals(dark.guide(time), restored.afterDark!!.guide(time)) + assertEquals(listOf(101, 102, 103), availableSampleChannels(restored.toonami, restored.afterDark, restored.orbitOne, null, restored.orbitOne).map { it.number }) + } + +} diff --git a/android/app/src/test/java/tv/orbit/classic/EmbyClientTest.kt b/android/app/src/test/java/tv/orbit/classic/EmbyClientTest.kt new file mode 100644 index 0000000..d4c49ab --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/EmbyClientTest.kt @@ -0,0 +1,136 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test +import java.io.ByteArrayInputStream + +class EmbyClientTest { + private data class CheckedSample(val items: List, val total: Long?, val signedOut: Boolean) + private fun EmbyClient.check(username: String, password: String): CheckedSample { + val session = connect(username, password) + val sample = session.sample + return CheckedSample(sample.items, sample.total, session.close()) + } + private val login = """{"AccessToken":"test-token-only","User":{"Id":"fake-user-123"}}""" + private class Scripted(vararg replies: EmbyReply) : EmbyTransport { + val requests = mutableListOf() + private val queue = ArrayDeque(replies.toList()) + override fun execute(request: EmbyRequest): EmbyReply { + requests += request + return queue.removeFirstOrNull() ?: error("Unexpected extra request") + } + } + private fun movie(name: String = "Fixture Film") = JSONObject().put("Name", name).put("Type", "Movie").put("Id", "fixture-item") + .put("RunTimeTicks", 54_000_000_000L).put("Container", "mkv") + .put("MediaStreams", JSONArray().put(JSONObject().put("Type", "Video").put("Codec", "hevc"))) + private fun page(items: JSONArray) = JSONObject().put("Items", items).put("TotalRecordCount", 900_000).toString() + private fun errorMessage(block: () -> Unit): String { + try { block(); fail("Expected a bounded check failure") } + catch (e: EmbyCheckException) { return e.message.orEmpty() } + return "" + } + @Test fun signsInReadsOnePageAndRevokesOnlyThatSession() { + val fake = Scripted(EmbyReply(200, login), EmbyReply(200, page(JSONArray().put(movie()))), EmbyReply(204, "")) + val result = EmbyClient(fake).check("fixture-user", " password with spaces ") + assertEquals(3, fake.requests.size) + val authBody = JSONObject(fake.requests[0].body!!) + assertEquals("fixture-user", authBody.getString("Username")) + assertEquals(" password with spaces ", authBody.getString("Pw")) + val library = fake.requests[1] + assertEquals("GET", library.method) + assertTrue(library.path.startsWith("/Users/fake-user-123/Items?")) + assertTrue(library.path.contains("Limit=20")); assertTrue(library.path.contains("StartIndex=0")) + assertFalse(library.path.contains("test-token-only")) + assertEquals("test-token-only", library.token) + assertEquals("/Sessions/Logout", fake.requests[2].path) + assertEquals("test-token-only", fake.requests[2].token) + assertEquals(900_000L, result.total) + assertEquals(90L, result.items.single().minutes) + assertEquals("mkv / hevc", result.items.single().format) + assertTrue(result.signedOut) + } + @Test fun refusesToDisplayMoreThanTwentyEvenIfProviderIgnoresLimit() { + val items = JSONArray(); repeat(100) { items.put(movie("Film $it")) } + val fake = Scripted(EmbyReply(200, login), EmbyReply(200, page(items)), EmbyReply(204, "")) + assertEquals(20, EmbyClient(fake).check("fixture", "fixture").items.size) + assertEquals(3, fake.requests.size) + } + @Test fun wrongPasswordDoesNotRetryOrFetchLibraryOrExposeProviderBody() { + val fake = Scripted(EmbyReply(401, "private-provider-detail")) + val message = errorMessage { EmbyClient(fake).check("fixture", "not-a-real-password") } + assertEquals(1, fake.requests.size) + assertFalse(message.contains("private-provider-detail")); assertFalse(message.contains("not-a-real-password")) + assertTrue(message.contains("Sign-in failed")) + } + @Test fun libraryFailureStillLogsOutAndDoesNotRetry() { + val fake = Scripted(EmbyReply(200, login), EmbyReply(403, "private"), EmbyReply(204, "")) + assertTrue(errorMessage { EmbyClient(fake).check("fixture", "fixture") }.contains("did not permit")) + assertEquals(3, fake.requests.size); assertEquals("/Sessions/Logout", fake.requests.last().path) + } + @Test fun malformedLibraryStillLogsOut() { + val fake = Scripted(EmbyReply(200, login), EmbyReply(200, "not JSON"), EmbyReply(204, "")) + assertTrue(errorMessage { EmbyClient(fake).check("fixture", "fixture") }.contains("cannot read")) + assertEquals("/Sessions/Logout", fake.requests.last().path) + } + @Test fun hostileUserIdentityCannotBecomeARequestPath() { + val auth = """{"AccessToken":"test-token-only","User":{"Id":"../other?token=bad"}}""" + val fake = Scripted(EmbyReply(200, auth), EmbyReply(204, "")) + errorMessage { EmbyClient(fake).check("fixture", "fixture") } + assertEquals(2, fake.requests.size); assertEquals("/Sessions/Logout", fake.requests.last().path) + } + @Test fun failedLogoutIsReportedWithoutRetainingTokenInResult() { + val fake = Scripted(EmbyReply(200, login), EmbyReply(200, page(JSONArray())), EmbyReply(500, "private")) + val result = EmbyClient(fake).check("fixture", "fixture") + assertFalse(result.signedOut); assertFalse(result.toString().contains("test-token-only")) + } + @Test fun providerTextIsBoundedAndNonMediaEntriesAreIgnored() { + val items = JSONArray().put(movie("x".repeat(500) + "\n")).put(JSONObject().put("Type", "Folder")) + val fake = Scripted(EmbyReply(200, login), EmbyReply(200, page(items)), EmbyReply(204, "")) + val result = EmbyClient(fake).check("fixture", "fixture") + assertEquals(1, result.items.size); assertEquals(160, result.items[0].title.length) + } + @Test fun redirectResponseIsNotTreatedAsSuccessfulSignIn() { + val fake = Scripted(EmbyReply(302, "")) + assertTrue(errorMessage { EmbyClient(fake).check("fixture", "fixture") }.contains("not forwarded")) + assertEquals(1, fake.requests.size) + } + @Test fun invalidCredentialsAreRejectedBeforeAnyNetworkRequest() { + val fake = Scripted() + for ((user, pass) in listOf("" to "fixture", "fixture" to "", "x".repeat(257) to "fixture", "fixture" to "x".repeat(1025))) + errorMessage { EmbyClient(fake).check(user, pass) } + assertTrue(fake.requests.isEmpty()) + } + @Test fun responseReaderStopsAtTheByteLimit() { + val stream = ByteArrayInputStream(ByteArray(HttpsEmbyTransport.MAX_RESPONSE_BYTES + 1)) + assertTrue(errorMessage { HttpsEmbyTransport.readBounded(stream) }.contains("too large")) + } + @Test fun responseReaderPreservesUtf8() { + assertEquals("A café", HttpsEmbyTransport.readBounded(ByteArrayInputStream("A café".toByteArray(Charsets.UTF_8)))) + } + @Test fun invalidTokenCannotEnterAnHttpHeader() { + val auth = JSONObject().put("AccessToken", "bad\r\nInjected: yes").put("User", JSONObject().put("Id", "fake-user")).toString() + val fake = Scripted(EmbyReply(200, auth)) + errorMessage { EmbyClient(fake).check("fixture", "fixture") } + assertEquals(1, fake.requests.size) + } + @Test fun tokenMustBeAStringNotAnObject() { + val auth = JSONObject().put("AccessToken", JSONObject().put("secret", "bad")).toString() + val fake = Scripted(EmbyReply(200, auth)) + errorMessage { EmbyClient(fake).check("fixture", "fixture") } + assertEquals(1, fake.requests.size) + } + @Test fun rateLimitDoesNotTriggerAutomaticRetries() { + val fake = Scripted(EmbyReply(429, "private")) + assertTrue(errorMessage { EmbyClient(fake).check("fixture", "fixture") }.contains("slow down")) + assertEquals(1, fake.requests.size) + } + + @Test fun metadataDurationKeepsMillisecondsForRealScheduling() { + val fake = Scripted(EmbyReply(200, login), + EmbyReply(200, page(JSONArray().put(movie().put("RunTimeTicks", 901_239_999L)))), EmbyReply(204, "")) + assertEquals(90_123L, EmbyClient(fake).check("fixture", "fixture").items.single().durationMs) + } + +} diff --git a/android/app/src/test/java/tv/orbit/classic/EmbyPlaybackTest.kt b/android/app/src/test/java/tv/orbit/classic/EmbyPlaybackTest.kt new file mode 100644 index 0000000..1fd0bf6 --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/EmbyPlaybackTest.kt @@ -0,0 +1,180 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test +import java.net.InetAddress + +class EmbyPlaybackTest { + private class Fake : EmbyTransport { + val requests = mutableListOf() + var response = EmbyReply(200, "") + override fun execute(request: EmbyRequest): EmbyReply { requests += request; return response } + } + private val item = SampleItem("Fixture film", "Movie", 90, "mkv", "fixture-item") + private fun session(fake: Fake) = EmbySampleSession(fake, "fixture-token-private", "fixture-user", EmbySample(listOf(item), 1)) + private fun source() = JSONObject().put("Id", "source-123").put("Container", "mkv") + .put("SupportsDirectStream", true).put("RequiresOpening", false) + private fun info(source: JSONObject) = JSONObject().put("PlaySessionId", "play-123").put("ErrorCode", JSONObject.NULL) + .put("MediaSources", JSONArray().put(source)).toString() + private fun fails(block: () -> Unit) { + try { block(); fail("Expected rejection") } catch (_: EmbyCheckException) { } + } + @Test fun preparesOnlySelectedSampleWithoutTranscodingOrTokenInUrl() { + val fake = Fake(); fake.response = EmbyReply(200, info(source())) + val session = session(fake); val plan = session.prepare(item) + assertEquals(1, fake.requests.size) + val body = JSONObject(fake.requests.single().body!!) + assertFalse(body.getBoolean("EnableTranscoding")); assertFalse(body.getBoolean("AutoOpenLiveStream")) + assertEquals("/Items/fixture-item/PlaybackInfo", fake.requests.single().path) + assertTrue(plan.url.contains("Static=true")); assertTrue(plan.url.contains("MediaSourceId=source-123")) + assertFalse(plan.url.contains("fixture-token-private")) + assertEquals("fixture-token-private", session.mediaHeaders(plan.url)["X-Emby-Token"]) + } + @Test fun cannotPrepareAnItemOutsideTheSample() { + val fake = Fake() + fails { session(fake).prepare(item.copy(id = "not-in-sample")) } + assertTrue(fake.requests.isEmpty()) + } + @Test fun refusesTranscodeOnlyAndLiveOpeningSources() { + for (source in listOf(source().put("SupportsDirectStream", false), source().put("RequiresOpening", true))) { + val fake = Fake(); fake.response = EmbyReply(200, info(source)) + fails { session(fake).prepare(item) } + } + } + @Test fun refusesSourceIdentifiersThatCouldAlterTheUrl() { + val fake = Fake(); fake.response = EmbyReply(200, info(source().put("Id", "../../private"))) + fails { session(fake).prepare(item) } + } + @Test fun providerApiKeyIsRemovedAndCdnGetsNoProviderHeaders() { + val session = session(Fake()) + val url = session.mediaUrl("/emby/Videos/fixture-item/stream.mkv?api_key=fixture-token-private&Static=true") + assertFalse(url.contains("api_key")); assertTrue(url.contains("Static=true")) + val cdn = session.mediaUrl("https://media.example.test/file.mkv?signature=fixture-signature") + assertTrue(session.mediaHeaders(cdn).isEmpty()) + assertTrue(session.mediaHeaders("https://bk2.appboxmanager.xyz:444/file").isEmpty()) + } + @Test fun rejectsInsecureAddressesAndCredentialsInExternalUrls() { + val session = session(Fake()) + for (url in listOf("http://media.example.test/a", "file:///private/a", "https://user:pass@media.example.test/a", + "https://media.example.test/a?key=fixture-token-private", "https://media.example.test/fixture-token-private")) + fails { session.mediaUrl(url) } + } + @Test fun externalSubtitleUrlIsValidatedAndUsesTokenHeaderOnlyAtProvider() { + val sub = JSONObject().put("Type", "Subtitle").put("IsExternal", true).put("Codec", "subrip") + .put("DeliveryUrl", "/emby/subtitle.srt?api_key=fixture-token-private").put("Language", "eng") + val fake = Fake(); fake.response = EmbyReply(200, info(source().put("MediaStreams", JSONArray().put(sub)))) + val plan = session(fake).prepare(item) + assertEquals("application/x-subrip", plan.subtitles.single().mime) + assertFalse(plan.subtitles.single().url.contains("api_key")) + } + @Test fun reportsStopBeforeLogoutAndClearsSessionCredentials() { + val fake = Fake(); fake.response = EmbyReply(200, info(source())) + val session = session(fake); val plan = session.prepare(item) + fake.response = EmbyReply(204, "") + session.report(plan, "Playing", 12_000, false) + session.report(plan, "Playing/Progress", 25_000, true) + assertTrue(session.close()) + assertEquals("/Sessions/Playing/Stopped", fake.requests[fake.requests.size - 2].path) + assertEquals("/Sessions/Logout", fake.requests.last().path) + val progress = JSONObject(fake.requests.first { it.path.endsWith("/Progress") }.body!!) + assertEquals(250_000_000L, progress.getLong("PositionTicks")); assertTrue(progress.getBoolean("IsPaused")) + fails { session.mediaHeaders(plan.url) } + val before = fake.requests.size; session.close(); assertEquals(before, fake.requests.size) + } + @Test fun leavingDuringSignInInvalidatesLateSessionAttachment() { + val slot = EmbySessionSlot(); val ticket = slot.ticket(); slot.clear() + val session = session(Fake()) + assertFalse(slot.attach(session, ticket)) + assertTrue(slot.attach(session, slot.ticket())) + assertSame(session, slot.clear()); assertNull(slot.clear()) + } + @Test fun mediaAddressGuardRejectsLocalAndSharedAddressSpace() { + for (host in listOf("127.0.0.1", "10.0.0.1", "192.168.0.252", "169.254.169.254", "100.64.0.1", "::1", "fc00::1")) + assertFalse(host, isPublicMediaAddress(InetAddress.getByName(host))) + assertTrue(isPublicMediaAddress(InetAddress.getByName("8.8.8.8"))) + } + @Test fun oldStopReportCannotOverwriteTheNewPlaybackPosition() { + val fake = Fake(); fake.response = EmbyReply(200, info(source())) + val session = session(fake); val old = session.prepare(item); val current = session.prepare(item) + fake.response = EmbyReply(204, "") + session.report(old, "Playing", 1_000, false) + session.report(current, "Playing", 3_000, false) + session.report(old, "Playing/Stopped", 99_000, true) + session.close() + val finalStop = fake.requests.last { it.path == "/Sessions/Playing/Stopped" } + assertEquals(30_000_000L, JSONObject(finalStop.body!!).getLong("PositionTicks")) + } + @Test fun validatesReturnedByteRangeBeforeSeeking() { + assertTrue(mediaRangeStartsAt("bytes 100-199/1000", 100)) + assertFalse(mediaRangeStartsAt("bytes 0-99/1000", 100)) + assertFalse(mediaRangeStartsAt(null, 100)) + } + + @Test fun sourceRuntimeWinsWithoutRoundingToMinutes() { + val fake = Fake(); fake.response = EmbyReply(200, info(source().put("RunTimeTicks", 901_230_000L))) + assertEquals(90_123L, session(fake).prepare(item).durationMs) + } + @Test fun locksChannelPlaybackToTheSourceUsedForScheduling() { + val fake = Fake(); fake.response = EmbyReply(200, info(source())) + session(fake).prepare(item, preferredSourceId = "source-123") + assertEquals("source-123", JSONObject(fake.requests.single().body!!).getString("MediaSourceId")) + fails { session(fake).prepare(item, preferredSourceId = "different-source") } + } + + @Test fun nullPlaybackIdentityGetsAFreshIdentifier() { + val fake = Fake(); fake.response = EmbyReply(200, JSONObject(info(source())).put("PlaySessionId", JSONObject.NULL).toString()) + val plan = session(fake).prepare(item, isPlayback = false) + assertNotEquals("null", plan.playSessionId); assertTrue(EmbyClient.validId(plan.playSessionId)) + } + + @Test fun retryAfterConnectionFailureRetainsSessionAndLockedSource() { + val requests = mutableListOf() + val transport = EmbyTransport { request -> + requests += request + if (requests.size == 1) throw EmbyCheckException("Fixture connection failure") + EmbyReply(200, info(source())) + } + val active = EmbySampleSession(transport, "fixture-token-private", "fixture-user", EmbySample(listOf(item), 1)) + fails { active.prepare(item, preferredSourceId = "source-123") } + assertEquals(1, requests.size) // No automatic retry or reauthentication. + val plan = active.prepare(item, preferredSourceId = "source-123") + assertEquals("source-123", plan.sourceId) + assertEquals(2, requests.size) + assertTrue(requests.all { it.path == "/Items/fixture-item/PlaybackInfo" }) + assertTrue(requests.all { it.token == "fixture-token-private" }) + assertTrue(requests.all { JSONObject(it.body!!).getString("MediaSourceId") == "source-123" }) + } + + @Test fun choosesCompatibleAlternativeInsteadOfFirstUnsupportedContainer() { + val fake = Fake() + val body = JSONObject().put("MediaSources", JSONArray() + .put(source().put("Id", "avi-source").put("Container", "avi")) + .put(source().put("Id", "mkv-source").put("Container", " MKV "))) + fake.response = EmbyReply(200, body.toString()) + val active = session(fake) + val plan = active.prepare(item) + assertEquals("mkv-source", plan.sourceId); assertTrue(plan.url.contains("stream.mkv?")) + // A scheduled source lock must never switch to another version silently. + fails { active.prepare(item, preferredSourceId = "avi-source") } + } + @Test fun unsupportedContainerDiagnosticIsBoundedAndRejectsUrls() { + val fake = Fake(); fake.response = EmbyReply(200, info(source().put("Container", "avi"))) + try { session(fake).prepare(item); fail("Expected unsupported format") } + catch (e: EmbyCheckException) { assertTrue(e.message.orEmpty().contains("avi")) } + assertEquals("unknown", safeContainerLabel("https://private.example/path?secret=value")) + assertEquals("unknown", safeContainerLabel("x".repeat(100))) + assertNull(supportedDirectContainer("avi")); assertEquals("mkv", supportedDirectContainer(" MKV ")) + } + + @Test fun accepts3gpAndAdvertisesItWithoutRenamingTheStream() { + val fake = Fake(); fake.response = EmbyReply(200, info(source().put("Container", "3gp"))) + val plan = session(fake).prepare(item) + assertTrue(plan.url.contains("stream.3gp?")) + val profile = JSONObject(fake.requests.single().body!!).getJSONObject("DeviceProfile") + .getJSONArray("DirectPlayProfiles").getJSONObject(0) + assertTrue(profile.getString("Container").split(",").contains("3gp")) + } + +} diff --git a/android/app/src/test/java/tv/orbit/classic/EpisodeDiscoveryTest.kt b/android/app/src/test/java/tv/orbit/classic/EpisodeDiscoveryTest.kt new file mode 100644 index 0000000..9b7f24e --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/EpisodeDiscoveryTest.kt @@ -0,0 +1,68 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test + +class EpisodeDiscoveryTest { + private val series = SeriesCandidate("fixture-series", "Fixture show", 1996, "TV-PG") + private fun episode(id: String, season: Int, number: Int) = JSONObject().put("Id", id).put("Type", "Episode") + .put("SeriesId", series.id).put("Name", "Fixture episode").put("ParentIndexNumber", season) + .put("IndexNumber", number).put("RunTimeTicks", 13_200_000_000L) + private fun page(items: JSONArray, total: Int = items.length()) = EmbyReply(200, + JSONObject().put("Items", items).put("TotalRecordCount", total).toString()) + @Test fun queriesOnlyApprovedSeriesWithBoundedReadOnlyPages() { + val requests = mutableListOf() + val result = discoverSeriesEpisodes(EmbyTransport { r -> requests += r; page(JSONArray().put(episode("ep", 1, 1))) }, + "fixture-user", { "fixture-token" }, listOf(series)) + val request = requests.single() + assertEquals("GET", request.method); assertTrue(request.path.startsWith("/Shows/fixture-series/Episodes?")) + assertTrue(request.path.contains("Limit=5")); assertTrue(request.path.contains("EnableUserData=false")) + assertFalse(request.path.contains("fixture-token")); assertEquals("fixture-token", request.token) + assertEquals(1_320_000L, result.single().episodes.single().durationMs) + } + @Test fun capsProviderResultsAndOrdersOnlyReturnedSample() { + val items = JSONArray().put(episode("second", 1, 2)).put(episode("first", 1, 1)) + repeat(10) { items.put(episode("other-$it", 2, it + 1)) } + val result = discoverSeriesEpisodes(EmbyTransport { page(items) }, "fixture-user", { "fixture-token" }, listOf(series)).single() + assertEquals(5, result.episodes.size); assertEquals("first", result.episodes.first().id); assertTrue(result.moreAvailable) + } + @Test fun rejectsForeignSeriesUnsafeIdsAndDuplicateEpisodes() { + val items = JSONArray().put(episode("same", 1, 1)).put(episode("same", 1, 1)) + .put(episode("../bad", 1, 1)).put(episode("foreign", 1, 1).put("SeriesId", "another")) + val result = discoverSeriesEpisodes(EmbyTransport { page(items) }, "fixture-user", { "fixture-token" }, listOf(series)) + assertEquals(listOf("same"), result.single().episodes.map { it.id }) + } + @Test fun missingOrderAndInvalidRuntimeRemainUnknown() { + val row = episode("ep", 1, 1).put("RunTimeTicks", -1).put("IndexNumber", -1) + row.remove("ParentIndexNumber") + val result = discoverSeriesEpisodes(EmbyTransport { page(JSONArray().put(row)) }, "fixture-user", { "fixture-token" }, listOf(series)).single().episodes.single() + assertNull(result.season); assertNull(result.episode); assertNull(result.durationMs) + } + @Test fun rejectsOversizedOrUnsafeApprovalBeforeNetwork() { + var count = 0 + val fake = EmbyTransport { count++; page(JSONArray()) } + for (approved in listOf(emptyList(), List(4) { series.copy(id = "series-$it") }, listOf(series.copy(id = "../bad")), listOf(series, series))) { + try { discoverSeriesEpisodes(fake, "fixture-user", { "fixture-token" }, approved); fail("Expected validation") } + catch (_: IllegalArgumentException) { } + } + assertEquals(0, count) + } + @Test fun rateLimitStopsBeforeSecondSeries() { + var count = 0 + try { + discoverSeriesEpisodes(EmbyTransport { count++; EmbyReply(429, "private") }, "fixture-user", { "fixture-token" }, listOf(series, series.copy(id = "second"))) + fail("Expected rate limit") + } catch (e: EmbyCheckException) { assertEquals(429, e.httpStatus) } + assertEquals(1, count) + } + @Test fun displaysOnlyReturnedMediaDetailsWithoutGuessingQuality() { + val streams = JSONArray().put(JSONObject().put("Type", "Video").put("Codec", "h264").put("Width", 1920).put("Height", 1080)) + .put(JSONObject().put("Type", "Audio").put("Codec", "aac")) + assertEquals("1920×1080 • mkv • h264 / aac", episodeMediaLabel(JSONObject().put("Container", "mkv").put("MediaStreams", streams))) + assertEquals("", episodeMediaLabel(JSONObject())) + assertEquals("unknown", episodeMediaLabel(JSONObject().put("Container", "https://private.example/file"))) + } + +} diff --git a/android/app/src/test/java/tv/orbit/classic/RememberedStateTest.kt b/android/app/src/test/java/tv/orbit/classic/RememberedStateTest.kt new file mode 100644 index 0000000..07e3032 --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/RememberedStateTest.kt @@ -0,0 +1,95 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test +import javax.crypto.KeyGenerator + +class RememberedStateTest { + private fun state(): RememberedState { + val series = SeriesCandidate("fixture-series", "Fixture series", 1996, "TV-PG") + val episodes = SeriesEpisodes(series, List(2) { EpisodeCandidate("episode-$it", "Fixture $it", 1, it + 1, 60_000) }, false) + val channel = SampleChannel(episodes.episodes.map { ScheduledMedia(episodeSampleItem(series, it), "source-${it.id}", 60_000) }, "Toonami", 103) + return RememberedState(RememberedIdentity("fixture-user", "fixture-token", "fixture-device"), EmbySample(emptyList(), 0), + listOf(SeriesMatches(ToonamiSearches.first(), listOf(series), false)), setOf(series.id), listOf(episodes), null, channel, 103) + } + private fun key() = KeyGenerator.getInstance("AES").apply { init(256) }.generateKey() + @Test fun encryptedRoundTripPreservesChoicesAndAbsoluteTimeline() { + val original = state(); val key = key() + val plain = RememberedStateCodec.encode(original) + val sealed = ConnectionCipher.seal(key, plain) + assertFalse(String(sealed, Charsets.ISO_8859_1).contains("fixture-token")) + val restored = RememberedStateCodec.decode(ConnectionCipher.open(key, sealed)) + assertEquals(original.approved, restored.approved); assertEquals("fixture-token", restored.identity.token) + assertEquals(original.toonami!!.guide(1_793_491_234_567L), restored.toonami!!.guide(1_793_491_234_567L)) + assertEquals(103, restored.selectedNumber); assertEquals(2, restored.episodes!!.single().episodes.size) + assertFalse(restored.toString().contains("fixture-token")); assertFalse(restored.identity.toString().contains("fixture-token")) + } + @Test fun freshNoncesProduceDifferentCiphertextAndTamperingIsRejected() { + val key = key(); val plain = RememberedStateCodec.encode(state()) + val first = ConnectionCipher.seal(key, plain); val second = ConnectionCipher.seal(key, plain) + assertFalse(first.contentEquals(second)) + first[first.lastIndex] = (first.last().toInt() xor 1).toByte() + try { ConnectionCipher.open(key, first); fail("Tampered record accepted") } catch (_: java.security.GeneralSecurityException) { } + try { ConnectionCipher.open(key(), second); fail("Wrong key accepted") } catch (_: java.security.GeneralSecurityException) { } + } + @Test fun wrongSchemaOriginAndOversizedRecordsAreRejected() { + val original = JSONObject(String(RememberedStateCodec.encode(state()))) + for (changed in listOf(JSONObject(original.toString()).put("schema", 999), JSONObject(original.toString()).put("origin", "https://other.example"), + JSONObject(original.toString()).put("user", "../bad"), JSONObject(original.toString()).put("approved", JSONArray().put("unmatched")))) { + try { RememberedStateCodec.decode(changed.toString().toByteArray()); fail("Invalid saved record accepted") } + catch (_: IllegalArgumentException) { } + } + try { RememberedStateCodec.decode(ByteArray(RememberedStateCodec.MAX_BYTES + 1)); fail("Oversized record accepted") } + catch (_: IllegalArgumentException) { } + } + @Test fun expiredTokenCanBeRemovedWithoutLosingChannelChoices() { + val noToken = RememberedStateCodec.decode(RememberedStateCodec.encode(state().withoutToken())) + assertNull(noToken.identity.token); assertEquals(103, noToken.toonami!!.number) + assertEquals(setOf("fixture-series"), noToken.approved) + } + @Test fun resumesByValidatingSavedUserWithoutAuthenticatingOrRefreshingSchedule() { + val requests = mutableListOf() + val fake = EmbyTransport { r -> + requests += r + if (r.path == "/Users/fixture-user") EmbyReply(200, """{"Id":"fixture-user"}""") + else EmbyReply(200, JSONObject().put("MediaSources", JSONArray().put(JSONObject().put("Id", "source-episode-0") + .put("Container", "mkv").put("SupportsDirectStream", true).put("RunTimeTicks", 600_000_000L))).toString()) + } + val saved = state(); val resumed = EmbyClient(fake).resume(saved) + assertEquals(1, requests.size); assertEquals("GET", requests.single().method) + assertEquals("fixture-token", requests.single().token); assertNull(requests.single().body) + val plan = resumed.prepare(saved.toonami!!.lineup.first().item, preferredSourceId = "source-episode-0") + assertEquals("source-episode-0", plan.sourceId) + resumed.detach() + assertFalse(requests.any { it.path == "/Sessions/Logout" }) + try { resumed.mediaHeaders(plan.url); fail("Detached token remains active") } catch (_: EmbyCheckException) { } + } + @Test fun expiredSavedLoginDoesNotTryPasswordOrLogout() { + val requests = mutableListOf() + try { EmbyClient(EmbyTransport { r -> requests += r; EmbyReply(401, "private") }).resume(state()); fail("Expired session accepted") } + catch (e: EmbyCheckException) { assertEquals(401, e.httpStatus) } + assertEquals(1, requests.size); assertEquals("/Users/fixture-user", requests.single().path) + } + @Test fun differentAccountCannotReceiveSavedChoices() { + val active = EmbySampleSession(EmbyTransport { EmbyReply(204, "") }, "other-token", "other-user", EmbySample(emptyList(), 0)) + assertFalse(active.matchesAccount(state().identity)) + try { active.restoreRemembered(state()); fail("Cross-account restore accepted") } catch (_: IllegalArgumentException) { } + } + @Test fun detachStopsReportedPlaybackButKeepsProviderTokenUnrevoked() { + val requests = mutableListOf() + val fake = EmbyTransport { r -> requests += r; EmbyReply(204, "") } + val saved = state() + val active = EmbySampleSession(fake, "fixture-token", "fixture-user", saved.sample) + active.restoreRemembered(saved) + val media = saved.toonami!!.lineup.first() + val plan = EmbyPlaybackPlan(media.item, "https://media.example.test/fixture.mkv", media.sourceId, "fixture-play", emptyList(), media.durationMs) + active.report(plan, "Playing", 12_345, false) + active.detach() + assertEquals(listOf("/Sessions/Playing", "/Sessions/Playing/Stopped"), requests.map { it.path }) + assertEquals(123_450_000L, JSONObject(requests.last().body!!).getLong("PositionTicks")) + assertFalse(requests.any { it.path == "/Sessions/Logout" }) + } + +} diff --git a/android/app/src/test/java/tv/orbit/classic/SampleChannelTest.kt b/android/app/src/test/java/tv/orbit/classic/SampleChannelTest.kt new file mode 100644 index 0000000..06f97af --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/SampleChannelTest.kt @@ -0,0 +1,93 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test + +class SampleChannelTest { + private fun media(id: String, duration: Long) = ScheduledMedia(SampleItem("Fixture $id", "Movie", duration / 60_000, "mkv", id, duration), "$id-source", duration) + private val entries = listOf(media("a", 90_123), media("b", 120_456), media("c", 45_678)) + private fun channel() = SampleChannel(entries) + @Test fun joinsWithinTheCurrentProgrammeUsingExactMilliseconds() { + val show = channel().at(12_345) + assertEquals("a", show.media.item.id); assertEquals(0L, show.startMs) + assertEquals(12_345L, show.offsetAt(12_345)); assertEquals(90_123L, show.endMs) + } + @Test fun exactEndSwitchesToTheNextTitleWithoutAGap() { + val channel = channel(); val before = channel.at(90_122); val after = channel.at(90_123) + assertEquals("a", before.media.item.id); assertEquals("b", after.media.item.id) + assertEquals(before.endMs, after.startMs); assertEquals(0L, after.offsetAt(90_123)) + } + @Test fun repeatsLineupWhileKeepingAbsoluteBroadcastTimes() { + val channel = channel(); val first = channel.at(channel.cycleMs) + assertEquals("a", first.media.item.id); assertEquals(channel.cycleMs, first.startMs) + assertEquals("c", channel.at(channel.cycleMs - 1).media.item.id) + } + @Test fun timelineDoesNotDependOnLaunchingTheApp() { + val at = 1_793_491_234_567L + assertEquals(channel().guide(at, 48), SampleChannel(entries.toList()).guide(at, 48)) + } + @Test fun guideIsContiguousAcrossMidnightAndClockChangeDates() { + val at = java.time.Instant.parse("2026-10-25T00:59:59Z").toEpochMilli() + channel().guide(at, 48).zipWithNext().forEach { (a, b) -> assertEquals(a.endMs, b.startMs) } + } + @Test fun negativeEpochsUseFloorDivision() { + val show = channel().at(-1) + assertEquals("c", show.media.item.id); assertEquals(-45_678L, show.startMs) + assertEquals(45_677L, show.offsetAt(-1)) + } + @Test fun transitionCheckUsesRealDurationsAndCrossesTheBoundary() { + val channel = channel(); val now = 30_000L + val shifted = now + channel.transitionCheckOffset(now) + assertEquals(10_000L, channel.at(shifted).endMs - shifted) + assertEquals("b", channel.at(shifted + 10_000).media.item.id) + assertEquals(90_123L, channel.lineup.first().durationMs) + } + @Test fun keepsItsOwnLineupSnapshot() { + val mutable = entries.toMutableList(); val channel = SampleChannel(mutable); mutable.clear() + assertEquals(3, channel.lineup.size); assertEquals("a", channel.at(0).media.item.id) + } + @Test fun rejectsInvalidDurationDuplicatesAndCounts() { + for (bad in listOf(listOf(entries[0]), listOf(entries[0], entries[0]), listOf(media("a", 0), entries[1]), + listOf(media("a", SampleChannel.MAX_DURATION_MS + 1), entries[1]))) { + try { SampleChannel(bad); fail("Invalid lineup accepted") } catch (_: IllegalArgumentException) { } + } + for (count in listOf(0, 49)) try { channel().guide(0, count); fail("Invalid count") } catch (_: IllegalArgumentException) { } + } + private class ProbeTransport(private val validFrom: Int = 0, private val status: Int = 200) : EmbyTransport { + val requests = mutableListOf() + override fun execute(request: EmbyRequest): EmbyReply { + requests += request + if (status != 200) return EmbyReply(status, "") + val itemId = request.path.substringAfter("/Items/").substringBefore('/') + val index = itemId.substringAfter('-').toInt() + val source = JSONObject().put("Id", "$itemId-source").put("Container", "mkv") + .put("RunTimeTicks", (60_123L + index) * 10_000).put("SupportsDirectStream", index >= validFrom) + return EmbyReply(200, JSONObject().put("PlaySessionId", "play-$index").put("MediaSources", JSONArray().put(source)).toString()) + } + } + private fun session(transport: EmbyTransport) = EmbySampleSession(transport, "fixture-token", "fixture-user", + EmbySample(List(20) { SampleItem("Fixture $it", "Movie", 1, "mkv", "id-$it") }, 100_000)) + @Test fun buildsOnlyThreeTitlesWithoutStartingPlaybackOrRequestingMorePages() { + val fake = ProbeTransport(); val built = session(fake).buildSampleChannel() + assertEquals(3, built.lineup.size); assertEquals(3, fake.requests.size) + assertEquals(60_123L, built.lineup.first().durationMs) + assertTrue(fake.requests.all { it.path.endsWith("/PlaybackInfo") && !JSONObject(it.body!!).getBoolean("IsPlayback") }) + } + @Test fun probesAtMostFiveSampleItemsAndSkipsUnsupportedSources() { + val fake = ProbeTransport(validFrom = 2); val built = session(fake).buildSampleChannel() + assertEquals(5, fake.requests.size); assertEquals(listOf("id-2", "id-3", "id-4"), built.lineup.map { it.item.id }) + val limited = ProbeTransport(validFrom = 5) + try { session(limited).buildSampleChannel(); fail("Should not reach sixth item") } catch (_: EmbyCheckException) { } + assertEquals(5, limited.requests.size) + } + @Test fun expiredLoginAndRateLimitStopTheProbeImmediately() { + for (status in listOf(401, 429)) { + val fake = ProbeTransport(status = status) + try { session(fake).buildSampleChannel(); fail("Should stop") } + catch (failure: EmbyCheckException) { assertEquals(status, failure.httpStatus) } + assertEquals(1, fake.requests.size) + } + } +} diff --git a/android/app/src/test/java/tv/orbit/classic/ScheduleTest.kt b/android/app/src/test/java/tv/orbit/classic/ScheduleTest.kt new file mode 100644 index 0000000..c89fd11 --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/ScheduleTest.kt @@ -0,0 +1,32 @@ +package tv.orbit.classic +import org.junit.Assert.* +import org.junit.Test + +class ScheduleTest { + private val channel = Schedule.channels.first() + @Test fun joinsEighteenMinutesIntoAnExistingBroadcast() { + val start = 100 * Schedule.SLOT + val now = start + 18 * 60_000 + val show = Schedule.programme(channel, now) + assertEquals(start, show.start) + assertEquals(18 * 60_000L, show.offsetAt(now)) + } + @Test fun boundaryBelongsToNextProgramme() { + val before = Schedule.programme(channel, Schedule.SLOT - 1) + val after = Schedule.programme(channel, Schedule.SLOT) + assertEquals(before.end, after.start) + assertNotEquals(before.title, after.title) + assertEquals(0, after.offsetAt(Schedule.SLOT)) + } + @Test fun guideHasNoGapsAndSurvivesRestart() { + val time = 1793478000000L + val guide = Schedule.guide(channel, time, 48) + guide.zipWithNext().forEach { (a, b) -> assertEquals(a.end, b.start) } + assertEquals(guide, Schedule.guide(channel, time, 48)) + } + @Test fun handlesDatesBeforeEpoch() { + val show = Schedule.programme(channel, -1) + assertEquals(-Schedule.SLOT, show.start) + assertEquals(Schedule.SLOT - 1, show.offsetAt(-1)) + } +} diff --git a/android/app/src/test/java/tv/orbit/classic/SeriesDiscoveryTest.kt b/android/app/src/test/java/tv/orbit/classic/SeriesDiscoveryTest.kt new file mode 100644 index 0000000..fdbbaba --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/SeriesDiscoveryTest.kt @@ -0,0 +1,77 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test + +class SeriesDiscoveryTest { + private fun series(id: String, type: String = "Series") = JSONObject().put("Id", id).put("Type", type) + .put("Name", "Fixture version").put("ProductionYear", 1996).put("OfficialRating", "TV-PG") + private fun page(items: JSONArray, total: Int = items.length()) = EmbyReply(200, + JSONObject().put("Items", items).put("TotalRecordCount", total).toString()) + @Test fun fiveBoundedSeriesOnlySearchesWithHeaderToken() { + val requests = mutableListOf() + val result = discoverToonamiSeries(EmbyTransport { r -> requests += r; page(JSONArray().put(series("fixture"))) }, "fixture-user") { "fixture-token" } + assertEquals(5, requests.size); assertEquals(ToonamiSearches.take(5), result.map { it.requested }) + assertTrue(requests.all { it.method == "GET" && it.path.startsWith("/Items?UserId=fixture-user&") }) + assertTrue(requests.all { it.path.contains("IncludeItemTypes=Series") && it.path.contains("Limit=10") && it.path.contains("StartIndex=0") }) + assertTrue(requests.all { it.token == "fixture-token" && !it.path.contains("fixture-token") }) + assertTrue(requests[0].path.contains("SearchTerm=Dragon+Ball+Z&")) + assertEquals(1996, result[0].candidates.single().year) + } + @Test fun capsResultsEvenIfServerIgnoresLimit() { + val items = JSONArray(); repeat(50) { items.put(series("series-$it")) } + val result = discoverToonamiSeries(EmbyTransport { page(items) }, "fixture-user") { "fixture-token" } + assertTrue(result.all { it.candidates.size == 10 && it.moreAvailable }) + } + @Test fun rejectsNonSeriesUnsafeIdsAndDuplicateIds() { + val items = JSONArray().put(series("good")).put(series("good")).put(series("../bad")) + .put(series("movie", "Movie")).put(series("empty").put("Name", "\n")) + val result = discoverToonamiSeries(EmbyTransport { page(items) }, "fixture-user") { "fixture-token" } + assertEquals(listOf("good"), result.first().candidates.map { it.id }) + } + @Test fun rateLimitAndExpiredSessionStopFurtherSearches() { + for (status in listOf(401, 429)) { + var count = 0 + try { + discoverToonamiSeries(EmbyTransport { count++; EmbyReply(status, "private") }, "fixture-user") { "fixture-token" } + fail("Expected failure") + } catch (e: EmbyCheckException) { assertEquals(status, e.httpStatus); assertFalse(e.message.orEmpty().contains("private")) } + assertEquals(1, count) + } + } + @Test fun emptyResultsAreNotAnAssertionThatLibraryHasNoEpisodes() { + val results = discoverToonamiSeries(EmbyTransport { page(JSONArray()) }, "fixture-user") { "fixture-token" } + assertEquals(5, results.size); assertTrue(results.all { it.candidates.isEmpty() }) + } + @Test fun laterBatchUsesOnlyRemainingTermsAndNeverRepeatsFirstBatch() { + val requests = mutableListOf() + val fake = EmbyTransport { r -> requests += r; page(JSONArray()) } + val results = discoverToonamiSeries(fake, "fixture-user", { "fixture-token" }, 20) + assertEquals(ToonamiSearches.drop(20), results.map { it.requested }) + assertEquals(3, requests.size) + assertTrue(discoverToonamiSeries(fake, "fixture-user", { "fixture-token" }, 23).isEmpty()) + assertEquals(3, requests.size) + } + @Test fun cancellationStopsBetweenSearches() { + var requests = 0 + try { + discoverToonamiSeries(EmbyTransport { requests++; page(JSONArray()) }, "fixture-user", { "fixture-token" }, 0) { + if (requests == 1) throw java.util.concurrent.CancellationException() + } + fail("Expected cancellation") + } catch (_: java.util.concurrent.CancellationException) { } + assertEquals(1, requests) + } + + @Test fun sameNamedSeriesKeepSeparateIdsAndGetNeutralEntryLabels() { + val first = SeriesCandidate("one", "Fixture show", 1999, "TV-PG") + val second = first.copy(id = "two") + val labelled = labelSeriesVariants(listOf(first, second, first.copy(id = "remake", year = 2020))) + assertEquals(listOf("one", "two", "remake"), labelled.map { it.id }) + assertEquals(listOf("Entry 1 of 2", "Entry 2 of 2", ""), labelled.map { it.variantLabel }) + assertFalse(labelled.any { it.variantLabel.contains("1080") || it.variantLabel.contains("4K") }) + } + +} diff --git a/android/app/src/test/java/tv/orbit/classic/ToonamiChannelTest.kt b/android/app/src/test/java/tv/orbit/classic/ToonamiChannelTest.kt new file mode 100644 index 0000000..9c194eb --- /dev/null +++ b/android/app/src/test/java/tv/orbit/classic/ToonamiChannelTest.kt @@ -0,0 +1,72 @@ +package tv.orbit.classic + +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test + +class ToonamiChannelTest { + private fun group(id: String, count: Int = 3) = SeriesEpisodes(SeriesCandidate(id, "Fixture $id", 1996, "TV-PG"), + List(count) { EpisodeCandidate("$id-${it + 1}", "Episode ${it + 1}", 1, it + 1, 60_000) }, false) + @Test fun rotatesShowsAndPreservesPerShowOrderThroughUnevenSamples() { + val ordered = toonamiEpisodeOrder(listOf(group("a", 3), group("b", 2), group("c", 1))) + assertEquals(listOf("a-1", "b-1", "c-1", "a-2", "b-2", "a-3"), ordered.map { it.id }) + } + @Test fun rejectsUnknownOrderSpecialsAndDuplicateEpisodeNumbers() { + val original = group("a", 2) + for (bad in listOf(original.copy(episodes = original.episodes.map { it.copy(season = null) }), + original.copy(episodes = original.episodes.map { it.copy(season = 0) }), + original.copy(episodes = original.episodes.map { it.copy(episode = 1) }))) { + try { toonamiEpisodeOrder(listOf(bad)); fail("Expected order rejection") } catch (_: EmbyCheckException) { } + } + } + @Test fun fullFifteenEpisodeSampleUsesClockBoundariesAndRepeats() { + val ordered = toonamiEpisodeOrder(listOf(group("a", 5), group("b", 5), group("c", 5))) + val channel = SampleChannel(ordered.map { ScheduledMedia(it, "${it.id}-source", 60_000) }, "Toonami", 103) + assertEquals(15, channel.lineup.size); assertEquals("b-1", channel.at(60_000).media.item.id) + assertEquals("a-1", channel.at(channel.cycleMs).media.item.id) + assertEquals(12_345L, channel.at(72_345).offsetAt(72_345)) + try { SampleChannel(List(16) { ScheduledMedia(SampleItem("x", "Episode", 1, "mkv", "id-$it"), "source", 60_000) }); fail("Expected cap") } + catch (_: IllegalArgumentException) { } + } + private class Fake(private val unsupported: Boolean = false) : EmbyTransport { + val requests = mutableListOf() + override fun execute(request: EmbyRequest): EmbyReply { + requests += request + if (request.path.startsWith("/Shows/")) { + val id = request.path.substringAfter("/Shows/").substringBefore('/') + val items = JSONArray() + repeat(2) { i -> items.put(JSONObject().put("Id", "$id-${i + 1}").put("Name", "Episode ${i + 1}") + .put("Type", "Episode").put("SeriesId", id).put("ParentIndexNumber", 1).put("IndexNumber", i + 1) + .put("RunTimeTicks", 600_000_000L)) } + return EmbyReply(200, JSONObject().put("Items", items).toString()) + } + val id = request.path.substringAfter("/Items/").substringBefore('/') + val source = JSONObject().put("Id", "$id-source").put("Container", "mkv") + .put("SupportsDirectStream", !unsupported).put("RunTimeTicks", 601_230_000L) + return EmbyReply(200, JSONObject().put("MediaSources", JSONArray().put(source)).toString()) + } + } + private fun session(fake: Fake) = EmbySampleSession(fake, "fixture-token", "fixture-user", EmbySample(emptyList(), 0)) + @Test fun onlyCheckedEpisodesAreEligibleAndBuildDoesNotStartPlayback() { + val fake = Fake(); val session = session(fake) + try { session.prepare(SampleItem("Injected", "Episode", 1, "mkv", "a-1")); fail("Expected allowlist") } + catch (_: EmbyCheckException) { } + assertTrue(fake.requests.isEmpty()) + session.checkSeriesEpisodes(listOf(group("a").series, group("b").series)) + val channel = session.buildToonamiChannel() + assertEquals(103, channel.number); assertEquals("Toonami", channel.name) + assertEquals(listOf("a-1", "b-1", "a-2", "b-2"), channel.lineup.map { it.item.id }) + assertEquals(60_123L, channel.lineup.first().durationMs) + val probes = fake.requests.filter { it.path.endsWith("/PlaybackInfo") } + assertEquals(4, probes.size); assertTrue(probes.all { !JSONObject(it.body!!).getBoolean("IsPlayback") }) + val plan = session.prepare(channel.lineup.first().item, preferredSourceId = "a-1-source") + assertEquals("a-1-source", plan.sourceId) + } + @Test fun unsupportedEpisodeStopsBuildInsteadOfSkippingAheadInSeries() { + val fake = Fake(true); val session = session(fake) + session.checkSeriesEpisodes(listOf(group("a").series)) + try { session.buildToonamiChannel(); fail("Expected eligibility failure") } catch (_: EmbyCheckException) { } + assertEquals(1, fake.requests.count { it.path.endsWith("/PlaybackInfo") }) + } +} diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..20cb258 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,4 @@ +plugins { + id("com.android.application") version "9.1.1" apply false + id("org.jetbrains.kotlin.plugin.compose") version "2.2.10" apply false +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..bd39374 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8 +org.gradle.workers.max=2 +android.useAndroidX=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..61285a6 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3abbda5 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,9 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists + +distributionSha256Sum=b266d5ff6b90eada6dc3b20cb090e3731302e553a27c5d3e4df1f0d76beaff06 diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 0000000..adff685 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..e509b2d --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,93 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..e6a898b --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,4 @@ +pluginManagement { repositories { google(); mavenCentral(); gradlePluginPortal() } } +dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS); repositories { google(); mavenCentral() } } +rootProject.name = "OrbitTV" +include(":app") diff --git a/build-android.sh b/build-android.sh new file mode 100755 index 0000000..6e5f67d --- /dev/null +++ b/build-android.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail +ORBIT_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +export GRADLE_USER_HOME="$ORBIT_ROOT/.tooling/gradle-cache" +export ANDROID_USER_HOME="$ORBIT_ROOT/.tooling/android" +export ANDROID_HOME="${ANDROID_HOME:-/opt/android-sdk}" +cd "$ORBIT_ROOT/android" +./gradlew --no-daemon :app:assembleDebug :app:testDebugUnitTest :app:lintDebug diff --git a/design/channels/orbit-after-dark-motion-03/README.md b/design/channels/orbit-after-dark-motion-03/README.md new file mode 100644 index 0000000..e2c0608 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/README.md @@ -0,0 +1,14 @@ +# After Dark — Night settles / motion proof 03 + +Requested sequence: windows illuminate individually as the skyline settles, a magenta orbital trail draws across the sky, then the approved logo appears. + +- Twelve separate window layers switch on at staggered times (0.28–1.24 s including settling). Four have a small second dip in brightness; the rest of the approved windows stay at a dim ambient level. +- At 1.4 s, the real vector stroke begins drawing with EffectCraft Trim Paths, completing at 2.4 s. A second low-opacity wider stroke supplies a restrained light edge. +- Logo reveal begins at 2.44 s and settles by 2.92 s. The clip holds, then ends at 4.2 s. +- Silent H.264 MP4, 1280×720, 25 fps, 105 frames. No transparent-video assumption. + +Open `sources/collected-project/orbit_after_dark_night.ecproj` for the self-contained native project with relative Footage paths. It has 12 separately keyed window footage layers, two editable shape/trim layers, the base skyline and the logo. Collected media is included. Original SVG windows/skyline and the VectorCraft logo source are included in brand-source; Barlow fonts and licences accompany it. + +`build-motion.py` rebuilds the source project and render using the local brand-source folder. It uses only installed VectorCraft/EffectCraft CLIs and the Python standard library. The script writes its command JSON and generated assets in this folder. + +Validation: all frames decoded; four-point contact sheet and final native render inspected; the collected project reopened/rendered using relative footage paths. The motion is not bundled into APK 0.15 and does not run between programmes. Playback integration still needs explicit optional settings, clock-safe timing/fallback and a TV test. The approved static lit-window background and EPG logo are the artwork integrated into channel 102's review/guide screens. diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/exports/orbit_after_dark_primary.png b/design/channels/orbit-after-dark-motion-03/brand-source/exports/orbit_after_dark_primary.png new file mode 100644 index 0000000..dff363e Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/brand-source/exports/orbit_after_dark_primary.png differ diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-condensed-medium.ttf b/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-condensed-medium.ttf new file mode 100644 index 0000000..eee49eb Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-condensed-medium.ttf differ diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-regular.ttf b/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-regular.ttf new file mode 100644 index 0000000..bb3faec Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-regular.ttf differ diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-semibold.ttf b/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-semibold.ttf new file mode 100644 index 0000000..7c974a4 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/brand-source/fonts/barlow-semibold.ttf differ diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/licenses/barlow-OFL.txt b/design/channels/orbit-after-dark-motion-03/brand-source/licenses/barlow-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/brand-source/licenses/barlow-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/licenses/barlow-condensed-OFL.txt b/design/channels/orbit-after-dark-motion-03/brand-source/licenses/barlow-condensed-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/brand-source/licenses/barlow-condensed-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark.vectorcraft b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark.vectorcraft new file mode 100644 index 0000000..3215480 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark.vectorcraft @@ -0,0 +1,1574 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_primary.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 1600.0, + "y1": 640.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 146.061279296875, + "y": 131.1414337158203 + }, + "end": { + "x": 146.061279296875, + "y": 475.00001525878906 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 335.0, + 132.0 + ], + "in": [ + 185.0, + 207.0 + ], + "out": [ + 141.0, + 114.0 + ] + }, + { + "p": [ + 257.0, + 475.0 + ], + "in": [ + 66.0, + 384.0 + ], + "out": [ + 143.0, + 363.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 11.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 129.0, + 369.0 + ], + "out": [ + 102.0, + 399.0 + ] + }, + { + "p": [ + 161.0, + 428.0 + ], + "in": [ + 111.0, + 425.0 + ], + "out": [ + 267.0, + 432.0 + ] + }, + { + "p": [ + 445.0, + 289.0 + ], + "in": [ + 431.0, + 340.0 + ], + "out": [ + 455.0, + 250.0 + ] + }, + { + "p": [ + 369.0, + 261.0 + ], + "in": [ + 405.0, + 250.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 439.0, + 282.0 + ], + "in": [ + 439.0, + 277.0294494628906 + ], + "out": [ + 439.0, + 286.9705505371094 + ], + "kind": "Smooth" + }, + { + "p": [ + 430.0, + 291.0 + ], + "in": [ + 434.9705505371094, + 291.0 + ], + "out": [ + 425.0294494628906, + 291.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 421.0, + 282.0 + ], + "in": [ + 421.0, + 286.9705505371094 + ], + "out": [ + 421.0, + 277.0294494628906 + ], + "kind": "Smooth" + }, + { + "p": [ + 430.0, + 273.0 + ], + "in": [ + 425.0294494628906, + 273.0 + ], + "out": [ + 434.9705505371094, + 273.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 5, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 470.0, + 160.0 + ], + "runs": [ + { + "text": "ORBIT", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 48.0, + "tracking": 270.8333333333333, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 451.0, + 335.0 + ], + "runs": [ + { + "text": "AFTER", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 216.0, + "tracking": 37.03703703703704, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 0.0, + "y": -216.0 + }, + "end": { + "x": 0.0, + "y": 43.20001220703125 + }, + "aspect": 1.0 + }, + "angle": -90.0 + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 7, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 443.0, + 536.0 + ], + "runs": [ + { + "text": "DARK", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 244.0, + "tracking": 49.18032786885246, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9764706, + "g": 0.58431375, + "b": 0.8627451 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 0.0, + "y": -244.0 + }, + "end": { + "x": 258.3698645932122, + "y": 186.55646104068177 + }, + "aspect": 1.0 + }, + "angle": -59.03272223354657 + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 8, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 5.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 468.0, + 574.0 + ], + "out": [ + 734.0, + 610.0 + ] + }, + { + "p": [ + 1403.0, + 479.0 + ], + "in": [ + 1169.0, + 577.0 + ] + } + ], + "closed": false + } + ] + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 9 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_sky.svg b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_sky.svg new file mode 100644 index 0000000..85f555f --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_sky.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_skyline.svg b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_skyline.svg new file mode 100644 index 0000000..75c394b --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_skyline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_stars.svg b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_stars.svg new file mode 100644 index 0000000..a30102e --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_stars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_windows.svg b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_windows.svg new file mode 100644 index 0000000..4ee110a --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/brand-source/sources/orbit_after_dark_windows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/build-motion.py b/design/channels/orbit-after-dark-motion-03/build-motion.py new file mode 100644 index 0000000..0616e1f --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/build-motion.py @@ -0,0 +1,53 @@ +from pathlib import Path +import xml.etree.ElementTree as ET +import json,subprocess,os +P=Path(__file__).resolve().parent; B=P/'brand-source' +S=P/'sources'; E=P/'exports'; S.mkdir(exist_ok=True);E.mkdir(exist_ok=True) +def body(path): + root=ET.parse(path).getroot() + return ''.join(ET.tostring(c,encoding='unicode') for c in root) +def svg(content):return ''+content+'' +# Preserve the approved geometry, but leave its static trail out for the animated stroke. +city=ET.parse(B/'sources/orbit_after_dark_skyline.svg').getroot() +city_body=''.join(ET.tostring(c,encoding='unicode') for c in list(city)[:2]) +windows=list(ET.parse(B/'sources/orbit_after_dark_windows.svg').getroot()) +chosen=[windows[int((i+.4)*len(windows)/12)] for i in range(12)] +chosen_ids={id(v) for v in chosen} +dim_windows=''.join(ET.tostring(w,encoding='unicode') for w in windows if id(w) not in chosen_ids) +base=body(B/'sources/orbit_after_dark_sky.svg')+body(B/'sources/orbit_after_dark_stars.svg')+city_body+''+dim_windows+'' +(S/'night_base.svg').write_text(svg(base)) +env=dict(os.environ,XDG_DATA_HOME=str((P.parent.parent.parent/'.tooling/font-data').resolve())) +def render(src,dst):subprocess.run(['vectorcraft-cli','convert',str(src),str(dst)],env=env,check=True,stdout=subprocess.DEVNULL) +render(S/'night_base.svg',E/'night_base.png') +for i,w in enumerate(chosen): + w.set('opacity','.9') + (S/f'window_{i+1:02}.svg').write_text(svg(ET.tostring(w,encoding='unicode'))) + render(S/f'window_{i+1:02}.svg',E/f'window_{i+1:02}.png') +steps=[{'command':'comp.new','params':{'name':'After Dark — night settles','width':1280,'height':720,'frameRate':25,'duration':4.2,'background':'#071632'}}] +def cmd(c,**p):steps.append({'command':c,'params':p}) +def load(path,name,scale): + cmd('file.import',paths=[str(path)],addToComp=True) + cmd('layer.rename',layer='#1',name=name) + cmd('prop.set',layer=name,path='transform/scale',value=[scale,scale,100]) +def key(layer,path,t,v):cmd('prop.addKey',layer=layer,path=path,time=round(t,3),value=v) +load(E/'night_base.png','Night skyline',66.6667) +for i in range(12): + name=f'Flat window {i+1:02}';load(E/f'window_{i+1:02}.png',name,66.6667) + t=.28+i*.075 + for at,v in [(0,0),(t,0),(t+.035,100),(t+.08,35 if i%3==0 else 100),(t+.13,100)]:key(name,'transform/opacity',at,v) +# Real editable vector path with Trim Paths: the trail draws itself, rather than wiping a raster. +path={'t':'Path','v':{'vertices':[[135,545],[1125,270]],'in_tangents':[[0,0],[-190,200]],'out_tangents':[[200,140],[0,0]],'closed':False}} +for name,width,opacity in [('Orbital trail glow',10,14),('Magenta orbital trail',2.5,100)]: + cmd('layer.newShape',kind='none',name=name) + for kind in ['path','stroke','trim']:cmd('layer.addShapeItem',layer=name,kind=kind) + for path_name,value in [('transform/position',[0,0,0]),('contents/path/path',path),('contents/stroke/color',[232/255,76/255,203/255,1]),('contents/stroke/width',width),('contents/stroke/opacity',opacity),('contents/stroke/cap',1)]:cmd('prop.set',layer=name,path=path_name,value=value) + key(name,'contents/trim/end',0,0);key(name,'contents/trim/end',1.4,0);key(name,'contents/trim/end',2.4,100) + for t,v in [(0,100),(3.95,100),(4.2,0)]:key(name,'transform/opacity',t,v) +load(B/'exports/orbit_after_dark_primary.png','After Dark logo',62) +cmd('prop.set',layer='After Dark logo',path='transform/position',value=[640,330,0]) +for t,v in [(0,0),(2.44,0),(2.92,100),(3.95,100),(4.2,0)]:key('After Dark logo','transform/opacity',t,v) +for t,v in [(2.44,[64,64,100]),(2.92,[62,62,100])]:key('After Dark logo','transform/scale',t,v) +file=S/'build-commands.json';file.write_text(json.dumps(steps,indent=2)) +project=S/'orbit_after_dark_night.ecproj' +subprocess.run(['effectcraft-cli','--empty','run','--commands',str(file),'--save-as',str(project),'--json'],check=True,stdout=subprocess.DEVNULL) +subprocess.run(['effectcraft-cli','--project',str(project),'render','--out',str(E/'orbit_after_dark_night.mp4'),'--format','h264','--fps','25','--bitrate','3500','--audio','off','--progress'],check=True) diff --git a/design/channels/orbit-after-dark-motion-03/exports/night_base.png b/design/channels/orbit-after-dark-motion-03/exports/night_base.png new file mode 100644 index 0000000..c110128 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/night_base.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/orbit_after_dark_night.mp4 b/design/channels/orbit-after-dark-motion-03/exports/orbit_after_dark_night.mp4 new file mode 100644 index 0000000..b917d4b Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/orbit_after_dark_night.mp4 differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_01.png b/design/channels/orbit-after-dark-motion-03/exports/window_01.png new file mode 100644 index 0000000..4a7e3b2 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_01.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_02.png b/design/channels/orbit-after-dark-motion-03/exports/window_02.png new file mode 100644 index 0000000..5079158 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_02.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_03.png b/design/channels/orbit-after-dark-motion-03/exports/window_03.png new file mode 100644 index 0000000..5d30517 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_03.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_04.png b/design/channels/orbit-after-dark-motion-03/exports/window_04.png new file mode 100644 index 0000000..2eb1c56 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_04.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_05.png b/design/channels/orbit-after-dark-motion-03/exports/window_05.png new file mode 100644 index 0000000..85d3821 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_05.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_06.png b/design/channels/orbit-after-dark-motion-03/exports/window_06.png new file mode 100644 index 0000000..4ee47bd Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_06.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_07.png b/design/channels/orbit-after-dark-motion-03/exports/window_07.png new file mode 100644 index 0000000..aea32b5 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_07.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_08.png b/design/channels/orbit-after-dark-motion-03/exports/window_08.png new file mode 100644 index 0000000..b52a8f8 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_08.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_09.png b/design/channels/orbit-after-dark-motion-03/exports/window_09.png new file mode 100644 index 0000000..1bb9ee6 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_09.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_10.png b/design/channels/orbit-after-dark-motion-03/exports/window_10.png new file mode 100644 index 0000000..f2d3146 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_10.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_11.png b/design/channels/orbit-after-dark-motion-03/exports/window_11.png new file mode 100644 index 0000000..d98fa6a Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_11.png differ diff --git a/design/channels/orbit-after-dark-motion-03/exports/window_12.png b/design/channels/orbit-after-dark-motion-03/exports/window_12.png new file mode 100644 index 0000000..8e54dde Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/exports/window_12.png differ diff --git a/design/channels/orbit-after-dark-motion-03/review/final_logo.png b/design/channels/orbit-after-dark-motion-03/review/final_logo.png new file mode 100644 index 0000000..16a90dd Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/review/final_logo.png differ diff --git a/design/channels/orbit-after-dark-motion-03/review/night_sequence.png b/design/channels/orbit-after-dark-motion-03/review/night_sequence.png new file mode 100644 index 0000000..ffadc92 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/review/night_sequence.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/build-commands.json b/design/channels/orbit-after-dark-motion-03/sources/build-commands.json new file mode 100644 index 0000000..3df10e1 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/build-commands.json @@ -0,0 +1,1376 @@ +[ + { + "command": "comp.new", + "params": { + "name": "After Dark \u2014 night settles", + "width": 1280, + "height": 720, + "frameRate": 25, + "duration": 4.2, + "background": "#071632" + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/night_base.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Night skyline" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Night skyline", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_01.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 01" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 01", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 01", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 01", + "path": "transform/opacity", + "time": 0.28, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 01", + "path": "transform/opacity", + "time": 0.315, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 01", + "path": "transform/opacity", + "time": 0.36, + "value": 35 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 01", + "path": "transform/opacity", + "time": 0.41, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_02.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 02" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 02", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 02", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 02", + "path": "transform/opacity", + "time": 0.355, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 02", + "path": "transform/opacity", + "time": 0.39, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 02", + "path": "transform/opacity", + "time": 0.435, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 02", + "path": "transform/opacity", + "time": 0.485, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_03.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 03" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 03", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 03", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 03", + "path": "transform/opacity", + "time": 0.43, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 03", + "path": "transform/opacity", + "time": 0.465, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 03", + "path": "transform/opacity", + "time": 0.51, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 03", + "path": "transform/opacity", + "time": 0.56, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_04.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 04" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 04", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 04", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 04", + "path": "transform/opacity", + "time": 0.505, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 04", + "path": "transform/opacity", + "time": 0.54, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 04", + "path": "transform/opacity", + "time": 0.585, + "value": 35 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 04", + "path": "transform/opacity", + "time": 0.635, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_05.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 05" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 05", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 05", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 05", + "path": "transform/opacity", + "time": 0.58, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 05", + "path": "transform/opacity", + "time": 0.615, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 05", + "path": "transform/opacity", + "time": 0.66, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 05", + "path": "transform/opacity", + "time": 0.71, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_06.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 06" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 06", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 06", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 06", + "path": "transform/opacity", + "time": 0.655, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 06", + "path": "transform/opacity", + "time": 0.69, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 06", + "path": "transform/opacity", + "time": 0.735, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 06", + "path": "transform/opacity", + "time": 0.785, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_07.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 07" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 07", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 07", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 07", + "path": "transform/opacity", + "time": 0.73, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 07", + "path": "transform/opacity", + "time": 0.765, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 07", + "path": "transform/opacity", + "time": 0.81, + "value": 35 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 07", + "path": "transform/opacity", + "time": 0.86, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_08.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 08" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 08", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 08", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 08", + "path": "transform/opacity", + "time": 0.805, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 08", + "path": "transform/opacity", + "time": 0.84, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 08", + "path": "transform/opacity", + "time": 0.885, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 08", + "path": "transform/opacity", + "time": 0.935, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_09.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 09" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 09", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 09", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 09", + "path": "transform/opacity", + "time": 0.88, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 09", + "path": "transform/opacity", + "time": 0.915, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 09", + "path": "transform/opacity", + "time": 0.96, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 09", + "path": "transform/opacity", + "time": 1.01, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_10.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 10" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 10", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 10", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 10", + "path": "transform/opacity", + "time": 0.955, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 10", + "path": "transform/opacity", + "time": 0.99, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 10", + "path": "transform/opacity", + "time": 1.035, + "value": 35 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 10", + "path": "transform/opacity", + "time": 1.085, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_11.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 11" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 11", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 11", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 11", + "path": "transform/opacity", + "time": 1.03, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 11", + "path": "transform/opacity", + "time": 1.065, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 11", + "path": "transform/opacity", + "time": 1.11, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 11", + "path": "transform/opacity", + "time": 1.16, + "value": 100 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_12.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "Flat window 12" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Flat window 12", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 12", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 12", + "path": "transform/opacity", + "time": 1.105, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 12", + "path": "transform/opacity", + "time": 1.14, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 12", + "path": "transform/opacity", + "time": 1.185, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Flat window 12", + "path": "transform/opacity", + "time": 1.235, + "value": 100 + } + }, + { + "command": "layer.newShape", + "params": { + "kind": "none", + "name": "Orbital trail glow" + } + }, + { + "command": "layer.addShapeItem", + "params": { + "layer": "Orbital trail glow", + "kind": "path" + } + }, + { + "command": "layer.addShapeItem", + "params": { + "layer": "Orbital trail glow", + "kind": "stroke" + } + }, + { + "command": "layer.addShapeItem", + "params": { + "layer": "Orbital trail glow", + "kind": "trim" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Orbital trail glow", + "path": "transform/position", + "value": [ + 0, + 0, + 0 + ] + } + }, + { + "command": "prop.set", + "params": { + "layer": "Orbital trail glow", + "path": "contents/path/path", + "value": { + "t": "Path", + "v": { + "vertices": [ + [ + 135, + 545 + ], + [ + 1125, + 270 + ] + ], + "in_tangents": [ + [ + 0, + 0 + ], + [ + -190, + 200 + ] + ], + "out_tangents": [ + [ + 200, + 140 + ], + [ + 0, + 0 + ] + ], + "closed": false + } + } + } + }, + { + "command": "prop.set", + "params": { + "layer": "Orbital trail glow", + "path": "contents/stroke/color", + "value": [ + 0.9098039215686274, + 0.2980392156862745, + 0.796078431372549, + 1 + ] + } + }, + { + "command": "prop.set", + "params": { + "layer": "Orbital trail glow", + "path": "contents/stroke/width", + "value": 10 + } + }, + { + "command": "prop.set", + "params": { + "layer": "Orbital trail glow", + "path": "contents/stroke/opacity", + "value": 14 + } + }, + { + "command": "prop.set", + "params": { + "layer": "Orbital trail glow", + "path": "contents/stroke/cap", + "value": 1 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Orbital trail glow", + "path": "contents/trim/end", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Orbital trail glow", + "path": "contents/trim/end", + "time": 1.4, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Orbital trail glow", + "path": "contents/trim/end", + "time": 2.4, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Orbital trail glow", + "path": "transform/opacity", + "time": 0, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Orbital trail glow", + "path": "transform/opacity", + "time": 3.95, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Orbital trail glow", + "path": "transform/opacity", + "time": 4.2, + "value": 0 + } + }, + { + "command": "layer.newShape", + "params": { + "kind": "none", + "name": "Magenta orbital trail" + } + }, + { + "command": "layer.addShapeItem", + "params": { + "layer": "Magenta orbital trail", + "kind": "path" + } + }, + { + "command": "layer.addShapeItem", + "params": { + "layer": "Magenta orbital trail", + "kind": "stroke" + } + }, + { + "command": "layer.addShapeItem", + "params": { + "layer": "Magenta orbital trail", + "kind": "trim" + } + }, + { + "command": "prop.set", + "params": { + "layer": "Magenta orbital trail", + "path": "transform/position", + "value": [ + 0, + 0, + 0 + ] + } + }, + { + "command": "prop.set", + "params": { + "layer": "Magenta orbital trail", + "path": "contents/path/path", + "value": { + "t": "Path", + "v": { + "vertices": [ + [ + 135, + 545 + ], + [ + 1125, + 270 + ] + ], + "in_tangents": [ + [ + 0, + 0 + ], + [ + -190, + 200 + ] + ], + "out_tangents": [ + [ + 200, + 140 + ], + [ + 0, + 0 + ] + ], + "closed": false + } + } + } + }, + { + "command": "prop.set", + "params": { + "layer": "Magenta orbital trail", + "path": "contents/stroke/color", + "value": [ + 0.9098039215686274, + 0.2980392156862745, + 0.796078431372549, + 1 + ] + } + }, + { + "command": "prop.set", + "params": { + "layer": "Magenta orbital trail", + "path": "contents/stroke/width", + "value": 2.5 + } + }, + { + "command": "prop.set", + "params": { + "layer": "Magenta orbital trail", + "path": "contents/stroke/opacity", + "value": 100 + } + }, + { + "command": "prop.set", + "params": { + "layer": "Magenta orbital trail", + "path": "contents/stroke/cap", + "value": 1 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Magenta orbital trail", + "path": "contents/trim/end", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Magenta orbital trail", + "path": "contents/trim/end", + "time": 1.4, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Magenta orbital trail", + "path": "contents/trim/end", + "time": 2.4, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Magenta orbital trail", + "path": "transform/opacity", + "time": 0, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Magenta orbital trail", + "path": "transform/opacity", + "time": 3.95, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "Magenta orbital trail", + "path": "transform/opacity", + "time": 4.2, + "value": 0 + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.png" + ], + "addToComp": true + } + }, + { + "command": "layer.rename", + "params": { + "layer": "#1", + "name": "After Dark logo" + } + }, + { + "command": "prop.set", + "params": { + "layer": "After Dark logo", + "path": "transform/scale", + "value": [ + 62, + 62, + 100 + ] + } + }, + { + "command": "prop.set", + "params": { + "layer": "After Dark logo", + "path": "transform/position", + "value": [ + 640, + 330, + 0 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "After Dark logo", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "After Dark logo", + "path": "transform/opacity", + "time": 2.44, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "After Dark logo", + "path": "transform/opacity", + "time": 2.92, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "After Dark logo", + "path": "transform/opacity", + "time": 3.95, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "After Dark logo", + "path": "transform/opacity", + "time": 4.2, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "After Dark logo", + "path": "transform/scale", + "time": 2.44, + "value": [ + 64, + 64, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "After Dark logo", + "path": "transform/scale", + "time": 2.92, + "value": [ + 62, + 62, + 100 + ] + } + } +] \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/night_base.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/night_base.png new file mode 100644 index 0000000..c110128 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/night_base.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/orbit_after_dark_primary.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/orbit_after_dark_primary.png new file mode 100644 index 0000000..dff363e Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/orbit_after_dark_primary.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_01.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_01.png new file mode 100644 index 0000000..4a7e3b2 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_01.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_02.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_02.png new file mode 100644 index 0000000..5079158 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_02.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_03.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_03.png new file mode 100644 index 0000000..5d30517 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_03.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_04.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_04.png new file mode 100644 index 0000000..2eb1c56 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_04.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_05.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_05.png new file mode 100644 index 0000000..85d3821 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_05.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_06.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_06.png new file mode 100644 index 0000000..4ee47bd Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_06.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_07.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_07.png new file mode 100644 index 0000000..aea32b5 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_07.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_08.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_08.png new file mode 100644 index 0000000..b52a8f8 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_08.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_09.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_09.png new file mode 100644 index 0000000..1bb9ee6 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_09.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_10.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_10.png new file mode 100644 index 0000000..f2d3146 Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_10.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_11.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_11.png new file mode 100644 index 0000000..d98fa6a Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_11.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_12.png b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_12.png new file mode 100644 index 0000000..8e54dde Binary files /dev/null and b/design/channels/orbit-after-dark-motion-03/sources/collected-project/(Footage)/window_12.png differ diff --git a/design/channels/orbit-after-dark-motion-03/sources/collected-project/orbit_after_dark_night.ecproj b/design/channels/orbit-after-dark-motion-03/sources/collected-project/orbit_after_dark_night.ecproj new file mode 100644 index 0000000..9d57576 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/collected-project/orbit_after_dark_night.ecproj @@ -0,0 +1,11231 @@ +{ + "schema": 2, + "settings": { + "bit_depth": "Bpc8", + "linearize": false, + "working_space": null, + "blend_linear": false, + "time_display": "Timecode", + "frame_start": 0, + "audio_sample_rate": 48000, + "gpu_acceleration": true, + "color_engine": "Adobe", + "hdr": "Clip", + "output_space": null, + "working_gamma": 2.2 + }, + "items": { + "1": { + "id": 1, + "name": "After Dark \u2014 night settles", + "label": "Sandstone", + "comment": "", + "parent": null, + "kind": { + "type": "Comp", + "width": 1280, + "height": 720, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 25, + "den": 1 + }, + "duration": 1066867200000, + "display_start": 0, + "background": [ + 0.02745098, + 0.08627451, + 0.19607843 + ], + "work_area": [ + 0, + 1066867200000 + ], + "layers": [ + { + "id": 433, + "name": "After Dark logo", + "source": { + "type": "Footage", + "item": 432 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 434, + "match": "layer", + "name": "orbit_after_dark_primary.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 435, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 436, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 445, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 437, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 800.0, + 320.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 438, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 330.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 439, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "keys": [ + { + "time": 619799040000, + "value": { + "t": "Vec3", + "v": [ + 64.0, + 64.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 741726720000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 440, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 441, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 442, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 443, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 444, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 619799040000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 741726720000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1005903360000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1066867200000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 446, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 447, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 448, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 449, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 450, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 451, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 452, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 453, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 454, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 455, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 373, + "name": "Magenta orbital trail", + "source": { + "type": "Shape" + }, + "label": "Blue", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 374, + "match": "layer", + "name": "Magenta orbital trail", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 375, + "match": "contents", + "name": "Contents", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 397, + "match": "path", + "name": "Path 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 398, + "match": "direction", + "name": "Path Direction", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Hidden" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 399, + "match": "path", + "name": "Path", + "value": { + "t": "Path", + "v": { + "vertices": [ + [ + 135.0, + 545.0 + ], + [ + 1125.0, + 270.0 + ] + ], + "in_tangents": [ + [ + 0.0, + 0.0 + ], + [ + -190.0, + 200.0 + ] + ], + "out_tangents": [ + [ + 200.0, + 140.0 + ], + [ + 0.0, + 0.0 + ] + ], + "closed": false + } + }, + "ui": { + "kind": "Path" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 400, + "match": "stroke", + "name": "Stroke 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 401, + "match": "blend", + "name": "Blend Mode", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Hidden" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 402, + "match": "composite", + "name": "Composite", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Below Previous in Same Group", + "Above Previous in Same Group" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 403, + "match": "color", + "name": "Color", + "value": { + "t": "Color", + "v": [ + 0.9098039215686274, + 0.2980392156862745, + 0.796078431372549, + 1.0 + ] + }, + "ui": { + "kind": "Color" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 404, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 405, + "match": "width", + "name": "Stroke Width", + "value": { + "t": "Scalar", + "v": 2.5 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 406, + "match": "cap", + "name": "Line Cap", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Butt Cap", + "Round Cap", + "Projecting Cap" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 407, + "match": "join", + "name": "Line Join", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Miter Join", + "Round Join", + "Bevel Join" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 408, + "match": "miter", + "name": "Miter Limit", + "value": { + "t": "Scalar", + "v": 4.0 + }, + "ui": { + "kind": "Number" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Group", + "uid": 409, + "match": "dashes", + "name": "Dashes", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 410, + "match": "dash", + "name": "Dash", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 411, + "match": "gap", + "name": "Gap", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 412, + "match": "offset", + "name": "Offset", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 413, + "match": "taper", + "name": "Taper", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 414, + "match": "units", + "name": "Length Units", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Pixels", + "Percent" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 415, + "match": "startLength", + "name": "Start Length", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 416, + "match": "endLength", + "name": "End Length", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 417, + "match": "startWidth", + "name": "Start Width", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 418, + "match": "endWidth", + "name": "End Width", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 419, + "match": "startEase", + "name": "Start Ease", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 420, + "match": "endEase", + "name": "End Ease", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 421, + "match": "wave", + "name": "Wave", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 422, + "match": "amount", + "name": "Amount", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 423, + "match": "units", + "name": "Units", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Pixels", + "Cycles" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 424, + "match": "wavelength", + "name": "Wavelength", + "value": { + "t": "Scalar", + "v": 20.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 425, + "match": "cycles", + "name": "Cycles", + "value": { + "t": "Scalar", + "v": 10.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 1000.0, + "slider_min": 0.0, + "slider_max": 50.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 426, + "match": "phase", + "name": "Phase", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + }, + { + "node": "Group", + "uid": 427, + "match": "trim", + "name": "Trim Paths 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 428, + "match": "start", + "name": "Start", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 429, + "match": "end", + "name": "End", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 355622400000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 609638400000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 430, + "match": "offset", + "name": "Offset", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 431, + "match": "mode", + "name": "Trim Multiple Shapes", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Simultaneously", + "Individually" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + }, + { + "node": "Group", + "uid": 376, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 377, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 386, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 378, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 379, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 380, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 100.0, + 100.0, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 381, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 382, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 383, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 384, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 385, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1005903360000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1066867200000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 387, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 388, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 389, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 390, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 391, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 392, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 393, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 394, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 395, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 396, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 314, + "name": "Orbital trail glow", + "source": { + "type": "Shape" + }, + "label": "Blue", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 315, + "match": "layer", + "name": "Orbital trail glow", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 316, + "match": "contents", + "name": "Contents", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 338, + "match": "path", + "name": "Path 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 339, + "match": "direction", + "name": "Path Direction", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Hidden" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 340, + "match": "path", + "name": "Path", + "value": { + "t": "Path", + "v": { + "vertices": [ + [ + 135.0, + 545.0 + ], + [ + 1125.0, + 270.0 + ] + ], + "in_tangents": [ + [ + 0.0, + 0.0 + ], + [ + -190.0, + 200.0 + ] + ], + "out_tangents": [ + [ + 200.0, + 140.0 + ], + [ + 0.0, + 0.0 + ] + ], + "closed": false + } + }, + "ui": { + "kind": "Path" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 341, + "match": "stroke", + "name": "Stroke 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 342, + "match": "blend", + "name": "Blend Mode", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Hidden" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 343, + "match": "composite", + "name": "Composite", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Below Previous in Same Group", + "Above Previous in Same Group" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 344, + "match": "color", + "name": "Color", + "value": { + "t": "Color", + "v": [ + 0.9098039215686274, + 0.2980392156862745, + 0.796078431372549, + 1.0 + ] + }, + "ui": { + "kind": "Color" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 345, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 14.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 346, + "match": "width", + "name": "Stroke Width", + "value": { + "t": "Scalar", + "v": 10.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 347, + "match": "cap", + "name": "Line Cap", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Butt Cap", + "Round Cap", + "Projecting Cap" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 348, + "match": "join", + "name": "Line Join", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Miter Join", + "Round Join", + "Bevel Join" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 349, + "match": "miter", + "name": "Miter Limit", + "value": { + "t": "Scalar", + "v": 4.0 + }, + "ui": { + "kind": "Number" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Group", + "uid": 350, + "match": "dashes", + "name": "Dashes", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 351, + "match": "dash", + "name": "Dash", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 352, + "match": "gap", + "name": "Gap", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 353, + "match": "offset", + "name": "Offset", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 354, + "match": "taper", + "name": "Taper", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 355, + "match": "units", + "name": "Length Units", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Pixels", + "Percent" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 356, + "match": "startLength", + "name": "Start Length", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 357, + "match": "endLength", + "name": "End Length", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 358, + "match": "startWidth", + "name": "Start Width", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 359, + "match": "endWidth", + "name": "End Width", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 360, + "match": "startEase", + "name": "Start Ease", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 361, + "match": "endEase", + "name": "End Ease", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 362, + "match": "wave", + "name": "Wave", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 363, + "match": "amount", + "name": "Amount", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 364, + "match": "units", + "name": "Units", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Pixels", + "Cycles" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 365, + "match": "wavelength", + "name": "Wavelength", + "value": { + "t": "Scalar", + "v": 20.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 366, + "match": "cycles", + "name": "Cycles", + "value": { + "t": "Scalar", + "v": 10.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 1000.0, + "slider_min": 0.0, + "slider_max": 50.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 367, + "match": "phase", + "name": "Phase", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + }, + { + "node": "Group", + "uid": 368, + "match": "trim", + "name": "Trim Paths 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 369, + "match": "start", + "name": "Start", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 370, + "match": "end", + "name": "End", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 355622400000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 609638400000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 371, + "match": "offset", + "name": "Offset", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 372, + "match": "mode", + "name": "Trim Multiple Shapes", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Simultaneously", + "Individually" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + }, + { + "node": "Group", + "uid": 317, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 318, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 327, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 319, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 320, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 321, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 100.0, + 100.0, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 322, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 323, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 324, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 325, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 326, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1005903360000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1066867200000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 328, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 329, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 330, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 331, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 332, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 333, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 334, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 335, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 336, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 337, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 291, + "name": "Flat window 12", + "source": { + "type": "Footage", + "item": 290 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 292, + "match": "layer", + "name": "window_12.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 293, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 294, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 303, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 295, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 296, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 297, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 298, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 299, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 300, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 301, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 302, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 284497920000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 304819200000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 314979840000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 304, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 305, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 306, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 307, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 308, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 309, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 310, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 311, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 312, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 313, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 267, + "name": "Flat window 11", + "source": { + "type": "Footage", + "item": 266 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 268, + "match": "layer", + "name": "window_11.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 269, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 270, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 279, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 271, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 272, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 273, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 274, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 275, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 276, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 277, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 278, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 264176640000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 274337280000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 284497920000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 294658560000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 280, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 281, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 282, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 283, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 284, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 285, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 286, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 287, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 288, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 289, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 243, + "name": "Flat window 10", + "source": { + "type": "Footage", + "item": 242 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 244, + "match": "layer", + "name": "window_10.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 245, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 246, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 255, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 247, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 248, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 249, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 250, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 251, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 252, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 253, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 254, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 243855360000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 254016000000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 264176640000, + "value": { + "t": "Scalar", + "v": 35.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 274337280000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 256, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 257, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 258, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 259, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 260, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 261, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 262, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 263, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 264, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 265, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 219, + "name": "Flat window 09", + "source": { + "type": "Footage", + "item": 218 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 220, + "match": "layer", + "name": "window_09.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 221, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 222, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 231, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 223, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 224, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 225, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 226, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 227, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 228, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 229, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 230, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 223534080000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 233694720000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 243855360000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 254016000000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 232, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 233, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 234, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 235, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 236, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 237, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 238, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 239, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 240, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 241, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 195, + "name": "Flat window 08", + "source": { + "type": "Footage", + "item": 194 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 196, + "match": "layer", + "name": "window_08.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 197, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 198, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 207, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 199, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 200, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 201, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 202, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 203, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 204, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 205, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 206, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 203212800000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 213373440000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 223534080000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 233694720000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 208, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 209, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 210, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 211, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 212, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 213, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 214, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 215, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 216, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 217, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 171, + "name": "Flat window 07", + "source": { + "type": "Footage", + "item": 170 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 172, + "match": "layer", + "name": "window_07.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 173, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 174, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 183, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 175, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 176, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 177, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 178, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 179, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 180, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 181, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 182, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 182891520000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 193052160000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 203212800000, + "value": { + "t": "Scalar", + "v": 35.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 213373440000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 184, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 185, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 186, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 187, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 188, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 189, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 190, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 191, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 192, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 193, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 147, + "name": "Flat window 06", + "source": { + "type": "Footage", + "item": 146 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 148, + "match": "layer", + "name": "window_06.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 149, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 150, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 159, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 151, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 152, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 153, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 154, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 155, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 156, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 157, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 158, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 162570240000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 172730880000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 182891520000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 203212800000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 160, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 161, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 162, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 163, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 164, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 165, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 166, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 167, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 168, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 169, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 123, + "name": "Flat window 05", + "source": { + "type": "Footage", + "item": 122 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 124, + "match": "layer", + "name": "window_05.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 125, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 126, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 135, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 127, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 128, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 129, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 130, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 131, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 132, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 133, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 134, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 142248960000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 152409600000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 162570240000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 182891520000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 136, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 137, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 138, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 139, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 140, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 141, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 142, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 143, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 144, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 145, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 99, + "name": "Flat window 04", + "source": { + "type": "Footage", + "item": 98 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 100, + "match": "layer", + "name": "window_04.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 101, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 102, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 111, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 103, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 104, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 105, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 106, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 107, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 108, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 109, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 110, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 132088320000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 152409600000, + "value": { + "t": "Scalar", + "v": 35.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 162570240000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 112, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 113, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 114, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 115, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 116, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 117, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 118, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 119, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 120, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 121, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 75, + "name": "Flat window 03", + "source": { + "type": "Footage", + "item": 74 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 76, + "match": "layer", + "name": "window_03.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 77, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 78, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 87, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 79, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 80, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 81, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 82, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 83, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 84, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 85, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 86, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 111767040000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 121927680000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 132088320000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 142248960000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 88, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 89, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 90, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 91, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 92, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 93, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 94, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 95, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 96, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 97, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 51, + "name": "Flat window 02", + "source": { + "type": "Footage", + "item": 50 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 52, + "match": "layer", + "name": "window_02.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 53, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 54, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 63, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 55, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 56, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 57, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 58, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 59, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 60, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 61, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 62, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 91445760000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 101606400000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 111767040000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 121927680000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 64, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 65, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 66, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 67, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 68, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 69, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 70, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 71, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 72, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 73, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 27, + "name": "Flat window 01", + "source": { + "type": "Footage", + "item": 26 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 28, + "match": "layer", + "name": "window_01.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 29, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 30, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 39, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 31, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 32, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 33, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 34, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 35, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 36, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 37, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 38, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 71124480000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 81285120000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 91445760000, + "value": { + "t": "Scalar", + "v": 35.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 101606400000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 40, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 41, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 42, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 43, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 44, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 45, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 46, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 47, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 48, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 49, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 3, + "name": "Night skyline", + "source": { + "type": "Footage", + "item": 2 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 4, + "match": "layer", + "name": "night_base.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 5, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 6, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 15, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 7, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 8, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 9, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 10, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 11, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 12, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 13, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 14, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 16, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 17, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 18, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 19, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 20, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 21, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 22, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 23, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 24, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 25, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + } + ], + "markers": [], + "shutter_angle": 180.0, + "shutter_phase": -90.0, + "motion_blur_samples": 16, + "motion_blur_adaptive_limit": 128, + "renderer": "Classic3D", + "hide_shy": false, + "enable_motion_blur": true, + "enable_frame_blending": true, + "draft_3d": false, + "preserve_frame_rate": false, + "preserve_resolution": false, + "poster_time": 0, + "global_light": { + "angle": { + "uid": 0, + "match": "globalLightAngle", + "name": "Global Light Angle", + "value": { + "t": "Scalar", + "v": 120.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + "altitude": { + "uid": 0, + "match": "globalLightAltitude", + "name": "Global Light Altitude", + "value": { + "t": "Scalar", + "v": 30.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + } + } + }, + "2": { + "id": 2, + "name": "night_base.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/night_base.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Ignore", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "26": { + "id": 26, + "name": "window_01.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_01.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "50": { + "id": 50, + "name": "window_02.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_02.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "74": { + "id": 74, + "name": "window_03.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_03.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "98": { + "id": 98, + "name": "window_04.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_04.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "122": { + "id": 122, + "name": "window_05.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_05.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "146": { + "id": 146, + "name": "window_06.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_06.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "170": { + "id": 170, + "name": "window_07.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_07.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "194": { + "id": 194, + "name": "window_08.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_08.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "218": { + "id": 218, + "name": "window_09.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_09.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "242": { + "id": 242, + "name": "window_10.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_10.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "266": { + "id": 266, + "name": "window_11.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_11.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "290": { + "id": 290, + "name": "window_12.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/window_12.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "432": { + "id": 432, + "name": "orbit_after_dark_primary.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/orbit_after_dark_primary.png", + "kind": "Still", + "width": 1600, + "height": 640, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + } + }, + "next_id": 456 +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/night_base.svg b/design/channels/orbit-after-dark-motion-03/sources/night_base.svg new file mode 100644 index 0000000..052ec5b --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/night_base.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/orbit_after_dark_night.ecproj b/design/channels/orbit-after-dark-motion-03/sources/orbit_after_dark_night.ecproj new file mode 100644 index 0000000..b225dff --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/orbit_after_dark_night.ecproj @@ -0,0 +1,11236 @@ +{ + "savedBy": "0.19.0", + "activeComp": 1, + "openComps": [ + 1 + ], + "schema": 2, + "settings": { + "bit_depth": "Bpc8", + "linearize": false, + "working_space": null, + "blend_linear": false, + "time_display": "Timecode", + "frame_start": 0, + "audio_sample_rate": 48000, + "gpu_acceleration": true, + "color_engine": "Adobe", + "hdr": "Clip", + "output_space": null, + "working_gamma": 2.2 + }, + "items": { + "1": { + "id": 1, + "name": "After Dark — night settles", + "label": "Sandstone", + "comment": "", + "parent": null, + "kind": { + "type": "Comp", + "width": 1280, + "height": 720, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 25, + "den": 1 + }, + "duration": 1066867200000, + "display_start": 0, + "background": [ + 0.02745098, + 0.08627451, + 0.19607843 + ], + "work_area": [ + 0, + 1066867200000 + ], + "layers": [ + { + "id": 433, + "name": "After Dark logo", + "source": { + "type": "Footage", + "item": 432 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 434, + "match": "layer", + "name": "orbit_after_dark_primary.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 435, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 436, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 445, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 437, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 800.0, + 320.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 438, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 330.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 439, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "keys": [ + { + "time": 619799040000, + "value": { + "t": "Vec3", + "v": [ + 64.0, + 64.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 741726720000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 440, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 441, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 442, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 443, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 444, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 619799040000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 741726720000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1005903360000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1066867200000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 446, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 447, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 448, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 449, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 450, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 451, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 452, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 453, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 454, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 455, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 373, + "name": "Magenta orbital trail", + "source": { + "type": "Shape" + }, + "label": "Blue", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 374, + "match": "layer", + "name": "Magenta orbital trail", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 375, + "match": "contents", + "name": "Contents", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 397, + "match": "path", + "name": "Path 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 398, + "match": "direction", + "name": "Path Direction", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Hidden" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 399, + "match": "path", + "name": "Path", + "value": { + "t": "Path", + "v": { + "vertices": [ + [ + 135.0, + 545.0 + ], + [ + 1125.0, + 270.0 + ] + ], + "in_tangents": [ + [ + 0.0, + 0.0 + ], + [ + -190.0, + 200.0 + ] + ], + "out_tangents": [ + [ + 200.0, + 140.0 + ], + [ + 0.0, + 0.0 + ] + ], + "closed": false + } + }, + "ui": { + "kind": "Path" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 400, + "match": "stroke", + "name": "Stroke 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 401, + "match": "blend", + "name": "Blend Mode", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Hidden" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 402, + "match": "composite", + "name": "Composite", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Below Previous in Same Group", + "Above Previous in Same Group" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 403, + "match": "color", + "name": "Color", + "value": { + "t": "Color", + "v": [ + 0.9098039215686274, + 0.2980392156862745, + 0.796078431372549, + 1.0 + ] + }, + "ui": { + "kind": "Color" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 404, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 405, + "match": "width", + "name": "Stroke Width", + "value": { + "t": "Scalar", + "v": 2.5 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 406, + "match": "cap", + "name": "Line Cap", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Butt Cap", + "Round Cap", + "Projecting Cap" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 407, + "match": "join", + "name": "Line Join", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Miter Join", + "Round Join", + "Bevel Join" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 408, + "match": "miter", + "name": "Miter Limit", + "value": { + "t": "Scalar", + "v": 4.0 + }, + "ui": { + "kind": "Number" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Group", + "uid": 409, + "match": "dashes", + "name": "Dashes", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 410, + "match": "dash", + "name": "Dash", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 411, + "match": "gap", + "name": "Gap", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 412, + "match": "offset", + "name": "Offset", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 413, + "match": "taper", + "name": "Taper", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 414, + "match": "units", + "name": "Length Units", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Pixels", + "Percent" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 415, + "match": "startLength", + "name": "Start Length", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 416, + "match": "endLength", + "name": "End Length", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 417, + "match": "startWidth", + "name": "Start Width", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 418, + "match": "endWidth", + "name": "End Width", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 419, + "match": "startEase", + "name": "Start Ease", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 420, + "match": "endEase", + "name": "End Ease", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 421, + "match": "wave", + "name": "Wave", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 422, + "match": "amount", + "name": "Amount", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 423, + "match": "units", + "name": "Units", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Pixels", + "Cycles" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 424, + "match": "wavelength", + "name": "Wavelength", + "value": { + "t": "Scalar", + "v": 20.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 425, + "match": "cycles", + "name": "Cycles", + "value": { + "t": "Scalar", + "v": 10.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 1000.0, + "slider_min": 0.0, + "slider_max": 50.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 426, + "match": "phase", + "name": "Phase", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + }, + { + "node": "Group", + "uid": 427, + "match": "trim", + "name": "Trim Paths 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 428, + "match": "start", + "name": "Start", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 429, + "match": "end", + "name": "End", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 355622400000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 609638400000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 430, + "match": "offset", + "name": "Offset", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 431, + "match": "mode", + "name": "Trim Multiple Shapes", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Simultaneously", + "Individually" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + }, + { + "node": "Group", + "uid": 376, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 377, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 386, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 378, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 379, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 380, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 100.0, + 100.0, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 381, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 382, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 383, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 384, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 385, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1005903360000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1066867200000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 387, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 388, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 389, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 390, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 391, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 392, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 393, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 394, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 395, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 396, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 314, + "name": "Orbital trail glow", + "source": { + "type": "Shape" + }, + "label": "Blue", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 315, + "match": "layer", + "name": "Orbital trail glow", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 316, + "match": "contents", + "name": "Contents", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 338, + "match": "path", + "name": "Path 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 339, + "match": "direction", + "name": "Path Direction", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Hidden" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 340, + "match": "path", + "name": "Path", + "value": { + "t": "Path", + "v": { + "vertices": [ + [ + 135.0, + 545.0 + ], + [ + 1125.0, + 270.0 + ] + ], + "in_tangents": [ + [ + 0.0, + 0.0 + ], + [ + -190.0, + 200.0 + ] + ], + "out_tangents": [ + [ + 200.0, + 140.0 + ], + [ + 0.0, + 0.0 + ] + ], + "closed": false + } + }, + "ui": { + "kind": "Path" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 341, + "match": "stroke", + "name": "Stroke 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 342, + "match": "blend", + "name": "Blend Mode", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Hidden" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 343, + "match": "composite", + "name": "Composite", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Below Previous in Same Group", + "Above Previous in Same Group" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 344, + "match": "color", + "name": "Color", + "value": { + "t": "Color", + "v": [ + 0.9098039215686274, + 0.2980392156862745, + 0.796078431372549, + 1.0 + ] + }, + "ui": { + "kind": "Color" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 345, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 14.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 346, + "match": "width", + "name": "Stroke Width", + "value": { + "t": "Scalar", + "v": 10.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 347, + "match": "cap", + "name": "Line Cap", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Butt Cap", + "Round Cap", + "Projecting Cap" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 348, + "match": "join", + "name": "Line Join", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Miter Join", + "Round Join", + "Bevel Join" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 349, + "match": "miter", + "name": "Miter Limit", + "value": { + "t": "Scalar", + "v": 4.0 + }, + "ui": { + "kind": "Number" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Group", + "uid": 350, + "match": "dashes", + "name": "Dashes", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 351, + "match": "dash", + "name": "Dash", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 352, + "match": "gap", + "name": "Gap", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 353, + "match": "offset", + "name": "Offset", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 354, + "match": "taper", + "name": "Taper", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 355, + "match": "units", + "name": "Length Units", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Pixels", + "Percent" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 356, + "match": "startLength", + "name": "Start Length", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 357, + "match": "endLength", + "name": "End Length", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 358, + "match": "startWidth", + "name": "Start Width", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 359, + "match": "endWidth", + "name": "End Width", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 360, + "match": "startEase", + "name": "Start Ease", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 361, + "match": "endEase", + "name": "End Ease", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 362, + "match": "wave", + "name": "Wave", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 363, + "match": "amount", + "name": "Amount", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 364, + "match": "units", + "name": "Units", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Pixels", + "Cycles" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 365, + "match": "wavelength", + "name": "Wavelength", + "value": { + "t": "Scalar", + "v": 20.0 + }, + "ui": { + "kind": "Pixels" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 366, + "match": "cycles", + "name": "Cycles", + "value": { + "t": "Scalar", + "v": 10.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 1000.0, + "slider_min": 0.0, + "slider_max": 50.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 367, + "match": "phase", + "name": "Phase", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + }, + { + "node": "Group", + "uid": 368, + "match": "trim", + "name": "Trim Paths 1", + "kind": { + "kind": "Indexed" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 369, + "match": "start", + "name": "Start", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 370, + "match": "end", + "name": "End", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 355622400000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 609638400000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 1 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 371, + "match": "offset", + "name": "Offset", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 372, + "match": "mode", + "name": "Trim Multiple Shapes", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Simultaneously", + "Individually" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + }, + { + "node": "Group", + "uid": 317, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 318, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 327, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 319, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 320, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 321, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 100.0, + 100.0, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 322, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 323, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 324, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 325, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 326, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1005903360000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 1066867200000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 328, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 329, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 330, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 331, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 332, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 333, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 334, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 335, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 336, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 337, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 291, + "name": "Flat window 12", + "source": { + "type": "Footage", + "item": 290 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 292, + "match": "layer", + "name": "window_12.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 293, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 294, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 303, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 295, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 296, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 297, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 298, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 299, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 300, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 301, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 302, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 284497920000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 304819200000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 314979840000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 304, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 305, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 306, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 307, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 308, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 309, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 310, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 311, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 312, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 313, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 267, + "name": "Flat window 11", + "source": { + "type": "Footage", + "item": 266 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 268, + "match": "layer", + "name": "window_11.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 269, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 270, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 279, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 271, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 272, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 273, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 274, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 275, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 276, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 277, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 278, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 264176640000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 274337280000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 284497920000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 294658560000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 280, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 281, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 282, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 283, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 284, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 285, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 286, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 287, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 288, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 289, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 243, + "name": "Flat window 10", + "source": { + "type": "Footage", + "item": 242 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 244, + "match": "layer", + "name": "window_10.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 245, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 246, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 255, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 247, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 248, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 249, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 250, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 251, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 252, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 253, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 254, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 243855360000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 254016000000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 264176640000, + "value": { + "t": "Scalar", + "v": 35.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 274337280000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 256, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 257, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 258, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 259, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 260, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 261, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 262, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 263, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 264, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 265, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 219, + "name": "Flat window 09", + "source": { + "type": "Footage", + "item": 218 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 220, + "match": "layer", + "name": "window_09.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 221, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 222, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 231, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 223, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 224, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 225, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 226, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 227, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 228, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 229, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 230, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 223534080000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 233694720000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 243855360000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 254016000000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 232, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 233, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 234, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 235, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 236, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 237, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 238, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 239, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 240, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 241, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 195, + "name": "Flat window 08", + "source": { + "type": "Footage", + "item": 194 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 196, + "match": "layer", + "name": "window_08.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 197, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 198, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 207, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 199, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 200, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 201, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 202, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 203, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 204, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 205, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 206, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 203212800000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 213373440000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 223534080000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 233694720000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 208, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 209, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 210, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 211, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 212, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 213, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 214, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 215, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 216, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 217, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 171, + "name": "Flat window 07", + "source": { + "type": "Footage", + "item": 170 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 172, + "match": "layer", + "name": "window_07.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 173, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 174, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 183, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 175, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 176, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 177, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 178, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 179, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 180, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 181, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 182, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 182891520000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 193052160000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 203212800000, + "value": { + "t": "Scalar", + "v": 35.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 213373440000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 184, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 185, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 186, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 187, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 188, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 189, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 190, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 191, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 192, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 193, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 147, + "name": "Flat window 06", + "source": { + "type": "Footage", + "item": 146 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 148, + "match": "layer", + "name": "window_06.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 149, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 150, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 159, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 151, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 152, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 153, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 154, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 155, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 156, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 157, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 158, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 162570240000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 172730880000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 182891520000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 203212800000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 160, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 161, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 162, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 163, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 164, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 165, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 166, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 167, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 168, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 169, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 123, + "name": "Flat window 05", + "source": { + "type": "Footage", + "item": 122 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 124, + "match": "layer", + "name": "window_05.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 125, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 126, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 135, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 127, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 128, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 129, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 130, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 131, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 132, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 133, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 134, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 142248960000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 152409600000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 162570240000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 182891520000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 136, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 137, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 138, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 139, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 140, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 141, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 142, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 143, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 144, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 145, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 99, + "name": "Flat window 04", + "source": { + "type": "Footage", + "item": 98 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 100, + "match": "layer", + "name": "window_04.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 101, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 102, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 111, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 103, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 104, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 105, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 106, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 107, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 108, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 109, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 110, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 132088320000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 152409600000, + "value": { + "t": "Scalar", + "v": 35.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 162570240000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 112, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 113, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 114, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 115, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 116, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 117, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 118, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 119, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 120, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 121, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 75, + "name": "Flat window 03", + "source": { + "type": "Footage", + "item": 74 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 76, + "match": "layer", + "name": "window_03.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 77, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 78, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 87, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 79, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 80, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 81, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 82, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 83, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 84, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 85, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 86, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 111767040000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 121927680000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 132088320000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 142248960000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 88, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 89, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 90, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 91, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 92, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 93, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 94, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 95, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 96, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 97, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 51, + "name": "Flat window 02", + "source": { + "type": "Footage", + "item": 50 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 52, + "match": "layer", + "name": "window_02.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 53, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 54, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 63, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 55, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 56, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 57, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 58, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 59, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 60, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 61, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 62, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 91445760000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 101606400000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 111767040000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 121927680000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 64, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 65, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 66, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 67, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 68, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 69, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 70, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 71, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 72, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 73, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 27, + "name": "Flat window 01", + "source": { + "type": "Footage", + "item": 26 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 28, + "match": "layer", + "name": "window_01.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 29, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 30, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 39, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 31, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 32, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 33, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 34, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 35, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 36, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 37, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 38, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 71124480000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 81285120000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 91445760000, + "value": { + "t": "Scalar", + "v": 35.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 101606400000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 40, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 41, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 42, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 43, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 44, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 45, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 46, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 47, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 48, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 49, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 3, + "name": "Night skyline", + "source": { + "type": "Footage", + "item": 2 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 1066867200000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 4, + "match": "layer", + "name": "night_base.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 5, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 6, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 15, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 7, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 8, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 9, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 10, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 11, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 12, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 13, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 14, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 16, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 17, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 18, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 19, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 20, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 21, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 22, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 23, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 24, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 25, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + } + ], + "markers": [], + "shutter_angle": 180.0, + "shutter_phase": -90.0, + "motion_blur_samples": 16, + "motion_blur_adaptive_limit": 128, + "renderer": "Classic3D", + "hide_shy": false, + "enable_motion_blur": true, + "enable_frame_blending": true, + "draft_3d": false, + "preserve_frame_rate": false, + "preserve_resolution": false, + "poster_time": 0, + "global_light": { + "angle": { + "uid": 0, + "match": "globalLightAngle", + "name": "Global Light Angle", + "value": { + "t": "Scalar", + "v": 120.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + "altitude": { + "uid": 0, + "match": "globalLightAltitude", + "name": "Global Light Altitude", + "value": { + "t": "Scalar", + "v": 30.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + } + } + }, + "2": { + "id": 2, + "name": "night_base.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/night_base.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Ignore", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "26": { + "id": 26, + "name": "window_01.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_01.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "50": { + "id": 50, + "name": "window_02.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_02.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "74": { + "id": 74, + "name": "window_03.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_03.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "98": { + "id": 98, + "name": "window_04.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_04.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "122": { + "id": 122, + "name": "window_05.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_05.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "146": { + "id": 146, + "name": "window_06.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_06.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "170": { + "id": 170, + "name": "window_07.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_07.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "194": { + "id": 194, + "name": "window_08.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_08.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "218": { + "id": 218, + "name": "window_09.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_09.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "242": { + "id": 242, + "name": "window_10.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_10.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "266": { + "id": 266, + "name": "window_11.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_11.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "290": { + "id": 290, + "name": "window_12.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-motion-03/exports/window_12.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "432": { + "id": 432, + "name": "orbit_after_dark_primary.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.png", + "kind": "Still", + "width": 1600, + "height": 640, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + } + }, + "next_id": 456 +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_01.svg b/design/channels/orbit-after-dark-motion-03/sources/window_01.svg new file mode 100644 index 0000000..4cc060e --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_02.svg b/design/channels/orbit-after-dark-motion-03/sources/window_02.svg new file mode 100644 index 0000000..61e9b6e --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_03.svg b/design/channels/orbit-after-dark-motion-03/sources/window_03.svg new file mode 100644 index 0000000..8cc6d90 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_04.svg b/design/channels/orbit-after-dark-motion-03/sources/window_04.svg new file mode 100644 index 0000000..20a2991 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_05.svg b/design/channels/orbit-after-dark-motion-03/sources/window_05.svg new file mode 100644 index 0000000..1982f82 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_05.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_06.svg b/design/channels/orbit-after-dark-motion-03/sources/window_06.svg new file mode 100644 index 0000000..974af68 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_06.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_07.svg b/design/channels/orbit-after-dark-motion-03/sources/window_07.svg new file mode 100644 index 0000000..a01061c --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_07.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_08.svg b/design/channels/orbit-after-dark-motion-03/sources/window_08.svg new file mode 100644 index 0000000..d237295 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_08.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_09.svg b/design/channels/orbit-after-dark-motion-03/sources/window_09.svg new file mode 100644 index 0000000..155d76e --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_09.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_10.svg b/design/channels/orbit-after-dark-motion-03/sources/window_10.svg new file mode 100644 index 0000000..00bec9a --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_10.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_11.svg b/design/channels/orbit-after-dark-motion-03/sources/window_11.svg new file mode 100644 index 0000000..2b1b39f --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_11.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-motion-03/sources/window_12.svg b/design/channels/orbit-after-dark-motion-03/sources/window_12.svg new file mode 100644 index 0000000..b85cf83 --- /dev/null +++ b/design/channels/orbit-after-dark-motion-03/sources/window_12.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/README.md b/design/channels/orbit-after-dark-v02/README.md new file mode 100644 index 0000000..1bac86a --- /dev/null +++ b/design/channels/orbit-after-dark-v02/README.md @@ -0,0 +1,49 @@ +# Orbit After Dark — branding proof 01 / revision 02 + +Original crescent/orbit geometry, silver wordmark, magenta channel accent and quiet skyline, adapted to Orbit Classic's existing navy interface and yellow remote focus. Reference sheet used for direction only; no pixels, logos, programme artwork or music copied from it. + +## Review + +- `review/orbit_after_dark_review.png`: full logo, EPG logo, playback bug and small-size comparison. +- `review/*_mockup.figcraft`: editable menu, grid-guide and player placement studies. These are proposed layouts with fictional programmes, not APK captures or completed features. Vortex in the grid is the proposed future identity; the installed channel has not been renamed. +- `review/orbit_after_dark_title_card.figcraft`: editable fictional programme title-card layout. +- `exports/orbit_after_dark_ident.mp4`: 1.6-second, silent H.264/720p/25fps motion-language test. Fade/settle only; not a final neon animation or a transparent video overlay. + +## Editable sources + +- `sources/orbit_after_dark.vectorcraft`: primary logo, editable text and paths. +- `sources/orbit_after_dark_epg.vectorcraft`: compact guide variant. +- `sources/orbit_after_dark_bug.vectorcraft`: compact AD monogram for television distance. +- `sources/orbit_after_dark_bug_wordmark.vectorcraft`: alternative longer wordmark for comparison. +- `sources/orbit_after_dark_background.pcraft`: four layers, with stars, skyline and lit windows as embedded Smart Objects. The background PNGs were generated from the original editable SVG geometry; those SVGs remain alongside them. +- `sources/ident-project/orbit_after_dark_ident.ecproj`: collected EffectCraft project with relative `(Footage)` references, checked by reopening/rendering from outside that directory. +- `sources/orbit_after_dark_ident.ecproj`: animation project referencing `../exports`. +- `create-proof.py`: reproducible source geometry and mockup generator. It writes SVGs only. +- `render-ident.py`: rebuild the native motion project and MP4 after moving this folder. Its JSON command files capture the build steps. + +Run `./open-proof.sh review`, `guide`, `logo` or `background` to open the relevant app with project-local Barlow fonts. TTFs and OFL licences are included. A running desktop app may need its font catalogue refreshed; headless font validation found exact matches with the supplied XDG_DATA_HOME setup. Outlined SVG exports have no font dependency. Export names are Android-compatible but are not installed into Android resources in this proof. + +## Export rules + +Author SVG / native files → VectorCraft for transparent standalone PNG and outlined SVG. FigCraft whole-page conversion adds a page background; it is used for opaque review/mockup pages, not transparent runtime logos. PhotoCraft retains layers in `.pcraft`; WebP exports intentionally flatten them. Lossy/background metadata warnings apply to the flattened export, not loss of the editable source. + +`branding-manifest.json` records the proposed palette, asset paths, overlay bounds and schedule policy. It is design metadata, not application settings. Keep yellow as focus; magenta identifies this channel. Proposed overlay default is Off; hide the bug for programme controls/subtitles. Real settings, runtime contrast/subtitle behavior and Android drawing are future integration work. + +Idents must not delay the clock. Treat this clip as a reference for a later optional transition, not something to insert between every programme. A longer ident needs an explicit scheduled slot; an animation failure must fall back to the scheduled media. No alpha-video support is asserted. + +## Verification + +- Actual PNG/WebP alpha spans 0–255 for primary, EPG and bug exports. +- App-size exports: EPG 256×80; bug 144×48. File sizes recorded in `verification.json`. +- All three primary native vector documents retain editable type with exact Barlow matches using project fonts. +- Runtime SVG primary/EPG/bug contain paths rather than text. +- PhotoCraft source reopened with 4 layers; stars/skyline/windows embedded, no external raster link needed. +- EffectCraft MP4 fully decoded successfully; 40 frames, 1280×720, 25 fps, no audio. Collected project reopened and rendered correctly with relative footage paths. +- Logo review, guide/player placement and the ident midpoint inspected visually; one refinement simplified the playback wordmark to AD. +- Installed Orbit version remains 0.14. No APK/device/network/media changes, saved-state migration or private account/catalogue access. Actual Android/TV integration, subtitle/OSD suppression, performance and toggles remain to test after approval. + +This review bundle is the stopping point before app integration and before producing other network brands. + +## Revision 02 — lit windows + +Added scattered steady warm-yellow windows (#FFDE59, varying opacity) to the existing buildings. Window geometry has its own SVG and embedded PhotoCraft Smart Object layer, so it can be hidden or edited independently. Building shapes and logo exports remain unchanged. Mockups, title card and EffectCraft footage were updated. Original proof 01 is preserved separately. diff --git a/design/channels/orbit-after-dark-v02/branding-manifest.json b/design/channels/orbit-after-dark-v02/branding-manifest.json new file mode 100644 index 0000000..6a95eac --- /dev/null +++ b/design/channels/orbit-after-dark-v02/branding-manifest.json @@ -0,0 +1,48 @@ +{ + "status": "design-proof-not-integrated", + "presetId": "orbit-after-dark", + "proposedChannelNumber": 102, + "displayName": "Orbit After Dark", + "networkTokens": { + "background": "#071632", + "panel": "#12356B", + "navigation": "#194C91", + "focus": "#FFDE59", + "muted": "#B7CBE8", + "text": "#FFFFFF" + }, + "channelTokens": { + "accent": "#E84CCB", + "silver": "#E8EDF5", + "windowLight": "#FFDE59" + }, + "assets": { + "primary": "exports/orbit_after_dark_primary.svg", + "epg": "exports/orbit_after_dark_epg_app.webp", + "bug": "exports/orbit_after_dark_bug_app.webp", + "background": "exports/orbit_after_dark_background.webp", + "ident": "exports/orbit_after_dark_ident.mp4" + }, + "proposedOverlay": { + "default": "off", + "anchor": "bottom-left", + "widthAt1080p": 144, + "heightAt1080p": 48, + "safeInsetPercent": 5, + "opacity": 0.8, + "hideForProgrammeStrip": true, + "hideForSubtitles": true + }, + "ident": { + "durationSeconds": 1.6, + "fps": 25, + "width": 1280, + "height": 720, + "codec": "h264", + "audio": false, + "alpha": false, + "status": "motion-language-proof-only", + "schedulePolicy": "optional-overlay-during-preparation; never delay scheduled media; explicitly timed slot required for longer idents" + }, + "revision": 2 +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/create-proof.py b/design/channels/orbit-after-dark-v02/create-proof.py new file mode 100644 index 0000000..6d042c5 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/create-proof.py @@ -0,0 +1,80 @@ +from pathlib import Path +import random,html +P=Path(__file__).parent; S=P/'sources' +N='#071632'; PANEL='#12356B'; BLUE='#194C91'; Y='#FFDE59'; MUTED='#B7CBE8'; PINK='#E84CCB' +def svg(w,h,body):return f'{body}' +def text(x,y,t,size=24,fill='white',family='Barlow',weight='400',extra=''): + return f'{html.escape(t)}' +DEFS='''''' +def mark():return '''''' +window_lights=[] +def skyline(): + rng=random.Random(102); lamps=random.Random(10299); x=0;d='M0 1080V900' + while x<1920: + w=rng.randint(35,85);h=rng.randint(70,220);top=1080-h + d+=f'H{x}V{top}H{x+w}V1080' + if lamps.random()>.16: + for wy in range(top+12,1069,16): + for wx in range(x+9,min(x+w-7,1912),13): + if lamps.random()<.30: + opacity=lamps.choice([.32,.45,.58,.72]) + window_lights.append(f'') + x+=w+rng.randint(5,18) + return f'' +primary=DEFS+mark()+text(470,160,'ORBIT',48,MUTED,'Barlow','600','letter-spacing="13"') +primary+=text(451,335,'AFTER',216,'url(#silver)','Barlow Condensed','500','letter-spacing="8"') +primary+=text(443,536,'DARK',244,'url(#pink)','Barlow Condensed','500','letter-spacing="12"') +primary+='' +(S/'orbit_after_dark_primary.svg').write_text(svg(1600,640,primary)) +epg=DEFS+f'{mark()}'+text(130,54,'ORBIT',20,MUTED,'Barlow','600','letter-spacing="5"')+text(128,112,'AFTER DARK',61,'#F4F6FF','Barlow Condensed','500') +(S/'orbit_after_dark_epg.svg').write_text(svg(512,160,epg)) +bug_wordmark=DEFS+f'{mark()}'+text(101,47,'ORBIT',19,'#FFF','Barlow','600','letter-spacing="3"')+text(99,94,'AFTER DARK',47,'#FFF','Barlow Condensed','500') +(S/'orbit_after_dark_bug_wordmark.svg').write_text(svg(384,128,bug_wordmark)) +bug=DEFS+f'{mark()}'+text(116,112,'AD',144,'#FFF','Barlow Condensed','500','letter-spacing="5" stroke="#071632" stroke-width="3"') +(S/'orbit_after_dark_bug.svg').write_text(svg(384,128,bug)) +sky='''''' +random.seed(1999); stars=''.join(f'' for i in range(58)) +city=skyline()+'''''' +for name,body in [('sky',sky),('stars',stars),('skyline',city)]: (S/f'orbit_after_dark_{name}.svg').write_text(svg(1920,1080,body)) +windows=''.join(window_lights) +(S/'orbit_after_dark_windows.svg').write_text(svg(1920,1080,windows)) +background=sky+stars+city+windows +(S/'orbit_after_dark_background.svg').write_text(svg(1920,1080,background)) +# Review board is a design artifact; every asset remains separate and transparent in exports. +board=f''+text(70,75,'Orbit After Dark',32,'white','Barlow','600')+text(70,113,'Branding proof 01 / Midnight Transmission',20,MUTED) +board+=f'{primary}' +board+=f''+text(70,804,'Compact EPG',22,MUTED)+f'' +board+=f'{epg}'+text(870,804,'Playback bug · transparent',22,MUTED)+f'{bug}' +board+=text(70,1116,'Actual-size checks at 1080p',22,MUTED)+f'{epg}{bug}' +board+=text(70,1345,'Original source artwork · Navy interface · Yellow focus · Magenta channel accent',22,MUTED) +(S/'orbit_after_dark_review.svg').write_text(svg(1920,1440,board)) +# Existing guide language, fictional programmes only. +nav=text(70,78,'◉ orbit / Classic',32,'white','Barlow','600')+text(1480,78,'Sunday 1 November',22,MUTED) +for i,label in enumerate(['1 Menu','2 TV Guide','3 Box Office']): + nav+=f''+text(90+i*325,151,label,24) +guide=f''+nav+f'{epg}'+text(560,245,'Now on Orbit After Dark',25,Y)+text(560,300,'The Last Screening',42,'white','Barlow','600')+text(560,347,'A fictional late-night cinema programme for this design proof.',25,MUTED) +guide+=f''+text(90,456,'Channel',22)+text(490,456,'22:00',22)+text(1040,456,'23:30',22)+text(1515,456,'00:00',22) +for i,(number,name,programme) in enumerate([(101,'Orbit One','The Evening Exchange'),(102,'Orbit After Dark','The Last Screening'),(103,'Vortex','Night Flight')]): + y=486+i*125;guide+=f''+text(92,y+35,str(number),21,Y) + if number==102:guide+=f'{epg}' + else:guide+=text(92,y+77,name,27,'white','Barlow','600') + guide+=f''+text(485,y+65,programme,28,N if number==102 else 'white')+text(1305,y+65,'Next programme',26,MUTED) +guide+=text(70,1010,'Arrows Browse OK Watch / programme info Back Return',23,MUTED) +(S/'orbit_after_dark_guide_mockup.svg').write_text(svg(1920,1080,guide)) +player=background+text(1470,125,'102',58,'#47FF52','monospace')+f'{bug}'+text(70,65,'Playback placement study · fictional scene',22,MUTED) +(S/'orbit_after_dark_player_mockup.svg').write_text(svg(1920,1080,player)) +menu=f''+nav+f'{background}'+f'{primary}'+text(1350,320,'Your evening starts here.',32,Y) +for j,l in enumerate(['Watch Orbit After Dark','TV Guide','OrbOffice','Settings']):menu+=f''+text(1350,425+j*88,l,28,N if j==0 else 'white') +menu+=text(80,990,'Menu integration study · proposed artwork placement',23,MUTED) +(S/'orbit_after_dark_menu_mockup.svg').write_text(svg(1920,1080,menu)) + +card=background+f'{primary}'+text(110,765,'Tonight at 22:00',30,Y)+text(110,860,'The Last Screening',84,'white','Barlow Condensed','500')+text(110,922,'Fictional programme title-card study',26,MUTED) +(S/'orbit_after_dark_title_card.svg').write_text(svg(1920,1080,card)) + +hud=background+text(70,65,'Controls / subtitle placement study · bug hidden',22,MUTED) +hud+=text(610,735,'There is still a light in the projection room.',32,'white') +hud+='' +hud+=text(160,824,'102 Orbit After Dark',25,N,'Barlow','600')+text(1400,824,'22:14 Sun 1 Nov',23,N) +hud+=text(160,886,'NOW',24,Y,'Barlow','600')+text(305,886,'The Last Screening',35,'white','Barlow','600')+text(160,940,'NEXT',22,MUTED)+text(305,940,'23:30 Midnight Visitors',27,'white') +hud+=text(160,1008,'▲ ▼ Channel ↶ TV guide CC Subtitles',27,N) +(S/'orbit_after_dark_player_hud_mockup.svg').write_text(svg(1920,1080,hud)) diff --git a/design/channels/orbit-after-dark-v02/design-philosophy.md b/design/channels/orbit-after-dark-v02/design-philosophy.md new file mode 100644 index 0000000..98f7944 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/design-philosophy.md @@ -0,0 +1,11 @@ +# Midnight Transmission + +Night is spacious rather than empty. A deep blue field gives a single illuminated form room to arrive; precise alignment and generous margins make the signal feel intentional. The work should reward a close look without demanding one. + +The orbit is a shared network gesture, while a cut crescent gives this identity its own silhouette. Curves remain carefully balanced against condensed, forward-moving lettering. Craft lives in the relationship between the shapes, not in a collection of decorative effects. + +Silver carries the programme name clearly. Magenta is the late-night accent, kept separate from the network's yellow focus colour. A restrained skyline belongs to the wider artwork; the smallest mark must stand on its own without scenery or texture. + +The quiet reference is the anticipation of an unfamiliar film starting after the usual broadcasts have finished. A thin light at the horizon, distant windows and a small orbital sweep suggest an inhabited night. Every detail is original geometry, refined for television distance. + +Motion should feel like a transmission resolving, with one measured reveal and a gentle settling of light. Static presentation remains complete. Clear lettering, disciplined spacing and carefully simplified small variants matter more than additional effects. diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_background.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_background.png new file mode 100644 index 0000000..a64b53f Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_background.png differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_background.webp b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_background.webp new file mode 100644 index 0000000..8baba23 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_background.webp differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug.png new file mode 100644 index 0000000..4e5bbfa Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug.png differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug.svg b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug.svg new file mode 100644 index 0000000..39e4996 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + orbit_after_dark_bug.svg + + + + + + + + + + + diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_app.webp b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_app.webp new file mode 100644 index 0000000..65f93d4 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_app.webp differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_wordmark.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_wordmark.png new file mode 100644 index 0000000..2fbc610 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_wordmark.png differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_wordmark.svg b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_wordmark.svg new file mode 100644 index 0000000..d587103 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_bug_wordmark.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + orbit_after_dark_bug_wordmark.svg + + + + + + + + + + + + + + diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg.png new file mode 100644 index 0000000..b2c43ee Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg.png differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg.svg b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg.svg new file mode 100644 index 0000000..34493e8 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + orbit_after_dark_epg.svg + + + + + + + + + + + + + + diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg_app.webp b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg_app.webp new file mode 100644 index 0000000..df5b6bc Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_epg_app.webp differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_ident.mp4 b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_ident.mp4 new file mode 100644 index 0000000..443719d Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_ident.mp4 differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.png new file mode 100644 index 0000000..dff363e Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.png differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.svg b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.svg new file mode 100644 index 0000000..251d267 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + orbit_after_dark_primary.svg + + + + + + + + + + + + + + + + diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_sky.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_sky.png new file mode 100644 index 0000000..e105a5e Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_sky.png differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_skyline.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_skyline.png new file mode 100644 index 0000000..cbe6d58 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_skyline.png differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_stars.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_stars.png new file mode 100644 index 0000000..a9fcc30 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_stars.png differ diff --git a/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_windows.png b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_windows.png new file mode 100644 index 0000000..e66755d Binary files /dev/null and b/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_windows.png differ diff --git a/design/channels/orbit-after-dark-v02/fonts/barlow-condensed-medium.ttf b/design/channels/orbit-after-dark-v02/fonts/barlow-condensed-medium.ttf new file mode 100644 index 0000000..eee49eb Binary files /dev/null and b/design/channels/orbit-after-dark-v02/fonts/barlow-condensed-medium.ttf differ diff --git a/design/channels/orbit-after-dark-v02/fonts/barlow-regular.ttf b/design/channels/orbit-after-dark-v02/fonts/barlow-regular.ttf new file mode 100644 index 0000000..bb3faec Binary files /dev/null and b/design/channels/orbit-after-dark-v02/fonts/barlow-regular.ttf differ diff --git a/design/channels/orbit-after-dark-v02/fonts/barlow-semibold.ttf b/design/channels/orbit-after-dark-v02/fonts/barlow-semibold.ttf new file mode 100644 index 0000000..7c974a4 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/fonts/barlow-semibold.ttf differ diff --git a/design/channels/orbit-after-dark-v02/licenses/barlow-OFL.txt b/design/channels/orbit-after-dark-v02/licenses/barlow-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/licenses/barlow-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/design/channels/orbit-after-dark-v02/licenses/barlow-condensed-OFL.txt b/design/channels/orbit-after-dark-v02/licenses/barlow-condensed-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/licenses/barlow-condensed-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/design/channels/orbit-after-dark-v02/open-proof.sh b/design/channels/orbit-after-dark-v02/open-proof.sh new file mode 100755 index 0000000..128dc9d --- /dev/null +++ b/design/channels/orbit-after-dark-v02/open-proof.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail +ORBIT_PROOF_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +mkdir -p "$ORBIT_PROOF_ROOT/.font-data/fonts" +cp "$ORBIT_PROOF_ROOT"/fonts/*.ttf "$ORBIT_PROOF_ROOT/.font-data/fonts/" +export XDG_DATA_HOME="$ORBIT_PROOF_ROOT/.font-data" +case "${1:-review}" in + review) exec figcraft "$ORBIT_PROOF_ROOT/review/orbit_after_dark_review.figcraft" ;; + guide) exec figcraft "$ORBIT_PROOF_ROOT/review/orbit_after_dark_guide_mockup.figcraft" ;; + logo) exec vectorcraft "$ORBIT_PROOF_ROOT/sources/orbit_after_dark.vectorcraft" ;; + background) exec photocraft "$ORBIT_PROOF_ROOT/sources/orbit_after_dark_background.pcraft" ;; + *) echo "Choose review, guide, logo or background"; exit 1 ;; +esac diff --git a/design/channels/orbit-after-dark-v02/render-ident.py b/design/channels/orbit-after-dark-v02/render-ident.py new file mode 100644 index 0000000..3e8b22e --- /dev/null +++ b/design/channels/orbit-after-dark-v02/render-ident.py @@ -0,0 +1,12 @@ +"""Rebuild the editable EffectCraft ident and its MP4 from this proof's current folder.""" +from pathlib import Path +import json, subprocess +p=Path(__file__).resolve().parent +steps=[{'command':'comp.new','params':{'name':'Orbit After Dark ident proof','width':1280,'height':720,'frameRate':25,'duration':1.6,'background':'#071632'}}] +for name in ['background','primary']: + steps.append({'command':'file.import','params':{'paths':[str(p/'exports'/f'orbit_after_dark_{name}.png')],'addToComp':True}}) +command_file=p/'sources/create-ident.json';command_file.write_text(json.dumps(steps,indent=2)) +project=p/'sources/orbit_after_dark_ident.ecproj' +subprocess.run(['effectcraft-cli','--empty','run','--commands',str(command_file),'--save-as',str(project),'--json'],check=True) +subprocess.run(['effectcraft-cli','--project',str(project),'run','--commands',str(p/'sources/animate-ident.json'),'--save','--json'],check=True) +subprocess.run(['effectcraft-cli','--project',str(project),'render','--out',str(p/'exports/orbit_after_dark_ident.mp4'),'--format','h264','--fps','25','--bitrate','3500','--audio','off'],check=True) diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_guide_mockup.figcraft b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_guide_mockup.figcraft new file mode 100644 index 0000000..d01ffae Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_guide_mockup.figcraft differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_guide_mockup.png b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_guide_mockup.png new file mode 100644 index 0000000..e593d75 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_guide_mockup.png differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_ident_midpoint.png b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_ident_midpoint.png new file mode 100644 index 0000000..4096ef5 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_ident_midpoint.png differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_menu_mockup.figcraft b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_menu_mockup.figcraft new file mode 100644 index 0000000..bae9949 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_menu_mockup.figcraft differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_menu_mockup.png b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_menu_mockup.png new file mode 100644 index 0000000..6091b60 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_menu_mockup.png differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_hud_mockup.figcraft b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_hud_mockup.figcraft new file mode 100644 index 0000000..5ea4f65 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_hud_mockup.figcraft differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_hud_mockup.png b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_hud_mockup.png new file mode 100644 index 0000000..a385ad0 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_hud_mockup.png differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_mockup.figcraft b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_mockup.figcraft new file mode 100644 index 0000000..96293a4 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_mockup.figcraft differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_mockup.png b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_mockup.png new file mode 100644 index 0000000..b7229d5 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_player_mockup.png differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_portable_ident_check.png b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_portable_ident_check.png new file mode 100644 index 0000000..ccf05cb Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_portable_ident_check.png differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_review.figcraft b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_review.figcraft new file mode 100644 index 0000000..c115ea3 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_review.figcraft differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_review.png b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_review.png new file mode 100644 index 0000000..c988504 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_review.png differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_title_card.figcraft b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_title_card.figcraft new file mode 100644 index 0000000..19c0b1d Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_title_card.figcraft differ diff --git a/design/channels/orbit-after-dark-v02/review/orbit_after_dark_title_card.png b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_title_card.png new file mode 100644 index 0000000..2ce991e Binary files /dev/null and b/design/channels/orbit-after-dark-v02/review/orbit_after_dark_title_card.png differ diff --git a/design/channels/orbit-after-dark-v02/sources/animate-ident.json b/design/channels/orbit-after-dark-v02/sources/animate-ident.json new file mode 100644 index 0000000..7505b8a --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/animate-ident.json @@ -0,0 +1,137 @@ +[ + { + "command": "prop.set", + "params": { + "layer": "#2", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.set", + "params": { + "layer": "#1", + "path": "transform/position", + "value": [ + 640, + 330, + 0 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/opacity", + "time": 0.32, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/opacity", + "time": 1.3, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/opacity", + "time": 1.6, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/scale", + "time": 0, + "value": [ + 65, + 65, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/scale", + "time": 0.44, + "value": [ + 62, + 62, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/scale", + "time": 1.6, + "value": [ + 62, + 62, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#2", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#2", + "path": "transform/opacity", + "time": 0.2, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#2", + "path": "transform/opacity", + "time": 1.3, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#2", + "path": "transform/opacity", + "time": 1.6, + "value": 0 + } + } +] \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/create-ident.json b/design/channels/orbit-after-dark-v02/sources/create-ident.json new file mode 100644 index 0000000..33a3196 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/create-ident.json @@ -0,0 +1,31 @@ +[ + { + "command": "comp.new", + "params": { + "name": "Orbit After Dark ident proof", + "width": 1280, + "height": 720, + "frameRate": 25, + "duration": 1.6, + "background": "#071632" + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_background.png" + ], + "addToComp": true + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark-v02/exports/orbit_after_dark_primary.png" + ], + "addToComp": true + } + } +] \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/ident-project/(Footage)/orbit_after_dark_background.png b/design/channels/orbit-after-dark-v02/sources/ident-project/(Footage)/orbit_after_dark_background.png new file mode 100644 index 0000000..a64b53f Binary files /dev/null and b/design/channels/orbit-after-dark-v02/sources/ident-project/(Footage)/orbit_after_dark_background.png differ diff --git a/design/channels/orbit-after-dark-v02/sources/ident-project/(Footage)/orbit_after_dark_primary.png b/design/channels/orbit-after-dark-v02/sources/ident-project/(Footage)/orbit_after_dark_primary.png new file mode 100644 index 0000000..dff363e Binary files /dev/null and b/design/channels/orbit-after-dark-v02/sources/ident-project/(Footage)/orbit_after_dark_primary.png differ diff --git a/design/channels/orbit-after-dark-v02/sources/ident-project/orbit_after_dark_ident.ecproj b/design/channels/orbit-after-dark-v02/sources/ident-project/orbit_after_dark_ident.ecproj new file mode 100644 index 0000000..20a3d32 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/ident-project/orbit_after_dark_ident.ecproj @@ -0,0 +1,1363 @@ +{ + "schema": 2, + "settings": { + "bit_depth": "Bpc8", + "linearize": false, + "working_space": null, + "blend_linear": false, + "time_display": "Timecode", + "frame_start": 0, + "audio_sample_rate": 48000, + "gpu_acceleration": true, + "color_engine": "Adobe", + "hdr": "Clip", + "output_space": null, + "working_gamma": 2.2 + }, + "items": { + "1": { + "id": 1, + "name": "Orbit After Dark ident proof", + "label": "Sandstone", + "comment": "", + "parent": null, + "kind": { + "type": "Comp", + "width": 1280, + "height": 720, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 25, + "den": 1 + }, + "duration": 406425600000, + "display_start": 0, + "background": [ + 0.02745098, + 0.08627451, + 0.19607843 + ], + "work_area": [ + 0, + 406425600000 + ], + "layers": [ + { + "id": 27, + "name": "orbit_after_dark_primary.png", + "source": { + "type": "Footage", + "item": 26 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 406425600000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 28, + "match": "layer", + "name": "orbit_after_dark_primary.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 29, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 30, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 39, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 31, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 800.0, + 320.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 32, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 330.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 33, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 100.0, + 100.0, + 100.0 + ] + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Vec3", + "v": [ + 65.0, + 65.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 111767040000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 34, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 35, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 36, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 37, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 38, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 81285120000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 325140480000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 40, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 41, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 42, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 43, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 44, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 45, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 46, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 47, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 48, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 49, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 3, + "name": "orbit_after_dark_background.png", + "source": { + "type": "Footage", + "item": 2 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 406425600000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 4, + "match": "layer", + "name": "orbit_after_dark_background.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 5, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 6, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 15, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 7, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 8, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 9, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 10, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 11, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 12, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 13, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 14, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 50803200000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 325140480000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 16, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 17, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 18, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 19, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 20, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 21, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 22, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 23, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 24, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 25, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + } + ], + "markers": [], + "shutter_angle": 180.0, + "shutter_phase": -90.0, + "motion_blur_samples": 16, + "motion_blur_adaptive_limit": 128, + "renderer": "Classic3D", + "hide_shy": false, + "enable_motion_blur": true, + "enable_frame_blending": true, + "draft_3d": false, + "preserve_frame_rate": false, + "preserve_resolution": false, + "poster_time": 0, + "global_light": { + "angle": { + "uid": 0, + "match": "globalLightAngle", + "name": "Global Light Angle", + "value": { + "t": "Scalar", + "v": 120.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + "altitude": { + "uid": 0, + "match": "globalLightAltitude", + "name": "Global Light Altitude", + "value": { + "t": "Scalar", + "v": 30.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + } + } + }, + "2": { + "id": 2, + "name": "orbit_after_dark_background.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/orbit_after_dark_background.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Ignore", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "26": { + "id": 26, + "name": "orbit_after_dark_primary.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/orbit_after_dark_primary.png", + "kind": "Still", + "width": 1600, + "height": 640, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + } + }, + "next_id": 50 +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark.vectorcraft b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark.vectorcraft new file mode 100644 index 0000000..3215480 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark.vectorcraft @@ -0,0 +1,1574 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_primary.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 1600.0, + "y1": 640.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 146.061279296875, + "y": 131.1414337158203 + }, + "end": { + "x": 146.061279296875, + "y": 475.00001525878906 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 335.0, + 132.0 + ], + "in": [ + 185.0, + 207.0 + ], + "out": [ + 141.0, + 114.0 + ] + }, + { + "p": [ + 257.0, + 475.0 + ], + "in": [ + 66.0, + 384.0 + ], + "out": [ + 143.0, + 363.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 11.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 129.0, + 369.0 + ], + "out": [ + 102.0, + 399.0 + ] + }, + { + "p": [ + 161.0, + 428.0 + ], + "in": [ + 111.0, + 425.0 + ], + "out": [ + 267.0, + 432.0 + ] + }, + { + "p": [ + 445.0, + 289.0 + ], + "in": [ + 431.0, + 340.0 + ], + "out": [ + 455.0, + 250.0 + ] + }, + { + "p": [ + 369.0, + 261.0 + ], + "in": [ + 405.0, + 250.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 439.0, + 282.0 + ], + "in": [ + 439.0, + 277.0294494628906 + ], + "out": [ + 439.0, + 286.9705505371094 + ], + "kind": "Smooth" + }, + { + "p": [ + 430.0, + 291.0 + ], + "in": [ + 434.9705505371094, + 291.0 + ], + "out": [ + 425.0294494628906, + 291.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 421.0, + 282.0 + ], + "in": [ + 421.0, + 286.9705505371094 + ], + "out": [ + 421.0, + 277.0294494628906 + ], + "kind": "Smooth" + }, + { + "p": [ + 430.0, + 273.0 + ], + "in": [ + 425.0294494628906, + 273.0 + ], + "out": [ + 434.9705505371094, + 273.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 5, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 470.0, + 160.0 + ], + "runs": [ + { + "text": "ORBIT", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 48.0, + "tracking": 270.8333333333333, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 451.0, + 335.0 + ], + "runs": [ + { + "text": "AFTER", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 216.0, + "tracking": 37.03703703703704, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 0.0, + "y": -216.0 + }, + "end": { + "x": 0.0, + "y": 43.20001220703125 + }, + "aspect": 1.0 + }, + "angle": -90.0 + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 7, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 443.0, + 536.0 + ], + "runs": [ + { + "text": "DARK", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 244.0, + "tracking": 49.18032786885246, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9764706, + "g": 0.58431375, + "b": 0.8627451 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 0.0, + "y": -244.0 + }, + "end": { + "x": 258.3698645932122, + "y": 186.55646104068177 + }, + "aspect": 1.0 + }, + "angle": -59.03272223354657 + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 8, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 5.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 468.0, + 574.0 + ], + "out": [ + 734.0, + 610.0 + ] + }, + { + "p": [ + 1403.0, + 479.0 + ], + "in": [ + 1169.0, + 577.0 + ] + } + ], + "closed": false + } + ] + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 9 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_background.pcraft b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_background.pcraft new file mode 100644 index 0000000..5f20174 Binary files /dev/null and b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_background.pcraft differ diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_background.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_background.svg new file mode 100644 index 0000000..04fa505 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug.svg new file mode 100644 index 0000000..137dbba --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug.svg @@ -0,0 +1 @@ +AD \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug.vectorcraft b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug.vectorcraft new file mode 100644 index 0000000..7089335 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug.vectorcraft @@ -0,0 +1,1335 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_bug.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 384.0, + "y1": 128.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 5, + "kind": { + "type": "group", + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 25.133481271193887, + "y": 20.851115261147697 + }, + "end": { + "x": 25.133481271193887, + "y": 96.50000279068945 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 66.69999960064888, + 21.039999842643738 + ], + "in": [ + 33.699999779462814, + 37.53999975323677 + ], + "out": [ + 24.0199998319149, + 17.07999986410141 + ] + }, + { + "p": [ + 49.539999693632126, + 96.49999943375587 + ], + "in": [ + 7.519999921321869, + 76.47999954223633 + ], + "out": [ + 24.459999829530716, + 71.85999956727028 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 2.419999986886978, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 21.379999846220016, + 73.17999956011772 + ], + "out": [ + 15.439999878406525, + 79.77999952435493 + ] + }, + { + "p": [ + 28.419999808073044, + 86.15999948978424 + ], + "in": [ + 17.41999986767769, + 85.49999949336052 + ], + "out": [ + 51.7399996817112, + 87.03999948501587 + ] + }, + { + "p": [ + 90.89999946951866, + 55.57999965548515 + ], + "in": [ + 87.81999948620796, + 66.79999959468842 + ], + "out": [ + 93.09999945759773, + 46.999999701976776 + ] + }, + { + "p": [ + 74.17999956011772, + 49.419999688863754 + ], + "in": [ + 82.09999951720238, + 46.999999701976776 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 89.57999947667122, + 54.0399996638298 + ], + "in": [ + 89.57999947667122, + 52.9464785515911 + ], + "out": [ + 89.57999947667122, + 55.13352077606851 + ], + "kind": "Smooth" + }, + { + "p": [ + 87.59999948740005, + 56.01999965310097 + ], + "in": [ + 88.69352059963876, + 56.01999965310097 + ], + "out": [ + 86.50647837516135, + 56.01999965310097 + ], + "kind": "Smooth" + }, + { + "p": [ + 85.61999949812889, + 54.0399996638298 + ], + "in": [ + 85.61999949812889, + 55.13352077606851 + ], + "out": [ + 85.61999949812889, + 52.9464785515911 + ], + "kind": "Smooth" + }, + { + "p": [ + 87.59999948740005, + 52.05999967455864 + ], + "in": [ + 86.50647837516135, + 52.05999967455864 + ], + "out": [ + 88.69352059963876, + 52.05999967455864 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + } + ], + "clip": false + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 116.0, + 112.0 + ], + "runs": [ + { + "text": "AD", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 144.0, + "tracking": 34.72222222222222, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke_width": 3.0, + "underline": false, + "strikethrough": false, + "all_caps": false, + "stroke_miter_limit": 4.0 + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 7 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug_wordmark.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug_wordmark.svg new file mode 100644 index 0000000..91624ca --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug_wordmark.svg @@ -0,0 +1 @@ +ORBITAFTER DARK \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug_wordmark.vectorcraft b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug_wordmark.vectorcraft new file mode 100644 index 0000000..5e668bd --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_bug_wordmark.vectorcraft @@ -0,0 +1,1385 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_bug_wordmark.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 384.0, + "y1": 128.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 5, + "kind": { + "type": "group", + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 25.133481271193887, + "y": 20.851115261147697 + }, + "end": { + "x": 25.133481271193887, + "y": 96.50000279068945 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 66.69999960064888, + 21.039999842643738 + ], + "in": [ + 33.699999779462814, + 37.53999975323677 + ], + "out": [ + 24.0199998319149, + 17.07999986410141 + ] + }, + { + "p": [ + 49.539999693632126, + 96.49999943375587 + ], + "in": [ + 7.519999921321869, + 76.47999954223633 + ], + "out": [ + 24.459999829530716, + 71.85999956727028 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 2.419999986886978, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 21.379999846220016, + 73.17999956011772 + ], + "out": [ + 15.439999878406525, + 79.77999952435493 + ] + }, + { + "p": [ + 28.419999808073044, + 86.15999948978424 + ], + "in": [ + 17.41999986767769, + 85.49999949336052 + ], + "out": [ + 51.7399996817112, + 87.03999948501587 + ] + }, + { + "p": [ + 90.89999946951866, + 55.57999965548515 + ], + "in": [ + 87.81999948620796, + 66.79999959468842 + ], + "out": [ + 93.09999945759773, + 46.999999701976776 + ] + }, + { + "p": [ + 74.17999956011772, + 49.419999688863754 + ], + "in": [ + 82.09999951720238, + 46.999999701976776 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 89.57999947667122, + 54.0399996638298 + ], + "in": [ + 89.57999947667122, + 52.9464785515911 + ], + "out": [ + 89.57999947667122, + 55.13352077606851 + ], + "kind": "Smooth" + }, + { + "p": [ + 87.59999948740005, + 56.01999965310097 + ], + "in": [ + 88.69352059963876, + 56.01999965310097 + ], + "out": [ + 86.50647837516135, + 56.01999965310097 + ], + "kind": "Smooth" + }, + { + "p": [ + 85.61999949812889, + 54.0399996638298 + ], + "in": [ + 85.61999949812889, + 55.13352077606851 + ], + "out": [ + 85.61999949812889, + 52.9464785515911 + ], + "kind": "Smooth" + }, + { + "p": [ + 87.59999948740005, + 52.05999967455864 + ], + "in": [ + 86.50647837516135, + 52.05999967455864 + ], + "out": [ + 88.69352059963876, + 52.05999967455864 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + } + ], + "clip": false + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 101.0, + 47.0 + ], + "runs": [ + { + "text": "ORBIT", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 19.0, + "tracking": 157.89473684210526, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 7, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 99.0, + 94.0 + ], + "runs": [ + { + "text": "AFTER DARK", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 47.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 8 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_epg.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_epg.svg new file mode 100644 index 0000000..c63fec5 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_epg.svg @@ -0,0 +1 @@ +ORBITAFTER DARK \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_epg.vectorcraft b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_epg.vectorcraft new file mode 100644 index 0000000..fc87ff2 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_epg.vectorcraft @@ -0,0 +1,1385 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_epg.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 512.0, + "y1": 160.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 5, + "kind": { + "type": "group", + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 32.97593122423859, + "y": 35.09677151545111 + }, + "end": { + "x": 32.97593122423859, + "y": 124.49999943733201 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 82.09999680519104, + 35.3199987411499 + ], + "in": [ + 43.099998235702515, + 54.819998025894165 + ], + "out": [ + 31.659998655319214, + 30.63999891281128 + ] + }, + { + "p": [ + 61.81999754905701, + 124.499995470047 + ], + "in": [ + 12.159999370574951, + 100.83999633789062 + ], + "out": [ + 32.17999863624573, + 95.37999653816223 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 2.859999895095825, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 28.539998769760132, + 96.93999648094177 + ], + "out": [ + 21.519999027252197, + 104.73999619483948 + ] + }, + { + "p": [ + 36.85999846458435, + 112.27999591827393 + ], + "in": [ + 23.85999894142151, + 111.49999594688416 + ], + "out": [ + 64.41999745368958, + 113.31999588012695 + ] + }, + { + "p": [ + 110.69999575614929, + 76.13999724388123 + ], + "in": [ + 107.0599958896637, + 89.39999675750732 + ], + "out": [ + 113.29999566078186, + 65.99999761581421 + ] + }, + { + "p": [ + 90.93999648094177, + 68.85999751091003 + ], + "in": [ + 100.29999613761902, + 65.99999761581421 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 109.13999581336975, + 74.31999731063843 + ], + "in": [ + 109.13999581336975, + 73.02765421839285 + ], + "out": [ + 109.13999581336975, + 75.612340402884 + ], + "kind": "Smooth" + }, + { + "p": [ + 106.79999589920044, + 76.65999722480774 + ], + "in": [ + 108.09233899144601, + 76.65999722480774 + ], + "out": [ + 105.50765280695487, + 76.65999722480774 + ], + "kind": "Smooth" + }, + { + "p": [ + 104.45999598503113, + 74.31999731063843 + ], + "in": [ + 104.45999598503113, + 75.612340402884 + ], + "out": [ + 104.45999598503113, + 73.02765421839285 + ], + "kind": "Smooth" + }, + { + "p": [ + 106.79999589920044, + 71.97999739646912 + ], + "in": [ + 105.50765280695487, + 71.97999739646912 + ], + "out": [ + 108.09233899144601, + 71.97999739646912 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + } + ], + "clip": false + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 130.0, + 54.0 + ], + "runs": [ + { + "text": "ORBIT", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 20.0, + "tracking": 250.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 7, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 128.0, + 112.0 + ], + "runs": [ + { + "text": "AFTER DARK", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 61.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.95686275, + "g": 0.9647059, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 8 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_guide_mockup.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_guide_mockup.svg new file mode 100644 index 0000000..368d6a2 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_guide_mockup.svg @@ -0,0 +1 @@ +◉ orbit / ClassicSunday 1 November1 Menu2 TV Guide3 Box OfficeORBITAFTER DARKNow on Orbit After DarkThe Last ScreeningA fictional late-night cinema programme for this design proof.Channel22:0023:3000:00101Orbit OneThe Evening ExchangeNext programme102ORBITAFTER DARKThe Last ScreeningNext programme103VortexNight FlightNext programmeArrows Browse OK Watch / programme info Back Return \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_ident.ecproj b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_ident.ecproj new file mode 100644 index 0000000..408f9ab --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_ident.ecproj @@ -0,0 +1,1368 @@ +{ + "savedBy": "0.19.0", + "activeComp": 1, + "openComps": [ + 1 + ], + "schema": 2, + "settings": { + "bit_depth": "Bpc8", + "linearize": false, + "working_space": null, + "blend_linear": false, + "time_display": "Timecode", + "frame_start": 0, + "audio_sample_rate": 48000, + "gpu_acceleration": true, + "color_engine": "Adobe", + "hdr": "Clip", + "output_space": null, + "working_gamma": 2.2 + }, + "items": { + "1": { + "id": 1, + "name": "Orbit After Dark ident proof", + "label": "Sandstone", + "comment": "", + "parent": null, + "kind": { + "type": "Comp", + "width": 1280, + "height": 720, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 25, + "den": 1 + }, + "duration": 406425600000, + "display_start": 0, + "background": [ + 0.02745098, + 0.08627451, + 0.19607843 + ], + "work_area": [ + 0, + 406425600000 + ], + "layers": [ + { + "id": 27, + "name": "orbit_after_dark_primary.png", + "source": { + "type": "Footage", + "item": 26 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 406425600000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 28, + "match": "layer", + "name": "orbit_after_dark_primary.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 29, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 30, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 39, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 31, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 800.0, + 320.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 32, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 330.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 33, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 100.0, + 100.0, + 100.0 + ] + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Vec3", + "v": [ + 65.0, + 65.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 111767040000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 34, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 35, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 36, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 37, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 38, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 81285120000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 325140480000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 40, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 41, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 42, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 43, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 44, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 45, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 46, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 47, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 48, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 49, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 3, + "name": "orbit_after_dark_background.png", + "source": { + "type": "Footage", + "item": 2 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 406425600000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 4, + "match": "layer", + "name": "orbit_after_dark_background.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 5, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 6, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 15, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 7, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 8, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 9, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 10, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 11, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 12, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 13, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 14, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 50803200000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 325140480000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 16, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 17, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 18, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 19, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 20, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 21, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 22, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 23, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 24, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 25, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + } + ], + "markers": [], + "shutter_angle": 180.0, + "shutter_phase": -90.0, + "motion_blur_samples": 16, + "motion_blur_adaptive_limit": 128, + "renderer": "Classic3D", + "hide_shy": false, + "enable_motion_blur": true, + "enable_frame_blending": true, + "draft_3d": false, + "preserve_frame_rate": false, + "preserve_resolution": false, + "poster_time": 0, + "global_light": { + "angle": { + "uid": 0, + "match": "globalLightAngle", + "name": "Global Light Angle", + "value": { + "t": "Scalar", + "v": 120.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + "altitude": { + "uid": 0, + "match": "globalLightAltitude", + "name": "Global Light Altitude", + "value": { + "t": "Scalar", + "v": 30.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + } + } + }, + "2": { + "id": 2, + "name": "orbit_after_dark_background.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "../exports/orbit_after_dark_background.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Ignore", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "26": { + "id": 26, + "name": "orbit_after_dark_primary.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "../exports/orbit_after_dark_primary.png", + "kind": "Still", + "width": 1600, + "height": 640, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + } + }, + "next_id": 50 +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_menu_mockup.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_menu_mockup.svg new file mode 100644 index 0000000..5ee2b20 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_menu_mockup.svg @@ -0,0 +1 @@ +◉ orbit / ClassicSunday 1 November1 Menu2 TV Guide3 Box OfficeORBITAFTERDARKYour evening starts here.Watch Orbit After DarkTV GuideOrbOfficeSettingsMenu integration study · proposed artwork placement \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_player_hud_mockup.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_player_hud_mockup.svg new file mode 100644 index 0000000..b2211aa --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_player_hud_mockup.svg @@ -0,0 +1 @@ +Controls / subtitle placement study · bug hiddenThere is still a light in the projection room.102 Orbit After Dark22:14 Sun 1 NovNOWThe Last ScreeningNEXT23:30 Midnight Visitors▲ ▼ Channel ↶ TV guide CC Subtitles \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_player_mockup.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_player_mockup.svg new file mode 100644 index 0000000..82700ef --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_player_mockup.svg @@ -0,0 +1 @@ +102ADPlayback placement study · fictional scene \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_primary.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_primary.svg new file mode 100644 index 0000000..de707a0 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_primary.svg @@ -0,0 +1 @@ +ORBITAFTERDARK \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_review.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_review.svg new file mode 100644 index 0000000..0f6d4bf --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_review.svg @@ -0,0 +1 @@ +Orbit After DarkBranding proof 01 / Midnight TransmissionORBITAFTERDARKCompact EPGORBITAFTER DARKPlayback bug · transparentADActual-size checks at 1080pORBITAFTER DARKADOriginal source artwork · Navy interface · Yellow focus · Magenta channel accent \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_sky.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_sky.svg new file mode 100644 index 0000000..85f555f --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_sky.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_skyline.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_skyline.svg new file mode 100644 index 0000000..75c394b --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_skyline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_stars.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_stars.svg new file mode 100644 index 0000000..a30102e --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_stars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_title_card.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_title_card.svg new file mode 100644 index 0000000..ce45732 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_title_card.svg @@ -0,0 +1 @@ +ORBITAFTERDARKTonight at 22:00The Last ScreeningFictional programme title-card study \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_windows.svg b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_windows.svg new file mode 100644 index 0000000..4ee110a --- /dev/null +++ b/design/channels/orbit-after-dark-v02/sources/orbit_after_dark_windows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark-v02/verification.json b/design/channels/orbit-after-dark-v02/verification.json new file mode 100644 index 0000000..9beae79 --- /dev/null +++ b/design/channels/orbit-after-dark-v02/verification.json @@ -0,0 +1,67 @@ +{ + "status": "design-proof", + "alpha": { + "primary.png": { + "min": 0, + "max": 255 + }, + "epg.png": { + "min": 0, + "max": 255 + }, + "bug.png": { + "min": 0, + "max": 255 + }, + "epg_app.webp": { + "min": 0, + "max": 255 + }, + "bug_app.webp": { + "min": 0, + "max": 255 + } + }, + "files": { + "orbit_after_dark_primary.svg": 13797, + "orbit_after_dark_epg.svg": 12351, + "orbit_after_dark_bug.svg": 2593, + "orbit_after_dark_primary.png": 44795, + "orbit_after_dark_epg.png": 7347, + "orbit_after_dark_bug.png": 6975, + "orbit_after_dark_background.png": 95370, + "orbit_after_dark_sky.png": 83040, + "orbit_after_dark_stars.png": 9162, + "orbit_after_dark_skyline.png": 17306, + "orbit_after_dark_bug_wordmark.svg": 12550, + "orbit_after_dark_bug_wordmark.png": 5163, + "orbit_after_dark_background.webp": 22006, + "orbit_after_dark_ident.mp4": 643348, + "orbit_after_dark_epg_app.webp": 6518, + "orbit_after_dark_bug_app.webp": 3676, + "orbit_after_dark_windows.png": 13230 + }, + "video": { + "programs": [], + "stream_groups": [], + "streams": [ + { + "codec_name": "h264", + "width": 1280, + "height": 720, + "pix_fmt": "yuv420p", + "r_frame_rate": "25/1" + } + ], + "format": { + "duration": "1.600000", + "size": "643348" + } + }, + "androidFilesUnchangedAgainst014Archive": 44, + "revision": 2, + "windowCount": 245, + "skylineGeometryUnchanged": true, + "logoExportsUnchanged": true, + "photoCraftLayerCount": 4 +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark/README.md b/design/channels/orbit-after-dark/README.md new file mode 100644 index 0000000..8ee670c --- /dev/null +++ b/design/channels/orbit-after-dark/README.md @@ -0,0 +1,45 @@ +# Orbit After Dark — branding proof 01 + +Original crescent/orbit geometry, silver wordmark, magenta channel accent and quiet skyline, adapted to Orbit Classic's existing navy interface and yellow remote focus. Reference sheet used for direction only; no pixels, logos, programme artwork or music copied from it. + +## Review + +- `review/orbit_after_dark_review.png`: full logo, EPG logo, playback bug and small-size comparison. +- `review/*_mockup.figcraft`: editable menu, grid-guide and player placement studies. These are proposed layouts with fictional programmes, not APK captures or completed features. Vortex in the grid is the proposed future identity; the installed channel has not been renamed. +- `review/orbit_after_dark_title_card.figcraft`: editable fictional programme title-card layout. +- `exports/orbit_after_dark_ident.mp4`: 1.6-second, silent H.264/720p/25fps motion-language test. Fade/settle only; not a final neon animation or a transparent video overlay. + +## Editable sources + +- `sources/orbit_after_dark.vectorcraft`: primary logo, editable text and paths. +- `sources/orbit_after_dark_epg.vectorcraft`: compact guide variant. +- `sources/orbit_after_dark_bug.vectorcraft`: compact AD monogram for television distance. +- `sources/orbit_after_dark_bug_wordmark.vectorcraft`: alternative longer wordmark for comparison. +- `sources/orbit_after_dark_background.pcraft`: three layers, with stars and skyline as embedded Smart Objects. The background PNGs were generated from the original editable SVG geometry; those SVGs remain alongside them. +- `sources/ident-project/orbit_after_dark_ident.ecproj`: collected EffectCraft project with relative `(Footage)` references, checked by reopening/rendering from outside that directory. +- `sources/orbit_after_dark_ident.ecproj`: animation project referencing `../exports`. +- `create-proof.py`: reproducible source geometry and mockup generator. It writes SVGs only. +- `render-ident.py`: rebuild the native motion project and MP4 after moving this folder. Its JSON command files capture the build steps. + +Run `./open-proof.sh review`, `guide`, `logo` or `background` to open the relevant app with project-local Barlow fonts. TTFs and OFL licences are included. A running desktop app may need its font catalogue refreshed; headless font validation found exact matches with the supplied XDG_DATA_HOME setup. Outlined SVG exports have no font dependency. Export names are Android-compatible but are not installed into Android resources in this proof. + +## Export rules + +Author SVG / native files → VectorCraft for transparent standalone PNG and outlined SVG. FigCraft whole-page conversion adds a page background; it is used for opaque review/mockup pages, not transparent runtime logos. PhotoCraft retains layers in `.pcraft`; WebP exports intentionally flatten them. Lossy/background metadata warnings apply to the flattened export, not loss of the editable source. + +`branding-manifest.json` records the proposed palette, asset paths, overlay bounds and schedule policy. It is design metadata, not application settings. Keep yellow as focus; magenta identifies this channel. Proposed overlay default is Off; hide the bug for programme controls/subtitles. Real settings, runtime contrast/subtitle behavior and Android drawing are future integration work. + +Idents must not delay the clock. Treat this clip as a reference for a later optional transition, not something to insert between every programme. A longer ident needs an explicit scheduled slot; an animation failure must fall back to the scheduled media. No alpha-video support is asserted. + +## Verification + +- Actual PNG/WebP alpha spans 0–255 for primary, EPG and bug exports. +- App-size exports: EPG 256×80; bug 144×48. File sizes recorded in `verification.json`. +- All three primary native vector documents retain editable type with exact Barlow matches using project fonts. +- Runtime SVG primary/EPG/bug contain paths rather than text. +- PhotoCraft source reopened with 3 layers; stars/skyline embedded, no external raster link needed. +- EffectCraft MP4 fully decoded successfully; 40 frames, 1280×720, 25 fps, no audio. Collected project reopened and rendered correctly with relative footage paths. +- Logo review, guide/player placement and the ident midpoint inspected visually; one refinement simplified the playback wordmark to AD. +- Installed Orbit version remains 0.14. No APK/device/network/media changes, saved-state migration or private account/catalogue access. Actual Android/TV integration, subtitle/OSD suppression, performance and toggles remain to test after approval. + +This review bundle is the stopping point before app integration and before producing other network brands. diff --git a/design/channels/orbit-after-dark/branding-manifest.json b/design/channels/orbit-after-dark/branding-manifest.json new file mode 100644 index 0000000..8d9335f --- /dev/null +++ b/design/channels/orbit-after-dark/branding-manifest.json @@ -0,0 +1,46 @@ +{ + "status": "design-proof-not-integrated", + "presetId": "orbit-after-dark", + "proposedChannelNumber": 102, + "displayName": "Orbit After Dark", + "networkTokens": { + "background": "#071632", + "panel": "#12356B", + "navigation": "#194C91", + "focus": "#FFDE59", + "muted": "#B7CBE8", + "text": "#FFFFFF" + }, + "channelTokens": { + "accent": "#E84CCB", + "silver": "#E8EDF5" + }, + "assets": { + "primary": "exports/orbit_after_dark_primary.svg", + "epg": "exports/orbit_after_dark_epg_app.webp", + "bug": "exports/orbit_after_dark_bug_app.webp", + "background": "exports/orbit_after_dark_background.webp", + "ident": "exports/orbit_after_dark_ident.mp4" + }, + "proposedOverlay": { + "default": "off", + "anchor": "bottom-left", + "widthAt1080p": 144, + "heightAt1080p": 48, + "safeInsetPercent": 5, + "opacity": 0.8, + "hideForProgrammeStrip": true, + "hideForSubtitles": true + }, + "ident": { + "durationSeconds": 1.6, + "fps": 25, + "width": 1280, + "height": 720, + "codec": "h264", + "audio": false, + "alpha": false, + "status": "motion-language-proof-only", + "schedulePolicy": "optional-overlay-during-preparation; never delay scheduled media; explicitly timed slot required for longer idents" + } +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark/create-proof.py b/design/channels/orbit-after-dark/create-proof.py new file mode 100644 index 0000000..453c14a --- /dev/null +++ b/design/channels/orbit-after-dark/create-proof.py @@ -0,0 +1,69 @@ +from pathlib import Path +import random,html +P=Path(__file__).parent; S=P/'sources' +N='#071632'; PANEL='#12356B'; BLUE='#194C91'; Y='#FFDE59'; MUTED='#B7CBE8'; PINK='#E84CCB' +def svg(w,h,body):return f'{body}' +def text(x,y,t,size=24,fill='white',family='Barlow',weight='400',extra=''): + return f'{html.escape(t)}' +DEFS='''''' +def mark():return '''''' +def skyline(): + random.seed(102); x=0;d='M0 1080V900' + while x<1920: + w=random.randint(35,85);h=random.randint(70,220);d+=f'H{x}V{1080-h}H{x+w}V1080';x+=w+random.randint(5,18) + return f'' +primary=DEFS+mark()+text(470,160,'ORBIT',48,MUTED,'Barlow','600','letter-spacing="13"') +primary+=text(451,335,'AFTER',216,'url(#silver)','Barlow Condensed','500','letter-spacing="8"') +primary+=text(443,536,'DARK',244,'url(#pink)','Barlow Condensed','500','letter-spacing="12"') +primary+='' +(S/'orbit_after_dark_primary.svg').write_text(svg(1600,640,primary)) +epg=DEFS+f'{mark()}'+text(130,54,'ORBIT',20,MUTED,'Barlow','600','letter-spacing="5"')+text(128,112,'AFTER DARK',61,'#F4F6FF','Barlow Condensed','500') +(S/'orbit_after_dark_epg.svg').write_text(svg(512,160,epg)) +bug_wordmark=DEFS+f'{mark()}'+text(101,47,'ORBIT',19,'#FFF','Barlow','600','letter-spacing="3"')+text(99,94,'AFTER DARK',47,'#FFF','Barlow Condensed','500') +(S/'orbit_after_dark_bug_wordmark.svg').write_text(svg(384,128,bug_wordmark)) +bug=DEFS+f'{mark()}'+text(116,112,'AD',144,'#FFF','Barlow Condensed','500','letter-spacing="5" stroke="#071632" stroke-width="3"') +(S/'orbit_after_dark_bug.svg').write_text(svg(384,128,bug)) +sky='''''' +random.seed(1999); stars=''.join(f'' for i in range(58)) +city=skyline()+'''''' +for name,body in [('sky',sky),('stars',stars),('skyline',city)]: (S/f'orbit_after_dark_{name}.svg').write_text(svg(1920,1080,body)) +background=sky+stars+city +(S/'orbit_after_dark_background.svg').write_text(svg(1920,1080,background)) +# Review board is a design artifact; every asset remains separate and transparent in exports. +board=f''+text(70,75,'Orbit After Dark',32,'white','Barlow','600')+text(70,113,'Branding proof 01 / Midnight Transmission',20,MUTED) +board+=f'{primary}' +board+=f''+text(70,804,'Compact EPG',22,MUTED)+f'' +board+=f'{epg}'+text(870,804,'Playback bug · transparent',22,MUTED)+f'{bug}' +board+=text(70,1116,'Actual-size checks at 1080p',22,MUTED)+f'{epg}{bug}' +board+=text(70,1345,'Original source artwork · Navy interface · Yellow focus · Magenta channel accent',22,MUTED) +(S/'orbit_after_dark_review.svg').write_text(svg(1920,1440,board)) +# Existing guide language, fictional programmes only. +nav=text(70,78,'◉ orbit / Classic',32,'white','Barlow','600')+text(1480,78,'Sunday 1 November',22,MUTED) +for i,label in enumerate(['1 Menu','2 TV Guide','3 Box Office']): + nav+=f''+text(90+i*325,151,label,24) +guide=f''+nav+f'{epg}'+text(560,245,'Now on Orbit After Dark',25,Y)+text(560,300,'The Last Screening',42,'white','Barlow','600')+text(560,347,'A fictional late-night cinema programme for this design proof.',25,MUTED) +guide+=f''+text(90,456,'Channel',22)+text(490,456,'22:00',22)+text(1040,456,'23:30',22)+text(1515,456,'00:00',22) +for i,(number,name,programme) in enumerate([(101,'Orbit One','The Evening Exchange'),(102,'Orbit After Dark','The Last Screening'),(103,'Vortex','Night Flight')]): + y=486+i*125;guide+=f''+text(92,y+35,str(number),21,Y) + if number==102:guide+=f'{epg}' + else:guide+=text(92,y+77,name,27,'white','Barlow','600') + guide+=f''+text(485,y+65,programme,28,N if number==102 else 'white')+text(1305,y+65,'Next programme',26,MUTED) +guide+=text(70,1010,'Arrows Browse OK Watch / programme info Back Return',23,MUTED) +(S/'orbit_after_dark_guide_mockup.svg').write_text(svg(1920,1080,guide)) +player=background+text(1470,125,'102',58,'#47FF52','monospace')+f'{bug}'+text(70,65,'Playback placement study · fictional scene',22,MUTED) +(S/'orbit_after_dark_player_mockup.svg').write_text(svg(1920,1080,player)) +menu=f''+nav+f'{background}'+f'{primary}'+text(1350,320,'Your evening starts here.',32,Y) +for j,l in enumerate(['Watch Orbit After Dark','TV Guide','OrbOffice','Settings']):menu+=f''+text(1350,425+j*88,l,28,N if j==0 else 'white') +menu+=text(80,990,'Menu integration study · proposed artwork placement',23,MUTED) +(S/'orbit_after_dark_menu_mockup.svg').write_text(svg(1920,1080,menu)) + +card=background+f'{primary}'+text(110,765,'Tonight at 22:00',30,Y)+text(110,860,'The Last Screening',84,'white','Barlow Condensed','500')+text(110,922,'Fictional programme title-card study',26,MUTED) +(S/'orbit_after_dark_title_card.svg').write_text(svg(1920,1080,card)) + +hud=background+text(70,65,'Controls / subtitle placement study · bug hidden',22,MUTED) +hud+=text(610,735,'There is still a light in the projection room.',32,'white') +hud+='' +hud+=text(160,824,'102 Orbit After Dark',25,N,'Barlow','600')+text(1400,824,'22:14 Sun 1 Nov',23,N) +hud+=text(160,886,'NOW',24,Y,'Barlow','600')+text(305,886,'The Last Screening',35,'white','Barlow','600')+text(160,940,'NEXT',22,MUTED)+text(305,940,'23:30 Midnight Visitors',27,'white') +hud+=text(160,1008,'▲ ▼ Channel ↶ TV guide CC Subtitles',27,N) +(S/'orbit_after_dark_player_hud_mockup.svg').write_text(svg(1920,1080,hud)) diff --git a/design/channels/orbit-after-dark/design-philosophy.md b/design/channels/orbit-after-dark/design-philosophy.md new file mode 100644 index 0000000..98f7944 --- /dev/null +++ b/design/channels/orbit-after-dark/design-philosophy.md @@ -0,0 +1,11 @@ +# Midnight Transmission + +Night is spacious rather than empty. A deep blue field gives a single illuminated form room to arrive; precise alignment and generous margins make the signal feel intentional. The work should reward a close look without demanding one. + +The orbit is a shared network gesture, while a cut crescent gives this identity its own silhouette. Curves remain carefully balanced against condensed, forward-moving lettering. Craft lives in the relationship between the shapes, not in a collection of decorative effects. + +Silver carries the programme name clearly. Magenta is the late-night accent, kept separate from the network's yellow focus colour. A restrained skyline belongs to the wider artwork; the smallest mark must stand on its own without scenery or texture. + +The quiet reference is the anticipation of an unfamiliar film starting after the usual broadcasts have finished. A thin light at the horizon, distant windows and a small orbital sweep suggest an inhabited night. Every detail is original geometry, refined for television distance. + +Motion should feel like a transmission resolving, with one measured reveal and a gentle settling of light. Static presentation remains complete. Clear lettering, disciplined spacing and carefully simplified small variants matter more than additional effects. diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_background.png b/design/channels/orbit-after-dark/exports/orbit_after_dark_background.png new file mode 100644 index 0000000..a125ff1 Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_background.png differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_background.webp b/design/channels/orbit-after-dark/exports/orbit_after_dark_background.webp new file mode 100644 index 0000000..0f7d0a3 Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_background.webp differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_bug.png b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug.png new file mode 100644 index 0000000..4e5bbfa Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug.png differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_bug.svg b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug.svg new file mode 100644 index 0000000..39e4996 --- /dev/null +++ b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + orbit_after_dark_bug.svg + + + + + + + + + + + diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_app.webp b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_app.webp new file mode 100644 index 0000000..65f93d4 Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_app.webp differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_wordmark.png b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_wordmark.png new file mode 100644 index 0000000..2fbc610 Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_wordmark.png differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_wordmark.svg b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_wordmark.svg new file mode 100644 index 0000000..d587103 --- /dev/null +++ b/design/channels/orbit-after-dark/exports/orbit_after_dark_bug_wordmark.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + orbit_after_dark_bug_wordmark.svg + + + + + + + + + + + + + + diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_epg.png b/design/channels/orbit-after-dark/exports/orbit_after_dark_epg.png new file mode 100644 index 0000000..b2c43ee Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_epg.png differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_epg.svg b/design/channels/orbit-after-dark/exports/orbit_after_dark_epg.svg new file mode 100644 index 0000000..34493e8 --- /dev/null +++ b/design/channels/orbit-after-dark/exports/orbit_after_dark_epg.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + orbit_after_dark_epg.svg + + + + + + + + + + + + + + diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_epg_app.webp b/design/channels/orbit-after-dark/exports/orbit_after_dark_epg_app.webp new file mode 100644 index 0000000..df5b6bc Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_epg_app.webp differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_ident.mp4 b/design/channels/orbit-after-dark/exports/orbit_after_dark_ident.mp4 new file mode 100644 index 0000000..e7416c0 Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_ident.mp4 differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_primary.png b/design/channels/orbit-after-dark/exports/orbit_after_dark_primary.png new file mode 100644 index 0000000..dff363e Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_primary.png differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_primary.svg b/design/channels/orbit-after-dark/exports/orbit_after_dark_primary.svg new file mode 100644 index 0000000..251d267 --- /dev/null +++ b/design/channels/orbit-after-dark/exports/orbit_after_dark_primary.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + orbit_after_dark_primary.svg + + + + + + + + + + + + + + + + diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_sky.png b/design/channels/orbit-after-dark/exports/orbit_after_dark_sky.png new file mode 100644 index 0000000..e105a5e Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_sky.png differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_skyline.png b/design/channels/orbit-after-dark/exports/orbit_after_dark_skyline.png new file mode 100644 index 0000000..cbe6d58 Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_skyline.png differ diff --git a/design/channels/orbit-after-dark/exports/orbit_after_dark_stars.png b/design/channels/orbit-after-dark/exports/orbit_after_dark_stars.png new file mode 100644 index 0000000..a9fcc30 Binary files /dev/null and b/design/channels/orbit-after-dark/exports/orbit_after_dark_stars.png differ diff --git a/design/channels/orbit-after-dark/fonts/barlow-condensed-medium.ttf b/design/channels/orbit-after-dark/fonts/barlow-condensed-medium.ttf new file mode 100644 index 0000000..eee49eb Binary files /dev/null and b/design/channels/orbit-after-dark/fonts/barlow-condensed-medium.ttf differ diff --git a/design/channels/orbit-after-dark/fonts/barlow-regular.ttf b/design/channels/orbit-after-dark/fonts/barlow-regular.ttf new file mode 100644 index 0000000..bb3faec Binary files /dev/null and b/design/channels/orbit-after-dark/fonts/barlow-regular.ttf differ diff --git a/design/channels/orbit-after-dark/fonts/barlow-semibold.ttf b/design/channels/orbit-after-dark/fonts/barlow-semibold.ttf new file mode 100644 index 0000000..7c974a4 Binary files /dev/null and b/design/channels/orbit-after-dark/fonts/barlow-semibold.ttf differ diff --git a/design/channels/orbit-after-dark/licenses/barlow-OFL.txt b/design/channels/orbit-after-dark/licenses/barlow-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/design/channels/orbit-after-dark/licenses/barlow-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/design/channels/orbit-after-dark/licenses/barlow-condensed-OFL.txt b/design/channels/orbit-after-dark/licenses/barlow-condensed-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/design/channels/orbit-after-dark/licenses/barlow-condensed-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/design/channels/orbit-after-dark/open-proof.sh b/design/channels/orbit-after-dark/open-proof.sh new file mode 100755 index 0000000..128dc9d --- /dev/null +++ b/design/channels/orbit-after-dark/open-proof.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail +ORBIT_PROOF_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +mkdir -p "$ORBIT_PROOF_ROOT/.font-data/fonts" +cp "$ORBIT_PROOF_ROOT"/fonts/*.ttf "$ORBIT_PROOF_ROOT/.font-data/fonts/" +export XDG_DATA_HOME="$ORBIT_PROOF_ROOT/.font-data" +case "${1:-review}" in + review) exec figcraft "$ORBIT_PROOF_ROOT/review/orbit_after_dark_review.figcraft" ;; + guide) exec figcraft "$ORBIT_PROOF_ROOT/review/orbit_after_dark_guide_mockup.figcraft" ;; + logo) exec vectorcraft "$ORBIT_PROOF_ROOT/sources/orbit_after_dark.vectorcraft" ;; + background) exec photocraft "$ORBIT_PROOF_ROOT/sources/orbit_after_dark_background.pcraft" ;; + *) echo "Choose review, guide, logo or background"; exit 1 ;; +esac diff --git a/design/channels/orbit-after-dark/render-ident.py b/design/channels/orbit-after-dark/render-ident.py new file mode 100644 index 0000000..3e8b22e --- /dev/null +++ b/design/channels/orbit-after-dark/render-ident.py @@ -0,0 +1,12 @@ +"""Rebuild the editable EffectCraft ident and its MP4 from this proof's current folder.""" +from pathlib import Path +import json, subprocess +p=Path(__file__).resolve().parent +steps=[{'command':'comp.new','params':{'name':'Orbit After Dark ident proof','width':1280,'height':720,'frameRate':25,'duration':1.6,'background':'#071632'}}] +for name in ['background','primary']: + steps.append({'command':'file.import','params':{'paths':[str(p/'exports'/f'orbit_after_dark_{name}.png')],'addToComp':True}}) +command_file=p/'sources/create-ident.json';command_file.write_text(json.dumps(steps,indent=2)) +project=p/'sources/orbit_after_dark_ident.ecproj' +subprocess.run(['effectcraft-cli','--empty','run','--commands',str(command_file),'--save-as',str(project),'--json'],check=True) +subprocess.run(['effectcraft-cli','--project',str(project),'run','--commands',str(p/'sources/animate-ident.json'),'--save','--json'],check=True) +subprocess.run(['effectcraft-cli','--project',str(project),'render','--out',str(p/'exports/orbit_after_dark_ident.mp4'),'--format','h264','--fps','25','--bitrate','3500','--audio','off'],check=True) diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_guide_mockup.figcraft b/design/channels/orbit-after-dark/review/orbit_after_dark_guide_mockup.figcraft new file mode 100644 index 0000000..d01ffae Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_guide_mockup.figcraft differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_guide_mockup.png b/design/channels/orbit-after-dark/review/orbit_after_dark_guide_mockup.png new file mode 100644 index 0000000..e593d75 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_guide_mockup.png differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_ident_midpoint.png b/design/channels/orbit-after-dark/review/orbit_after_dark_ident_midpoint.png new file mode 100644 index 0000000..68b5889 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_ident_midpoint.png differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_menu_mockup.figcraft b/design/channels/orbit-after-dark/review/orbit_after_dark_menu_mockup.figcraft new file mode 100644 index 0000000..4d1ffe6 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_menu_mockup.figcraft differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_menu_mockup.png b/design/channels/orbit-after-dark/review/orbit_after_dark_menu_mockup.png new file mode 100644 index 0000000..10b6d61 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_menu_mockup.png differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_player_hud_mockup.figcraft b/design/channels/orbit-after-dark/review/orbit_after_dark_player_hud_mockup.figcraft new file mode 100644 index 0000000..c5ce08b Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_player_hud_mockup.figcraft differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_player_hud_mockup.png b/design/channels/orbit-after-dark/review/orbit_after_dark_player_hud_mockup.png new file mode 100644 index 0000000..8a6fa22 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_player_hud_mockup.png differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_player_mockup.figcraft b/design/channels/orbit-after-dark/review/orbit_after_dark_player_mockup.figcraft new file mode 100644 index 0000000..84ad6a3 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_player_mockup.figcraft differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_player_mockup.png b/design/channels/orbit-after-dark/review/orbit_after_dark_player_mockup.png new file mode 100644 index 0000000..5a280bb Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_player_mockup.png differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_portable_ident_check.png b/design/channels/orbit-after-dark/review/orbit_after_dark_portable_ident_check.png new file mode 100644 index 0000000..a0a0bc5 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_portable_ident_check.png differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_review.figcraft b/design/channels/orbit-after-dark/review/orbit_after_dark_review.figcraft new file mode 100644 index 0000000..c115ea3 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_review.figcraft differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_review.png b/design/channels/orbit-after-dark/review/orbit_after_dark_review.png new file mode 100644 index 0000000..c988504 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_review.png differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_title_card.figcraft b/design/channels/orbit-after-dark/review/orbit_after_dark_title_card.figcraft new file mode 100644 index 0000000..c6e520f Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_title_card.figcraft differ diff --git a/design/channels/orbit-after-dark/review/orbit_after_dark_title_card.png b/design/channels/orbit-after-dark/review/orbit_after_dark_title_card.png new file mode 100644 index 0000000..67c8188 Binary files /dev/null and b/design/channels/orbit-after-dark/review/orbit_after_dark_title_card.png differ diff --git a/design/channels/orbit-after-dark/sources/animate-ident.json b/design/channels/orbit-after-dark/sources/animate-ident.json new file mode 100644 index 0000000..7505b8a --- /dev/null +++ b/design/channels/orbit-after-dark/sources/animate-ident.json @@ -0,0 +1,137 @@ +[ + { + "command": "prop.set", + "params": { + "layer": "#2", + "path": "transform/scale", + "value": [ + 66.6667, + 66.6667, + 100 + ] + } + }, + { + "command": "prop.set", + "params": { + "layer": "#1", + "path": "transform/position", + "value": [ + 640, + 330, + 0 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/opacity", + "time": 0.32, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/opacity", + "time": 1.3, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/opacity", + "time": 1.6, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/scale", + "time": 0, + "value": [ + 65, + 65, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/scale", + "time": 0.44, + "value": [ + 62, + 62, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#1", + "path": "transform/scale", + "time": 1.6, + "value": [ + 62, + 62, + 100 + ] + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#2", + "path": "transform/opacity", + "time": 0, + "value": 0 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#2", + "path": "transform/opacity", + "time": 0.2, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#2", + "path": "transform/opacity", + "time": 1.3, + "value": 100 + } + }, + { + "command": "prop.addKey", + "params": { + "layer": "#2", + "path": "transform/opacity", + "time": 1.6, + "value": 0 + } + } +] \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/create-ident.json b/design/channels/orbit-after-dark/sources/create-ident.json new file mode 100644 index 0000000..661006d --- /dev/null +++ b/design/channels/orbit-after-dark/sources/create-ident.json @@ -0,0 +1,31 @@ +[ + { + "command": "comp.new", + "params": { + "name": "Orbit After Dark ident proof", + "width": 1280, + "height": 720, + "frameRate": 25, + "duration": 1.6, + "background": "#071632" + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark/exports/orbit_after_dark_background.png" + ], + "addToComp": true + } + }, + { + "command": "file.import", + "params": { + "paths": [ + "/home/pauljd/Documents/Codex/orbit-tv/design/channels/orbit-after-dark/exports/orbit_after_dark_primary.png" + ], + "addToComp": true + } + } +] \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/ident-project/(Footage)/orbit_after_dark_background.png b/design/channels/orbit-after-dark/sources/ident-project/(Footage)/orbit_after_dark_background.png new file mode 100644 index 0000000..a125ff1 Binary files /dev/null and b/design/channels/orbit-after-dark/sources/ident-project/(Footage)/orbit_after_dark_background.png differ diff --git a/design/channels/orbit-after-dark/sources/ident-project/(Footage)/orbit_after_dark_primary.png b/design/channels/orbit-after-dark/sources/ident-project/(Footage)/orbit_after_dark_primary.png new file mode 100644 index 0000000..dff363e Binary files /dev/null and b/design/channels/orbit-after-dark/sources/ident-project/(Footage)/orbit_after_dark_primary.png differ diff --git a/design/channels/orbit-after-dark/sources/ident-project/orbit_after_dark_ident.ecproj b/design/channels/orbit-after-dark/sources/ident-project/orbit_after_dark_ident.ecproj new file mode 100644 index 0000000..20a3d32 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/ident-project/orbit_after_dark_ident.ecproj @@ -0,0 +1,1363 @@ +{ + "schema": 2, + "settings": { + "bit_depth": "Bpc8", + "linearize": false, + "working_space": null, + "blend_linear": false, + "time_display": "Timecode", + "frame_start": 0, + "audio_sample_rate": 48000, + "gpu_acceleration": true, + "color_engine": "Adobe", + "hdr": "Clip", + "output_space": null, + "working_gamma": 2.2 + }, + "items": { + "1": { + "id": 1, + "name": "Orbit After Dark ident proof", + "label": "Sandstone", + "comment": "", + "parent": null, + "kind": { + "type": "Comp", + "width": 1280, + "height": 720, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 25, + "den": 1 + }, + "duration": 406425600000, + "display_start": 0, + "background": [ + 0.02745098, + 0.08627451, + 0.19607843 + ], + "work_area": [ + 0, + 406425600000 + ], + "layers": [ + { + "id": 27, + "name": "orbit_after_dark_primary.png", + "source": { + "type": "Footage", + "item": 26 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 406425600000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 28, + "match": "layer", + "name": "orbit_after_dark_primary.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 29, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 30, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 39, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 31, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 800.0, + 320.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 32, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 330.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 33, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 100.0, + 100.0, + 100.0 + ] + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Vec3", + "v": [ + 65.0, + 65.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 111767040000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 34, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 35, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 36, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 37, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 38, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 81285120000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 325140480000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 40, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 41, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 42, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 43, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 44, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 45, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 46, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 47, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 48, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 49, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 3, + "name": "orbit_after_dark_background.png", + "source": { + "type": "Footage", + "item": 2 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 406425600000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 4, + "match": "layer", + "name": "orbit_after_dark_background.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 5, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 6, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 15, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 7, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 8, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 9, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 10, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 11, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 12, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 13, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 14, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 50803200000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 325140480000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 16, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 17, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 18, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 19, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 20, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 21, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 22, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 23, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 24, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 25, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + } + ], + "markers": [], + "shutter_angle": 180.0, + "shutter_phase": -90.0, + "motion_blur_samples": 16, + "motion_blur_adaptive_limit": 128, + "renderer": "Classic3D", + "hide_shy": false, + "enable_motion_blur": true, + "enable_frame_blending": true, + "draft_3d": false, + "preserve_frame_rate": false, + "preserve_resolution": false, + "poster_time": 0, + "global_light": { + "angle": { + "uid": 0, + "match": "globalLightAngle", + "name": "Global Light Angle", + "value": { + "t": "Scalar", + "v": 120.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + "altitude": { + "uid": 0, + "match": "globalLightAltitude", + "name": "Global Light Altitude", + "value": { + "t": "Scalar", + "v": 30.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + } + } + }, + "2": { + "id": 2, + "name": "orbit_after_dark_background.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/orbit_after_dark_background.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Ignore", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "26": { + "id": 26, + "name": "orbit_after_dark_primary.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "(Footage)/orbit_after_dark_primary.png", + "kind": "Still", + "width": 1600, + "height": 640, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + } + }, + "next_id": 50 +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark.vectorcraft b/design/channels/orbit-after-dark/sources/orbit_after_dark.vectorcraft new file mode 100644 index 0000000..3215480 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark.vectorcraft @@ -0,0 +1,1574 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_primary.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 1600.0, + "y1": 640.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 146.061279296875, + "y": 131.1414337158203 + }, + "end": { + "x": 146.061279296875, + "y": 475.00001525878906 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 335.0, + 132.0 + ], + "in": [ + 185.0, + 207.0 + ], + "out": [ + 141.0, + 114.0 + ] + }, + { + "p": [ + 257.0, + 475.0 + ], + "in": [ + 66.0, + 384.0 + ], + "out": [ + 143.0, + 363.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 11.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 129.0, + 369.0 + ], + "out": [ + 102.0, + 399.0 + ] + }, + { + "p": [ + 161.0, + 428.0 + ], + "in": [ + 111.0, + 425.0 + ], + "out": [ + 267.0, + 432.0 + ] + }, + { + "p": [ + 445.0, + 289.0 + ], + "in": [ + 431.0, + 340.0 + ], + "out": [ + 455.0, + 250.0 + ] + }, + { + "p": [ + 369.0, + 261.0 + ], + "in": [ + 405.0, + 250.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 439.0, + 282.0 + ], + "in": [ + 439.0, + 277.0294494628906 + ], + "out": [ + 439.0, + 286.9705505371094 + ], + "kind": "Smooth" + }, + { + "p": [ + 430.0, + 291.0 + ], + "in": [ + 434.9705505371094, + 291.0 + ], + "out": [ + 425.0294494628906, + 291.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 421.0, + 282.0 + ], + "in": [ + 421.0, + 286.9705505371094 + ], + "out": [ + 421.0, + 277.0294494628906 + ], + "kind": "Smooth" + }, + { + "p": [ + 430.0, + 273.0 + ], + "in": [ + 425.0294494628906, + 273.0 + ], + "out": [ + 434.9705505371094, + 273.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 5, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 470.0, + 160.0 + ], + "runs": [ + { + "text": "ORBIT", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 48.0, + "tracking": 270.8333333333333, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 451.0, + 335.0 + ], + "runs": [ + { + "text": "AFTER", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 216.0, + "tracking": 37.03703703703704, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 0.0, + "y": -216.0 + }, + "end": { + "x": 0.0, + "y": 43.20001220703125 + }, + "aspect": 1.0 + }, + "angle": -90.0 + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 7, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 443.0, + 536.0 + ], + "runs": [ + { + "text": "DARK", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 244.0, + "tracking": 49.18032786885246, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9764706, + "g": 0.58431375, + "b": 0.8627451 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 0.0, + "y": -244.0 + }, + "end": { + "x": 258.3698645932122, + "y": 186.55646104068177 + }, + "aspect": 1.0 + }, + "angle": -59.03272223354657 + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 8, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 5.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 468.0, + 574.0 + ], + "out": [ + 734.0, + 610.0 + ] + }, + { + "p": [ + 1403.0, + 479.0 + ], + "in": [ + 1169.0, + 577.0 + ] + } + ], + "closed": false + } + ] + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 9 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_background.pcraft b/design/channels/orbit-after-dark/sources/orbit_after_dark_background.pcraft new file mode 100644 index 0000000..be716b2 Binary files /dev/null and b/design/channels/orbit-after-dark/sources/orbit_after_dark_background.pcraft differ diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_background.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_background.svg new file mode 100644 index 0000000..1a73d76 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_bug.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_bug.svg new file mode 100644 index 0000000..137dbba --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_bug.svg @@ -0,0 +1 @@ +AD \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_bug.vectorcraft b/design/channels/orbit-after-dark/sources/orbit_after_dark_bug.vectorcraft new file mode 100644 index 0000000..7089335 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_bug.vectorcraft @@ -0,0 +1,1335 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_bug.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 384.0, + "y1": 128.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 5, + "kind": { + "type": "group", + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 25.133481271193887, + "y": 20.851115261147697 + }, + "end": { + "x": 25.133481271193887, + "y": 96.50000279068945 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 66.69999960064888, + 21.039999842643738 + ], + "in": [ + 33.699999779462814, + 37.53999975323677 + ], + "out": [ + 24.0199998319149, + 17.07999986410141 + ] + }, + { + "p": [ + 49.539999693632126, + 96.49999943375587 + ], + "in": [ + 7.519999921321869, + 76.47999954223633 + ], + "out": [ + 24.459999829530716, + 71.85999956727028 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 2.419999986886978, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 21.379999846220016, + 73.17999956011772 + ], + "out": [ + 15.439999878406525, + 79.77999952435493 + ] + }, + { + "p": [ + 28.419999808073044, + 86.15999948978424 + ], + "in": [ + 17.41999986767769, + 85.49999949336052 + ], + "out": [ + 51.7399996817112, + 87.03999948501587 + ] + }, + { + "p": [ + 90.89999946951866, + 55.57999965548515 + ], + "in": [ + 87.81999948620796, + 66.79999959468842 + ], + "out": [ + 93.09999945759773, + 46.999999701976776 + ] + }, + { + "p": [ + 74.17999956011772, + 49.419999688863754 + ], + "in": [ + 82.09999951720238, + 46.999999701976776 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 89.57999947667122, + 54.0399996638298 + ], + "in": [ + 89.57999947667122, + 52.9464785515911 + ], + "out": [ + 89.57999947667122, + 55.13352077606851 + ], + "kind": "Smooth" + }, + { + "p": [ + 87.59999948740005, + 56.01999965310097 + ], + "in": [ + 88.69352059963876, + 56.01999965310097 + ], + "out": [ + 86.50647837516135, + 56.01999965310097 + ], + "kind": "Smooth" + }, + { + "p": [ + 85.61999949812889, + 54.0399996638298 + ], + "in": [ + 85.61999949812889, + 55.13352077606851 + ], + "out": [ + 85.61999949812889, + 52.9464785515911 + ], + "kind": "Smooth" + }, + { + "p": [ + 87.59999948740005, + 52.05999967455864 + ], + "in": [ + 86.50647837516135, + 52.05999967455864 + ], + "out": [ + 88.69352059963876, + 52.05999967455864 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + } + ], + "clip": false + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 116.0, + 112.0 + ], + "runs": [ + { + "text": "AD", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 144.0, + "tracking": 34.72222222222222, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke_width": 3.0, + "underline": false, + "strikethrough": false, + "all_caps": false, + "stroke_miter_limit": 4.0 + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 7 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_bug_wordmark.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_bug_wordmark.svg new file mode 100644 index 0000000..91624ca --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_bug_wordmark.svg @@ -0,0 +1 @@ +ORBITAFTER DARK \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_bug_wordmark.vectorcraft b/design/channels/orbit-after-dark/sources/orbit_after_dark_bug_wordmark.vectorcraft new file mode 100644 index 0000000..5e668bd --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_bug_wordmark.vectorcraft @@ -0,0 +1,1385 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_bug_wordmark.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 384.0, + "y1": 128.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 5, + "kind": { + "type": "group", + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 25.133481271193887, + "y": 20.851115261147697 + }, + "end": { + "x": 25.133481271193887, + "y": 96.50000279068945 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 66.69999960064888, + 21.039999842643738 + ], + "in": [ + 33.699999779462814, + 37.53999975323677 + ], + "out": [ + 24.0199998319149, + 17.07999986410141 + ] + }, + { + "p": [ + 49.539999693632126, + 96.49999943375587 + ], + "in": [ + 7.519999921321869, + 76.47999954223633 + ], + "out": [ + 24.459999829530716, + 71.85999956727028 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 2.419999986886978, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 21.379999846220016, + 73.17999956011772 + ], + "out": [ + 15.439999878406525, + 79.77999952435493 + ] + }, + { + "p": [ + 28.419999808073044, + 86.15999948978424 + ], + "in": [ + 17.41999986767769, + 85.49999949336052 + ], + "out": [ + 51.7399996817112, + 87.03999948501587 + ] + }, + { + "p": [ + 90.89999946951866, + 55.57999965548515 + ], + "in": [ + 87.81999948620796, + 66.79999959468842 + ], + "out": [ + 93.09999945759773, + 46.999999701976776 + ] + }, + { + "p": [ + 74.17999956011772, + 49.419999688863754 + ], + "in": [ + 82.09999951720238, + 46.999999701976776 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 89.57999947667122, + 54.0399996638298 + ], + "in": [ + 89.57999947667122, + 52.9464785515911 + ], + "out": [ + 89.57999947667122, + 55.13352077606851 + ], + "kind": "Smooth" + }, + { + "p": [ + 87.59999948740005, + 56.01999965310097 + ], + "in": [ + 88.69352059963876, + 56.01999965310097 + ], + "out": [ + 86.50647837516135, + 56.01999965310097 + ], + "kind": "Smooth" + }, + { + "p": [ + 85.61999949812889, + 54.0399996638298 + ], + "in": [ + 85.61999949812889, + 55.13352077606851 + ], + "out": [ + 85.61999949812889, + 52.9464785515911 + ], + "kind": "Smooth" + }, + { + "p": [ + 87.59999948740005, + 52.05999967455864 + ], + "in": [ + 86.50647837516135, + 52.05999967455864 + ], + "out": [ + 88.69352059963876, + 52.05999967455864 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + } + ], + "clip": false + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 101.0, + 47.0 + ], + "runs": [ + { + "text": "ORBIT", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 19.0, + "tracking": 157.89473684210526, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 7, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 99.0, + 94.0 + ], + "runs": [ + { + "text": "AFTER DARK", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 47.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 8 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_epg.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_epg.svg new file mode 100644 index 0000000..c63fec5 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_epg.svg @@ -0,0 +1 @@ +ORBITAFTER DARK \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_epg.vectorcraft b/design/channels/orbit-after-dark/sources/orbit_after_dark_epg.vectorcraft new file mode 100644 index 0000000..fc87ff2 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_epg.vectorcraft @@ -0,0 +1,1385 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit_after_dark_epg.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 512.0, + "y1": 160.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 5, + "kind": { + "type": "group", + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.44, + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.92941177, + "b": 0.9607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.5, + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.96862745, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 32.97593122423859, + "y": 35.09677151545111 + }, + "end": { + "x": 32.97593122423859, + "y": 124.49999943733201 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 82.09999680519104, + 35.3199987411499 + ], + "in": [ + 43.099998235702515, + 54.819998025894165 + ], + "out": [ + 31.659998655319214, + 30.63999891281128 + ] + }, + { + "p": [ + 61.81999754905701, + 124.499995470047 + ], + "in": [ + 12.159999370574951, + 100.83999633789062 + ], + "out": [ + 32.17999863624573, + 95.37999653816223 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + }, + "width": 2.859999895095825, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 28.539998769760132, + 96.93999648094177 + ], + "out": [ + 21.519999027252197, + 104.73999619483948 + ] + }, + { + "p": [ + 36.85999846458435, + 112.27999591827393 + ], + "in": [ + 23.85999894142151, + 111.49999594688416 + ], + "out": [ + 64.41999745368958, + 113.31999588012695 + ] + }, + { + "p": [ + 110.69999575614929, + 76.13999724388123 + ], + "in": [ + 107.0599958896637, + 89.39999675750732 + ], + "out": [ + 113.29999566078186, + 65.99999761581421 + ] + }, + { + "p": [ + 90.93999648094177, + 68.85999751091003 + ], + "in": [ + 100.29999613761902, + 65.99999761581421 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9098039, + "g": 0.29803923, + "b": 0.79607844 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 109.13999581336975, + 74.31999731063843 + ], + "in": [ + 109.13999581336975, + 73.02765421839285 + ], + "out": [ + 109.13999581336975, + 75.612340402884 + ], + "kind": "Smooth" + }, + { + "p": [ + 106.79999589920044, + 76.65999722480774 + ], + "in": [ + 108.09233899144601, + 76.65999722480774 + ], + "out": [ + 105.50765280695487, + 76.65999722480774 + ], + "kind": "Smooth" + }, + { + "p": [ + 104.45999598503113, + 74.31999731063843 + ], + "in": [ + 104.45999598503113, + 75.612340402884 + ], + "out": [ + 104.45999598503113, + 73.02765421839285 + ], + "kind": "Smooth" + }, + { + "p": [ + 106.79999589920044, + 71.97999739646912 + ], + "in": [ + 105.50765280695487, + 71.97999739646912 + ], + "out": [ + 108.09233899144601, + 71.97999739646912 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + } + ], + "clip": false + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 130.0, + 54.0 + ], + "runs": [ + { + "text": "ORBIT", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 20.0, + "tracking": 250.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 7, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 128.0, + 112.0 + ], + "runs": [ + { + "text": "AFTER DARK", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 61.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.95686275, + "g": 0.9647059, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 8 + }, + "images": {} +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_guide_mockup.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_guide_mockup.svg new file mode 100644 index 0000000..368d6a2 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_guide_mockup.svg @@ -0,0 +1 @@ +◉ orbit / ClassicSunday 1 November1 Menu2 TV Guide3 Box OfficeORBITAFTER DARKNow on Orbit After DarkThe Last ScreeningA fictional late-night cinema programme for this design proof.Channel22:0023:3000:00101Orbit OneThe Evening ExchangeNext programme102ORBITAFTER DARKThe Last ScreeningNext programme103VortexNight FlightNext programmeArrows Browse OK Watch / programme info Back Return \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_ident.ecproj b/design/channels/orbit-after-dark/sources/orbit_after_dark_ident.ecproj new file mode 100644 index 0000000..408f9ab --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_ident.ecproj @@ -0,0 +1,1368 @@ +{ + "savedBy": "0.19.0", + "activeComp": 1, + "openComps": [ + 1 + ], + "schema": 2, + "settings": { + "bit_depth": "Bpc8", + "linearize": false, + "working_space": null, + "blend_linear": false, + "time_display": "Timecode", + "frame_start": 0, + "audio_sample_rate": 48000, + "gpu_acceleration": true, + "color_engine": "Adobe", + "hdr": "Clip", + "output_space": null, + "working_gamma": 2.2 + }, + "items": { + "1": { + "id": 1, + "name": "Orbit After Dark ident proof", + "label": "Sandstone", + "comment": "", + "parent": null, + "kind": { + "type": "Comp", + "width": 1280, + "height": 720, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 25, + "den": 1 + }, + "duration": 406425600000, + "display_start": 0, + "background": [ + 0.02745098, + 0.08627451, + 0.19607843 + ], + "work_area": [ + 0, + 406425600000 + ], + "layers": [ + { + "id": 27, + "name": "orbit_after_dark_primary.png", + "source": { + "type": "Footage", + "item": 26 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 406425600000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 28, + "match": "layer", + "name": "orbit_after_dark_primary.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 29, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 30, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 39, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 31, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 800.0, + 320.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 32, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 330.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 33, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 100.0, + 100.0, + 100.0 + ] + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Vec3", + "v": [ + 65.0, + 65.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 111767040000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Vec3", + "v": [ + 62.0, + 62.0, + 100.0 + ] + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 34, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 35, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 36, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 37, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 38, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 81285120000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 325140480000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 40, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 41, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 42, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 43, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 44, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 45, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 46, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 47, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 48, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 49, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + }, + { + "id": 3, + "name": "orbit_after_dark_background.png", + "source": { + "type": "Footage", + "item": 2 + }, + "label": "Lavender", + "comment": "", + "start_time": 0, + "in_point": 0, + "out_point": 406425600000, + "stretch": 100.0, + "switches": { + "video": true, + "audio": true, + "solo": false, + "locked": false, + "shy": false, + "collapse": false, + "quality": "Best", + "sampling": "Bilinear", + "effects": true, + "frame_blend": "Off", + "motion_blur": false, + "adjustment": false, + "three_d": false, + "guide": false + }, + "blend_mode": "Normal", + "preserve_transparency": false, + "track_matte": null, + "parent": null, + "markers": [], + "auto_orient": "Off", + "props": { + "uid": 4, + "match": "layer", + "name": "orbit_after_dark_background.png", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Group", + "uid": 5, + "match": "masks", + "name": "Masks", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 6, + "match": "effects", + "name": "Effects", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [] + }, + { + "node": "Group", + "uid": 15, + "match": "transform", + "name": "Transform", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 7, + "match": "anchor", + "name": "Anchor Point", + "value": { + "t": "Vec3", + "v": [ + 960.0, + 540.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 8, + "match": "position", + "name": "Position", + "value": { + "t": "Vec3", + "v": [ + 640.0, + 360.0, + 0.0 + ] + }, + "ui": { + "kind": "Point" + }, + "spatial": true, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 9, + "match": "scale", + "name": "Scale", + "value": { + "t": "Vec3", + "v": [ + 66.6667, + 66.6667, + 100.0 + ] + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 2, + "static_only": false + }, + { + "node": "Prop", + "uid": 10, + "match": "orientation", + "name": "Orientation", + "value": { + "t": "Vec3", + "v": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 11, + "match": "rotationX", + "name": "X Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 12, + "match": "rotationY", + "name": "Y Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": true, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 13, + "match": "rotation", + "name": "Rotation", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 14, + "match": "opacity", + "name": "Opacity", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "keys": [ + { + "time": 0, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 50803200000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 325140480000, + "value": { + "t": "Scalar", + "v": 100.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + }, + { + "time": 406425600000, + "value": { + "t": "Scalar", + "v": 0.0 + }, + "in_interp": "Linear", + "out_interp": "Linear", + "in_ease": [], + "out_ease": [], + "continuous": false, + "auto_bezier": false, + "spatial_in": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_out": [ + 0.0, + 0.0, + 0.0 + ], + "spatial_auto": true, + "spatial_continuous": false, + "roving": false + } + ], + "ui": { + "kind": "Slider", + "min": 0.0, + "max": 100.0, + "slider_min": 0.0, + "slider_max": 100.0, + "decimals": 0 + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + }, + { + "node": "Group", + "uid": 16, + "match": "materialOptions", + "name": "Material Options", + "kind": { + "kind": "Plain" + }, + "enabled": true, + "children": [ + { + "node": "Prop", + "uid": 17, + "match": "castsShadows", + "name": "Casts Shadows", + "value": { + "t": "Enum", + "v": 0 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 18, + "match": "lightTransmission", + "name": "Light Transmission", + "value": { + "t": "Scalar", + "v": 0.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 19, + "match": "acceptsShadows", + "name": "Accepts Shadows", + "value": { + "t": "Enum", + "v": 1 + }, + "ui": { + "kind": "Popup", + "options": [ + "Off", + "On", + "Only" + ] + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 20, + "match": "acceptsLights", + "name": "Accepts Lights", + "value": { + "t": "Bool", + "v": true + }, + "ui": { + "kind": "Checkbox" + }, + "spatial": false, + "hold_only": true, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 21, + "match": "ambient", + "name": "Ambient", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 22, + "match": "diffuse", + "name": "Diffuse", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 23, + "match": "specularIntensity", + "name": "Specular Intensity", + "value": { + "t": "Scalar", + "v": 50.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 24, + "match": "specularShininess", + "name": "Specular Shininess", + "value": { + "t": "Scalar", + "v": 5.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + { + "node": "Prop", + "uid": 25, + "match": "metal", + "name": "Metal", + "value": { + "t": "Scalar", + "v": 100.0 + }, + "ui": { + "kind": "Percent" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + ] + } + ] + } + } + ], + "markers": [], + "shutter_angle": 180.0, + "shutter_phase": -90.0, + "motion_blur_samples": 16, + "motion_blur_adaptive_limit": 128, + "renderer": "Classic3D", + "hide_shy": false, + "enable_motion_blur": true, + "enable_frame_blending": true, + "draft_3d": false, + "preserve_frame_rate": false, + "preserve_resolution": false, + "poster_time": 0, + "global_light": { + "angle": { + "uid": 0, + "match": "globalLightAngle", + "name": "Global Light Angle", + "value": { + "t": "Scalar", + "v": 120.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + }, + "altitude": { + "uid": 0, + "match": "globalLightAltitude", + "name": "Global Light Altitude", + "value": { + "t": "Scalar", + "v": 30.0 + }, + "ui": { + "kind": "Angle" + }, + "spatial": false, + "hold_only": false, + "three_d_only": false, + "two_d_only": false, + "shown_dims": 0, + "static_only": false + } + } + } + }, + "2": { + "id": 2, + "name": "orbit_after_dark_background.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "../exports/orbit_after_dark_background.png", + "kind": "Still", + "width": 1920, + "height": 1080, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Ignore", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + }, + "26": { + "id": 26, + "name": "orbit_after_dark_primary.png", + "label": "Lavender", + "comment": "", + "parent": null, + "kind": { + "type": "Footage", + "path": "../exports/orbit_after_dark_primary.png", + "kind": "Still", + "width": 1600, + "height": 640, + "pixel_aspect": 1.0, + "frame_rate": { + "num": 30, + "den": 1 + }, + "native_rate": null, + "duration": 0, + "has_video": true, + "has_audio": false, + "alpha": "Straight", + "premul_color": [ + 0.0, + 0.0, + 0.0 + ], + "loop_count": 1, + "codec": "PNG", + "missing": false + } + } + }, + "next_id": 50 +} \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_menu_mockup.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_menu_mockup.svg new file mode 100644 index 0000000..f39a84e --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_menu_mockup.svg @@ -0,0 +1 @@ +◉ orbit / ClassicSunday 1 November1 Menu2 TV Guide3 Box OfficeORBITAFTERDARKYour evening starts here.Watch Orbit After DarkTV GuideOrbOfficeSettingsMenu integration study · proposed artwork placement \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_player_hud_mockup.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_player_hud_mockup.svg new file mode 100644 index 0000000..38db7fc --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_player_hud_mockup.svg @@ -0,0 +1 @@ +Controls / subtitle placement study · bug hiddenThere is still a light in the projection room.102 Orbit After Dark22:14 Sun 1 NovNOWThe Last ScreeningNEXT23:30 Midnight Visitors▲ ▼ Channel ↶ TV guide CC Subtitles \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_player_mockup.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_player_mockup.svg new file mode 100644 index 0000000..802b0b7 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_player_mockup.svg @@ -0,0 +1 @@ +102ADPlayback placement study · fictional scene \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_primary.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_primary.svg new file mode 100644 index 0000000..de707a0 --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_primary.svg @@ -0,0 +1 @@ +ORBITAFTERDARK \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_review.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_review.svg new file mode 100644 index 0000000..0f6d4bf --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_review.svg @@ -0,0 +1 @@ +Orbit After DarkBranding proof 01 / Midnight TransmissionORBITAFTERDARKCompact EPGORBITAFTER DARKPlayback bug · transparentADActual-size checks at 1080pORBITAFTER DARKADOriginal source artwork · Navy interface · Yellow focus · Magenta channel accent \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_sky.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_sky.svg new file mode 100644 index 0000000..85f555f --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_sky.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_skyline.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_skyline.svg new file mode 100644 index 0000000..75c394b --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_skyline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_stars.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_stars.svg new file mode 100644 index 0000000..a30102e --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_stars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/design/channels/orbit-after-dark/sources/orbit_after_dark_title_card.svg b/design/channels/orbit-after-dark/sources/orbit_after_dark_title_card.svg new file mode 100644 index 0000000..841a50e --- /dev/null +++ b/design/channels/orbit-after-dark/sources/orbit_after_dark_title_card.svg @@ -0,0 +1 @@ +ORBITAFTERDARKTonight at 22:00The Last ScreeningFictional programme title-card study \ No newline at end of file diff --git a/design/channels/orbit-after-dark/verification.json b/design/channels/orbit-after-dark/verification.json new file mode 100644 index 0000000..b94898b --- /dev/null +++ b/design/channels/orbit-after-dark/verification.json @@ -0,0 +1,61 @@ +{ + "status": "design-proof", + "alpha": { + "primary.png": { + "min": 0, + "max": 255 + }, + "epg.png": { + "min": 0, + "max": 255 + }, + "bug.png": { + "min": 0, + "max": 255 + }, + "epg_app.webp": { + "min": 0, + "max": 255 + }, + "bug_app.webp": { + "min": 0, + "max": 255 + } + }, + "files": { + "orbit_after_dark_primary.svg": 13797, + "orbit_after_dark_epg.svg": 12351, + "orbit_after_dark_bug.svg": 2593, + "orbit_after_dark_primary.png": 44795, + "orbit_after_dark_epg.png": 7347, + "orbit_after_dark_bug.png": 6975, + "orbit_after_dark_background.png": 91432, + "orbit_after_dark_sky.png": 83040, + "orbit_after_dark_stars.png": 9162, + "orbit_after_dark_skyline.png": 17306, + "orbit_after_dark_bug_wordmark.svg": 12550, + "orbit_after_dark_bug_wordmark.png": 5163, + "orbit_after_dark_background.webp": 10768, + "orbit_after_dark_ident.mp4": 633277, + "orbit_after_dark_epg_app.webp": 6518, + "orbit_after_dark_bug_app.webp": 3676 + }, + "video": { + "programs": [], + "stream_groups": [], + "streams": [ + { + "codec_name": "h264", + "width": 1280, + "height": 720, + "pix_fmt": "yuv420p", + "r_frame_rate": "25/1" + } + ], + "format": { + "duration": "1.600000", + "size": "633277" + } + }, + "androidFilesUnchangedAgainst014Archive": 44 +} \ No newline at end of file diff --git a/design/classic-programme-strip.figcraft b/design/classic-programme-strip.figcraft new file mode 100644 index 0000000..58e3165 Binary files /dev/null and b/design/classic-programme-strip.figcraft differ diff --git a/design/classic-programme-strip.png b/design/classic-programme-strip.png new file mode 100644 index 0000000..e8a67ab Binary files /dev/null and b/design/classic-programme-strip.png differ diff --git a/design/classic-programme-strip.svg b/design/classic-programme-strip.svg new file mode 100644 index 0000000..ecf57e1 --- /dev/null +++ b/design/classic-programme-strip.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + +Orbit Preview +21:30 Sun 1 Nov + +NOW +The Last Shuttle Home +INFO +Movie • 96 min + +▲ ▼ +Channel +↶ +TV guide +CC +Subtitles + \ No newline at end of file diff --git a/design/create-classic-osd.py b/design/create-classic-osd.py new file mode 100644 index 0000000..812523c --- /dev/null +++ b/design/create-classic-osd.py @@ -0,0 +1,19 @@ +from pathlib import Path +from html import escape +p=Path(__file__).parent +parts=['', '', ''] +def rect(x,y,w,h,color):parts.append(f'') +def text(x,y,value,size=30,color='#fff',bold=False):parts.append(f'{escape(value)}') +# Original abstract video stand-in, not captured provider content. +parts.append('') +for x,y,r in [(180,180,3),(420,340,2),(1560,140,3),(1680,480,2),(1300,250,2),(700,140,2),(300,600,3)]:parts.append(f'') +x=134;y=794;w=1652 +rect(x-2,y-2,w+4,234,'#e8edf5') +rect(x,y,w,44,'#e8edf5');text(x+24,y+32,'Orbit Preview',28,'#071632',True);text(x+w-360,y+31,'21:30 Sun 1 Nov',26,'#071632') +rect(x,y+44,w,128,'#194c91') +text(x+28,y+98,'NOW',28,'#ffde59',True);text(x+168,y+99,'The Last Shuttle Home',40,'#fff',True) +text(x+28,y+144,'INFO',26,'#b7cbe8',True);text(x+168,y+144,'Movie • 96 min',28) +rect(x,y+172,w,58,'#e8edf5') +for px,icon,label in [(x+28,'▲ ▼','Channel'),(x+390,'↶','TV guide'),(x+760,'CC','Subtitles')]: + text(px,y+211,icon,32,'#071632',True);text(px+92,y+211,label,28,'#071632',True) +parts.append('');(p/'classic-programme-strip.svg').write_text('\n'.join(parts)) diff --git a/design/create-design.py b/design/create-design.py new file mode 100644 index 0000000..91ce363 --- /dev/null +++ b/design/create-design.py @@ -0,0 +1,39 @@ +from pathlib import Path +from html import escape +p=Path(__file__).parent +parts=[''] +def rect(x,y,w,h,c,stroke=None): + parts.append(f'') +def text(x,y,s,size=28,c='#ffffff',bold=False): + parts.append(f'{escape(s)}') +rect(0,0,1920,1080,'#071632') +parts.append('') +text(175,108,'orbit',68,bold=True);text(365,103,'/ Classic',34,'#b7cbe8') +text(1440,101,'Saturday 31 October',26);text(1770,101,'20:30',28,'#ffde59',True) +for x,w,label,active in [(64,340,'1 Menu',False),(412,340,'2 TV Guide',True),(760,340,'3 Box Office',False)]: + rect(x,150,w,64,'#194c91' if active else '#12356b','#38629a');text(x+24,192,label,29,bold=active) +text(1510,191,'Your media. Your universe.',24,'#b7cbe8') +rect(64,248,545,300,'#12356b','#38629a') +parts.append('') +rect(64,492,545,56,'#0c244d');text(86,529,'101 Orbit One',24,'#ffffff',True);text(400,529,'Demo signal',20,'#ffde59') +text(654,276,'Orbit One / 20:30–21:00',24,'#ffde59') +text(654,338,'The Midnight Observatory',45,bold=True) +text(654,391,'An astronomer follows a mysterious signal',29,'#b7cbe8') +text(654,435,'across the night sky.',29,'#b7cbe8') +text(654,524,'Fictional programmes • Original demo transmission',22,'#b7cbe8') +rect(64,584,1792,51,'#194c91') +text(88,619,'Channel',24) +for x,label in [(430,'20:30'),(910,'21:00'),(1390,'21:30')]:text(x,619,label,24) +rows=[('101','Orbit One',['The Midnight Observatory','Small Town, Big Orbit','Beyond the Blue']),('202','Orbit Sci-Fi',['Signal from Europa','Starbound Dispatch','Visitors at Dawn']),('401','Orbit Kids',['Moonbug Rangers','The Comet Club','Rocket Pocket'])] +for i,(num,name,shows) in enumerate(rows): + y=644+i*100 + rect(64,y,330,92,'#102b57');text(86,y+32,num,22,'#ffde59');text(86,y+68,name,29,bold=True) + for j,show in enumerate(shows): + x=402+j*486;focused=i==0 and j==0 + rect(x,y,478,92,'#ffde59' if focused else '#12356b','#ffffff' if focused else '#38629a') + text(x+20,y+54,show,27,'#071632' if focused else '#ffffff',focused) +text(66,1009,'Arrows Browse',23,'#b7cbe8');text(430,1009,'OK Watch now / programme information',23,'#b7cbe8');text(1390,1009,'Back Return',23,'#b7cbe8') +rect(64,1040,1792,2,'#38629a') +parts.append('');(p/'orbit-classic-guide.svg').write_text('\n'.join(parts)) +logo='''orbit''' +(p/'orbit-wordmark.svg').write_text(logo) diff --git a/design/create-drive-in-mark.py b/design/create-drive-in-mark.py new file mode 100644 index 0000000..e0088b7 --- /dev/null +++ b/design/create-drive-in-mark.py @@ -0,0 +1,25 @@ +from pathlib import Path +p=Path(__file__).parent +art=''' + + + + + + + + + + + + + +OrbOffice +Your own drive-in cinema +ADMIT +01 +FRONT ROW +''' +(p/'orboffice-drive-in-mark.svg').write_text(art) +proof=art.replace('\n'] + def rect(x,y,w,h,c,stroke=None):a.append(f'') + def text(x,y,s,size=28,c=W,bold=False,font='Barlow'): + a.append(f'{escape(s)}') + rect(0,0,1920,1080,N) + a.append(f'') + text(175,108,'orbit',68,bold=True);text(360,103,'/ Classic',34,M) + text(1440,101,'Saturday 31 October',26);text(1770,101,'21:30',28,Y,True) + for x,label,active in [(64,'1 Menu',section=='menu'),(412,'2 TV Guide',False),(760,'3 Box Office',section=='office')]: + rect(x,150,340,64,'#194c91' if active else P,'#38629a');text(x+24,192,label,29,bold=active) + if section=='office': + text(64,296,'OrbOffice',68,Y,font='Barlow Condensed');text(370,288,'Your front-row seat.',32,M) + tx=64;ty=340;tw=1070;th=590;seam=tx+tw*.76 + rect(tx,ty,tw,th,C) + a.append(f'') + for i in range(12): + for x in [tx,tx+tw]:a.append(f'') + for y in [ty,ty+th]:a.append(f'') + text(110,408,'OrbOffice',48,N,font='Barlow Condensed');text(110,450,'Orbit premieres',26,N) + text(110,550,'The Last',72,N,font='Barlow Condensed');text(110,629,'Shuttle Home',72,N,font='Barlow Condensed') + text(110,745,'Tonight at 21:30',36,N,True);text(110,787,'One universe. Best seat in the house.',27,N) + rect(110,824,236,66,Y);text(137,870,'Admit one',39,N,font='Barlow Condensed') + text(seam+60,420,'orbit',42,N,True);text(seam+50,465,'Front row',32,N,font='Barlow Condensed') + text(seam+77,658,'01',105,N,font='Barlow Condensed');text(seam+84,700,'Seat',25,N) + text(seam+66,845,'ORB-001',30,N,font='Barlow Condensed');text(seam+75,883,'Preview',23,N) + text(64,976,'Preview ticket • Fictional event • Included in your collection',26,M) + text(1210,320,'Special transmissions',40,bold=True) + rect(1210,356,646,77,Y,W);text(1238,407,'Orbit premieres',32,N,True) + rect(1210,445,646,77,P,'#38629a');text(1238,496,'After dark',32) + for y,s in [(590,'One final journey brings an unlikely'),(634,'crew together. A fictional premiere'),(678,'for your own front-row seat.')]:text(1210,y,s,32,M) + text(1210,800,'Event playback comes with the',28,M);text(1210,838,'Emby connection.',28,M) + rect(1210,874,646,66,P,'#38629a');text(1240,918,'Return to TV Guide',29) + else: + rect(64,258,1792,690,P) + text(112,365,'Your evening starts here.',61,Y,True) + for y,s in [(455,'Your collection.'),(515,'Your channels.'),(575,'Your television.')]:text(112,y,s,46) + text(112,824,'Orbit Classic',48,M,font='Barlow Condensed');text(112,873,'The satellite spirit, in your universe.',30,M) + for y,s in [(400,"TV Guide / What's on now"),(510,'OrbOffice / Special transmissions'),(620,'Services / Orbit Interactive')]: + rect(1030,y,760,84,Y if y==400 else '#194c91',W if y==400 else '#38629a');text(1058,y+55,s,30,N if y==400 else W,y==400) + text(64,1030,'Arrows Browse OK Select Back Return to guide',25,M) + a.append('');(p/('orboffice.svg' if section=='office' else 'orbit-menu.svg')).write_text('\n'.join(a)) +for section in ['office','menu']:build(section) +# A font comparison rendered from the actual local TTFs, without installing system fonts. +base=p/'fonts' +im=Image.new('RGB',(1600,1100),N);d=ImageDraw.Draw(im) +def line(x,y,s,path,size,color=W):d.text((x,y),s,font=ImageFont.truetype(str(path),size),fill=color) +def font(name):return base/name +line(65,45,'Orbit / type study',font('barlow-semibold.ttf'),60) +line(65,123,'Actual fonts from your Documents collection',font('barlow-regular.ttf'),28,M) +for i,(name,path,description) in enumerate([ + ('Barlow',font('barlow-regular.ttf'),'Selected for the new menu and event descriptions'), + ('Barlow Condensed',font('barlow-condensed-medium.ttf'),'Selected for OrbOffice titles and ticket lettering'), + ('Instrument Sans',font('instrument-sans.ttf'),'Alternative: a quieter contemporary UI')]): + y=215+i*285;d.rectangle((64,y,1536,y+245),fill=P) + line(90,y+23,name,path,36,Y) + line(90,y+82,'The Last Shuttle Home',path,62) + line(90,y+169,'101 Orbit One Tonight 21:30 Admit one',path,27) + line(90,y+210,description,font('barlow-regular.ttf'),22,M) +im.save(p/'font-comparison.png') diff --git a/design/design-notes-0.2.md b/design/design-notes-0.2.md new file mode 100644 index 0000000..cdf41ca --- /dev/null +++ b/design/design-notes-0.2.md @@ -0,0 +1,18 @@ +# Orbit Classic / OrbOffice revision + +The established deep-blue guide and yellow focus remain the visual foundation. +Top navigation: 1 Menu / 2 TV Guide / 3 Box Office. Services moves into Menu. +OrbOffice is an original paper admission ticket: cream body, navy lettering, yellow Admit one stamp, +perforated edges and a detachable seat stub. No Sky logo, ticket artwork or third-party programme art is used. +Barlow is used for new menu/body copy and Barlow Condensed for event/ticket lettering. +The previous guide and fullscreen bar retain their tested fonts and styling. + +FigCraft files retain editable text and shapes. Barlow TTFs and OFL licences are included. +Use render-designs.sh for project-local font loading. The font report confirms both families available. +The font-comparison.png sheet compares actual local Barlow, Barlow Condensed and Instrument Sans binaries. +PNG previews are design mockups, not captures of the new APK on the TV. + +Future identity brief from Paul: create a proper original logo, centred in the TV app tile, +with generous safe padding. No logo redesign is included in this increment. + +Open with design/open-design.sh orboffice to make the included fonts available to FigCraft without installing them system-wide. diff --git a/design/design-notes.md b/design/design-notes.md new file mode 100644 index 0000000..dac0431 --- /dev/null +++ b/design/design-notes.md @@ -0,0 +1,18 @@ +# Orbit Classic design + +Original satellite-guide direction: deep blue panels, dense channel rows, yellow remote focus. + +- Background: #071632 +- Panels: #12356B +- Navigation / time ruler: #194C91 +- Focus: #FFDE59 +- Supporting text: #B7CBE8 +- Text: white; bold programme titles and channel names. +- Typeface: DejaVu Sans in mockups; Android system sans in the app. +- Layout: left-aligned, three channels and three half-hour columns, preview above grid. + +`orbit-classic-guide.figcraft` contains editable frame, shape and text layers (63 nodes). +`orbit-wordmark.vectorcraft` contains the editable original vector identity. +SVG files and create-design.py preserve reproducible source artwork. +The mockup is a concept; the Android UI is implemented independently in Compose. +PhotoCraft is available for future seasonal raster artwork; none is needed for this increment. diff --git a/design/font-comparison.png b/design/font-comparison.png new file mode 100644 index 0000000..22cf8b0 Binary files /dev/null and b/design/font-comparison.png differ diff --git a/design/font-report.json b/design/font-report.json new file mode 100644 index 0000000..775da6a --- /dev/null +++ b/design/font-report.json @@ -0,0 +1 @@ +[{"command":"file.fontReport","params":{}}] \ No newline at end of file diff --git a/design/fonts/README.md b/design/fonts/README.md new file mode 100644 index 0000000..5780688 --- /dev/null +++ b/design/fonts/README.md @@ -0,0 +1,4 @@ +Barlow Regular, SemiBold and Barlow Condensed Medium copied from the local TTF collection. +Original project: https://github.com/jpt/barlow +Copyright 2017 The Barlow Project Authors. SIL Open Font License 1.1. +Licence copies are in ../../licenses/. No font binaries were modified. diff --git a/design/fonts/barlow-condensed-medium.ttf b/design/fonts/barlow-condensed-medium.ttf new file mode 100644 index 0000000..eee49eb Binary files /dev/null and b/design/fonts/barlow-condensed-medium.ttf differ diff --git a/design/fonts/barlow-regular.ttf b/design/fonts/barlow-regular.ttf new file mode 100644 index 0000000..bb3faec Binary files /dev/null and b/design/fonts/barlow-regular.ttf differ diff --git a/design/fonts/barlow-semibold.ttf b/design/fonts/barlow-semibold.ttf new file mode 100644 index 0000000..7c974a4 Binary files /dev/null and b/design/fonts/barlow-semibold.ttf differ diff --git a/design/fonts/instrument-sans.ttf b/design/fonts/instrument-sans.ttf new file mode 100644 index 0000000..3589b81 Binary files /dev/null and b/design/fonts/instrument-sans.ttf differ diff --git a/design/open-design.sh b/design/open-design.sh new file mode 100755 index 0000000..eb1d0af --- /dev/null +++ b/design/open-design.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail +ORBIT_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +ORBIT_DESIGN="${1:-orboffice}" +case "$ORBIT_DESIGN" in orboffice|orbit-menu|orbit-classic-guide|orboffice-drive-in) ;; *) echo "Choose orboffice, orbit-menu, orbit-classic-guide or orboffice-drive-in"; exit 1;; esac +mkdir -p "$ORBIT_ROOT/.tooling/font-data/fonts" +cp "$ORBIT_ROOT"/design/fonts/*.ttf "$ORBIT_ROOT/.tooling/font-data/fonts/" +export XDG_DATA_HOME="$ORBIT_ROOT/.tooling/font-data" +exec figcraft "$ORBIT_ROOT/design/$ORBIT_DESIGN.figcraft" diff --git a/design/orbit-classic-guide.figcraft b/design/orbit-classic-guide.figcraft new file mode 100644 index 0000000..6ddc9f0 Binary files /dev/null and b/design/orbit-classic-guide.figcraft differ diff --git a/design/orbit-classic-guide.png b/design/orbit-classic-guide.png new file mode 100644 index 0000000..f5dc975 Binary files /dev/null and b/design/orbit-classic-guide.png differ diff --git a/design/orbit-classic-guide.svg b/design/orbit-classic-guide.svg new file mode 100644 index 0000000..07ae4e0 --- /dev/null +++ b/design/orbit-classic-guide.svg @@ -0,0 +1,61 @@ + + + +orbit +/ Classic +Saturday 31 October +20:30 + +1 Menu + +2 TV Guide + +3 Box Office +Your media. Your universe. + + + +101 Orbit One +Demo signal +Orbit One / 20:30–21:00 +The Midnight Observatory +An astronomer follows a mysterious signal +across the night sky. +Fictional programmes • Original demo transmission + +Channel +20:30 +21:00 +21:30 + +101 +Orbit One + +The Midnight Observatory + +Small Town, Big Orbit + +Beyond the Blue + +202 +Orbit Sci-Fi + +Signal from Europa + +Starbound Dispatch + +Visitors at Dawn + +401 +Orbit Kids + +Moonbug Rangers + +The Comet Club + +Rocket Pocket +Arrows Browse +OK Watch now / programme information +Back Return + + \ No newline at end of file diff --git a/design/orbit-menu.figcraft b/design/orbit-menu.figcraft new file mode 100644 index 0000000..9a32e0a Binary files /dev/null and b/design/orbit-menu.figcraft differ diff --git a/design/orbit-menu.png b/design/orbit-menu.png new file mode 100644 index 0000000..425842b Binary files /dev/null and b/design/orbit-menu.png differ diff --git a/design/orbit-menu.svg b/design/orbit-menu.svg new file mode 100644 index 0000000..ca9a048 --- /dev/null +++ b/design/orbit-menu.svg @@ -0,0 +1,28 @@ + + + +orbit +/ Classic +Saturday 31 October +21:30 + +1 Menu + +2 TV Guide + +3 Box Office + +Your evening starts here. +Your collection. +Your channels. +Your television. +Orbit Classic +The satellite spirit, in your universe. + +TV Guide / What's on now + +OrbOffice / Special transmissions + +Services / Orbit Interactive +Arrows Browse OK Select Back Return to guide + \ No newline at end of file diff --git a/design/orbit-wordmark.svg b/design/orbit-wordmark.svg new file mode 100644 index 0000000..8dd5faa --- /dev/null +++ b/design/orbit-wordmark.svg @@ -0,0 +1 @@ +orbit \ No newline at end of file diff --git a/design/orbit-wordmark.vectorcraft b/design/orbit-wordmark.vectorcraft new file mode 100644 index 0000000..e323742 --- /dev/null +++ b/design/orbit-wordmark.vectorcraft @@ -0,0 +1,1274 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orbit-wordmark.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 640.0, + "y1": 240.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 0.0, + 0.0 + ] + }, + { + "p": [ + 640.0, + 0.0 + ] + }, + { + "p": [ + 640.0, + 240.0 + ] + }, + { + "p": [ + 0.0, + 240.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.87058824, + "b": 0.34901962 + } + }, + "width": 10.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 174.0, + 120.0 + ], + "in": [ + 174.0, + 90.17662048339844 + ], + "out": [ + 174.0, + 149.82337951660156 + ], + "kind": "Smooth" + }, + { + "p": [ + 120.0, + 174.0 + ], + "in": [ + 149.82337951660156, + 174.0 + ], + "out": [ + 90.17662048339844, + 174.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 66.0, + 120.0 + ], + "in": [ + 66.0, + 149.82337951660156 + ], + "out": [ + 66.0, + 90.17662048339844 + ], + "kind": "Smooth" + }, + { + "p": [ + 120.0, + 66.0 + ], + "in": [ + 90.17662048339844, + 66.0 + ], + "out": [ + 149.82337951660156, + 66.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "width": 6.000000180987937, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 200.66139948368073, + 82.38697588443756 + ], + "in": [ + 195.5264772323526, + 71.37509943526402 + ], + "out": [ + 205.79632495933038, + 93.398859248191 + ], + "kind": "Smooth" + }, + { + "p": [ + 129.29760575294495, + 139.93877387046814 + ], + "in": [ + 173.84565798851872, + 119.1656762305156 + ], + "out": [ + 84.74954660279127, + 160.7118747347422 + ], + "kind": "Smooth" + }, + { + "p": [ + 39.338608145713806, + 157.6130279302597 + ], + "in": [ + 44.47353362136346, + 168.62491129401315 + ], + "out": [ + 34.20368589438567, + 146.60115148108616 + ], + "kind": "Smooth" + }, + { + "p": [ + 110.70240187644958, + 100.06122994422913 + ], + "in": [ + 66.15434272629591, + 120.83433080850318 + ], + "out": [ + 155.25045411202336, + 79.28813230427659 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 5, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 235.0, + 153.0 + ], + "runs": [ + { + "text": "orbit", + "style": { + "font_family": "DejaVu Sans", + "font_style": "Bold", + "size": 94.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 6 + }, + "images": {} +} \ No newline at end of file diff --git a/design/orboffice-drive-in-brief.md b/design/orboffice-drive-in-brief.md new file mode 100644 index 0000000..0b647d8 --- /dev/null +++ b/design/orboffice-drive-in-brief.md @@ -0,0 +1,36 @@ +# OrbOffice / drive-in direction + +Paul supplied a historic Sky Box Office ticket logo as a reference. Retain the broad gold, +charcoal, admission-ticket and cinema atmosphere while developing original typography, +geometry, screen/planet emblem and proportions under the working name OrbOffice. +This concept is original vector artwork, not a traced or renamed Sky logo. It is a design +proposal, not a legal clearance opinion. OrbOffice name availability has not been searched. +Before public branding, check relevant trade marks and obtain appropriate advice if needed. +A name swap alone does not decide infringement; similar marks can matter too. + +Future Box Office interface direction: a drive-in cinema, with a feature screen, tonight's +programme, ticket-style event cards and original seasonal artwork. Keep this as a later +interface increment, separate from proving playback. Do not change the working guide or +full-screen demo programme bar in the playback-test revision. + +The ringed screen emblem and one-word condensed gold lettering form this first concept. +The application-launcher Orbit logo remains a separate brief: centred with safe padding. +Editable FigCraft, VectorCraft and SVG sources are included, with the existing licensed fonts. + +Reference guidance: +https://www.gov.uk/defend-your-intellectual-property +https://www.nibusinessinfo.co.uk/content/using-other-peoples-trade-marks + +## Android CLI skill assessment + +The exact supplied MCP Market listing could not be read. An official matching-titled Android +CLI Specialist reference is available at: +https://developer.android.com/agents/skills/devtools/android-cli/skill +It covers environment/SDK management, device layout inspection, screenshots and journey tests. +Useful for later repeatable TV acceptance tests. The new android CLI is not on PATH here. +No new CLI or skill was installed; current Gradle and ADB tooling remains sufficient to build +and install this increment. Do not run installation instructions merely because a listing says so. + +Latest refinement: Paul requested a chunky CRT based on his supplied generic television reference and white Office lettering. The mark now uses a curved screen, cabinet, speaker grille and controls; Orb remains gold. The tightened stub spacing remains. + +Final CRT refinement: remove the outer cream cabinet outline and pale feet, keeping the curved gold screen and small controls. diff --git a/design/orboffice-drive-in-concept.png b/design/orboffice-drive-in-concept.png new file mode 100644 index 0000000..2c3d06a Binary files /dev/null and b/design/orboffice-drive-in-concept.png differ diff --git a/design/orboffice-drive-in-mark.svg b/design/orboffice-drive-in-mark.svg new file mode 100644 index 0000000..f35ce07 --- /dev/null +++ b/design/orboffice-drive-in-mark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + +OrbOffice +Your own drive-in cinema +ADMIT +01 +FRONT ROW + \ No newline at end of file diff --git a/design/orboffice-drive-in-proof.svg b/design/orboffice-drive-in-proof.svg new file mode 100644 index 0000000..bb74fe7 --- /dev/null +++ b/design/orboffice-drive-in-proof.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + +OrbOffice +Your own drive-in cinema +ADMIT +01 +FRONT ROW + \ No newline at end of file diff --git a/design/orboffice-drive-in.figcraft b/design/orboffice-drive-in.figcraft new file mode 100644 index 0000000..5c4a85b Binary files /dev/null and b/design/orboffice-drive-in.figcraft differ diff --git a/design/orboffice-drive-in.vectorcraft b/design/orboffice-drive-in.vectorcraft new file mode 100644 index 0000000..8184cf6 --- /dev/null +++ b/design/orboffice-drive-in.vectorcraft @@ -0,0 +1,2671 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orboffice-drive-in-mark.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 1200.0, + "y1": 500.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.20392157, + "g": 0.22352941, + "b": 0.27058825 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "width": 5.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 100.0, + 94.0 + ] + }, + { + "p": [ + 1100.0, + 94.0 + ] + }, + { + "p": [ + 1100.0, + 180.0 + ], + "out": [ + 1076.6666666666667, + 180.0 + ] + }, + { + "p": [ + 1065.0, + 215.0 + ], + "in": [ + 1065.0, + 191.66666666666666 + ] + }, + { + "p": [ + 1065.0, + 285.0 + ], + "out": [ + 1065.0, + 308.3333333333333 + ] + }, + { + "p": [ + 1100.0, + 320.0 + ], + "in": [ + 1076.6666666666667, + 320.0 + ] + }, + { + "p": [ + 1100.0, + 406.0 + ] + }, + { + "p": [ + 100.0, + 406.0 + ] + }, + { + "p": [ + 100.0, + 320.0 + ], + "out": [ + 123.33333333333333, + 320.0 + ] + }, + { + "p": [ + 135.0, + 285.0 + ], + "in": [ + 135.0, + 308.3333333333333 + ] + }, + { + "p": [ + 135.0, + 215.0 + ], + "out": [ + 135.0, + 191.66666666666666 + ] + }, + { + "p": [ + 100.0, + 180.0 + ], + "in": [ + 123.33333333333333, + 180.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 5, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "compound", + "children": [ + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 155.0, + 119.0 + ] + }, + { + "p": [ + 1018.0, + 119.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 155.0, + 381.0 + ] + }, + { + "p": [ + 1018.0, + 381.0 + ] + } + ], + "closed": false + } + ] + } + } + } + ], + "rule": "NonZero" + } + }, + { + "id": 6, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "width": 2.0, + "miter_limit": 4.0, + "dash": { + "pattern": [ + 7.0, + 10.0 + ], + "offset": 0.0, + "align_corners": false + }, + "opacity": 0.65 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 945.0, + 120.0 + ] + }, + { + "p": [ + 945.0, + 380.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 7, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.10980392, + "g": 0.14509805, + "b": 0.19215687 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 195.0, + 142.0 + ], + "in": [ + 191.13400268554688, + 142.0 + ] + }, + { + "p": [ + 387.0, + 142.0 + ], + "out": [ + 390.8659973144531, + 142.0 + ] + }, + { + "p": [ + 394.0, + 149.0 + ], + "in": [ + 394.0, + 145.13400268554688 + ] + }, + { + "p": [ + 394.0, + 331.0 + ], + "out": [ + 394.0, + 334.8659973144531 + ] + }, + { + "p": [ + 387.0, + 338.0 + ], + "in": [ + 390.8659973144531, + 338.0 + ] + }, + { + "p": [ + 195.0, + 338.0 + ], + "out": [ + 191.13400268554688, + 338.0 + ] + }, + { + "p": [ + 188.0, + 331.0 + ], + "in": [ + 188.0, + 334.8659973144531 + ] + }, + { + "p": [ + 188.0, + 149.0 + ], + "out": [ + 188.0, + 145.13400268554688 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 8, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13725491, + "g": 0.19607843, + "b": 0.23529412 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "width": 3.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 204.0, + 160.0 + ], + "in": [ + 199.33333333333334, + 198.66666666666666 + ], + "out": [ + 262.0, + 154.66666666666666 + ] + }, + { + "p": [ + 378.0, + 160.0 + ], + "in": [ + 320.0, + 154.66666666666666 + ], + "out": [ + 382.6666666666667, + 198.66666666666666 + ] + }, + { + "p": [ + 378.0, + 277.0 + ], + "in": [ + 382.6666666666667, + 237.66666666666669 + ], + "out": [ + 320.0, + 282.3333333333333 + ] + }, + { + "p": [ + 204.0, + 277.0 + ], + "in": [ + 262.0, + 282.3333333333333 + ], + "out": [ + 199.33333333333334, + 237.66666666666669 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 9, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "width": 2.0, + "miter_limit": 4.0, + "opacity": 0.23 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 211.0, + 168.0 + ], + "out": [ + 264.3333333333333, + 164.0 + ] + }, + { + "p": [ + 371.0, + 168.0 + ], + "in": [ + 317.6666666666667, + 164.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 10, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "width": 2.0, + "miter_limit": 4.0, + "opacity": 0.45 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 201.0, + 292.0 + ] + }, + { + "p": [ + 381.0, + 292.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 14, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "width": 2.0, + "miter_limit": 4.0, + "opacity": 0.5 + } + ] + }, + "kind": { + "type": "compound", + "children": [ + { + "id": 11, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "width": 2.0, + "miter_limit": 4.0, + "opacity": 0.5 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 205.0, + 302.0 + ] + }, + { + "p": [ + 315.0, + 302.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 12, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "width": 2.0, + "miter_limit": 4.0, + "opacity": 0.5 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 205.0, + 309.0 + ] + }, + { + "p": [ + 315.0, + 309.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 13, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "width": 2.0, + "miter_limit": 4.0, + "opacity": 0.5 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 205.0, + 316.0 + ] + }, + { + "p": [ + 315.0, + 316.0 + ] + } + ], + "closed": false + } + ] + } + } + } + ], + "rule": "NonZero" + } + }, + { + "id": 15, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 367.0, + 316.0 + ], + "in": [ + 367.0, + 312.1340026855469 + ], + "out": [ + 367.0, + 319.8659973144531 + ], + "kind": "Smooth" + }, + { + "p": [ + 360.0, + 323.0 + ], + "in": [ + 363.8659973144531, + 323.0 + ], + "out": [ + 356.1340026855469, + 323.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 353.0, + 316.0 + ], + "in": [ + 353.0, + 319.8659973144531 + ], + "out": [ + 353.0, + 312.1340026855469 + ], + "kind": "Smooth" + }, + { + "p": [ + 360.0, + 309.0 + ], + "in": [ + 356.1340026855469, + 309.0 + ], + "out": [ + 363.8659973144531, + 309.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 16, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 339.0, + 316.0 + ], + "in": [ + 339.0, + 314.8954162597656 + ], + "out": [ + 339.0, + 317.1045837402344 + ], + "kind": "Smooth" + }, + { + "p": [ + 337.0, + 318.0 + ], + "in": [ + 338.1045837402344, + 318.0 + ], + "out": [ + 335.8954162597656, + 318.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 335.0, + 316.0 + ], + "in": [ + 335.0, + 317.1045837402344 + ], + "out": [ + 335.0, + 314.8954162597656 + ], + "kind": "Smooth" + }, + { + "p": [ + 337.0, + 314.0 + ], + "in": [ + 335.8954162597656, + 314.0 + ], + "out": [ + 338.1045837402344, + 314.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 19, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.10980392, + "g": 0.14509805, + "b": 0.19215687 + } + }, + "width": 5.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "compound", + "children": [ + { + "id": 17, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.10980392, + "g": 0.14509805, + "b": 0.19215687 + } + }, + "width": 5.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 207.0, + 340.0 + ] + }, + { + "p": [ + 240.0, + 340.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 18, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.10980392, + "g": 0.14509805, + "b": 0.19215687 + } + }, + "width": 5.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 344.0, + 340.0 + ] + }, + { + "p": [ + 377.0, + 340.0 + ] + } + ], + "closed": false + } + ] + } + } + } + ], + "rule": "NonZero" + } + }, + { + "id": 20, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "width": 5.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 318.0, + 220.0 + ], + "in": [ + 318.0, + 205.08831787109375 + ], + "out": [ + 318.0, + 234.91168212890625 + ], + "kind": "Smooth" + }, + { + "p": [ + 291.0, + 247.0 + ], + "in": [ + 305.91168212890625, + 247.0 + ], + "out": [ + 276.08831787109375, + 247.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 264.0, + 220.0 + ], + "in": [ + 264.0, + 234.91168212890625 + ], + "out": [ + 264.0, + 205.08831787109375 + ], + "kind": "Smooth" + }, + { + "p": [ + 291.0, + 193.0 + ], + "in": [ + 276.08831787109375, + 193.0 + ], + "out": [ + 305.91168212890625, + 193.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 21, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "width": 4.000000023471502, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 341.0679281949997, + 199.77124813199043 + ], + "in": [ + 338.58525647077386, + 193.62641967934178 + ], + "out": [ + 343.55059991922553, + 205.9160765846391 + ], + "kind": "Smooth" + }, + { + "p": [ + 295.4952783584595, + 231.12620982527733 + ], + "in": [ + 323.14702054308145, + 219.95418135021828 + ], + "out": [ + 267.8435361738375, + 242.29823830033638 + ], + "kind": "Smooth" + }, + { + "p": [ + 240.9320706129074, + 240.22875872254372 + ], + "in": [ + 243.41474233713325, + 246.37358717519237 + ], + "out": [ + 238.44939888868157, + 234.08393026989506 + ], + "kind": "Smooth" + }, + { + "p": [ + 286.50472044944763, + 208.87379702925682 + ], + "in": [ + 258.85297826482565, + 220.04582550431587 + ], + "out": [ + 314.1564626340696, + 197.70176855419777 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 22, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 432.0, + 280.0 + ], + "runs": [ + { + "text": "Orb", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 147.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + }, + { + "text": "Office", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Medium", + "size": 147.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 23, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 438.0, + 334.0 + ], + "runs": [ + { + "text": "Your own drive-in cinema", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 28.0, + "tracking": 71.42857142857143, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 24, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 982.0, + 223.0 + ], + "runs": [ + { + "text": "ADMIT", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 31.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 25, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 994.0, + 275.0 + ], + "runs": [ + { + "text": "01", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 53.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9607843, + "g": 0.9137255, + "b": 0.8039216 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 26, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 970.0, + 316.0 + ], + "runs": [ + { + "text": "FRONT ROW", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 14.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.6666667, + "b": 0.32941177 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 27 + }, + "images": {} +} \ No newline at end of file diff --git a/design/orboffice.figcraft b/design/orboffice.figcraft new file mode 100644 index 0000000..dd2816a Binary files /dev/null and b/design/orboffice.figcraft differ diff --git a/design/orboffice.png b/design/orboffice.png new file mode 100644 index 0000000..a9c0d32 Binary files /dev/null and b/design/orboffice.png differ diff --git a/design/orboffice.svg b/design/orboffice.svg new file mode 100644 index 0000000..bfd8322 --- /dev/null +++ b/design/orboffice.svg @@ -0,0 +1,72 @@ + + + +orbit +/ Classic +Saturday 31 October +21:30 + +1 Menu + +2 TV Guide + +3 Box Office +OrbOffice +Your front-row seat. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +OrbOffice +Orbit premieres +The Last +Shuttle Home +Tonight at 21:30 +One universe. Best seat in the house. + +Admit one +orbit +Front row +01 +Seat +ORB-001 +Preview +Preview ticket • Fictional event • Included in your collection +Special transmissions + +Orbit premieres + +After dark +One final journey brings an unlikely +crew together. A fictional premiere +for your own front-row seat. +Event playback comes with the +Emby connection. + +Return to TV Guide +Arrows Browse OK Select Back Return to guide + \ No newline at end of file diff --git a/design/orboffice.vectorcraft b/design/orboffice.vectorcraft new file mode 100644 index 0000000..c30c1cd --- /dev/null +++ b/design/orboffice.vectorcraft @@ -0,0 +1,6054 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.19.0", + "document": { + "version": 1, + "title": "orboffice.svg", + "units": "Pixels", + "rulers": "artboard", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 1920.0, + "y1": 1080.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 2, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 0.0, + 0.0 + ] + }, + { + "p": [ + 1920.0, + 0.0 + ] + }, + { + "p": [ + 1920.0, + 1080.0 + ] + }, + { + "p": [ + 0.0, + 1080.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 3, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.87058824, + "b": 0.34901962 + } + }, + "width": 7.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 138.0, + 87.0 + ], + "in": [ + 138.0, + 69.32688903808594 + ], + "out": [ + 138.0, + 104.67311096191406 + ], + "kind": "Smooth" + }, + { + "p": [ + 106.0, + 119.0 + ], + "in": [ + 123.67311096191406, + 119.0 + ], + "out": [ + 88.32688903808594, + 119.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 74.0, + 87.0 + ], + "in": [ + 74.0, + 104.67311096191406 + ], + "out": [ + 74.0, + 69.32688903808594 + ], + "kind": "Smooth" + }, + { + "p": [ + 106.0, + 55.0 + ], + "in": [ + 88.32688903808594, + 55.0 + ], + "out": [ + 123.67311096191406, + 55.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 4, + "appearance": { + "items": [ + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "width": 4.000000120658624, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 152.22170233726501, + 65.44646883010864 + ], + "in": [ + 148.95402336848474, + 58.43890857533279 + ], + "out": [ + 155.4893813060453, + 72.4540290848845 + ], + "kind": "Smooth" + }, + { + "p": [ + 111.91665947437286, + 99.6883100271225 + ], + "in": [ + 137.44419595739782, + 87.78462442791533 + ], + "out": [ + 86.3891229913479, + 111.59199562632966 + ], + "kind": "Smooth" + }, + { + "p": [ + 59.77830505371094, + 108.55353236198425 + ], + "in": [ + 63.04598402249121, + 115.5610926167601 + ], + "out": [ + 56.510626084930664, + 101.5459721072084 + ], + "kind": "Smooth" + }, + { + "p": [ + 100.08334791660309, + 74.3116911649704 + ], + "in": [ + 74.55581143357813, + 86.21537676417756 + ], + "out": [ + 125.61088439962805, + 62.40800556576323 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 5, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 175.0, + 108.0 + ], + "runs": [ + { + "text": "orbit", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 68.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 6, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 360.0, + 103.0 + ], + "runs": [ + { + "text": "/ Classic", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 34.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 7, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1440.0, + 101.0 + ], + "runs": [ + { + "text": "Saturday 31 October", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 26.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 8, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1770.0, + 101.0 + ], + "runs": [ + { + "text": "21:30", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 28.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.87058824, + "b": 0.34901962 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 9, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.07058824, + "g": 0.20784314, + "b": 0.41960785 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.21960784, + "g": 0.38431373, + "b": 0.6039216 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 64.0, + 150.0 + ] + }, + { + "p": [ + 404.0, + 150.0 + ] + }, + { + "p": [ + 404.0, + 214.0 + ] + }, + { + "p": [ + 64.0, + 214.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 10, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 88.0, + 192.0 + ], + "runs": [ + { + "text": "1 Menu", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 29.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 11, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.07058824, + "g": 0.20784314, + "b": 0.41960785 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.21960784, + "g": 0.38431373, + "b": 0.6039216 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 412.0, + 150.0 + ] + }, + { + "p": [ + 752.0, + 150.0 + ] + }, + { + "p": [ + 752.0, + 214.0 + ] + }, + { + "p": [ + 412.0, + 214.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 12, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 436.0, + 192.0 + ], + "runs": [ + { + "text": "2 TV Guide", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 29.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 13, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.09803922, + "g": 0.29803923, + "b": 0.5686275 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.21960784, + "g": 0.38431373, + "b": 0.6039216 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 760.0, + 150.0 + ] + }, + { + "p": [ + 1100.0, + 150.0 + ] + }, + { + "p": [ + 1100.0, + 214.0 + ] + }, + { + "p": [ + 760.0, + 214.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 14, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 784.0, + 192.0 + ], + "runs": [ + { + "text": "3 Box Office", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 29.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 15, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 64.0, + 296.0 + ], + "runs": [ + { + "text": "OrbOffice", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 68.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.87058824, + "b": 0.34901962 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 16, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 370.0, + 288.0 + ], + "runs": [ + { + "text": "Your front-row seat.", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 32.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 17, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.91764706, + "b": 0.78431374 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 64.0, + 340.0 + ] + }, + { + "p": [ + 1134.0, + 340.0 + ] + }, + { + "p": [ + 1134.0, + 930.0 + ] + }, + { + "p": [ + 64.0, + 930.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 18, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "width": 2.0, + "miter_limit": 4.0, + "dash": { + "pattern": [ + 10.0, + 10.0 + ], + "offset": 0.0, + "align_corners": false + }, + "opacity": 0.5 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 877.2000122070312, + 340.0 + ] + }, + { + "p": [ + 877.2000122070312, + 930.0 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 19, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 364.5833435058594 + ], + "in": [ + 74.0, + 359.06048583984375 + ], + "out": [ + 74.0, + 370.106201171875 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 374.5833435058594 + ], + "in": [ + 69.5228500366211, + 374.5833435058594 + ], + "out": [ + 58.47715377807617, + 374.5833435058594 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 364.5833435058594 + ], + "in": [ + 54.0, + 370.106201171875 + ], + "out": [ + 54.0, + 359.06048583984375 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 354.5833435058594 + ], + "in": [ + 58.47715377807617, + 354.5833435058594 + ], + "out": [ + 69.5228500366211, + 354.5833435058594 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 20, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 364.5833435058594 + ], + "in": [ + 1144.0, + 359.06048583984375 + ], + "out": [ + 1144.0, + 370.106201171875 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 374.5833435058594 + ], + "in": [ + 1139.5228271484375, + 374.5833435058594 + ], + "out": [ + 1128.4771728515625, + 374.5833435058594 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 364.5833435058594 + ], + "in": [ + 1124.0, + 370.106201171875 + ], + "out": [ + 1124.0, + 359.06048583984375 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 354.5833435058594 + ], + "in": [ + 1128.4771728515625, + 354.5833435058594 + ], + "out": [ + 1139.5228271484375, + 354.5833435058594 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 21, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 413.75 + ], + "in": [ + 74.0, + 408.2271423339844 + ], + "out": [ + 74.0, + 419.2728576660156 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 423.75 + ], + "in": [ + 69.5228500366211, + 423.75 + ], + "out": [ + 58.47715377807617, + 423.75 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 413.75 + ], + "in": [ + 54.0, + 419.2728576660156 + ], + "out": [ + 54.0, + 408.2271423339844 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 403.75 + ], + "in": [ + 58.47715377807617, + 403.75 + ], + "out": [ + 69.5228500366211, + 403.75 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 22, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 413.75 + ], + "in": [ + 1144.0, + 408.2271423339844 + ], + "out": [ + 1144.0, + 419.2728576660156 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 423.75 + ], + "in": [ + 1139.5228271484375, + 423.75 + ], + "out": [ + 1128.4771728515625, + 423.75 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 413.75 + ], + "in": [ + 1124.0, + 419.2728576660156 + ], + "out": [ + 1124.0, + 408.2271423339844 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 403.75 + ], + "in": [ + 1128.4771728515625, + 403.75 + ], + "out": [ + 1139.5228271484375, + 403.75 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 23, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 462.9166564941406 + ], + "in": [ + 74.0, + 457.393798828125 + ], + "out": [ + 74.0, + 468.43951416015625 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 472.9166564941406 + ], + "in": [ + 69.5228500366211, + 472.9166564941406 + ], + "out": [ + 58.47715377807617, + 472.9166564941406 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 462.9166564941406 + ], + "in": [ + 54.0, + 468.43951416015625 + ], + "out": [ + 54.0, + 457.393798828125 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 452.9166564941406 + ], + "in": [ + 58.47715377807617, + 452.9166564941406 + ], + "out": [ + 69.5228500366211, + 452.9166564941406 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 24, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 462.9166564941406 + ], + "in": [ + 1144.0, + 457.393798828125 + ], + "out": [ + 1144.0, + 468.43951416015625 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 472.9166564941406 + ], + "in": [ + 1139.5228271484375, + 472.9166564941406 + ], + "out": [ + 1128.4771728515625, + 472.9166564941406 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 462.9166564941406 + ], + "in": [ + 1124.0, + 468.43951416015625 + ], + "out": [ + 1124.0, + 457.393798828125 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 452.9166564941406 + ], + "in": [ + 1128.4771728515625, + 452.9166564941406 + ], + "out": [ + 1139.5228271484375, + 452.9166564941406 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 25, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 512.0833129882812 + ], + "in": [ + 74.0, + 506.5604553222656 + ], + "out": [ + 74.0, + 517.6061401367188 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 522.0833129882812 + ], + "in": [ + 69.5228500366211, + 522.0833129882812 + ], + "out": [ + 58.47715377807617, + 522.0833129882812 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 512.0833129882812 + ], + "in": [ + 54.0, + 517.6061401367188 + ], + "out": [ + 54.0, + 506.5604553222656 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 502.08331298828125 + ], + "in": [ + 58.47715377807617, + 502.08331298828125 + ], + "out": [ + 69.5228500366211, + 502.08331298828125 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 26, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 512.0833129882812 + ], + "in": [ + 1144.0, + 506.5604553222656 + ], + "out": [ + 1144.0, + 517.6061401367188 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 522.0833129882812 + ], + "in": [ + 1139.5228271484375, + 522.0833129882812 + ], + "out": [ + 1128.4771728515625, + 522.0833129882812 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 512.0833129882812 + ], + "in": [ + 1124.0, + 517.6061401367188 + ], + "out": [ + 1124.0, + 506.5604553222656 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 502.08331298828125 + ], + "in": [ + 1128.4771728515625, + 502.08331298828125 + ], + "out": [ + 1139.5228271484375, + 502.08331298828125 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 27, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 561.25 + ], + "in": [ + 74.0, + 555.7271728515625 + ], + "out": [ + 74.0, + 566.7728271484375 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 571.25 + ], + "in": [ + 69.5228500366211, + 571.25 + ], + "out": [ + 58.47715377807617, + 571.25 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 561.25 + ], + "in": [ + 54.0, + 566.7728271484375 + ], + "out": [ + 54.0, + 555.7271728515625 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 551.25 + ], + "in": [ + 58.47715377807617, + 551.25 + ], + "out": [ + 69.5228500366211, + 551.25 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 28, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 561.25 + ], + "in": [ + 1144.0, + 555.7271728515625 + ], + "out": [ + 1144.0, + 566.7728271484375 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 571.25 + ], + "in": [ + 1139.5228271484375, + 571.25 + ], + "out": [ + 1128.4771728515625, + 571.25 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 561.25 + ], + "in": [ + 1124.0, + 566.7728271484375 + ], + "out": [ + 1124.0, + 555.7271728515625 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 551.25 + ], + "in": [ + 1128.4771728515625, + 551.25 + ], + "out": [ + 1139.5228271484375, + 551.25 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 29, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 610.4166870117188 + ], + "in": [ + 74.0, + 604.8938598632812 + ], + "out": [ + 74.0, + 615.9395141601562 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 620.4166870117188 + ], + "in": [ + 69.5228500366211, + 620.4166870117188 + ], + "out": [ + 58.47715377807617, + 620.4166870117188 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 610.4166870117188 + ], + "in": [ + 54.0, + 615.9395141601562 + ], + "out": [ + 54.0, + 604.8938598632812 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 600.4166870117188 + ], + "in": [ + 58.47715377807617, + 600.4166870117188 + ], + "out": [ + 69.5228500366211, + 600.4166870117188 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 30, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 610.4166870117188 + ], + "in": [ + 1144.0, + 604.8938598632812 + ], + "out": [ + 1144.0, + 615.9395141601562 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 620.4166870117188 + ], + "in": [ + 1139.5228271484375, + 620.4166870117188 + ], + "out": [ + 1128.4771728515625, + 620.4166870117188 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 610.4166870117188 + ], + "in": [ + 1124.0, + 615.9395141601562 + ], + "out": [ + 1124.0, + 604.8938598632812 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 600.4166870117188 + ], + "in": [ + 1128.4771728515625, + 600.4166870117188 + ], + "out": [ + 1139.5228271484375, + 600.4166870117188 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 31, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 659.5833129882812 + ], + "in": [ + 74.0, + 654.0604858398438 + ], + "out": [ + 74.0, + 665.1061401367188 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 669.5833129882812 + ], + "in": [ + 69.5228500366211, + 669.5833129882812 + ], + "out": [ + 58.47715377807617, + 669.5833129882812 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 659.5833129882812 + ], + "in": [ + 54.0, + 665.1061401367188 + ], + "out": [ + 54.0, + 654.0604858398438 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 649.5833129882812 + ], + "in": [ + 58.47715377807617, + 649.5833129882812 + ], + "out": [ + 69.5228500366211, + 649.5833129882812 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 32, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 659.5833129882812 + ], + "in": [ + 1144.0, + 654.0604858398438 + ], + "out": [ + 1144.0, + 665.1061401367188 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 669.5833129882812 + ], + "in": [ + 1139.5228271484375, + 669.5833129882812 + ], + "out": [ + 1128.4771728515625, + 669.5833129882812 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 659.5833129882812 + ], + "in": [ + 1124.0, + 665.1061401367188 + ], + "out": [ + 1124.0, + 654.0604858398438 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 649.5833129882812 + ], + "in": [ + 1128.4771728515625, + 649.5833129882812 + ], + "out": [ + 1139.5228271484375, + 649.5833129882812 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 33, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 708.75 + ], + "in": [ + 74.0, + 703.2271728515625 + ], + "out": [ + 74.0, + 714.2728271484375 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 718.75 + ], + "in": [ + 69.5228500366211, + 718.75 + ], + "out": [ + 58.47715377807617, + 718.75 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 708.75 + ], + "in": [ + 54.0, + 714.2728271484375 + ], + "out": [ + 54.0, + 703.2271728515625 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 698.75 + ], + "in": [ + 58.47715377807617, + 698.75 + ], + "out": [ + 69.5228500366211, + 698.75 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 34, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 708.75 + ], + "in": [ + 1144.0, + 703.2271728515625 + ], + "out": [ + 1144.0, + 714.2728271484375 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 718.75 + ], + "in": [ + 1139.5228271484375, + 718.75 + ], + "out": [ + 1128.4771728515625, + 718.75 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 708.75 + ], + "in": [ + 1124.0, + 714.2728271484375 + ], + "out": [ + 1124.0, + 703.2271728515625 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 698.75 + ], + "in": [ + 1128.4771728515625, + 698.75 + ], + "out": [ + 1139.5228271484375, + 698.75 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 35, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 757.9166870117188 + ], + "in": [ + 74.0, + 752.3938598632812 + ], + "out": [ + 74.0, + 763.4395141601562 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 767.9166870117188 + ], + "in": [ + 69.5228500366211, + 767.9166870117188 + ], + "out": [ + 58.47715377807617, + 767.9166870117188 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 757.9166870117188 + ], + "in": [ + 54.0, + 763.4395141601562 + ], + "out": [ + 54.0, + 752.3938598632812 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 747.9166870117188 + ], + "in": [ + 58.47715377807617, + 747.9166870117188 + ], + "out": [ + 69.5228500366211, + 747.9166870117188 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 36, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 757.9166870117188 + ], + "in": [ + 1144.0, + 752.3938598632812 + ], + "out": [ + 1144.0, + 763.4395141601562 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 767.9166870117188 + ], + "in": [ + 1139.5228271484375, + 767.9166870117188 + ], + "out": [ + 1128.4771728515625, + 767.9166870117188 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 757.9166870117188 + ], + "in": [ + 1124.0, + 763.4395141601562 + ], + "out": [ + 1124.0, + 752.3938598632812 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 747.9166870117188 + ], + "in": [ + 1128.4771728515625, + 747.9166870117188 + ], + "out": [ + 1139.5228271484375, + 747.9166870117188 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 37, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 807.0833129882812 + ], + "in": [ + 74.0, + 801.5604858398438 + ], + "out": [ + 74.0, + 812.6061401367188 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 817.0833129882812 + ], + "in": [ + 69.5228500366211, + 817.0833129882812 + ], + "out": [ + 58.47715377807617, + 817.0833129882812 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 807.0833129882812 + ], + "in": [ + 54.0, + 812.6061401367188 + ], + "out": [ + 54.0, + 801.5604858398438 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 797.0833129882812 + ], + "in": [ + 58.47715377807617, + 797.0833129882812 + ], + "out": [ + 69.5228500366211, + 797.0833129882812 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 38, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 807.0833129882812 + ], + "in": [ + 1144.0, + 801.5604858398438 + ], + "out": [ + 1144.0, + 812.6061401367188 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 817.0833129882812 + ], + "in": [ + 1139.5228271484375, + 817.0833129882812 + ], + "out": [ + 1128.4771728515625, + 817.0833129882812 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 807.0833129882812 + ], + "in": [ + 1124.0, + 812.6061401367188 + ], + "out": [ + 1124.0, + 801.5604858398438 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 797.0833129882812 + ], + "in": [ + 1128.4771728515625, + 797.0833129882812 + ], + "out": [ + 1139.5228271484375, + 797.0833129882812 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 39, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 856.25 + ], + "in": [ + 74.0, + 850.7271728515625 + ], + "out": [ + 74.0, + 861.7728271484375 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 866.25 + ], + "in": [ + 69.5228500366211, + 866.25 + ], + "out": [ + 58.47715377807617, + 866.25 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 856.25 + ], + "in": [ + 54.0, + 861.7728271484375 + ], + "out": [ + 54.0, + 850.7271728515625 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 846.25 + ], + "in": [ + 58.47715377807617, + 846.25 + ], + "out": [ + 69.5228500366211, + 846.25 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 40, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 856.25 + ], + "in": [ + 1144.0, + 850.7271728515625 + ], + "out": [ + 1144.0, + 861.7728271484375 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 866.25 + ], + "in": [ + 1139.5228271484375, + 866.25 + ], + "out": [ + 1128.4771728515625, + 866.25 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 856.25 + ], + "in": [ + 1124.0, + 861.7728271484375 + ], + "out": [ + 1124.0, + 850.7271728515625 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 846.25 + ], + "in": [ + 1128.4771728515625, + 846.25 + ], + "out": [ + 1139.5228271484375, + 846.25 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 41, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 74.0, + 905.4166870117188 + ], + "in": [ + 74.0, + 899.8938598632812 + ], + "out": [ + 74.0, + 910.9395141601562 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 915.4166870117188 + ], + "in": [ + 69.5228500366211, + 915.4166870117188 + ], + "out": [ + 58.47715377807617, + 915.4166870117188 + ], + "kind": "Smooth" + }, + { + "p": [ + 54.0, + 905.4166870117188 + ], + "in": [ + 54.0, + 910.9395141601562 + ], + "out": [ + 54.0, + 899.8938598632812 + ], + "kind": "Smooth" + }, + { + "p": [ + 64.0, + 895.4166870117188 + ], + "in": [ + 58.47715377807617, + 895.4166870117188 + ], + "out": [ + 69.5228500366211, + 895.4166870117188 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 42, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1144.0, + 905.4166870117188 + ], + "in": [ + 1144.0, + 899.8938598632812 + ], + "out": [ + 1144.0, + 910.9395141601562 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 915.4166870117188 + ], + "in": [ + 1139.5228271484375, + 915.4166870117188 + ], + "out": [ + 1128.4771728515625, + 915.4166870117188 + ], + "kind": "Smooth" + }, + { + "p": [ + 1124.0, + 905.4166870117188 + ], + "in": [ + 1124.0, + 910.9395141601562 + ], + "out": [ + 1124.0, + 899.8938598632812 + ], + "kind": "Smooth" + }, + { + "p": [ + 1134.0, + 895.4166870117188 + ], + "in": [ + 1128.4771728515625, + 895.4166870117188 + ], + "out": [ + 1139.5228271484375, + 895.4166870117188 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 43, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 895.2000122070312, + 340.0 + ], + "in": [ + 895.2000122070312, + 330.0588684082031 + ], + "out": [ + 895.2000122070312, + 349.9411315917969 + ], + "kind": "Smooth" + }, + { + "p": [ + 877.2000122070312, + 358.0 + ], + "in": [ + 887.14111328125, + 358.0 + ], + "out": [ + 867.2589111328125, + 358.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 859.2000122070312, + 340.0 + ], + "in": [ + 859.2000122070312, + 349.9411315917969 + ], + "out": [ + 859.2000122070312, + 330.0588684082031 + ], + "kind": "Smooth" + }, + { + "p": [ + 877.2000122070312, + 322.0 + ], + "in": [ + 867.2589111328125, + 322.0 + ], + "out": [ + 887.14111328125, + 322.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 44, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 895.2000122070312, + 930.0 + ], + "in": [ + 895.2000122070312, + 920.0588989257812 + ], + "out": [ + 895.2000122070312, + 939.9411010742188 + ], + "kind": "Smooth" + }, + { + "p": [ + 877.2000122070312, + 948.0 + ], + "in": [ + 887.14111328125, + 948.0 + ], + "out": [ + 867.2589111328125, + 948.0 + ], + "kind": "Smooth" + }, + { + "p": [ + 859.2000122070312, + 930.0 + ], + "in": [ + 859.2000122070312, + 939.9411010742188 + ], + "out": [ + 859.2000122070312, + 920.0588989257812 + ], + "kind": "Smooth" + }, + { + "p": [ + 877.2000122070312, + 912.0 + ], + "in": [ + 867.2589111328125, + 912.0 + ], + "out": [ + 887.14111328125, + 912.0 + ], + "kind": "Smooth" + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 45, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 110.0, + 408.0 + ], + "runs": [ + { + "text": "OrbOffice", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 48.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 46, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 110.0, + 450.0 + ], + "runs": [ + { + "text": "Orbit premieres", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 26.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 47, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 110.0, + 550.0 + ], + "runs": [ + { + "text": "The Last", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 72.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 48, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 110.0, + 629.0 + ], + "runs": [ + { + "text": "Shuttle Home", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 72.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 49, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 110.0, + 745.0 + ], + "runs": [ + { + "text": "Tonight at 21:30", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 36.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 50, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 110.0, + 787.0 + ], + "runs": [ + { + "text": "One universe. Best seat in the house.", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 27.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 51, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.87058824, + "b": 0.34901962 + } + } + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 110.0, + 824.0 + ] + }, + { + "p": [ + 346.0, + 824.0 + ] + }, + { + "p": [ + 346.0, + 890.0 + ] + }, + { + "p": [ + 110.0, + 890.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 52, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 137.0, + 870.0 + ], + "runs": [ + { + "text": "Admit one", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 39.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 53, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 937.2, + 420.0 + ], + "runs": [ + { + "text": "orbit", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 42.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 54, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 927.2, + 465.0 + ], + "runs": [ + { + "text": "Front row", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 32.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 55, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 954.2, + 658.0 + ], + "runs": [ + { + "text": "01", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 105.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 56, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 961.2, + 700.0 + ], + "runs": [ + { + "text": "Seat", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 25.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 57, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 943.2, + 845.0 + ], + "runs": [ + { + "text": "ORB-001", + "style": { + "font_family": "Barlow Condensed", + "font_style": "Regular", + "size": 30.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 58, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 952.2, + 883.0 + ], + "runs": [ + { + "text": "Preview", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 23.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 59, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 64.0, + 976.0 + ], + "runs": [ + { + "text": "Preview ticket • Fictional event • Included in your collection", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 26.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 60, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1210.0, + 320.0 + ], + "runs": [ + { + "text": "Special transmissions", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 40.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 61, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.87058824, + "b": 0.34901962 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1210.0, + 356.0 + ] + }, + { + "p": [ + 1856.0, + 356.0 + ] + }, + { + "p": [ + 1856.0, + 433.0 + ] + }, + { + "p": [ + 1210.0, + 433.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 62, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1238.0, + 407.0 + ], + "runs": [ + { + "text": "Orbit premieres", + "style": { + "font_family": "Barlow", + "font_style": "SemiBold", + "size": 32.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.02745098, + "g": 0.08627451, + "b": 0.19607843 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 63, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.07058824, + "g": 0.20784314, + "b": 0.41960785 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.21960784, + "g": 0.38431373, + "b": 0.6039216 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1210.0, + 445.0 + ] + }, + { + "p": [ + 1856.0, + 445.0 + ] + }, + { + "p": [ + 1856.0, + 522.0 + ] + }, + { + "p": [ + 1210.0, + 522.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 64, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1238.0, + 496.0 + ], + "runs": [ + { + "text": "After dark", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 32.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 65, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1210.0, + 590.0 + ], + "runs": [ + { + "text": "One final journey brings an unlikely", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 32.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 66, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1210.0, + 634.0 + ], + "runs": [ + { + "text": "crew together. A fictional premiere", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 32.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 67, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1210.0, + 678.0 + ], + "runs": [ + { + "text": "for your own front-row seat.", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 32.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 68, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1210.0, + 800.0 + ], + "runs": [ + { + "text": "Event playback comes with the", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 28.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 69, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1210.0, + 838.0 + ], + "runs": [ + { + "text": "Emby connection.", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 28.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 70, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.07058824, + "g": 0.20784314, + "b": 0.41960785 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.21960784, + "g": 0.38431373, + "b": 0.6039216 + } + }, + "width": 2.0, + "miter_limit": 4.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 1210.0, + 874.0 + ] + }, + { + "p": [ + 1856.0, + 874.0 + ] + }, + { + "p": [ + 1856.0, + 940.0 + ] + }, + { + "p": [ + 1210.0, + 940.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 71, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1240.0, + 918.0 + ], + "runs": [ + { + "text": "Return to TV Guide", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 29.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + }, + { + "id": 72, + "kind": { + "type": "text", + "kind": { + "kind": "point" + }, + "xf": [ + 1.0, + 0.0, + 0.0, + 1.0, + 64.0, + 1030.0 + ], + "runs": [ + { + "text": "Arrows Browse OK Select Back Return to guide", + "style": { + "font_family": "Barlow", + "font_style": "Regular", + "size": 25.0, + "tracking": 0.0, + "baseline_shift": 0.0, + "h_scale": 100.0, + "v_scale": 100.0, + "rotation": 0.0, + "fill": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7176471, + "g": 0.79607844, + "b": 0.9098039 + } + }, + "stroke": { + "type": "none" + }, + "stroke_width": 0.0, + "underline": false, + "strikethrough": false, + "all_caps": false + } + } + ], + "para": { + "justify": "Left", + "left_indent": 0.0, + "right_indent": 0.0, + "first_line_indent": 0.0, + "space_before": 0.0, + "space_after": 0.0, + "hyphenate": false + } + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 73 + }, + "images": {} +} \ No newline at end of file diff --git a/design/render-designs.sh b/design/render-designs.sh new file mode 100755 index 0000000..80068dd --- /dev/null +++ b/design/render-designs.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail +ORBIT_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ORBIT_ROOT" +mkdir -p .tooling/font-data/fonts +cp design/fonts/*.ttf .tooling/font-data/fonts/ +export XDG_DATA_HOME="$ORBIT_ROOT/.tooling/font-data" +python3 design/create-design.py +python3 design/create-orboffice.py +for ORBIT_DESIGN in orbit-classic-guide orbit-menu orboffice; do + figcraft-cli convert "design/$ORBIT_DESIGN.svg" "design/$ORBIT_DESIGN.figcraft" --automation-read-root design --automation-write-root design + figcraft-cli export "design/$ORBIT_DESIGN.figcraft" --out "design/$ORBIT_DESIGN.png" --automation-read-root design --automation-write-root design +done diff --git a/docs/classic-programme-strip.md b/docs/classic-programme-strip.md new file mode 100644 index 0000000..4430a21 --- /dev/null +++ b/docs/classic-programme-strip.md @@ -0,0 +1,37 @@ +# Classic programme strip — 0.5.0 + +Paul reports that 0.4.0 loaded the sample and played provider media on the Xiaomi box. +He requested removal of the persistent top banner and an original bottom programme strip +in the existing Orbit colours, inspired by his supplied historic TV-guide reference. +He explicitly approved visual-only functionality for the bottom icon row at this stage. + +## Presentation + +- A pale header with Orbit Preview and the current device-local time/date. +- Blue NOW/PAUSED and INFO rows, with the selected title, media type and duration. +- A plain footer with channel up/down arrows, a back/guide icon and CC/subtitles. +- No coloured remote-key shortcut boxes and no codec/container diagnostics in the overlay. +- Five-second auto-hide during active playback; paused/buffering states keep the strip visible. +- OK reveals the strip. When it is already visible, OK toggles play/pause. +- Left/right and media rewind/fast-forward seek ten seconds; up/down reveal the strip. +- Physical Back keeps the existing return-to-sample behaviour. + +The icon legend is a visual prototype: channel switching, its guide action and the subtitle +selector are not wired up in this pass. The stock Media3 controller is hidden so it does not +compete with the requested design; the new legend does not claim to implement those actions. +The standard subtitle/audio settings UI from 0.4.0 is therefore not shown in this visual revision. +No media/session/authentication behaviour beyond the controller presentation is changed. + +## Logo + +Remove the cream/white outer CRT cabinet outline and pale feet. Retain the dark cabinet, +curved gold screen, small grille/controls, gold Orb, white Office and tightened stub spacing. +The edited logo remains separate artwork; the app's Box Office page has not been redesigned. + +## Verification + +Run Android build, existing 31 unit tests and lint. Render and inspect FigCraft mockups and +logo artwork. This UI-only increment does not add implementation-mirroring tests. +On hardware, check that the native view receives the remote keys, the strip disappears after +five seconds, OK restores it, the text is readable, and Back still returns to the sample. +PNG previews are design mockups with original abstract artwork, not provider screenshots. diff --git a/docs/emby-connection-check.md b/docs/emby-connection-check.md new file mode 100644 index 0000000..4ebd9b9 --- /dev/null +++ b/docs/emby-connection-check.md @@ -0,0 +1,58 @@ +# Emby connection check — 0.3.0 + +## Approved scope + +Paul approved a Connect Emby entry in the main menu for now. A designed first-launch +connection flow can follow later. Authenticate to his selected provider and read one +small metadata page, with no full scan or media playback in this increment. + +## Request contract + +Fixed HTTPS origin: https://bk2.appboxmanager.xyz, API prefix /emby. + +1. POST /Users/AuthenticateByName with Username and Pw in JSON and the Emby client header. +2. GET /Users/{authenticated-user-id}/Items with Recursive=true, IncludeItemTypes=Movie,Episode, + StartIndex=0, Limit=20, SortBy=SortName, Fields=MediaStreams, images and user-data disabled. +3. POST /Sessions/Logout with the temporary token, including when the metadata request fails. + +The HTTP transport follows no redirects and uses standard TLS certificate verification. +The token is sent in X-Emby-Token, not a URL. Each response is capped at 2 MiB; +connection timeout is 10 seconds, read timeout 15 seconds (5 seconds for logout). +These are I/O timeouts, not an overall operation deadline. No automatic retries. +A per-screen 15-second cooldown prevents rapid repeat submissions; provider rate limits still apply. + +## Trust boundaries and retention + +- Username/password are entered directly in the TV app. No tool or assistant receives them. +- The provider supplies tokens, user IDs and metadata. Check token type/header characters, + validate IDs before building paths, bound fields and sample count, render metadata as plain text. +- The password uses BasicSecureTextField with always-hidden text and no saveable state. +- The connection screen sets FLAG_SECURE and uses LocalActivity. Sample metadata is private too. +- On submit, remove the password from the field. On background or exit, clear password/sample + state and cancel the UI operation. Blocking HTTP can finish within its I/O timeouts and + still attempts logout; cancellation does not guarantee instantaneous socket shutdown. +- Password and token are not written to preferences, files, logs, URLs, saved state or the APK. + JVM strings are garbage-collected; no claim of guaranteed memory zeroisation is made. +- The temporary token never appears in the returned sample DTO. Explicit sign-out revokes it + when the provider accepts logout; otherwise the UI reports that sign-out was not confirmed. +- No artwork, media, credentials or real provider response bodies are collected by development tests. + +## Evidence and limits + +Only public server identification was checked without authentication. The endpoint reported +version 4.9.1.23. Live account authentication and sample access remain for Paul's TV test. +Tests use fake credentials and an injected scripted transport; they make no network requests. +The connection check does not connect the guide to Emby or persist an imported library. + +## Primary references + +- https://dev.emby.media/doc/restapi/User-Authentication.html +- https://dev.emby.media/reference/RestAPI/UserService/postUsersAuthenticatebyname.html +- https://dev.emby.media/reference/RestAPI/ItemsService/getItems.html +- https://developer.android.com/develop/ui/compose/text/user-input + +## Later + +Encrypted persistent sessions, an initial setup flow, scalable indexing and real playback +need their own reviewed increment after this check succeeds. Profile icons, names, Kids +restrictions and a four-digit adult PIN are recorded in profiles-roadmap.md. diff --git a/docs/emby-playback-test.md b/docs/emby-playback-test.md new file mode 100644 index 0000000..8ec23a7 --- /dev/null +++ b/docs/emby-playback-test.md @@ -0,0 +1,57 @@ +# Emby playback test — 0.4.0 + +## Approved scope and prior evidence + +Paul confirmed 0.3.0 returned 20 records on his Xiaomi box, then approved a small-sample playback +check. This revision keeps one 20-record page and makes those items selectable. No full scan, +scheduled real channel, stored credentials, profiles or automatic first-launch setup is included. + +## Session ownership + +The sample screen holds its token only in memory until the user leaves or backgrounds the app. +A sign-in that completes after the screen exits is rejected by a generation ticket and closed. +Leaving attempts temporary-session logout on a cleanup executor. Android process termination +can prevent cleanup, so immediate server-side revocation cannot be guaranteed after a process kill. +Neither token nor password is written to files, saved state or logs. The connection screen and +fullscreen playback dialog are protected with FLAG_SECURE. The password field is cleared on submit. + +## Playback + +- Only IDs from the current sample can be selected. +- POST /Items/{Id}/PlaybackInfo negotiates a direct source with EnableTranscoding=false and + AutoOpenLiveStream=false. The first eligible source must not require opening/closing live resources. +- Test containers: mp4, mkv, mov, m4v, webm, ts/mpegts. Actual video/audio decoder support is + determined on hardware; this test does not promise every codec/profile in these containers works. +- Static /Videos/{Id}/stream.{container} uses source and playback session IDs. The Emby token is + an origin-scoped HTTP header rather than a URL query parameter. +- A custom Media3 data source follows at most five HTTPS redirects. It re-evaluates credentials + at every hop, dropping provider credentials for another host or port. Default certificate checks + remain enabled; cleartext delivery, URL user-info and token-bearing external URLs are rejected. +- DNS results are checked for local/private/shared address ranges before each request. This is + not a guarantee against DNS rebinding: HttpsURLConnection resolves the hostname again internally. +- Range requests support seeking. A server that ignores a non-zero byte range is rejected rather + than downloading the skipped portion. A partial response must begin at the requested offset. +- Embedded subtitles and provider-delivered external SRT/WebVTT tracks are exposed to Media3. + Other external subtitle formats, burn-in, HLS/transcoding and live-source opening are not added. +- One selected title plays at a time. The PlayerView exposes pause/resume, ten-second seeks, + audio settings and subtitles where available. Back closes fullscreen and returns to the same sample list. Backgrounding stops the player directly, + before relying on Compose disposal, and ends the temporary session. +- Normal Emby playback start/progress/stop reports are sent. They can update the provider's + playback history, as normal viewing does. Reports are best effort; no raw responses are logged. +- No playback-progress/session report is sent by development tests to the real provider. +- The previous demo guide/player bar is preserved independently of this on-demand test player. + +## On-TV acceptance check + +After approval to install: open Menu → Connect Emby, enter credentials on the TV, Check 20 items. +Select a title with OK. Confirm picture and sound; pause/resume; seek forward and backward; +select subtitles/audio if tracks exist. Back should return to the same sample without signing in. +Try a second title. Leaving the connection screen ends the temporary login. Report only whether +these checks worked and any fixed error code; do not share credentials, media URLs or screenshots. + +## Primary references + +https://dev.emby.media/doc/restapi/Playback-Guidelines.html +https://dev.emby.media/doc/restapi/Video-Streaming.html +https://dev.emby.media/reference/RestAPI/MediaInfoService/postItemsByIdPlaybackinfo.html +https://developer.android.com/media/media3/ui/playerview diff --git a/docs/profiles-roadmap.md b/docs/profiles-roadmap.md new file mode 100644 index 0000000..18e0c98 --- /dev/null +++ b/docs/profiles-roadmap.md @@ -0,0 +1,10 @@ +# Later: Orbit profiles + +Paul's requested direction: named profiles with simple icons, including Kids, and a four-digit +adult-content PIN. Keep this outside the first Emby connection and 20-item sample check. + +A later design/build proposal should cover profile choice on launch, server account mapping, +age/rating policies, blocked unrated programmes, and an adult-profile PIN with protected storage +and retry limits. Restrictions must apply to listings, previews, channel tuning and playback, +not only hide navigation. Confirm provider account permissions before promising enforcement. +Never ship a default adult PIN or treat the TV's client-side screen as the sole access boundary. diff --git a/docs/sample-scheduled-channel.md b/docs/sample-scheduled-channel.md new file mode 100644 index 0000000..2ffbfdb --- /dev/null +++ b/docs/sample-scheduled-channel.md @@ -0,0 +1,72 @@ +# One scheduled Emby channel — 0.6.0 + +## Approved increment + +Paul confirmed the classic overlay hides correctly on his Xiaomi and approved the next step: +one real scheduled channel from a small Emby selection, accurate runtimes, joining in progress, +automatic transitions and genuine Now/Next. This is a session-scoped proof, not a full importer. + +## Bounded setup + +Menu → Connect Emby → Check 20 items → Create sample channel. +The existing single-page limit remains 20. The builder checks playback metadata for at most +five entries from that page and keeps up to three distinct direct-stream-eligible titles. +At least two are required. It requests metadata with IsPlayback=false and does not open video +streams during setup. Expired-login and rate-limit responses stop setup immediately. +No account or server administration is performed. No new runtime dependency is introduced. + +## Timeline and source selection + +Catalogue and source runtimes retain millisecond precision from Emby's 100-nanosecond ticks. +The chosen source's runtime takes precedence, and its media-source ID is locked for later tuning. +A usable runtime must be at least one second and at most seven days. The channel repeats its +2–3-item lineup against the Unix UTC epoch. Start/end times come from cumulative durations, +not fixed half-hour slots or the time the app launched. Display times use the TV's local zone. +The same lineup, order, source IDs and durations produce the same schedule when recreated. +A changed provider sample or runtime can change the lineup; nothing is persisted in this increment. + +The guide calculates current/upcoming broadcasts from the wall clock. No encoder or video +process runs when the channel is unwatched. This prototype's real guide is inside the connected +sample flow; the main three-channel fictional demo guide remains unchanged. + +## Tuning and transitions + +Watch channel opens the source at the current programme's wall-clock offset. The player adjusts +its initial join after preparation if buffering put it more than two seconds behind the target. +A 250 ms clock tick detects the next programme boundary, releases the old player and negotiates +its successor. It joins the successor at the current offset, so preparation delay does not reset +programme start time. Brief buffering between programmes is possible; this is not a gapless +server broadcast. A material source runtime change produces a rebuild message instead of +silently changing the timeline. Failed slots are not repeatedly requested on every timer tick. A cancellable mutex serializes +preparation, so a slow in-flight metadata call finishes before a newer clock slot starts another. + +The existing auto-hiding strip displays 101 Orbit One, real current title and next title/time. +This mode follows the clock: pause/seeking are disabled for now. On-demand sample playback +keeps its existing pause/seek behaviour. Back from the channel returns to the sample TV guide; +Back to sample returns to the 20-item list without signing out. Leaving that flow/backgrounding +still stops playback and attempts logout through the existing temporary-session cleanup. + +## Quick transition check + +Check transition temporarily shifts only the preview clock to ten seconds before the current +programme ends (half its length if very short). Real durations are not shortened. It exercises +exactly the same boundary/next-item path as normal viewing. The strip labels Transition check. +Closing it returns the guide to the ordinary wall clock. Like normal viewing, joining near a +programme's end may update or mark it watched in the provider's viewing history; the guide says so. + +## Evidence and limits + +Tests use fictional items and scripted API replies, with no live account or media calls. +They cover exact millisecond joins, end boundaries, repeated cycles, contiguous guides across +midnight/DST dates, negative epochs, recreation, immutable lineups, duration/count validation, +transition checking, a three-item/five-probe bound, rate limits and source/runtime locking. +The three-item eligibility check is metadata-based and does not guarantee every codec/profile +will decode on this TV. Real channel playback and rollover still require Paul's hardware test. +Credentials, tokens, private titles and URLs remain outside development tooling and saved files. +No VPS, firewall, persistent service, full library scan or new device permission is needed. + +## Primary references + +https://dev.emby.media/reference/RestAPI/MediaInfoService/postItemsByIdPlaybackinfo.html +https://dev.emby.media/doc/restapi/Playback-Guidelines.html +https://dev.emby.media/doc/restapi/Video-Streaming.html diff --git a/licenses/barlow-OFL.txt b/licenses/barlow-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/licenses/barlow-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/licenses/barlow-condensed-OFL.txt b/licenses/barlow-condensed-OFL.txt new file mode 100644 index 0000000..2f22ba6 --- /dev/null +++ b/licenses/barlow-condensed-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/licenses/instrument-sans-OFL.txt b/licenses/instrument-sans-OFL.txt new file mode 100644 index 0000000..26bd2f9 --- /dev/null +++ b/licenses/instrument-sans-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Instrument Sans Project Authors (https://github.com/Instrument/instrument-sans) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..e1fe2e1 --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,50 @@ +{ + "name": "orbit-tv-server", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "orbit-tv-server", + "version": "0.1.0", + "devDependencies": { + "@types/node": "24.3.0", + "typescript": "5.9.2" + }, + "engines": { + "node": ">=24" + } + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..cc1b42a --- /dev/null +++ b/server/package.json @@ -0,0 +1,18 @@ +{ + "name": "orbit-tv-server", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "build": "tsc", + "start": "npm run build && node dist/server.js", + "test": "npm run build && node dist/schedule.test.js" + }, + "engines": { + "node": ">=24" + }, + "devDependencies": { + "@types/node": "24.3.0", + "typescript": "5.9.2" + } +} diff --git a/server/schedule.test.ts b/server/schedule.test.ts new file mode 100644 index 0000000..af4e5fd --- /dev/null +++ b/server/schedule.test.ts @@ -0,0 +1,27 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { channels, programme, guide, SLOT_MS } from './schedule.ts'; +test('join in progress returns the broadcast offset', () => { + const start = SLOT_MS * 100; + assert.equal(programme(channels[0], start + 18 * 60000).offsetMs, 18 * 60000); +}); +test('exact boundary switches programmes with no gap', () => { + const a = programme(channels[0], SLOT_MS - 1), b = programme(channels[0], SLOT_MS); + assert.equal(a.end, b.start); assert.equal(b.offsetMs, 0); assert.notEqual(a.title, b.title); +}); +test('schedule is deterministic and contiguous across midnight', () => { + const at = Date.UTC(2026, 9, 31, 23, 59); + assert.deepEqual(guide(at), guide(at)); + for (const channel of guide(at, 48)) channel.programmes.slice(1).forEach((show, i) => assert.equal(channel.programmes[i].end, show.start)); +}); +test('invalid input is rejected and negative epochs work', () => { + for (const count of [0, -1, 49, 1.5, NaN]) assert.throws(() => guide(0, count)); + for (const at of [NaN, Infinity, 8.1e15]) assert.throws(() => guide(at)); + assert.equal(programme(channels[0], -1).start, -SLOT_MS); +}); + +test('future guide entries start at zero rather than inheriting current offset', () => { + const programmes = guide(18 * 60000)[0].programmes; + assert.equal(programmes[0].offsetMs, 18 * 60000); + assert.ok(programmes.slice(1).every(show => show.offsetMs === 0)); +}); diff --git a/server/schedule.ts b/server/schedule.ts new file mode 100644 index 0000000..c635796 --- /dev/null +++ b/server/schedule.ts @@ -0,0 +1,18 @@ +export const SLOT_MS = 30 * 60 * 1000; +export const channels = [ + { number: 101, name: 'Orbit One', titles: ['The Midnight Observatory', 'Small Town, Big Orbit', 'Beyond the Blue', 'The Last Shuttle Home'] }, + { number: 202, name: 'Orbit Sci-Fi', titles: ['Signal from Europa', 'Starbound Dispatch', 'Visitors at Dawn', 'Station Nine'] }, + { number: 401, name: 'Orbit Kids', titles: ['Moonbug Rangers', 'The Comet Club', 'Rocket Pocket', 'Planet of Puzzles'] }, +]; +export function programme(channel: typeof channels[number], time: number) { + if (!Number.isSafeInteger(time) || Math.abs(time) > 8e15) throw new RangeError('Invalid timestamp'); + const slot = Math.floor(time / SLOT_MS); + const index = ((slot % channel.titles.length) + channel.titles.length) % channel.titles.length; + const start = slot * SLOT_MS; + return { title: channel.titles[index], start, end: start + SLOT_MS, offsetMs: time - start }; +} +export function guide(time = Date.now(), count = 6) { + if (!Number.isInteger(count) || count < 1 || count > 48) throw new RangeError('count must be 1–48'); + return channels.map(channel => ({ number: channel.number, name: channel.name, + programmes: Array.from({ length: count }, (_, i) => ({ ...programme(channel, time + i * SLOT_MS), offsetMs: i === 0 ? programme(channel, time).offsetMs : 0 })) })); +} diff --git a/server/server.ts b/server/server.ts new file mode 100644 index 0000000..bafc033 --- /dev/null +++ b/server/server.ts @@ -0,0 +1,20 @@ +import { createServer } from 'node:http'; +import { guide } from './schedule.ts'; + +// Development-only service: loopback binding, no media, accounts or Emby credentials. +const server = createServer((req, res) => { + res.setHeader('Content-Type', 'application/json; charset=utf-8'); + res.setHeader('Cache-Control', 'no-store'); + res.setHeader('X-Content-Type-Options', 'nosniff'); + if (req.method !== 'GET') { res.writeHead(405, { Allow: 'GET' }); res.end('{"error":"GET required"}'); return; } + const url = new URL(req.url ?? '/', 'http://127.0.0.1'); + if (url.pathname === '/health') { res.end('{"status":"ok","mode":"fictional-demo"}'); return; } + if (url.pathname !== '/guide') { res.writeHead(404); res.end('{"error":"Not found"}'); return; } + try { + const now = url.searchParams.has('at') ? Number(url.searchParams.get('at')) : Date.now(); + const count = url.searchParams.has('count') ? Number(url.searchParams.get('count')) : 6; + res.end(JSON.stringify({ generatedAt: Date.now(), channels: guide(now, count) })); + } catch { res.writeHead(400); res.end('{"error":"Use a valid epoch timestamp and count from 1 to 48"}'); } +}); +server.listen(4317, '127.0.0.1', () => console.log('Orbit demo guide: http://127.0.0.1:4317/guide')); +for (const signal of ['SIGINT', 'SIGTERM'] as const) process.on(signal, () => server.close()); diff --git a/server/smoke-test.mjs b/server/smoke-test.mjs new file mode 100644 index 0000000..fb3478d --- /dev/null +++ b/server/smoke-test.mjs @@ -0,0 +1,20 @@ +import { spawn } from 'node:child_process'; +import assert from 'node:assert/strict'; +const child = spawn(process.execPath, ['dist/server.js'], { stdio: ['ignore', 'pipe', 'pipe'] }); +let errors = ''; +child.stderr.on('data', chunk => { errors += chunk; }); +try { + await new Promise((resolve, reject) => { + child.stdout.once('data', resolve); child.once('error', reject); + child.once('exit', code => reject(new Error(`Server exited ${code}: ${errors}`))); + setTimeout(() => reject(new Error('Startup timeout')), 5000).unref(); + }); + for (const [path, status] of [['/health',200], ['/guide?at=1793478000000&count=48',200], ['/guide?count=999',400], ['/missing',404]]) { + const response = await fetch(`http://127.0.0.1:4317${path}`); + assert.equal(response.status, status); const body = await response.json(); + if(path.includes('count=48')) { assert.equal(body.channels.length,3); assert.equal(body.channels[0].programmes.length,48); } + console.log(`${status} ${path}`); + } + assert.equal((await fetch('http://127.0.0.1:4317/guide', {method:'POST'})).status,405); + console.log('405 POST /guide'); +} finally { child.kill('SIGTERM'); } diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000..a461016 --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "dist", + "strict": true, + "rewriteRelativeImportExtensions": true, + "skipLibCheck": true + }, + "include": [ + "*.ts" + ] +} \ No newline at end of file