1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
//! AbstractTUI brand constants: the boot splash's single source of truth.
//!
//! Art direction lives in `docs/design/theme-identity.md` (section 2 —
//! geometry, storyboard, frame-by-frame timing). This file is the
//! machine-readable half: timings, easing parameters, color ramp and the
//! fallback wordmark. GFX3D implements the 3D mark against these
//! constants; the 2D fallback splash (DESIGN, cycle 4) uses the same ones,
//! so the two splashes can never drift apart.
//!
//! The mark: **three ascending planes forming an "A"** — the compositor
//! story (layers) drawn as the product's initial. Not a generic spinning
//! cube; the geometry *is* the architecture pitch.
//!
//! OWNER: DESIGN (GFX3D consumes).
use crateRgba;
// ---------------------------------------------------------------------------
// Timeline (milliseconds from splash start)
// ---------------------------------------------------------------------------
/// Total splash duration. Product requirement: ~2 seconds, skippable.
pub const SPLASH_TOTAL_MS: u32 = 2000;
/// Phase A — "arrival": planes fly in from below-right, staggered.
pub const PHASE_ARRIVAL_START_MS: u32 = 0;
/// Phase A ends / phase B ("alignment") begins: planes overshoot toward
/// the A-silhouette and settle back (ease-out-back).
pub const PHASE_ALIGN_START_MS: u32 = 900;
/// Phase C — "reveal": wordmark letters fade in while letter-spacing
/// collapses; accent underline sweeps left to right.
pub const PHASE_REVEAL_START_MS: u32 = 1400;
/// Splash holds the finished composition briefly, then hands off.
pub const PHASE_HOLD_START_MS: u32 = 1850;
/// Per-plane arrival stagger: plane i starts at `i * STAGGER`.
pub const PLANE_STAGGER_MS: u32 = 120;
/// Duration of one plane's arrival tween.
pub const PLANE_ARRIVAL_MS: u32 = 780;
/// Glow/particle burst moment (alignment impact).
pub const BURST_AT_MS: u32 = 900;
/// Number of spark particles in the burst (cell-sized, additive).
pub const BURST_PARTICLES: u32 = 12;
/// Particle lifetime.
pub const BURST_LIFETIME_MS: u32 = 450;
/// Sparks kicked up when one plane/mark-line lands (cycle 7, the
/// ParticleField afterglow pass — additive to the locked timeline: no
/// existing constant moved, so GFX3D's drift pin is untouched).
pub const LAND_SPARKS: u32 = 5;
/// Afterglow: layer opacity of the trail buffer decays by this factor per
/// 100 ms (compositor multiplies the previous trail frame).
pub const AFTERGLOW_DECAY_PER_100MS: f32 = 0.72;
/// Skip: any key or mouse press. The splash never blocks input.
pub const SKIP_FADE_MS: u32 = 120;
/// Environment variable that disables the splash entirely (also
/// auto-disabled when stdout is not a TTY).
pub const SPLASH_DISABLE_ENV: &str = "ABSTRACTTUI_NO_SPLASH";
// ---------------------------------------------------------------------------
// Easing (cubic-bezier control points, CSS convention: x1, y1, x2, y2)
// ---------------------------------------------------------------------------
// Expressed as bezier parameters rather than `anim` types so this file has
// zero dependency on the animation layer's API surface; `anim` can build
// its curves from these numbers (CONTRACT(RENDER): see
// reviews/cycle1/design-requests.md — named easing constructors).
/// Plane fly-in: fast start, long soft landing.
pub const EASE_ARRIVAL: = ; // ease-out-expo-like
/// Alignment settle: overshoot then return (back-out). The `y > 1` control
/// point is the overshoot.
pub const EASE_SETTLE: = ;
/// Wordmark tracking collapse: symmetric, calm.
pub const EASE_TRACKING: = ; // ease-in-out-quint-like
/// All fades (in, out, skip).
pub const EASE_FADE: = ; // ease-out-cubic
// ---------------------------------------------------------------------------
// Camera (3D mark; GFX3D)
// ---------------------------------------------------------------------------
/// Camera yaw sweep across the splash (degrees): starts angled, ends
/// nearly frontal so the "A" silhouette locks.
pub const CAMERA_YAW_DEG: = ;
/// Camera pitch (degrees), constant slight down-look.
pub const CAMERA_PITCH_DEG: f32 = 8.0;
/// Dolly distance (arbitrary scene units, start -> end): a slow push-in.
pub const CAMERA_DOLLY: = ;
// ---------------------------------------------------------------------------
// Brand colors
// ---------------------------------------------------------------------------
// The splash renders on the ACTIVE theme's bg/text so it never clashes with
// the user's palette; the mark itself carries the Abstract house accents
// (theme.css :root values — the brand is the brand on every theme).
/// House accent (theme.css `--accent`): the A's leading plane.
pub const BRAND_ACCENT: Rgba = rgb;
/// House secondary accent (theme.css `--info`): the trailing plane.
pub const BRAND_ACCENT_ALT: Rgba = rgb;
/// Deep field tint behind the mark (theme.css `--bg-tertiary`), blended
/// over the active theme's bg for the vignette.
pub const BRAND_FIELD: Rgba = rgb;
/// Curated 5-stop ramp for the plane gradient and particle colors.
/// Deliberately hand-picked, NOT lerped at runtime: sRGB midpoints between
/// the house red and blue desaturate to gray (see `theme::derive` docs), so
/// the middle stops route through violet on purpose.
pub const BRAND_RAMP: = ;
/// Ramp color for a normalized position `t` in 0..=1: nearest curated
/// stop pair, mixed only within the pair (short hue distance keeps the
/// blend honest at cell scale). Routed through `theme::derive::mix` — the
/// one audited home for color arithmetic (RT1-9b).
// ---------------------------------------------------------------------------
// Wordmark
// ---------------------------------------------------------------------------
/// The product wordmark, revealed at `PHASE_REVEAL_START_MS`.
pub const WORDMARK: &str = "AbstractTUI";
/// Letter-spacing animation in cells: starts airy, collapses to snug.
pub const WORDMARK_TRACKING: = ;
/// Tagline under the wordmark (text_muted, no animation, fades with the
/// wordmark's tail).
pub const TAGLINE: &str = "the terminal, composed";
/// Skip affordance shown bottom-right from 300 ms on (text_faint).
pub const SKIP_HINT: &str = "press any key to skip";
/// Fallback 2D mark for terminals without graphics/3D budget: three
/// ascending strokes forming an "A" (pure ASCII — the fallback targets the
/// dumbest terminals, so no box-drawing or shade glyphs). Rendered with
/// `brand_ramp` per line over the theme ground, wordmark alongside.
pub const MARK_ASCII: = ;
/// Widest fallback-art line (cells) — layout helper for centering.
pub const MARK_ASCII_WIDTH: u16 = 14;