@echomem/mcp 1.4.19 → 1.4.21

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.
@@ -139,6 +139,129 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
139
139
  font-size: 12px;
140
140
  font-weight: 650;
141
141
  }
142
+ .localAuthStage {
143
+ display: grid;
144
+ place-items: center;
145
+ width: min(720px, 100%);
146
+ min-height: min(660px, calc(100vh - 120px));
147
+ margin: 0 auto;
148
+ }
149
+ .localAuthCard {
150
+ width: min(680px, 100%);
151
+ border: 1.5px solid rgba(26,58,143,0.16);
152
+ border-radius: 20px;
153
+ background: rgba(255,255,255,0.88);
154
+ padding: clamp(22px, 4vw, 34px);
155
+ box-shadow: 0 24px 60px -42px rgba(20,36,84,0.48);
156
+ text-align: left;
157
+ }
158
+ .localAuthLead {
159
+ display: grid;
160
+ justify-items: start;
161
+ gap: 10px;
162
+ }
163
+ .localAuthLead img {
164
+ width: 58px;
165
+ height: 58px;
166
+ object-fit: contain;
167
+ filter: drop-shadow(0 10px 16px rgba(26,58,143,0.18));
168
+ }
169
+ .localAuthLead h2 {
170
+ max-width: 610px;
171
+ font-size: clamp(30px, 4vw, 46px);
172
+ line-height: 1;
173
+ }
174
+ .localAuthLead p:not(.consentEyebrow) {
175
+ max-width: 590px;
176
+ margin: 0;
177
+ color: var(--echo-ink-mute);
178
+ font-size: 15px;
179
+ line-height: 1.55;
180
+ }
181
+ .localAuthForm {
182
+ display: grid;
183
+ gap: 14px;
184
+ margin-top: 22px;
185
+ }
186
+ .localAuthField {
187
+ display: grid;
188
+ gap: 7px;
189
+ }
190
+ .localAuthField > span {
191
+ font-family: var(--echo-font-mono);
192
+ color: var(--echo-ink-mute);
193
+ font-size: 11px;
194
+ font-weight: 800;
195
+ letter-spacing: 0.06em;
196
+ text-transform: uppercase;
197
+ }
198
+ .localAuthField input {
199
+ width: 100%;
200
+ min-height: 50px;
201
+ border: 1px solid rgba(26,58,143,0.20);
202
+ border-radius: 10px;
203
+ background: #fff;
204
+ color: var(--echo-ink-text);
205
+ padding: 0 14px;
206
+ font: inherit;
207
+ font-size: 16px;
208
+ outline: none;
209
+ }
210
+ .localAuthField input:focus {
211
+ border-color: var(--echo-ink-primary);
212
+ box-shadow: 0 0 0 3px rgba(26,58,143,0.12);
213
+ }
214
+ .localAuthLegal {
215
+ display: grid;
216
+ gap: 10px;
217
+ border: 1px solid rgba(26,58,143,0.10);
218
+ border-radius: 14px;
219
+ background: rgba(240,239,233,0.56);
220
+ padding: 13px 14px;
221
+ }
222
+ .localAuthLegal label {
223
+ display: grid;
224
+ grid-template-columns: 18px minmax(0, 1fr);
225
+ gap: 10px;
226
+ align-items: start;
227
+ color: var(--echo-ink-mute);
228
+ font-size: 12px;
229
+ line-height: 1.45;
230
+ }
231
+ .localAuthLegal input {
232
+ width: 16px;
233
+ height: 16px;
234
+ margin: 2px 0 0;
235
+ accent-color: var(--echo-ink-primary);
236
+ }
237
+ .localAuthLegal a {
238
+ color: var(--echo-ink-primary);
239
+ font-weight: 750;
240
+ text-decoration: underline;
241
+ text-underline-offset: 2px;
242
+ }
243
+ .localAuthActions {
244
+ display: flex;
245
+ flex-wrap: wrap;
246
+ gap: 10px;
247
+ align-items: center;
248
+ }
249
+ .localAuthStatus {
250
+ min-height: 18px;
251
+ margin: 0;
252
+ color: var(--echo-ink-mute);
253
+ font-size: 13px;
254
+ line-height: 1.45;
255
+ }
256
+ .localAuthStatus:empty { display: none; }
257
+ .localAuthStatus.is-error {
258
+ border: 1px solid rgba(139,44,38,0.22);
259
+ border-radius: 10px;
260
+ background: #fff4ee;
261
+ padding: 9px 11px;
262
+ color: #8b2c26;
263
+ font-weight: 650;
264
+ }
142
265
  .track { height: 12px; overflow: hidden; border-radius: 999px; background: #e8e8e1; margin: 16px 0 10px; }
143
266
  .fill { height: 100%; width: 0%; background: var(--echo-ink-primary); transition: width 180ms ease; }
144
267
  /* indeterminate "we're working on it" bar for the prep phase (before job counts move) */
@@ -173,6 +296,8 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
173
296
  .explainCta .promiseActions { width: 100%; }
174
297
  .explainCta .primary, .explainCta .secondary { width: 100%; }
175
298
  .consentActions .primary { width: 100%; }
299
+ .localAuthActions .primary,
300
+ .localAuthForm > .primary { width: 100%; }
176
301
  .cityHero { min-height: auto; }
177
302
  .cityShell {
178
303
  width: 100vw;
@@ -271,6 +396,11 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
271
396
  border-radius: 14px;
272
397
  box-shadow: 0 18px 34px -20px rgba(26,58,143,0.62);
273
398
  }
399
+ .readyDecision .actions .skipHistoryButton {
400
+ min-height: 58px;
401
+ padding: 0 22px;
402
+ border-radius: 14px;
403
+ }
274
404
  .readyDecision .actions .primary:not(:disabled):hover { box-shadow: 0 22px 38px -18px rgba(26,58,143,0.66); }
275
405
  .readyDecision .actions .primary .setupGlyph { width: 19px; height: 19px; }
276
406
  /* Proof strip: one quiet line of evidence (source split), not stat cards. Centered. */
@@ -1383,6 +1513,7 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
1383
1513
 
1384
1514
  .sessionPicker {
1385
1515
  width: min(860px, calc(100vw - 32px));
1516
+ height: min(780px, calc(100vh - 32px));
1386
1517
  max-height: min(780px, calc(100vh - 32px));
1387
1518
  margin: auto;
1388
1519
  border: 0;
@@ -1393,7 +1524,7 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
1393
1524
  box-shadow: 0 34px 90px -30px rgba(10,18,46,0.68);
1394
1525
  }
1395
1526
  .sessionPicker::backdrop { background: rgba(13,21,43,0.62); backdrop-filter: blur(4px); }
1396
- .sessionPickerShell { display: grid; grid-template-rows: auto auto auto minmax(180px, 1fr) auto; max-height: min(780px, calc(100vh - 32px)); background: var(--echo-paper-white); }
1527
+ .sessionPickerShell { display: grid; grid-template-rows: auto auto auto minmax(0, 1fr) auto; height: 100%; min-height: 0; max-height: min(780px, calc(100vh - 32px)); overflow: hidden; background: var(--echo-paper-white); }
1397
1528
  .sessionPickerHead {
1398
1529
  display: flex;
1399
1530
  align-items: flex-start;
@@ -1465,9 +1596,60 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
1465
1596
  padding: 9px 24px;
1466
1597
  }
1467
1598
  .sessionPickerActions > strong { margin-right: auto; color: var(--echo-ink-primary); font-size: 13px; font-variant-numeric: tabular-nums; }
1468
- .sessionPickerActions [role="status"] { color: #9b6612; font-size: 11px; font-weight: 700; }
1599
+ .sessionPickerStatus { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
1469
1600
  .sessionPickerActions .textButton { min-height: 32px; color: var(--echo-ink-primary); }
1470
- .sessionPickerList { min-height: 0; overflow-y: auto; background: var(--echo-paper-white); padding: 6px 0; }
1601
+ .sessionPickerListWrap { position: relative; min-height: 0; overflow: hidden; background: var(--echo-paper-white); }
1602
+ .sessionPickerList { height: 100%; min-height: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; background: var(--echo-paper-white); padding: 6px 0; }
1603
+ .sessionPickerListWrap.is-limit-blocked .sessionPickerList {
1604
+ filter: blur(4px);
1605
+ opacity: 0.36;
1606
+ pointer-events: none;
1607
+ transform: scale(1.012);
1608
+ transition: filter 180ms ease, opacity 180ms ease, transform 180ms ease;
1609
+ user-select: none;
1610
+ }
1611
+ .sessionPickerLimitOverlay {
1612
+ position: absolute;
1613
+ inset: 0;
1614
+ z-index: 3;
1615
+ display: grid;
1616
+ place-items: center;
1617
+ overflow-y: auto;
1618
+ background: rgba(245,247,252,0.38);
1619
+ padding: 20px;
1620
+ backdrop-filter: blur(2px);
1621
+ }
1622
+ .sessionPickerLimitOverlay[hidden] { display: none; }
1623
+ .sessionPickerLimitCard {
1624
+ width: min(470px, 100%);
1625
+ border: 1px solid rgba(26,58,143,0.18);
1626
+ border-radius: 18px;
1627
+ background: rgba(255,255,255,0.92);
1628
+ padding: clamp(24px, 5vw, 36px);
1629
+ text-align: center;
1630
+ box-shadow: 0 24px 56px -28px rgba(20,36,84,0.46), 0 6px 18px rgba(20,24,34,0.10);
1631
+ }
1632
+ .sessionPickerLimitEyebrow {
1633
+ display: inline-block;
1634
+ color: #9b6612;
1635
+ font-family: var(--echo-font-mono);
1636
+ font-size: 10px;
1637
+ font-weight: 900;
1638
+ letter-spacing: 0.1em;
1639
+ text-transform: uppercase;
1640
+ }
1641
+ .sessionPickerLimitCard h3 {
1642
+ margin: 8px 0 0;
1643
+ color: var(--echo-ink-text);
1644
+ font-family: var(--echo-font-brand);
1645
+ font-size: clamp(28px, 5vw, 40px);
1646
+ font-weight: 900;
1647
+ line-height: 1;
1648
+ }
1649
+ .sessionPickerLimitCard p { margin: 13px auto 0; max-width: 360px; color: var(--echo-ink-mute); font-size: 14px; line-height: 1.5; }
1650
+ .sessionPickerLimitActions { display: flex; justify-content: center; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 22px; }
1651
+ .sessionPickerLimitActions .button { min-height: 46px; padding: 0 20px; }
1652
+ .sessionPickerLimitActions .textButton { color: var(--echo-ink-primary); }
1471
1653
  .sessionPickerRow {
1472
1654
  display: grid;
1473
1655
  grid-template-columns: auto auto minmax(0, 1fr) auto;
@@ -1521,6 +1703,7 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
1521
1703
  padding: 14px 24px;
1522
1704
  }
1523
1705
  .sessionPickerFoot p { margin: 0; color: var(--echo-ink-mute); font-size: 12px; }
1706
+ .sessionPickerFootActions { display: flex; justify-content: flex-end; gap: 10px; flex-wrap: wrap; }
1524
1707
  .sessionPickerFoot button { min-width: 170px; }
1525
1708
 
1526
1709
  .pauseStatus {
@@ -1740,6 +1923,10 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
1740
1923
  border-radius: 4px;
1741
1924
  box-shadow: none;
1742
1925
  }
1926
+ .readyDecision .actions .skipHistoryButton {
1927
+ min-height: 52px;
1928
+ border-radius: 4px;
1929
+ }
1743
1930
  .readyDecision .actions .primary:not(:disabled):hover { box-shadow: none; }
1744
1931
  .ctaMeta { justify-content: flex-start; }
1745
1932
  .readyFoot {
@@ -1948,7 +2135,8 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
1948
2135
  .setupPlanConfirmed { grid-template-columns: auto minmax(0, 1fr); }
1949
2136
  .setupPlanConfirmed .textButton { grid-column: 2; width: fit-content; }
1950
2137
  .readyDecision .actions,
1951
- .readyDecision .actions .primary { width: 100%; }
2138
+ .readyDecision .actions .primary,
2139
+ .readyDecision .actions .skipHistoryButton { width: 100%; }
1952
2140
  .readyDecision .actions .primary { min-width: 0; }
1953
2141
  .readyGo,
1954
2142
  .readyFoot,
@@ -1965,15 +2153,21 @@ export const SETUP_PAGE_STYLES_EXTRACTION = String.raw ` /* ---- dashboard (p
1965
2153
  .recallPromptActions { display: grid; grid-template-columns: 1fr; }
1966
2154
  .recallAgent { width: 100%; }
1967
2155
  .skipStage { width: calc(100vw - 28px); padding: 26px 20px; }
1968
- .sessionPicker { width: 100vw; max-height: 100vh; border-radius: 0; border-left-width: 4px; }
1969
- .sessionPickerShell { max-height: 100vh; min-height: 100vh; }
2156
+ .sessionPicker { width: 100vw; height: 100vh; max-height: 100vh; border-radius: 0; border-left-width: 4px; }
2157
+ .sessionPickerShell { height: 100%; max-height: 100vh; min-height: 0; }
1970
2158
  .sessionPickerHead { padding: 18px 16px 15px; }
1971
2159
  .sessionPickerToolbar { grid-template-columns: 1fr; padding: 12px 16px; }
1972
2160
  .sessionPickerActions { flex-wrap: wrap; padding: 8px 16px; }
1973
2161
  .sessionPickerActions > strong { width: 100%; }
1974
2162
  .sessionPickerRow { grid-template-columns: auto auto minmax(0, 1fr); margin: 0 4px; padding: 10px 8px; }
1975
2163
  .sessionPickerMeta { display: none; }
2164
+ .sessionPickerLimitOverlay { padding: 14px; }
2165
+ .sessionPickerLimitCard { border-radius: 15px; padding: 24px 18px; }
2166
+ .sessionPickerLimitActions { display: grid; }
2167
+ .sessionPickerLimitActions .button,
2168
+ .sessionPickerLimitActions button { width: 100%; }
1976
2169
  .sessionPickerFoot { align-items: stretch; flex-direction: column; padding: 12px 16px; }
2170
+ .sessionPickerFootActions { display: grid; }
1977
2171
  .sessionPickerFoot button { width: 100%; }
1978
2172
  }
1979
2173
 
@@ -88,6 +88,144 @@ 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(92px, 13vw, 118px);
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
+ transform: rotate(-1.5deg);
146
+ }
147
+ .scanMascot img {
148
+ display: block;
149
+ width: 76%;
150
+ height: 76%;
151
+ object-fit: contain;
152
+ filter: drop-shadow(0 12px 14px rgba(26,58,143,0.16));
153
+ }
154
+ .scanLoaderCopy { min-width: 0; }
155
+ .scanEyebrow {
156
+ width: fit-content;
157
+ margin: 0 0 15px;
158
+ border: 1px solid rgba(26,58,143,0.13);
159
+ border-radius: 999px;
160
+ background: rgba(255,255,255,0.72);
161
+ padding: 6px 11px;
162
+ box-shadow: var(--echo-shadow-glass);
163
+ color: color-mix(in srgb, var(--echo-ink-primary) 70%, var(--echo-ink-accent) 30%);
164
+ font-size: 11px;
165
+ letter-spacing: 0.11em;
166
+ }
167
+ .scanLoader h2.siteHeadline {
168
+ max-width: 560px;
169
+ font-size: clamp(40px, 6vw, 64px);
170
+ line-height: 0.98;
171
+ }
172
+ .scanIntro {
173
+ max-width: 520px;
174
+ margin: 18px 0 0;
175
+ color: var(--echo-ink-mute);
176
+ font-size: 15px;
177
+ font-weight: 500;
178
+ line-height: 1.55;
179
+ }
180
+ .scanProgressCard {
181
+ margin-top: clamp(26px, 5vw, 38px);
182
+ border: 1px solid rgba(26,58,143,0.10);
183
+ border-radius: var(--echo-radius-card);
184
+ background: color-mix(in srgb, var(--echo-paper-white) 68%, var(--echo-note-blue) 32%);
185
+ padding: 17px 18px 15px;
186
+ box-shadow: var(--echo-shadow-paper);
187
+ }
188
+ .scanProgress {
189
+ width: 100%;
190
+ height: 10px;
191
+ margin: 0;
192
+ border-radius: 999px;
193
+ background: rgba(255,255,255,0.78);
194
+ box-shadow: inset 0 1px 3px rgba(20,24,34,0.10);
195
+ }
196
+ .scanProgressFill {
197
+ min-width: 10px;
198
+ border-radius: 999px;
199
+ background: linear-gradient(90deg, var(--echo-ink-primary), color-mix(in srgb, var(--echo-ink-primary) 72%, var(--echo-ink-accent) 28%));
200
+ box-shadow: 0 0 0 1px rgba(26,58,143,0.08), 0 3px 9px rgba(26,58,143,0.20);
201
+ }
202
+ .scanCaption {
203
+ margin: 12px 0 0;
204
+ color: var(--echo-ink-mute);
205
+ font-size: 12px;
206
+ font-weight: 700;
207
+ line-height: 1.5;
208
+ }
209
+ .scanPrivacy {
210
+ display: flex;
211
+ align-items: center;
212
+ gap: 8px;
213
+ margin: 15px 2px 0;
214
+ color: var(--echo-ink-faint);
215
+ font-family: var(--echo-font-mono);
216
+ font-size: 11px;
217
+ font-weight: 600;
218
+ line-height: 1.45;
219
+ }
220
+ .scanPrivacy > span {
221
+ width: 8px;
222
+ height: 8px;
223
+ flex: 0 0 auto;
224
+ border-radius: 50%;
225
+ background: var(--echo-ink-accent-deep);
226
+ box-shadow: 0 0 0 4px rgba(78,205,196,0.13);
227
+ }
228
+
91
229
  /* Permission and skip states ------------------------------------------------ */
92
230
  .localConsent {
93
231
  overflow: visible;
@@ -379,6 +517,9 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
379
517
  .readyDecision .actions .primary:not(:disabled):hover {
380
518
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.28), 0 16px 34px rgba(26,58,143,0.25);
381
519
  }
520
+ .readyDecision .actions .skipHistoryButton {
521
+ border-radius: 999px;
522
+ }
382
523
  .readyFoot {
383
524
  border-top-color: rgba(26,58,143,0.10);
384
525
  border-radius: 0 0 calc(var(--echo-radius-panel) - 2px) calc(var(--echo-radius-panel) - 2px);
@@ -563,6 +704,16 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
563
704
  background: color-mix(in srgb, var(--echo-paper-white) 64%, var(--echo-note-blue) 36%);
564
705
  box-shadow: inset 3px 0 0 var(--echo-ink-primary);
565
706
  }
707
+ .sessionPickerLimitCard {
708
+ border-color: rgba(26,58,143,0.16);
709
+ border-radius: var(--echo-radius-card);
710
+ background: color-mix(in srgb, rgba(255,255,255,0.94) 84%, var(--echo-note-cream) 16%);
711
+ box-shadow: var(--echo-shadow-pop);
712
+ }
713
+ .sessionPickerLimitActions .button,
714
+ .sessionPickerLimitActions button {
715
+ border-radius: 999px;
716
+ }
566
717
  .sessionPickerSource {
567
718
  border-radius: 9px;
568
719
  box-shadow: var(--echo-shadow-paper);
@@ -585,6 +736,38 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
585
736
  .skipStage {
586
737
  border-radius: 18px;
587
738
  }
739
+ body.scanMode main {
740
+ padding: 34px 14px 52px;
741
+ }
742
+ body.scanMode #app {
743
+ min-height: calc(100vh - 86px);
744
+ }
745
+ .scanLoader {
746
+ border-radius: 18px;
747
+ padding: 28px 20px 22px;
748
+ }
749
+ .scanLoaderLead {
750
+ grid-template-columns: 1fr;
751
+ gap: 18px;
752
+ }
753
+ .scanMascot {
754
+ width: 76px;
755
+ border-radius: 16px;
756
+ }
757
+ .scanLoader h2.siteHeadline {
758
+ font-size: clamp(38px, 12vw, 52px);
759
+ }
760
+ .scanIntro {
761
+ margin-top: 14px;
762
+ font-size: 14px;
763
+ }
764
+ .scanProgressCard {
765
+ margin-top: 24px;
766
+ padding: 15px 14px 13px;
767
+ }
768
+ .scanPrivacy {
769
+ align-items: flex-start;
770
+ }
588
771
  .consentLead,
589
772
  .skippedEcho {
590
773
  border-radius: 16px 16px 0 0;
@@ -1,5 +1,6 @@
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
4
  /**
4
5
  * Setup page entry point. The implementation is split by product phase under ./setup-page/:
5
6
  * core utilities, local report, post-auth extraction, and lifecycle polling.