neoagent 2.3.1-beta.58 → 2.3.1-beta.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/flutter_app/lib/features/onboarding/onboarding_messaging_step.dart +3 -47
- package/flutter_app/lib/features/onboarding/onboarding_model_step.dart +2 -39
- package/flutter_app/lib/features/onboarding/onboarding_video_step.dart +81 -135
- package/flutter_app/lib/features/onboarding/onboarding_welcome_step.dart +10 -70
- package/package.json +1 -1
- package/server/public/.last_build_id +1 -1
- package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
- package/server/public/flutter_bootstrap.js +1 -1
- package/server/public/main.dart.js +52738 -52974
|
@@ -32,42 +32,8 @@ class _OnboardingMessagingStepState extends State<OnboardingMessagingStep> {
|
|
|
32
32
|
step: 2,
|
|
33
33
|
totalSteps: 4,
|
|
34
34
|
eyebrow: 'COMMUNICATION',
|
|
35
|
-
title: 'Connect
|
|
36
|
-
description:
|
|
37
|
-
'Choose one messaging surface to start. NeoOS can prepare context, monitor the right signals, and keep the interaction layer close to your real workflow.',
|
|
38
|
-
sidePanel: OnboardingPanel(
|
|
39
|
-
child: Column(
|
|
40
|
-
crossAxisAlignment: CrossAxisAlignment.start,
|
|
41
|
-
children: <Widget>[
|
|
42
|
-
const Text(
|
|
43
|
-
'Setup principle',
|
|
44
|
-
style: TextStyle(
|
|
45
|
-
color: Colors.white,
|
|
46
|
-
fontSize: 20,
|
|
47
|
-
fontWeight: FontWeight.w800,
|
|
48
|
-
),
|
|
49
|
-
),
|
|
50
|
-
const SizedBox(height: 10),
|
|
51
|
-
Text(
|
|
52
|
-
'Start with one high-value integration first. The product feels smarter when the first connection is relevant, not exhaustive.',
|
|
53
|
-
style: TextStyle(
|
|
54
|
-
color: Colors.white.withValues(alpha: 0.72),
|
|
55
|
-
fontSize: 15,
|
|
56
|
-
height: 1.5,
|
|
57
|
-
),
|
|
58
|
-
),
|
|
59
|
-
const SizedBox(height: 18),
|
|
60
|
-
const Wrap(
|
|
61
|
-
spacing: 12,
|
|
62
|
-
runSpacing: 12,
|
|
63
|
-
children: <Widget>[
|
|
64
|
-
OnboardingMetricPill(label: 'Signal', value: 'Relevant only'),
|
|
65
|
-
OnboardingMetricPill(label: 'Access', value: 'Configurable'),
|
|
66
|
-
],
|
|
67
|
-
),
|
|
68
|
-
],
|
|
69
|
-
),
|
|
70
|
-
).animate().fadeIn(duration: 600.ms, delay: 200.ms),
|
|
35
|
+
title: 'Connect a\nmessaging platform.',
|
|
36
|
+
description: 'Choose one to get started now. You can add more later.',
|
|
71
37
|
footer: Row(
|
|
72
38
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
73
39
|
children: <Widget>[
|
|
@@ -113,17 +79,7 @@ class _OnboardingMessagingStepState extends State<OnboardingMessagingStep> {
|
|
|
113
79
|
separatorBuilder: (_, __) => const SizedBox(height: 14),
|
|
114
80
|
itemBuilder: (context, index) {
|
|
115
81
|
if (index == platforms.length) {
|
|
116
|
-
return
|
|
117
|
-
padding: const EdgeInsets.only(top: 10, bottom: 10),
|
|
118
|
-
child: Text(
|
|
119
|
-
'More providers stay available later in Settings.',
|
|
120
|
-
style: TextStyle(
|
|
121
|
-
color: Colors.white.withValues(alpha: 0.52),
|
|
122
|
-
fontSize: 14,
|
|
123
|
-
fontWeight: FontWeight.w600,
|
|
124
|
-
),
|
|
125
|
-
),
|
|
126
|
-
);
|
|
82
|
+
return const SizedBox.shrink();
|
|
127
83
|
}
|
|
128
84
|
|
|
129
85
|
final platform = platforms[index];
|
|
@@ -78,45 +78,8 @@ class _OnboardingModelStepState extends State<OnboardingModelStep> {
|
|
|
78
78
|
step: 3,
|
|
79
79
|
totalSteps: 4,
|
|
80
80
|
eyebrow: 'INTELLIGENCE',
|
|
81
|
-
title: 'Choose
|
|
82
|
-
description:
|
|
83
|
-
'This selection shapes the tone of the product from the first message onward. You can change it later, but the first default should already feel intentional.',
|
|
84
|
-
sidePanel: OnboardingPanel(
|
|
85
|
-
child: Column(
|
|
86
|
-
crossAxisAlignment: CrossAxisAlignment.start,
|
|
87
|
-
children: <Widget>[
|
|
88
|
-
const Text(
|
|
89
|
-
'Selection notes',
|
|
90
|
-
style: TextStyle(
|
|
91
|
-
color: Colors.white,
|
|
92
|
-
fontSize: 20,
|
|
93
|
-
fontWeight: FontWeight.w800,
|
|
94
|
-
),
|
|
95
|
-
),
|
|
96
|
-
const SizedBox(height: 10),
|
|
97
|
-
Text(
|
|
98
|
-
'Favor the model you want to live with every day. Speed, tone, and reliability matter more here than benchmark theater.',
|
|
99
|
-
style: TextStyle(
|
|
100
|
-
color: Colors.white.withValues(alpha: 0.72),
|
|
101
|
-
fontSize: 15,
|
|
102
|
-
height: 1.5,
|
|
103
|
-
),
|
|
104
|
-
),
|
|
105
|
-
const SizedBox(height: 18),
|
|
106
|
-
const Wrap(
|
|
107
|
-
spacing: 12,
|
|
108
|
-
runSpacing: 12,
|
|
109
|
-
children: <Widget>[
|
|
110
|
-
OnboardingMetricPill(label: 'Priority', value: 'Daily default'),
|
|
111
|
-
OnboardingMetricPill(
|
|
112
|
-
label: 'Flexibility',
|
|
113
|
-
value: 'Editable later',
|
|
114
|
-
),
|
|
115
|
-
],
|
|
116
|
-
),
|
|
117
|
-
],
|
|
118
|
-
),
|
|
119
|
-
).animate().fadeIn(duration: 620.ms, delay: 220.ms),
|
|
81
|
+
title: 'Choose your\ndefault model.',
|
|
82
|
+
description: 'Pick the model NeoOS should use by default.',
|
|
120
83
|
footer: Row(
|
|
121
84
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
122
85
|
children: <Widget>[
|
|
@@ -75,48 +75,55 @@ class _OnboardingVideoStepState extends State<OnboardingVideoStep> {
|
|
|
75
75
|
final orientation = MediaQuery.orientationOf(context);
|
|
76
76
|
|
|
77
77
|
if (_hasError) {
|
|
78
|
-
return
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
78
|
+
return Scaffold(
|
|
79
|
+
backgroundColor: Colors.black,
|
|
80
|
+
body: Center(
|
|
81
|
+
child: Padding(
|
|
82
|
+
padding: const EdgeInsets.all(32),
|
|
83
|
+
child: Column(
|
|
84
|
+
mainAxisSize: MainAxisSize.min,
|
|
85
|
+
children: <Widget>[
|
|
86
|
+
const Icon(
|
|
87
|
+
Icons.play_circle_outline_rounded,
|
|
88
|
+
color: Colors.white70,
|
|
89
|
+
size: 56,
|
|
90
|
+
),
|
|
91
|
+
const SizedBox(height: 18),
|
|
92
|
+
const Text(
|
|
93
|
+
'Continue to setup',
|
|
94
|
+
style: TextStyle(
|
|
95
|
+
color: Colors.white,
|
|
96
|
+
fontSize: 26,
|
|
97
|
+
fontWeight: FontWeight.w800,
|
|
98
|
+
),
|
|
99
|
+
),
|
|
100
|
+
const SizedBox(height: 12),
|
|
101
|
+
Text(
|
|
102
|
+
'The intro is not available on this device.',
|
|
103
|
+
textAlign: TextAlign.center,
|
|
104
|
+
style: TextStyle(
|
|
105
|
+
color: Colors.white.withValues(alpha: 0.68),
|
|
106
|
+
fontSize: 15,
|
|
107
|
+
height: 1.5,
|
|
108
|
+
),
|
|
109
|
+
),
|
|
110
|
+
const SizedBox(height: 28),
|
|
111
|
+
OnboardingPrimaryButton(
|
|
112
|
+
label: 'Continue',
|
|
113
|
+
icon: Icons.arrow_forward_rounded,
|
|
114
|
+
onPressed: widget.onComplete,
|
|
115
|
+
),
|
|
116
|
+
],
|
|
93
117
|
),
|
|
94
|
-
|
|
118
|
+
),
|
|
95
119
|
),
|
|
96
|
-
child: const SizedBox.shrink(),
|
|
97
120
|
);
|
|
98
121
|
}
|
|
99
122
|
|
|
100
123
|
if (!_isInitialized || _controller == null) {
|
|
101
|
-
return
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
eyebrow: 'INTRO',
|
|
105
|
-
title: 'Preparing the opening sequence.',
|
|
106
|
-
description:
|
|
107
|
-
'The first impression should feel immediate and polished, so the transition in is staged before the rest of setup appears.',
|
|
108
|
-
sidePanel: const _VideoFallbackPanel(),
|
|
109
|
-
footer: Row(
|
|
110
|
-
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
111
|
-
children: <Widget>[
|
|
112
|
-
OnboardingGhostButton(
|
|
113
|
-
label: 'Skip intro',
|
|
114
|
-
onPressed: widget.onComplete,
|
|
115
|
-
),
|
|
116
|
-
const SizedBox.shrink(),
|
|
117
|
-
],
|
|
118
|
-
),
|
|
119
|
-
child: const Center(child: CircularProgressIndicator()),
|
|
124
|
+
return const Scaffold(
|
|
125
|
+
backgroundColor: Colors.black,
|
|
126
|
+
body: Center(child: CircularProgressIndicator(color: Colors.white)),
|
|
120
127
|
);
|
|
121
128
|
}
|
|
122
129
|
|
|
@@ -127,108 +134,46 @@ class _OnboardingVideoStepState extends State<OnboardingVideoStep> {
|
|
|
127
134
|
_controller!.play();
|
|
128
135
|
}
|
|
129
136
|
|
|
130
|
-
return
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
eyebrow: 'INTRO',
|
|
134
|
-
title: 'See the product\nbefore you configure it.',
|
|
135
|
-
description:
|
|
136
|
-
'The opening sequence sets tone and expectation: quiet motion, deliberate materials, and a system that feels already alive.',
|
|
137
|
-
dense: true,
|
|
138
|
-
sidePanel: Wrap(
|
|
139
|
-
spacing: 12,
|
|
140
|
-
runSpacing: 12,
|
|
141
|
-
children: const <Widget>[
|
|
142
|
-
OnboardingMetricPill(label: 'Feel', value: 'Editorial motion'),
|
|
143
|
-
OnboardingMetricPill(label: 'Pacing', value: 'Fast, never rushed'),
|
|
144
|
-
],
|
|
145
|
-
).animate().fadeIn(duration: 500.ms, delay: 220.ms),
|
|
146
|
-
footer: Row(
|
|
147
|
-
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
148
|
-
children: <Widget>[
|
|
149
|
-
OnboardingGhostButton(
|
|
150
|
-
label: 'Skip intro',
|
|
151
|
-
onPressed: widget.onComplete,
|
|
152
|
-
),
|
|
153
|
-
Text(
|
|
154
|
-
'Auto-continues when the video ends',
|
|
155
|
-
style: TextStyle(
|
|
156
|
-
color: Colors.white.withValues(alpha: 0.56),
|
|
157
|
-
fontSize: 13,
|
|
158
|
-
fontWeight: FontWeight.w600,
|
|
159
|
-
),
|
|
160
|
-
),
|
|
161
|
-
],
|
|
162
|
-
),
|
|
163
|
-
child: portrait
|
|
137
|
+
return Scaffold(
|
|
138
|
+
backgroundColor: Colors.black,
|
|
139
|
+
body: portrait
|
|
164
140
|
? const _RotatePrompt()
|
|
165
|
-
:
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
),
|
|
175
|
-
child: FittedBox(
|
|
176
|
-
fit: BoxFit.cover,
|
|
177
|
-
child: SizedBox(
|
|
178
|
-
width: _controller!.value.size.width,
|
|
179
|
-
height: _controller!.value.size.height,
|
|
180
|
-
child: VideoPlayer(_controller!),
|
|
181
|
-
),
|
|
182
|
-
),
|
|
141
|
+
: Stack(
|
|
142
|
+
fit: StackFit.expand,
|
|
143
|
+
children: <Widget>[
|
|
144
|
+
FittedBox(
|
|
145
|
+
fit: BoxFit.cover,
|
|
146
|
+
child: SizedBox(
|
|
147
|
+
width: _controller!.value.size.width,
|
|
148
|
+
height: _controller!.value.size.height,
|
|
149
|
+
child: VideoPlayer(_controller!),
|
|
183
150
|
),
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
151
|
+
),
|
|
152
|
+
Positioned.fill(
|
|
153
|
+
child: DecoratedBox(
|
|
154
|
+
decoration: BoxDecoration(
|
|
155
|
+
gradient: LinearGradient(
|
|
156
|
+
colors: <Color>[
|
|
157
|
+
Colors.transparent,
|
|
158
|
+
Colors.transparent,
|
|
159
|
+
Colors.black.withValues(alpha: 0.22),
|
|
160
|
+
],
|
|
161
|
+
begin: Alignment.topCenter,
|
|
162
|
+
end: Alignment.bottomCenter,
|
|
196
163
|
),
|
|
197
164
|
),
|
|
198
165
|
),
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
@override
|
|
210
|
-
Widget build(BuildContext context) {
|
|
211
|
-
return const OnboardingPanel(
|
|
212
|
-
child: Column(
|
|
213
|
-
crossAxisAlignment: CrossAxisAlignment.start,
|
|
214
|
-
children: <Widget>[
|
|
215
|
-
Icon(Icons.movie_creation_outlined, color: Colors.white, size: 30),
|
|
216
|
-
SizedBox(height: 16),
|
|
217
|
-
Text(
|
|
218
|
-
'Fallback mode',
|
|
219
|
-
style: TextStyle(
|
|
220
|
-
color: Colors.white,
|
|
221
|
-
fontSize: 22,
|
|
222
|
-
fontWeight: FontWeight.w800,
|
|
166
|
+
),
|
|
167
|
+
Positioned(
|
|
168
|
+
top: 28,
|
|
169
|
+
right: 28,
|
|
170
|
+
child: OnboardingGhostButton(
|
|
171
|
+
label: 'Skip',
|
|
172
|
+
onPressed: widget.onComplete,
|
|
173
|
+
).animate().fadeIn(duration: 280.ms, delay: 220.ms),
|
|
174
|
+
),
|
|
175
|
+
],
|
|
223
176
|
),
|
|
224
|
-
),
|
|
225
|
-
SizedBox(height: 10),
|
|
226
|
-
Text(
|
|
227
|
-
'Paste a real `onboarding_intro.mp4` into `assets/branding/` to restore the cinematic first step.',
|
|
228
|
-
style: TextStyle(color: Colors.white70, fontSize: 15, height: 1.5),
|
|
229
|
-
),
|
|
230
|
-
],
|
|
231
|
-
),
|
|
232
177
|
);
|
|
233
178
|
}
|
|
234
179
|
}
|
|
@@ -239,14 +184,15 @@ class _RotatePrompt extends StatelessWidget {
|
|
|
239
184
|
@override
|
|
240
185
|
Widget build(BuildContext context) {
|
|
241
186
|
return Center(
|
|
242
|
-
child:
|
|
187
|
+
child: Padding(
|
|
188
|
+
padding: const EdgeInsets.all(32),
|
|
243
189
|
child: Column(
|
|
244
190
|
mainAxisSize: MainAxisSize.min,
|
|
245
191
|
children: <Widget>[
|
|
246
192
|
const Icon(Icons.screen_rotation, color: Colors.white, size: 54),
|
|
247
193
|
const SizedBox(height: 18),
|
|
248
194
|
const Text(
|
|
249
|
-
'Rotate
|
|
195
|
+
'Rotate to continue',
|
|
250
196
|
textAlign: TextAlign.center,
|
|
251
197
|
style: TextStyle(
|
|
252
198
|
color: Colors.white,
|
|
@@ -256,7 +202,7 @@ class _RotatePrompt extends StatelessWidget {
|
|
|
256
202
|
),
|
|
257
203
|
const SizedBox(height: 10),
|
|
258
204
|
Text(
|
|
259
|
-
'
|
|
205
|
+
'This intro is designed for full-screen landscape playback.',
|
|
260
206
|
textAlign: TextAlign.center,
|
|
261
207
|
style: TextStyle(
|
|
262
208
|
color: Colors.white.withValues(alpha: 0.7),
|
|
@@ -14,10 +14,8 @@ class OnboardingWelcomeStep extends StatelessWidget {
|
|
|
14
14
|
step: 1,
|
|
15
15
|
totalSteps: 4,
|
|
16
16
|
eyebrow: 'WELCOME',
|
|
17
|
-
title: '
|
|
18
|
-
description:
|
|
19
|
-
'NeoOS watches the right signals, stays out of the way, and surfaces context exactly when you need it. The experience should feel calm, tactile, and immediate.',
|
|
20
|
-
sidePanel: _WelcomeSidePanel(),
|
|
17
|
+
title: 'Welcome to\nNeoOS',
|
|
18
|
+
description: 'Your assistant layer for capture, context, and action.',
|
|
21
19
|
footer: Row(
|
|
22
20
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
23
21
|
children: <Widget>[
|
|
@@ -33,74 +31,16 @@ class OnboardingWelcomeStep extends StatelessWidget {
|
|
|
33
31
|
),
|
|
34
32
|
child: Align(
|
|
35
33
|
alignment: Alignment.topLeft,
|
|
36
|
-
child:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
),
|
|
45
|
-
OnboardingMetricPill(
|
|
46
|
-
label: 'Automation',
|
|
47
|
-
value: 'Reactive by design',
|
|
48
|
-
),
|
|
49
|
-
],
|
|
34
|
+
child: Text(
|
|
35
|
+
'Set up your workspace in a few steps and start using NeoOS immediately.',
|
|
36
|
+
style: TextStyle(
|
|
37
|
+
color: Colors.white.withValues(alpha: 0.72),
|
|
38
|
+
fontSize: 18,
|
|
39
|
+
height: 1.55,
|
|
40
|
+
fontWeight: FontWeight.w500,
|
|
41
|
+
),
|
|
50
42
|
).animate().fadeIn(duration: 600.ms, delay: 380.ms),
|
|
51
43
|
),
|
|
52
44
|
);
|
|
53
45
|
}
|
|
54
46
|
}
|
|
55
|
-
|
|
56
|
-
class _WelcomeSidePanel extends StatelessWidget {
|
|
57
|
-
@override
|
|
58
|
-
Widget build(BuildContext context) {
|
|
59
|
-
final accent = Theme.of(context).colorScheme.primary;
|
|
60
|
-
return OnboardingPanel(
|
|
61
|
-
padding: const EdgeInsets.all(22),
|
|
62
|
-
child: Column(
|
|
63
|
-
crossAxisAlignment: CrossAxisAlignment.start,
|
|
64
|
-
children: <Widget>[
|
|
65
|
-
Container(
|
|
66
|
-
width: 54,
|
|
67
|
-
height: 54,
|
|
68
|
-
decoration: BoxDecoration(
|
|
69
|
-
gradient: LinearGradient(
|
|
70
|
-
colors: <Color>[accent, const Color(0xFF6EDBFF)],
|
|
71
|
-
begin: Alignment.topLeft,
|
|
72
|
-
end: Alignment.bottomRight,
|
|
73
|
-
),
|
|
74
|
-
borderRadius: BorderRadius.circular(18),
|
|
75
|
-
),
|
|
76
|
-
child: const Icon(
|
|
77
|
-
Icons.layers_rounded,
|
|
78
|
-
color: Colors.white,
|
|
79
|
-
size: 28,
|
|
80
|
-
),
|
|
81
|
-
),
|
|
82
|
-
const SizedBox(height: 18),
|
|
83
|
-
const Text(
|
|
84
|
-
'Designed to feel premium,\nnot noisy.',
|
|
85
|
-
style: TextStyle(
|
|
86
|
-
color: Colors.white,
|
|
87
|
-
fontSize: 24,
|
|
88
|
-
height: 1.15,
|
|
89
|
-
fontWeight: FontWeight.w800,
|
|
90
|
-
letterSpacing: -0.6,
|
|
91
|
-
),
|
|
92
|
-
),
|
|
93
|
-
const SizedBox(height: 12),
|
|
94
|
-
Text(
|
|
95
|
-
'Borrowing from Apple’s hierarchy guidance: stronger content contrast, fewer competing layers, and motion that explains rather than distracts.',
|
|
96
|
-
style: TextStyle(
|
|
97
|
-
color: Colors.white.withValues(alpha: 0.7),
|
|
98
|
-
fontSize: 15,
|
|
99
|
-
height: 1.5,
|
|
100
|
-
),
|
|
101
|
-
),
|
|
102
|
-
],
|
|
103
|
-
),
|
|
104
|
-
).animate().fadeIn(duration: 700.ms, delay: 260.ms).slideX(begin: 0.12);
|
|
105
|
-
}
|
|
106
|
-
}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
154775e7dc374e782403c776404afd0b
|
|
Binary file
|
|
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"42d3d75a56efe1a2e9902f52dc8006099c45d9
|
|
|
37
37
|
|
|
38
38
|
_flutter.loader.load({
|
|
39
39
|
serviceWorkerSettings: {
|
|
40
|
-
serviceWorkerVersion: "
|
|
40
|
+
serviceWorkerVersion: "3080522326" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
|
|
41
41
|
}
|
|
42
42
|
});
|