Skip to content

Commit f9ebefb

Browse files
authored
feat(macos): onboarding mascot reacts with moods, randomized idle behavior, and Easter eggs (#104255)
* feat(macos): mascot moods, randomized idle behavior, and onboarding Easter eggs * feat(apps): opt About window and iOS hero marks into mascot Easter eggs * chore(i18n): sync native app i18n inventory
1 parent 8cd0926 commit f9ebefb

14 files changed

Lines changed: 1471 additions & 131 deletions

apps/.i18n/native-source.json

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9635,47 +9635,47 @@
96359635
},
96369636
{
96379637
"kind": "ui-modifier",
9638-
"line": 600,
9638+
"line": 602,
96399639
"path": "apps/ios/Sources/Design/OpenClawProComponents.swift",
96409640
"source": "OpenClaw",
96419641
"surface": "apple",
96429642
"id": "native.apple.cf9bb65f8e405cc8"
96439643
},
96449644
{
96459645
"kind": "ui-modifier",
9646-
"line": 628,
9646+
"line": 630,
96479647
"path": "apps/ios/Sources/Design/OpenClawProComponents.swift",
96489648
"source": "Gateway \\(self.title)",
96499649
"surface": "apple",
96509650
"id": "native.apple.51c566ed34b67acf"
96519651
},
96529652
{
96539653
"kind": "conditional-branch",
9654-
"line": 633,
9654+
"line": 635,
96559655
"path": "apps/ios/Sources/Design/OpenClawProComponents.swift",
96569656
"source": "Online",
96579657
"surface": "apple",
96589658
"id": "native.apple.72baecec6cf1b462"
96599659
},
96609660
{
96619661
"kind": "conditional-branch",
9662-
"line": 635,
9662+
"line": 637,
96639663
"path": "apps/ios/Sources/Design/OpenClawProComponents.swift",
96649664
"source": "Connecting",
96659665
"surface": "apple",
96669666
"id": "native.apple.ca9dfb05d9034ff7"
96679667
},
96689668
{
96699669
"kind": "conditional-branch",
9670-
"line": 637,
9670+
"line": 639,
96719671
"path": "apps/ios/Sources/Design/OpenClawProComponents.swift",
96729672
"source": "Attention",
96739673
"surface": "apple",
96749674
"id": "native.apple.d7a3d53412e23e88"
96759675
},
96769676
{
96779677
"kind": "conditional-branch",
9678-
"line": 639,
9678+
"line": 641,
96799679
"path": "apps/ios/Sources/Design/OpenClawProComponents.swift",
96809680
"source": "Offline",
96819681
"surface": "apple",
@@ -14937,161 +14937,153 @@
1493714937
"surface": "apple",
1493814938
"id": "native.apple.096fb24013ac5455"
1493914939
},
14940-
{
14941-
"kind": "ui-modifier",
14942-
"line": 32,
14943-
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
14944-
"source": "OpenClaw on GitHub",
14945-
"surface": "apple",
14946-
"id": "native.apple.6fdc607c6178ba31"
14947-
},
1494814940
{
1494914941
"kind": "ui-call",
14950-
"line": 40,
14942+
"line": 32,
1495114943
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1495214944
"source": "OpenClaw",
1495314945
"surface": "apple",
1495414946
"id": "native.apple.5ac0c79487a492b4"
1495514947
},
1495614948
{
1495714949
"kind": "ui-call",
14958-
"line": 44,
14950+
"line": 36,
1495914951
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1496014952
"source": "Menu bar companion for notifications, screenshots, and privileged agent actions.",
1496114953
"surface": "apple",
1496214954
"id": "native.apple.95b5730738a28d71"
1496314955
},
1496414956
{
1496514957
"kind": "ui-named-argument",
14966-
"line": 53,
14958+
"line": 45,
1496714959
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1496814960
"source": "Website",
1496914961
"surface": "apple",
1497014962
"id": "native.apple.63e488db74990ce5"
1497114963
},
1497214964
{
1497314965
"kind": "ui-named-argument",
14974-
"line": 54,
14966+
"line": 46,
1497514967
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1497614968
"source": "Docs",
1497714969
"surface": "apple",
1497814970
"id": "native.apple.a6ce39368a3dcba9"
1497914971
},
1498014972
{
1498114973
"kind": "ui-named-argument",
14982-
"line": 57,
14974+
"line": 49,
1498314975
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1498414976
"source": "GitHub",
1498514977
"surface": "apple",
1498614978
"id": "native.apple.953dd3deb91be186"
1498714979
},
1498814980
{
1498914981
"kind": "ui-named-argument",
14990-
"line": 61,
14982+
"line": 53,
1499114983
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1499214984
"source": "Discord",
1499314985
"surface": "apple",
1499414986
"id": "native.apple.3f2971f0141e1cf6"
1499514987
},
1499614988
{
1499714989
"kind": "ui-call",
14998-
"line": 74,
14990+
"line": 66,
1499914991
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1500014992
"source": "Check for updates automatically",
1500114993
"surface": "apple",
1500214994
"id": "native.apple.32ce87cf5adca95c"
1500314995
},
1500414996
{
1500514997
"kind": "ui-call",
15006-
"line": 78,
14998+
"line": 70,
1500714999
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1500815000
"source": "Check for Updates…",
1500915001
"surface": "apple",
1501015002
"id": "native.apple.5e0de63984ca40c9"
1501115003
},
1501215004
{
1501315005
"kind": "ui-call",
15014-
"line": 81,
15006+
"line": 73,
1501515007
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1501615008
"source": "Updates unavailable in this build.",
1501715009
"surface": "apple",
1501815010
"id": "native.apple.ddec1d4e5e5b43cb"
1501915011
},
1502015012
{
1502115013
"kind": "ui-call",
15022-
"line": 87,
15014+
"line": 79,
1502315015
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1502415016
"source": "© 2026 OpenClaw Foundation — MIT License.",
1502515017
"surface": "apple",
1502615018
"id": "native.apple.4ec07761308f7f50"
1502715019
},
1502815020
{
1502915021
"kind": "ui-call",
15030-
"line": 166,
15022+
"line": 158,
1503115023
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1503215024
"source": "Copy full commit hash",
1503315025
"surface": "apple",
1503415026
"id": "native.apple.37661ff1af405580"
1503515027
},
1503615028
{
1503715029
"kind": "ui-call",
15038-
"line": 170,
15030+
"line": 162,
1503915031
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1504015032
"source": "Copy build info",
1504115033
"surface": "apple",
1504215034
"id": "native.apple.2916df231993897d"
1504315035
},
1504415036
{
1504515037
"kind": "ui-call",
15046-
"line": 176,
15038+
"line": 168,
1504715039
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1504815040
"source": "Copy Commit",
1504915041
"surface": "apple",
1505015042
"id": "native.apple.f870085ee74e9885"
1505115043
},
1505215044
{
1505315045
"kind": "ui-call",
15054-
"line": 180,
15046+
"line": 172,
1505515047
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1505615048
"source": "Copy Build Info",
1505715049
"surface": "apple",
1505815050
"id": "native.apple.be5af46a63f9d1da"
1505915051
},
1506015052
{
1506115053
"kind": "ui-call",
15062-
"line": 196,
15054+
"line": 188,
1506315055
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1506415056
"source": "Unavailable",
1506515057
"surface": "apple",
1506615058
"id": "native.apple.ddd4228d93680320"
1506715059
},
1506815060
{
1506915061
"kind": "ui-call",
15070-
"line": 212,
15062+
"line": 204,
1507115063
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1507215064
"source": "Version \\(version), commit \\(commit), built \\(built), timestamp \\(timestamp)",
1507315065
"surface": "apple",
1507415066
"id": "native.apple.0e7c932e0d8fb288"
1507515067
},
1507615068
{
1507715069
"kind": "ui-call",
15078-
"line": 215,
15070+
"line": 207,
1507915071
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1508015072
"source": "Version \\(version), commit \\(commit), build date unavailable",
1508115073
"surface": "apple",
1508215074
"id": "native.apple.d4ef93e8ebca2d55"
1508315075
},
1508415076
{
1508515077
"kind": "ui-call",
15086-
"line": 218,
15078+
"line": 210,
1508715079
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1508815080
"source": "Version \\(version), commit unavailable, built \\(built), timestamp \\(timestamp)",
1508915081
"surface": "apple",
1509015082
"id": "native.apple.f67aac55a340fda0"
1509115083
},
1509215084
{
1509315085
"kind": "ui-call",
15094-
"line": 220,
15086+
"line": 212,
1509515087
"path": "apps/macos/Sources/OpenClaw/AboutSettings.swift",
1509615088
"source": "Version \\(version), commit unavailable, build date unavailable",
1509715089
"surface": "apple",
@@ -18947,15 +18939,15 @@
1894718939
},
1894818940
{
1894918941
"kind": "conditional-branch",
18950-
"line": 236,
18942+
"line": 237,
1895118943
"path": "apps/macos/Sources/OpenClaw/Onboarding.swift",
1895218944
"source": "Finish",
1895318945
"surface": "apple",
1895418946
"id": "native.apple.800d9fd07f5dde85"
1895518947
},
1895618948
{
1895718949
"kind": "conditional-branch",
18958-
"line": 236,
18950+
"line": 237,
1895918951
"path": "apps/macos/Sources/OpenClaw/Onboarding.swift",
1896018952
"source": "Next",
1896118953
"surface": "apple",
@@ -23505,6 +23497,14 @@
2350523497
"surface": "apple",
2350623498
"id": "native.apple.8d0606ab1a2c0f44"
2350723499
},
23500+
{
23501+
"kind": "ui-call",
23502+
"line": 547,
23503+
"path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/OpenClawMascotView.swift",
23504+
"source": "z",
23505+
"surface": "apple",
23506+
"id": "native.apple.f74d150ce05205dd"
23507+
},
2350823508
{
2350923509
"kind": "ui-modifier",
2351023510
"line": 39,

apps/ios/Sources/Design/OpenClawBrand.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,11 @@ enum OpenClawBrand {
210210

211211
struct OpenClawActivationGlyph: View {
212212
let size: CGFloat
213+
/// Opt-in tap Easter eggs; leave off when the glyph sits inside a control.
214+
var interactive = false
213215

214216
var body: some View {
215-
OpenClawMascotView(floats: false)
217+
OpenClawMascotView(floats: false, interactive: self.interactive)
216218
.frame(width: self.size, height: self.size)
217219
.shadow(
218220
color: OpenClawBrand.activationGlow.opacity(0.18),

apps/ios/Sources/Design/OpenClawProComponents.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,9 +592,11 @@ struct ProValuePill: View {
592592
struct OpenClawProMark: View {
593593
var size: CGFloat = 42
594594
var shadowRadius: CGFloat = 10
595+
/// Opt-in tap Easter eggs; leave off when the mark sits inside a control.
596+
var interactive = false
595597

596598
var body: some View {
597-
OpenClawMascotView()
599+
OpenClawMascotView(interactive: self.interactive)
598600
.frame(width: self.size, height: self.size)
599601
.shadow(color: OpenClawBrand.accent.opacity(0.18), radius: self.shadowRadius, y: self.shadowRadius / 3)
600602
.accessibilityLabel("OpenClaw")

apps/ios/Sources/Design/SettingsProTabSections.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ extension SettingsProTab {
694694
Group {
695695
Section {
696696
VStack(spacing: 12) {
697-
OpenClawProMark(size: 96, shadowRadius: 18)
697+
OpenClawProMark(size: 96, shadowRadius: 18, interactive: true)
698698
.accessibilityHidden(true)
699699
VStack(spacing: 2) {
700700
Text("OpenClaw")

apps/ios/Sources/Gateway/GatewayQuickSetupSheet.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ private struct GatewayQuickSetupHeader: View {
211211
var body: some View {
212212
VStack(alignment: .leading, spacing: 14) {
213213
ZStack(alignment: .bottomTrailing) {
214-
OpenClawActivationGlyph(size: 70)
214+
OpenClawActivationGlyph(size: 70, interactive: true)
215215
.shadow(color: OpenClawBrand.activationGlow.opacity(0.18), radius: 10, x: 0, y: 5)
216216

217217
Image(systemName: "antenna.radiowaves.left.and.right")

apps/ios/Sources/Onboarding/OnboardingWizardSteps.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ private struct OnboardingActivationCanvas<Content: View>: View {
2727

2828
private struct OnboardingHeroGlyph: View {
2929
var body: some View {
30-
OpenClawActivationGlyph(size: 78)
30+
OpenClawActivationGlyph(size: 78, interactive: true)
3131
}
3232
}
3333

@@ -361,7 +361,7 @@ struct OnboardingSuccessStep: View {
361361
Spacer(minLength: 54)
362362

363363
ZStack(alignment: .bottomTrailing) {
364-
OpenClawActivationGlyph(size: 86)
364+
OpenClawActivationGlyph(size: 86, interactive: true)
365365
.shadow(color: OpenClawBrand.activationGlow.opacity(0.18), radius: 12, x: 0, y: 6)
366366

367367
Image(systemName: "checkmark")

apps/macos/Sources/OpenClaw/AboutSettings.swift

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,21 @@ struct AboutSettings: View {
1212

1313
var body: some View {
1414
VStack(spacing: 8) {
15-
Button {
16-
if let url = URL(string: "https://github.com/openclaw/openclaw") {
17-
NSWorkspace.shared.open(url)
15+
// Hero treatment from openclaw.ai: coral silhouette glow at 10% of
16+
// size, teal glow at 15% plus scale 1.1 on hover. Clicks go to the
17+
// mascot's Easter eggs; the GitHub link lives in the row set below.
18+
OpenClawMascotView(interactive: true)
19+
.frame(width: 160, height: 160)
20+
.shadow(
21+
color: OpenClawMascotView.heroGlowColor(
22+
for: self.colorScheme,
23+
hovering: self.iconHover),
24+
radius: self.iconHover ? 24 : 16)
25+
.scaleEffect(self.iconHover ? 1.1 : 1.0)
26+
.pointingHandCursor()
27+
.onHover { hover in
28+
withAnimation(.spring(response: 0.3, dampingFraction: 0.72)) { self.iconHover = hover }
1829
}
19-
} label: {
20-
// Hero treatment from openclaw.ai: coral silhouette glow at 10% of
21-
// size, teal glow at 15% plus scale 1.1 on hover.
22-
OpenClawMascotView()
23-
.frame(width: 160, height: 160)
24-
.shadow(
25-
color: OpenClawMascotView.heroGlowColor(
26-
for: self.colorScheme,
27-
hovering: self.iconHover),
28-
radius: self.iconHover ? 24 : 16)
29-
.scaleEffect(self.iconHover ? 1.1 : 1.0)
30-
}
31-
.buttonStyle(.plain)
32-
.accessibilityLabel("OpenClaw on GitHub")
33-
.focusable(false)
34-
.pointingHandCursor()
35-
.onHover { hover in
36-
withAnimation(.spring(response: 0.3, dampingFraction: 0.72)) { self.iconHover = hover }
37-
}
3830

3931
VStack(spacing: 3) {
4032
Text("OpenClaw")

apps/macos/Sources/OpenClaw/Onboarding.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ struct OnboardingView: View {
149149
let cliPageIndex = 2
150150
let aiPageIndex = 3
151151
let onboardingChatPageIndex = 8
152+
let readyPageIndex = 9
152153

153154
let permissionsPageIndex = 5
154155

apps/macos/Sources/OpenClaw/OnboardingView+Layout.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ extension OnboardingView {
77
let contentHeight = self.contentHeight(for: windowGeometry.size.height)
88
VStack(spacing: 0) {
99
// Chat-heavy pages shrink the mascot so the content gets the room.
10-
GlowingOpenClawIcon(size: self.heroSize)
10+
GlowingOpenClawIcon(size: self.heroSize, mood: self.mascotMood)
1111
.offset(y: self.usesCompactHero ? 4 : 10)
1212
.frame(height: self.heroFrameHeight)
1313
.animation(.spring(response: 0.45, dampingFraction: 0.85), value: self.usesCompactHero)

0 commit comments

Comments
 (0)