@echomem/mcp 1.4.44 → 1.4.45
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/README.md +28 -25
- package/dist/city/README.md +9 -0
- package/dist/city/echo-ai-city-only.html +2232 -0
- package/dist/city/echo-extraction-plate.html +330 -0
- package/dist/city/echo-face-cutout.png +0 -0
- package/dist/city/personality_stickers/bossy.png +0 -0
- package/dist/city/personality_stickers/ghosty.png +0 -0
- package/dist/city/personality_stickers/loopy.png +0 -0
- package/dist/city/personality_stickers/lusty.png +0 -0
- package/dist/city/personality_stickers/maxxy.png +0 -0
- package/dist/city/personality_stickers/tabby.png +0 -0
- package/dist/city/vendor/OrbitControls.js +1417 -0
- package/dist/city/vendor/RoundedBoxGeometry.js +155 -0
- package/dist/city/vendor/echo_general-file-21.riv +0 -0
- package/dist/city/vendor/rive.js +8139 -0
- package/dist/city/vendor/rive.wasm +0 -0
- package/dist/city/vendor/three.module.min.js +6 -0
- package/dist/context-analysis/claude-native-canonical.js +2 -2
- package/dist/context-analysis/vendored-canonical.js +2 -2
- package/dist/context-analysis/workspace-report.js +3 -3
- package/dist/forensics.js +1531 -0
- package/dist/hud/hooks.js +31 -43
- package/dist/index.js +79 -15
- package/dist/local-data-paths.js +38 -0
- package/dist/migrate.js +140 -70
- package/dist/report.js +721 -0
- package/dist/save-checkpoint-hook.js +1 -1
- package/dist/setup-page/client-core.js +372 -18
- package/dist/setup-page/client-extraction.js +204 -37
- package/dist/setup-page/client-lifecycle.js +101 -31
- package/dist/setup-page/client-report-audit.js +819 -0
- package/dist/setup-page/client-report-city.js +356 -0
- package/dist/setup-page/client-report.js +6 -0
- package/dist/setup-page/client.js +2 -0
- package/dist/setup-page/styles-city-report.js +880 -0
- package/dist/setup-page/styles-context-audit.js +470 -0
- package/dist/setup-page/styles-extraction.js +31 -1
- package/dist/setup-page/styles-foundation.js +89 -0
- package/dist/setup-page/styles-mvp.js +155 -10
- package/dist/setup-page/styles-website-alignment.js +204 -0
- package/dist/setup-page/styles.js +4 -0
- package/dist/setup-page.js +4 -4
- package/dist/setup-preview.js +212 -4
- package/dist/setup.js +702 -321
- package/dist/source-session.js +3 -9
- package/dist/v1-contract.js +8 -0
- package/package.json +7 -9
- package/dist/config-files.js +0 -63
- package/dist/local-jsonl.js +0 -87
- package/dist/onboarding-stats.js +0 -16
|
@@ -105,6 +105,89 @@ export const SETUP_PAGE_STYLES_FOUNDATION = String.raw ` :root {
|
|
|
105
105
|
font-size: 16px;
|
|
106
106
|
text-align: center;
|
|
107
107
|
}
|
|
108
|
+
body.scanMode {
|
|
109
|
+
background: var(--echo-paper-canvas);
|
|
110
|
+
}
|
|
111
|
+
body.scanMode main {
|
|
112
|
+
width: 100%;
|
|
113
|
+
min-height: 100vh;
|
|
114
|
+
margin: 0;
|
|
115
|
+
padding: clamp(32px, 7vw, 96px);
|
|
116
|
+
display: grid;
|
|
117
|
+
place-items: center;
|
|
118
|
+
}
|
|
119
|
+
body.scanMode main > header {
|
|
120
|
+
display: none;
|
|
121
|
+
}
|
|
122
|
+
body.scanMode #app {
|
|
123
|
+
width: min(900px, 100%);
|
|
124
|
+
min-height: min(62vh, 620px);
|
|
125
|
+
display: grid;
|
|
126
|
+
place-items: center;
|
|
127
|
+
}
|
|
128
|
+
.scanLoader {
|
|
129
|
+
width: min(720px, 100%);
|
|
130
|
+
border-top: 1px solid #c9cbc6;
|
|
131
|
+
border-right: 1px solid #c9cbc6;
|
|
132
|
+
border-bottom: 1px solid #c9cbc6;
|
|
133
|
+
border-left: 5px solid var(--echo-ink-primary);
|
|
134
|
+
border-radius: 2px;
|
|
135
|
+
background: var(--echo-paper-white);
|
|
136
|
+
padding: clamp(30px, 6vw, 58px);
|
|
137
|
+
text-align: left;
|
|
138
|
+
}
|
|
139
|
+
.scanEyebrow {
|
|
140
|
+
margin: 0 0 22px;
|
|
141
|
+
color: var(--echo-ink-faint);
|
|
142
|
+
font-family: var(--echo-font-mono);
|
|
143
|
+
font-size: 14px;
|
|
144
|
+
font-weight: 700;
|
|
145
|
+
letter-spacing: 0.18em;
|
|
146
|
+
text-transform: uppercase;
|
|
147
|
+
}
|
|
148
|
+
.scanLoader h2 {
|
|
149
|
+
margin: 0;
|
|
150
|
+
color: var(--echo-ink-text);
|
|
151
|
+
font-size: clamp(42px, 5vw, 72px);
|
|
152
|
+
line-height: 1;
|
|
153
|
+
}
|
|
154
|
+
.scanProgress {
|
|
155
|
+
width: min(520px, 100%);
|
|
156
|
+
height: 6px;
|
|
157
|
+
margin: 38px 0 0;
|
|
158
|
+
overflow: hidden;
|
|
159
|
+
border-radius: 0;
|
|
160
|
+
background: #e2e3e9;
|
|
161
|
+
}
|
|
162
|
+
.scanProgressFill {
|
|
163
|
+
display: block;
|
|
164
|
+
height: 100%;
|
|
165
|
+
min-width: 10px;
|
|
166
|
+
border-radius: 0;
|
|
167
|
+
background: var(--echo-ink-primary);
|
|
168
|
+
/* Matched to the 700ms report poll so the fill glides between updates instead of
|
|
169
|
+
stepping and then sitting still for the rest of the interval. */
|
|
170
|
+
transition: width 700ms linear;
|
|
171
|
+
}
|
|
172
|
+
.scanCaption {
|
|
173
|
+
margin: 20px 0 0;
|
|
174
|
+
color: var(--echo-ink-faint);
|
|
175
|
+
font-family: var(--echo-font-mono);
|
|
176
|
+
font-size: 16px;
|
|
177
|
+
font-weight: 600;
|
|
178
|
+
line-height: 1.45;
|
|
179
|
+
}
|
|
180
|
+
body.cityMode {
|
|
181
|
+
background: var(--echo-paper-canvas);
|
|
182
|
+
}
|
|
183
|
+
body.cityMode main {
|
|
184
|
+
width: 100%;
|
|
185
|
+
padding: 0;
|
|
186
|
+
margin: 0;
|
|
187
|
+
}
|
|
188
|
+
body.cityMode main > header {
|
|
189
|
+
display: none;
|
|
190
|
+
}
|
|
108
191
|
body.extractMode main > header {
|
|
109
192
|
display: none;
|
|
110
193
|
}
|
|
@@ -127,6 +210,12 @@ export const SETUP_PAGE_STYLES_FOUNDATION = String.raw ` :root {
|
|
|
127
210
|
body.readyMode {
|
|
128
211
|
background: #f5f3ed;
|
|
129
212
|
}
|
|
213
|
+
body.cityMode #app {
|
|
214
|
+
display: block;
|
|
215
|
+
min-height: 100vh;
|
|
216
|
+
color: var(--echo-ink-text);
|
|
217
|
+
text-align: left;
|
|
218
|
+
}
|
|
130
219
|
body.extractMode #app {
|
|
131
220
|
width: 100%;
|
|
132
221
|
display: grid;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
// Final MVP onboarding layer. It deliberately mirrors the public Echo pricing,
|
|
2
|
-
// login,
|
|
2
|
+
// login, and report surfaces instead of introducing another local-only design system.
|
|
3
3
|
export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
4
4
|
body.readyMode,
|
|
5
|
+
body.scanMode,
|
|
5
6
|
body.extractMode {
|
|
6
7
|
background:
|
|
7
8
|
radial-gradient(circle, rgba(26,58,143,0.12) 0 1.2px, transparent 1.5px) 0 0 / 22px 22px,
|
|
8
9
|
var(--echo-paper-canvas);
|
|
9
10
|
}
|
|
10
|
-
body.readyMode main
|
|
11
|
+
body.readyMode main,
|
|
12
|
+
body.scanMode main,
|
|
11
13
|
body.extractMode main {
|
|
12
14
|
width: 100%;
|
|
13
15
|
min-height: 100vh;
|
|
@@ -17,17 +19,19 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
17
19
|
}
|
|
18
20
|
main > header { display: none; }
|
|
19
21
|
#app.state { color: transparent; }
|
|
20
|
-
body.readyMode #app
|
|
22
|
+
body.readyMode #app,
|
|
23
|
+
body.scanMode #app,
|
|
21
24
|
body.extractMode #app {
|
|
22
25
|
width: 100%;
|
|
23
26
|
min-height: calc(100vh - clamp(56px, 10vw, 128px));
|
|
24
27
|
}
|
|
25
|
-
body.readyMode #app:has(> .setupJourney)
|
|
28
|
+
body.readyMode #app:has(> .setupJourney),
|
|
29
|
+
body.scanMode #app:has(> .setupJourney),
|
|
26
30
|
body.extractMode #app:has(> .setupJourney) {
|
|
27
31
|
padding-top: 0 !important;
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
/* One calm map across
|
|
34
|
+
/* One calm map across local scan, account/Stripe, import, and first value. */
|
|
31
35
|
.setupJourney {
|
|
32
36
|
width: min(760px, 100%);
|
|
33
37
|
flex: 0 0 auto;
|
|
@@ -36,7 +40,7 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
36
40
|
}
|
|
37
41
|
.setupJourney ol {
|
|
38
42
|
display: grid;
|
|
39
|
-
grid-template-columns: repeat(
|
|
43
|
+
grid-template-columns: repeat(5, minmax(0, 1fr));
|
|
40
44
|
gap: 0;
|
|
41
45
|
margin: 0;
|
|
42
46
|
padding: 0;
|
|
@@ -95,6 +99,11 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
95
99
|
box-shadow: 0 0 0 4px rgba(26,58,143,0.09);
|
|
96
100
|
color: white;
|
|
97
101
|
}
|
|
102
|
+
body.cityMode .setupJourney {
|
|
103
|
+
margin-top: 12px;
|
|
104
|
+
margin-bottom: 8px;
|
|
105
|
+
padding-inline: 18px;
|
|
106
|
+
}
|
|
98
107
|
#setupJourneySlot {
|
|
99
108
|
width: 100%;
|
|
100
109
|
flex: 0 0 auto;
|
|
@@ -142,6 +151,21 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
142
151
|
text-align: center;
|
|
143
152
|
}
|
|
144
153
|
.mvpConsentTrustLine strong { color: var(--echo-ink-text); }
|
|
154
|
+
.mvpReportPreview { overflow: hidden; border: 1px solid rgba(26,58,143,0.18); border-radius: 18px; background: rgba(255,255,255,0.84); box-shadow: 0 16px 36px -26px rgba(26,58,143,0.42); }
|
|
155
|
+
.mvpReportPreview header { display: flex; align-items: center; gap: 13px; border-bottom: 1px solid rgba(26,58,143,0.10); background: color-mix(in srgb, var(--echo-paper-white) 66%, var(--echo-note-blue) 34%); padding: 13px 15px; }
|
|
156
|
+
.mvpReportPreview header span,
|
|
157
|
+
.mvpReportPreview header small,
|
|
158
|
+
.mvpReportPreview header strong,
|
|
159
|
+
.mvpPreviewRow span,
|
|
160
|
+
.mvpPreviewRow small,
|
|
161
|
+
.mvpPreviewRow strong { display: block; }
|
|
162
|
+
.mvpReportPreview header small { color: var(--echo-ink-primary); font: 800 9px/1 var(--echo-font-mono); letter-spacing: 0.1em; text-transform: uppercase; }
|
|
163
|
+
.mvpReportPreview header strong { margin-top: 5px; color: var(--echo-ink-text); font-size: 15px; }
|
|
164
|
+
.mvpPreviewRow { display: grid; grid-template-columns: 22px minmax(0, 1fr); gap: 10px; align-items: start; padding: 11px 15px; }
|
|
165
|
+
.mvpPreviewRow + .mvpPreviewRow { border-top: 1px solid rgba(26,58,143,0.08); }
|
|
166
|
+
.mvpPreviewRow .setupGlyph { width: 19px; height: 19px; color: #2c8f68; }
|
|
167
|
+
.mvpPreviewRow strong { color: var(--echo-ink-text); font-size: 13px; }
|
|
168
|
+
.mvpPreviewRow small { margin-top: 2px; color: var(--echo-ink-mute); font-size: 11px; line-height: 1.35; }
|
|
145
169
|
.mvpTrustCard { display: grid; grid-template-columns: 38px minmax(0, 1fr) auto; gap: 12px; align-items: center; border: 1px solid rgba(44,143,104,0.28); border-radius: 15px; background: color-mix(in srgb, var(--echo-paper-white) 62%, var(--echo-note-mint) 38%); padding: 13px 15px; }
|
|
146
170
|
.mvpTrustIcon { width: 38px; height: 38px; display: grid; place-items: center; border-radius: 50%; background: rgba(44,143,104,0.13); color: #257b59; }
|
|
147
171
|
.mvpTrustIcon .setupGlyph { width: 21px; height: 21px; }
|
|
@@ -513,6 +537,125 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
513
537
|
font-weight: 750;
|
|
514
538
|
}
|
|
515
539
|
|
|
540
|
+
/* Reading --------------------------------------------------------------- */
|
|
541
|
+
.scanLoading {
|
|
542
|
+
display: flex !important;
|
|
543
|
+
flex-direction: column;
|
|
544
|
+
align-items: center;
|
|
545
|
+
justify-content: flex-start;
|
|
546
|
+
}
|
|
547
|
+
.scanLoading .mvpReading {
|
|
548
|
+
margin-block: auto;
|
|
549
|
+
}
|
|
550
|
+
.mvpReading {
|
|
551
|
+
display: flex;
|
|
552
|
+
width: min(460px, 100%);
|
|
553
|
+
flex-direction: column;
|
|
554
|
+
align-items: center;
|
|
555
|
+
color: var(--echo-ink-text);
|
|
556
|
+
text-align: center;
|
|
557
|
+
}
|
|
558
|
+
.mvpReadingMascot {
|
|
559
|
+
display: block;
|
|
560
|
+
width: 150px;
|
|
561
|
+
height: 150px;
|
|
562
|
+
margin: 0 auto 18px;
|
|
563
|
+
object-fit: contain;
|
|
564
|
+
filter: none;
|
|
565
|
+
}
|
|
566
|
+
.mvpReading h2 {
|
|
567
|
+
margin: 0;
|
|
568
|
+
color: var(--echo-ink-primary);
|
|
569
|
+
font: 650 38px/1.05 var(--echo-font-script), cursive;
|
|
570
|
+
}
|
|
571
|
+
.mvpReadingCount {
|
|
572
|
+
min-height: 18px;
|
|
573
|
+
margin: 13px 0 0;
|
|
574
|
+
color: var(--echo-ink-mute);
|
|
575
|
+
font: 650 13px/1.4 var(--echo-font-mono);
|
|
576
|
+
}
|
|
577
|
+
.mvpReadingCount[hidden] {
|
|
578
|
+
display: block;
|
|
579
|
+
visibility: hidden;
|
|
580
|
+
}
|
|
581
|
+
.mvpReadingEta {
|
|
582
|
+
min-height: 17px;
|
|
583
|
+
margin: 5px 0 0;
|
|
584
|
+
color: var(--echo-ink-faint);
|
|
585
|
+
font: 600 12px/1.4 var(--echo-font-mono);
|
|
586
|
+
font-variant-numeric: tabular-nums;
|
|
587
|
+
}
|
|
588
|
+
.mvpReadingProgress {
|
|
589
|
+
width: min(260px, 100%);
|
|
590
|
+
height: 3px;
|
|
591
|
+
margin: 8px 0 0;
|
|
592
|
+
background: rgba(26,58,143,0.12);
|
|
593
|
+
}
|
|
594
|
+
.discoveryLoader {
|
|
595
|
+
width: 100%;
|
|
596
|
+
min-height: min(62vh, 620px);
|
|
597
|
+
display: grid;
|
|
598
|
+
place-items: center;
|
|
599
|
+
}
|
|
600
|
+
.discoverySpinner span {
|
|
601
|
+
display: block;
|
|
602
|
+
width: 26px;
|
|
603
|
+
height: 26px;
|
|
604
|
+
border: 3px solid rgba(26,58,143,0.16);
|
|
605
|
+
border-top-color: var(--echo-ink-primary);
|
|
606
|
+
border-radius: 50%;
|
|
607
|
+
animation: localAuthSpin 700ms linear infinite;
|
|
608
|
+
}
|
|
609
|
+
.extractionStartStage {
|
|
610
|
+
display: flex !important;
|
|
611
|
+
flex-direction: column;
|
|
612
|
+
align-items: center;
|
|
613
|
+
justify-content: flex-start;
|
|
614
|
+
}
|
|
615
|
+
.extractionStartStage .discoverySpinner {
|
|
616
|
+
display: grid;
|
|
617
|
+
flex: 1 1 auto;
|
|
618
|
+
place-items: center;
|
|
619
|
+
}
|
|
620
|
+
.reportMessageStage {
|
|
621
|
+
display: flex !important;
|
|
622
|
+
justify-content: center;
|
|
623
|
+
color: var(--echo-ink-text);
|
|
624
|
+
}
|
|
625
|
+
.reportMessage {
|
|
626
|
+
width: min(620px, 100%);
|
|
627
|
+
padding-top: clamp(48px, 10vh, 112px);
|
|
628
|
+
}
|
|
629
|
+
.reportMessage h2 {
|
|
630
|
+
margin: 0;
|
|
631
|
+
font-size: clamp(42px, 5vw, 58px);
|
|
632
|
+
font-weight: 650;
|
|
633
|
+
line-height: 1;
|
|
634
|
+
letter-spacing: -0.045em;
|
|
635
|
+
}
|
|
636
|
+
.reportMessage p {
|
|
637
|
+
margin: 16px 0 0;
|
|
638
|
+
color: var(--echo-ink-mute);
|
|
639
|
+
font-size: 16px;
|
|
640
|
+
line-height: 1.55;
|
|
641
|
+
}
|
|
642
|
+
.reportMessage code {
|
|
643
|
+
color: var(--echo-ink-primary);
|
|
644
|
+
font-family: var(--echo-font-mono);
|
|
645
|
+
}
|
|
646
|
+
.reportTechnical {
|
|
647
|
+
width: fit-content;
|
|
648
|
+
margin-top: 22px;
|
|
649
|
+
color: var(--echo-ink-faint);
|
|
650
|
+
font: 650 11px/1.5 var(--echo-font-mono);
|
|
651
|
+
}
|
|
652
|
+
.reportTechnical summary {
|
|
653
|
+
cursor: pointer;
|
|
654
|
+
text-decoration: underline;
|
|
655
|
+
text-underline-offset: 3px;
|
|
656
|
+
}
|
|
657
|
+
.reportTechnical code { display: block; margin-top: 8px; }
|
|
658
|
+
|
|
516
659
|
/* Pricing copied from the public Echo habitat -------------------------- */
|
|
517
660
|
.planGateStage {
|
|
518
661
|
display: flex !important;
|
|
@@ -1432,7 +1575,7 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
1432
1575
|
box-shadow: 0 6px 0 color-mix(in srgb, var(--echo-ink-primary) 77%, black);
|
|
1433
1576
|
}
|
|
1434
1577
|
|
|
1435
|
-
/* Extraction
|
|
1578
|
+
/* Extraction: let the existing animated plate carry the page ----------- */
|
|
1436
1579
|
.exHero {
|
|
1437
1580
|
width: min(1180px, 100%);
|
|
1438
1581
|
min-height: calc(100vh - clamp(56px, 10vw, 128px));
|
|
@@ -1442,8 +1585,7 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
1442
1585
|
box-shadow: none;
|
|
1443
1586
|
}
|
|
1444
1587
|
.exHero.exHeroActive {
|
|
1445
|
-
|
|
1446
|
-
grid-template-columns: minmax(0, 1fr);
|
|
1588
|
+
grid-template-columns: minmax(320px, 0.72fr) minmax(460px, 1.28fr);
|
|
1447
1589
|
align-items: center;
|
|
1448
1590
|
}
|
|
1449
1591
|
.exHeroActive #exText { padding: clamp(20px, 4vw, 44px); }
|
|
@@ -1468,6 +1610,7 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
1468
1610
|
-webkit-text-fill-color: var(--echo-ink-primary);
|
|
1469
1611
|
font-weight: 650;
|
|
1470
1612
|
}
|
|
1613
|
+
.exHeroActive .exPlate { min-height: min(72vh, 720px); }
|
|
1471
1614
|
.exHeroActive .exMeter {
|
|
1472
1615
|
margin-top: 28px;
|
|
1473
1616
|
border: 0;
|
|
@@ -1592,9 +1735,11 @@ export const SETUP_PAGE_STYLES_MVP = String.raw `
|
|
|
1592
1735
|
.checkoutCommitment,
|
|
1593
1736
|
.checkoutActions { grid-template-columns: 1fr; }
|
|
1594
1737
|
.exHero.exHeroActive { grid-template-columns: 1fr; }
|
|
1595
|
-
}
|
|
1738
|
+
.exHeroActive .exPlate { min-height: 440px; }
|
|
1739
|
+
}
|
|
1596
1740
|
@media (max-width: 560px) {
|
|
1597
1741
|
body.readyMode main,
|
|
1742
|
+
body.scanMode main,
|
|
1598
1743
|
body.extractMode main { padding: 22px 14px 38px; }
|
|
1599
1744
|
.setupJourney { margin-bottom: 24px; }
|
|
1600
1745
|
.mvpConsentFooter { align-items: stretch; flex-direction: column; }
|
|
@@ -88,6 +88,171 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
|
|
|
88
88
|
box-shadow: none;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
/* Local scan -------------------------------------------------------------- */
|
|
92
|
+
body.scanMode {
|
|
93
|
+
background:
|
|
94
|
+
radial-gradient(circle, rgba(26,58,143,0.075) 0 1px, transparent 1.35px) 0 0 / 18px 18px,
|
|
95
|
+
radial-gradient(circle, rgba(78,205,196,0.07) 0 1px, transparent 1.35px) 9px 9px / 22px 22px,
|
|
96
|
+
var(--echo-paper-canvas);
|
|
97
|
+
}
|
|
98
|
+
body.scanMode main {
|
|
99
|
+
padding: clamp(32px, 6vw, 72px) clamp(18px, 5vw, 58px);
|
|
100
|
+
}
|
|
101
|
+
body.scanMode #app {
|
|
102
|
+
width: min(860px, 100%);
|
|
103
|
+
min-height: min(72vh, 680px);
|
|
104
|
+
}
|
|
105
|
+
.scanLoader {
|
|
106
|
+
position: relative;
|
|
107
|
+
overflow: visible;
|
|
108
|
+
width: min(760px, 100%);
|
|
109
|
+
border: 1.5px solid rgba(26,58,143,0.20);
|
|
110
|
+
border-radius: var(--echo-radius-panel);
|
|
111
|
+
background: rgba(255,255,255,0.92);
|
|
112
|
+
padding: clamp(26px, 5vw, 48px);
|
|
113
|
+
box-shadow: var(--echo-shadow-pop);
|
|
114
|
+
}
|
|
115
|
+
.scanLoader::before {
|
|
116
|
+
content: "";
|
|
117
|
+
position: absolute;
|
|
118
|
+
top: -11px;
|
|
119
|
+
left: 50%;
|
|
120
|
+
z-index: 2;
|
|
121
|
+
width: 88px;
|
|
122
|
+
height: 25px;
|
|
123
|
+
border: 1px solid rgba(43,42,38,0.07);
|
|
124
|
+
background: color-mix(in srgb, var(--echo-note-cream) 72%, white 28%);
|
|
125
|
+
box-shadow: 0 1px 2px rgba(43,42,38,0.07);
|
|
126
|
+
opacity: 0.82;
|
|
127
|
+
transform: translateX(-50%) rotate(-1deg);
|
|
128
|
+
}
|
|
129
|
+
.scanLoaderLead {
|
|
130
|
+
display: grid;
|
|
131
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
132
|
+
align-items: center;
|
|
133
|
+
gap: clamp(20px, 4vw, 34px);
|
|
134
|
+
}
|
|
135
|
+
.scanMascot {
|
|
136
|
+
display: grid;
|
|
137
|
+
place-items: center;
|
|
138
|
+
width: clamp(108px, 14vw, 132px);
|
|
139
|
+
aspect-ratio: 1;
|
|
140
|
+
flex: 0 0 auto;
|
|
141
|
+
border: 1px solid rgba(26,58,143,0.11);
|
|
142
|
+
border-radius: 20px;
|
|
143
|
+
background: color-mix(in srgb, var(--echo-paper-white) 64%, var(--echo-note-cream) 36%);
|
|
144
|
+
box-shadow: var(--echo-shadow-paper);
|
|
145
|
+
overflow: hidden;
|
|
146
|
+
transform: rotate(-1.5deg);
|
|
147
|
+
}
|
|
148
|
+
.scanMascotFrames {
|
|
149
|
+
position: relative;
|
|
150
|
+
display: block;
|
|
151
|
+
width: 100%;
|
|
152
|
+
height: 100%;
|
|
153
|
+
}
|
|
154
|
+
.scanMascotFrame {
|
|
155
|
+
position: absolute;
|
|
156
|
+
inset: 0;
|
|
157
|
+
display: block;
|
|
158
|
+
width: 100%;
|
|
159
|
+
height: 100%;
|
|
160
|
+
object-fit: contain;
|
|
161
|
+
opacity: 0;
|
|
162
|
+
filter: drop-shadow(0 12px 14px rgba(26,58,143,0.16));
|
|
163
|
+
animation: scanMascotFrame 4.2s linear infinite;
|
|
164
|
+
}
|
|
165
|
+
/* Keep the ready pose mounted underneath every animated frame. This prevents
|
|
166
|
+
a transparent flash at loop boundaries or while a later PNG is decoding. */
|
|
167
|
+
.scanMascotFrame:nth-child(1) {
|
|
168
|
+
opacity: 1;
|
|
169
|
+
animation: none;
|
|
170
|
+
}
|
|
171
|
+
.scanMascotFrame:nth-child(2) { animation-delay: 0.6s; }
|
|
172
|
+
.scanMascotFrame:nth-child(3) { animation-delay: 1.2s; }
|
|
173
|
+
.scanMascotFrame:nth-child(4) { animation-delay: 1.8s; }
|
|
174
|
+
.scanMascotFrame:nth-child(5) { animation-delay: 2.4s; }
|
|
175
|
+
.scanMascotFrame:nth-child(6) { animation-delay: 3s; }
|
|
176
|
+
.scanMascotFrame:nth-child(7) { animation-delay: 3.6s; }
|
|
177
|
+
@keyframes scanMascotFrame {
|
|
178
|
+
0%, 14.4% { opacity: 1; }
|
|
179
|
+
14.5%, 100% { opacity: 0; }
|
|
180
|
+
}
|
|
181
|
+
.scanLoaderCopy { min-width: 0; }
|
|
182
|
+
.scanEyebrow {
|
|
183
|
+
width: fit-content;
|
|
184
|
+
margin: 0 0 15px;
|
|
185
|
+
border: 1px solid rgba(26,58,143,0.13);
|
|
186
|
+
border-radius: 999px;
|
|
187
|
+
background: rgba(255,255,255,0.72);
|
|
188
|
+
padding: 6px 11px;
|
|
189
|
+
box-shadow: var(--echo-shadow-glass);
|
|
190
|
+
color: color-mix(in srgb, var(--echo-ink-primary) 70%, var(--echo-ink-accent) 30%);
|
|
191
|
+
font-size: 11px;
|
|
192
|
+
letter-spacing: 0.11em;
|
|
193
|
+
}
|
|
194
|
+
.scanLoader h2.siteHeadline {
|
|
195
|
+
max-width: 560px;
|
|
196
|
+
font-size: clamp(40px, 6vw, 64px);
|
|
197
|
+
line-height: 0.98;
|
|
198
|
+
}
|
|
199
|
+
.scanIntro {
|
|
200
|
+
max-width: 520px;
|
|
201
|
+
margin: 18px 0 0;
|
|
202
|
+
color: var(--echo-ink-mute);
|
|
203
|
+
font-size: 15px;
|
|
204
|
+
font-weight: 500;
|
|
205
|
+
line-height: 1.55;
|
|
206
|
+
}
|
|
207
|
+
.scanProgressCard {
|
|
208
|
+
margin-top: clamp(26px, 5vw, 38px);
|
|
209
|
+
border: 1px solid rgba(26,58,143,0.10);
|
|
210
|
+
border-radius: var(--echo-radius-card);
|
|
211
|
+
background: color-mix(in srgb, var(--echo-paper-white) 68%, var(--echo-note-blue) 32%);
|
|
212
|
+
padding: 17px 18px 15px;
|
|
213
|
+
box-shadow: var(--echo-shadow-paper);
|
|
214
|
+
}
|
|
215
|
+
.scanProgress {
|
|
216
|
+
width: 100%;
|
|
217
|
+
height: 10px;
|
|
218
|
+
margin: 0;
|
|
219
|
+
border-radius: 999px;
|
|
220
|
+
background: rgba(255,255,255,0.78);
|
|
221
|
+
box-shadow: inset 0 1px 3px rgba(20,24,34,0.10);
|
|
222
|
+
}
|
|
223
|
+
.scanProgressFill {
|
|
224
|
+
min-width: 10px;
|
|
225
|
+
border-radius: 999px;
|
|
226
|
+
background: linear-gradient(90deg, var(--echo-ink-primary), color-mix(in srgb, var(--echo-ink-primary) 72%, var(--echo-ink-accent) 28%));
|
|
227
|
+
box-shadow: 0 0 0 1px rgba(26,58,143,0.08), 0 3px 9px rgba(26,58,143,0.20);
|
|
228
|
+
}
|
|
229
|
+
.scanCaption {
|
|
230
|
+
margin: 12px 0 0;
|
|
231
|
+
color: var(--echo-ink-mute);
|
|
232
|
+
font-size: 12px;
|
|
233
|
+
font-weight: 700;
|
|
234
|
+
line-height: 1.5;
|
|
235
|
+
}
|
|
236
|
+
.scanPrivacy {
|
|
237
|
+
display: flex;
|
|
238
|
+
align-items: center;
|
|
239
|
+
gap: 8px;
|
|
240
|
+
margin: 15px 2px 0;
|
|
241
|
+
color: var(--echo-ink-faint);
|
|
242
|
+
font-family: var(--echo-font-mono);
|
|
243
|
+
font-size: 11px;
|
|
244
|
+
font-weight: 600;
|
|
245
|
+
line-height: 1.45;
|
|
246
|
+
}
|
|
247
|
+
.scanPrivacy > span {
|
|
248
|
+
width: 8px;
|
|
249
|
+
height: 8px;
|
|
250
|
+
flex: 0 0 auto;
|
|
251
|
+
border-radius: 50%;
|
|
252
|
+
background: var(--echo-ink-accent-deep);
|
|
253
|
+
box-shadow: 0 0 0 4px rgba(78,205,196,0.13);
|
|
254
|
+
}
|
|
255
|
+
|
|
91
256
|
/* Permission and skip states ------------------------------------------------ */
|
|
92
257
|
.localConsent {
|
|
93
258
|
overflow: visible;
|
|
@@ -789,6 +954,38 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
|
|
|
789
954
|
.skipStage {
|
|
790
955
|
border-radius: 18px;
|
|
791
956
|
}
|
|
957
|
+
body.scanMode main {
|
|
958
|
+
padding: 34px 14px 52px;
|
|
959
|
+
}
|
|
960
|
+
body.scanMode #app {
|
|
961
|
+
min-height: calc(100vh - 86px);
|
|
962
|
+
}
|
|
963
|
+
.scanLoader {
|
|
964
|
+
border-radius: 18px;
|
|
965
|
+
padding: 28px 20px 22px;
|
|
966
|
+
}
|
|
967
|
+
.scanLoaderLead {
|
|
968
|
+
grid-template-columns: 1fr;
|
|
969
|
+
gap: 18px;
|
|
970
|
+
}
|
|
971
|
+
.scanMascot {
|
|
972
|
+
width: 88px;
|
|
973
|
+
border-radius: 16px;
|
|
974
|
+
}
|
|
975
|
+
.scanLoader h2.siteHeadline {
|
|
976
|
+
font-size: clamp(38px, 12vw, 52px);
|
|
977
|
+
}
|
|
978
|
+
.scanIntro {
|
|
979
|
+
margin-top: 14px;
|
|
980
|
+
font-size: 14px;
|
|
981
|
+
}
|
|
982
|
+
.scanProgressCard {
|
|
983
|
+
margin-top: 24px;
|
|
984
|
+
padding: 15px 14px 13px;
|
|
985
|
+
}
|
|
986
|
+
.scanPrivacy {
|
|
987
|
+
align-items: flex-start;
|
|
988
|
+
}
|
|
792
989
|
.consentLead,
|
|
793
990
|
.skippedEcho {
|
|
794
991
|
border-radius: 16px 16px 0 0;
|
|
@@ -847,5 +1044,12 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
|
|
|
847
1044
|
transition: none;
|
|
848
1045
|
transform: none;
|
|
849
1046
|
}
|
|
1047
|
+
.scanMascotFrame {
|
|
1048
|
+
animation: none;
|
|
1049
|
+
opacity: 0;
|
|
1050
|
+
}
|
|
1051
|
+
.scanMascotFrame:first-child {
|
|
1052
|
+
opacity: 1;
|
|
1053
|
+
}
|
|
850
1054
|
}
|
|
851
1055
|
`;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { SETUP_PAGE_STYLES_FOUNDATION } from "./styles-foundation.js";
|
|
2
|
+
import { SETUP_PAGE_STYLES_CITY_REPORT } from "./styles-city-report.js";
|
|
2
3
|
import { SETUP_PAGE_STYLES_EXTRACTION } from "./styles-extraction.js";
|
|
4
|
+
import { SETUP_PAGE_STYLES_CONTEXT_AUDIT } from "./styles-context-audit.js";
|
|
3
5
|
import { SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT } from "./styles-website-alignment.js";
|
|
4
6
|
import { SETUP_PAGE_STYLES_MVP } from "./styles-mvp.js";
|
|
5
7
|
// Kept as one emitted style tag so the local HTML page remains self-contained.
|
|
6
8
|
export const SETUP_PAGE_STYLES = [
|
|
7
9
|
SETUP_PAGE_STYLES_FOUNDATION,
|
|
10
|
+
SETUP_PAGE_STYLES_CITY_REPORT,
|
|
8
11
|
SETUP_PAGE_STYLES_EXTRACTION,
|
|
12
|
+
SETUP_PAGE_STYLES_CONTEXT_AUDIT,
|
|
9
13
|
SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT,
|
|
10
14
|
SETUP_PAGE_STYLES_MVP,
|
|
11
15
|
].join("\n");
|
package/dist/setup-page.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { renderSetupPageDocument } from "./setup-page/document.js";
|
|
2
2
|
import { renderSetupPreviewBootstrap } from "./setup-preview.js";
|
|
3
|
-
export { SETUP_PREVIEW_STATES } from "./setup-preview.js";
|
|
3
|
+
export { SETUP_PREVIEW_REPORT, SETUP_PREVIEW_STATES } from "./setup-preview.js";
|
|
4
4
|
/**
|
|
5
5
|
* Setup page entry point. The implementation is split by product phase under ./setup-page/:
|
|
6
|
-
* core utilities, post-auth extraction, and lifecycle polling.
|
|
6
|
+
* core utilities, local report, post-auth extraction, and lifecycle polling.
|
|
7
7
|
*/
|
|
8
8
|
export function renderSetupPage(options = {}) {
|
|
9
9
|
const previewState = options.previewState ?? null;
|
|
10
10
|
const startupScript = previewState
|
|
11
11
|
? renderSetupPreviewBootstrap(previewState)
|
|
12
12
|
: `
|
|
13
|
-
init().catch(function (
|
|
14
|
-
|
|
13
|
+
init().catch(function () {
|
|
14
|
+
renderReportIssue("SETUP_INITIALIZATION_FAILED", "The local setup page could not start. Close this tab and run echomem-mcp init again.");
|
|
15
15
|
});`;
|
|
16
16
|
return renderSetupPageDocument({ previewState, startupScript });
|
|
17
17
|
}
|