@the-portland-company/shell 0.53.1 → 0.55.0
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/CHANGELOG.md +32 -0
- package/dist/app-chrome.cjs +134 -10
- package/dist/app-chrome.cjs.map +1 -1
- package/dist/app-chrome.d.cts +19 -2
- package/dist/app-chrome.d.ts +19 -2
- package/dist/app-chrome.js +131 -7
- package/dist/app-chrome.js.map +1 -1
- package/dist/{chunk-XEFBZ3PR.js → chunk-K5GWJSHE.js} +6 -6
- package/dist/{chunk-XEFBZ3PR.js.map → chunk-K5GWJSHE.js.map} +1 -1
- package/dist/native.cjs +4 -4
- package/dist/native.cjs.map +1 -1
- package/dist/native.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
## 0.55.0 — 2026-09-30
|
|
2
|
+
|
|
3
|
+
### Fixed — org pill body no longer takes the Mode accent (`./native`)
|
|
4
|
+
|
|
5
|
+
Reference/UI-Platform ("Left bar" / "Per-mode branding") is explicit: the org
|
|
6
|
+
pill sits on a **neutral surface** — only the circular org badge carries a
|
|
7
|
+
brand or Mode color, never the pill body. The `./native` `NavSidebar`'s org
|
|
8
|
+
pill (both the disabled single-org button and the multi-org `<details>`
|
|
9
|
+
selector) resolved `var(--mode-accent, var(--panel-elevated))` as its own
|
|
10
|
+
background and `var(--mode-on-accent, var(--foreground))` as its text color —
|
|
11
|
+
so a Mode with its own accent (Campaign's `#8F1F2A`) painted the **whole
|
|
12
|
+
pill** solid red instead of just the badge. Reported live as "V1 styling" on
|
|
13
|
+
a2p.politogyvrm.com (shell 0.46.0, still present through 0.54.0). Both spots
|
|
14
|
+
now render the neutral `--panel-elevated` / `--line` / `--foreground` chain
|
|
15
|
+
unconditionally; the badge (unchanged) still resolves the org's brand color
|
|
16
|
+
or, absent one, the chrome/Mode accent.
|
|
17
|
+
|
|
18
|
+
### Fixed — mode pill resolves the semantic Mode accent, not the flat global one
|
|
19
|
+
|
|
20
|
+
The mode pill (both the disabled single-mode button and the multi-mode
|
|
21
|
+
selector) was hardcoded to `var(--color-accent)` / `text-white`, so a Mode
|
|
22
|
+
that declares its own `chrome.accent` (Reference/UI-Platform → "Per-mode
|
|
23
|
+
branding") never reached this pill — only the rail background did. It now
|
|
24
|
+
resolves `var(--mode-accent, var(--color-accent))` with
|
|
25
|
+
`var(--mode-on-accent, white)`, matching the org pill's badge and the active
|
|
26
|
+
nav row's existing pattern.
|
|
27
|
+
|
|
28
|
+
### Why
|
|
29
|
+
|
|
30
|
+
Live audit against Reference/UI-Platform + the shared Relationship Mode UI
|
|
31
|
+
design template (orchestrator rail-parity sweep, 2026-09-30).
|
|
32
|
+
|
|
1
33
|
## 0.53.0 — 2026-09-29
|
|
2
34
|
|
|
3
35
|
### Added — Loading Screen boot surface (Specs/Loading-Screen)
|
package/dist/app-chrome.cjs
CHANGED
|
@@ -1932,7 +1932,7 @@ function NavSidebar({
|
|
|
1932
1932
|
),
|
|
1933
1933
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading organization" })
|
|
1934
1934
|
] }) : org.organizations && org.organizations.length > 0 && org.onSwitch ? /* @__PURE__ */ jsxRuntime.jsxs("details", { "data-nav-details": true, className: "group relative", children: [
|
|
1935
|
-
/* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex w-full cursor-pointer list-none items-center justify-between gap-2 rounded-md border border-[color:var(--
|
|
1935
|
+
/* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex w-full cursor-pointer list-none items-center justify-between gap-2 rounded-md border border-[color:var(--line)] bg-[color:var(--panel-elevated)] px-2.5 py-2 text-left text-[color:var(--foreground)] shadow-sm transition hover:bg-[color:var(--panel)] [&::-webkit-details-marker]:hidden", children: [
|
|
1936
1936
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-2.5", children: [
|
|
1937
1937
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1938
1938
|
"span",
|
|
@@ -2021,7 +2021,7 @@ function NavSidebar({
|
|
|
2021
2021
|
{
|
|
2022
2022
|
type: "button",
|
|
2023
2023
|
onClick: org.onClick,
|
|
2024
|
-
className: "flex w-full items-center justify-between gap-2 rounded-md border border-[color:var(--
|
|
2024
|
+
className: "flex w-full items-center justify-between gap-2 rounded-md border border-[color:var(--line)] bg-[color:var(--panel-elevated)] px-2.5 py-2 text-left text-[color:var(--foreground)] shadow-sm transition hover:bg-[color:var(--panel)]",
|
|
2025
2025
|
children: [
|
|
2026
2026
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-2.5", children: [
|
|
2027
2027
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -2040,7 +2040,7 @@ function NavSidebar({
|
|
|
2040
2040
|
)
|
|
2041
2041
|
] }) : null,
|
|
2042
2042
|
mode ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4", children: mode.options && mode.options.length > 1 && mode.onSelect ? /* @__PURE__ */ jsxRuntime.jsxs("details", { "data-nav-details": true, className: "group relative", children: [
|
|
2043
|
-
/* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex w-full cursor-pointer list-none items-center justify-between gap-2 rounded-md bg-[color:var(--color-accent)] px-2.5 py-2 text-white shadow-sm transition hover:opacity-95 [&::-webkit-details-marker]:hidden", children: [
|
|
2043
|
+
/* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex w-full cursor-pointer list-none items-center justify-between gap-2 rounded-md bg-[color:var(--mode-accent,var(--color-accent))] px-2.5 py-2 text-[color:var(--mode-on-accent,white)] shadow-sm transition hover:bg-[color:var(--mode-accent-strong,var(--color-accent))] hover:opacity-95 [&::-webkit-details-marker]:hidden", children: [
|
|
2044
2044
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2.5", children: [
|
|
2045
2045
|
ModeIcon ? /* @__PURE__ */ jsxRuntime.jsx(ModeIcon, { size: 16, className: "shrink-0" }) : null,
|
|
2046
2046
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold tracking-[-0.01em]", children: mode.label })
|
|
@@ -2075,7 +2075,7 @@ function NavSidebar({
|
|
|
2075
2075
|
"button",
|
|
2076
2076
|
{
|
|
2077
2077
|
type: "button",
|
|
2078
|
-
className: "flex w-full items-center justify-between gap-2 rounded-md bg-[color:var(--color-accent)] px-2.5 py-2 text-white shadow-sm",
|
|
2078
|
+
className: "flex w-full items-center justify-between gap-2 rounded-md bg-[color:var(--mode-accent,var(--color-accent))] px-2.5 py-2 text-[color:var(--mode-on-accent,white)] shadow-sm",
|
|
2079
2079
|
children: [
|
|
2080
2080
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2.5", children: [
|
|
2081
2081
|
ModeIcon ? /* @__PURE__ */ jsxRuntime.jsx(ModeIcon, { size: 16, className: "shrink-0" }) : null,
|
|
@@ -3256,6 +3256,41 @@ function watchLogout(onLogout, options = {}) {
|
|
|
3256
3256
|
}
|
|
3257
3257
|
return cleanup;
|
|
3258
3258
|
}
|
|
3259
|
+
var BOOT_STAGE_TABLE = [
|
|
3260
|
+
{ id: "s0_session", weight: 5, critical: true, waitsOn: "Politogy ID session resolution" },
|
|
3261
|
+
{ id: "s1_org", weight: 10, critical: true, waitsOn: "Chrome API /api/chrome/me + orgs" },
|
|
3262
|
+
{ id: "s2_uvp_connect", weight: 10, critical: true, waitsOn: "UVP data layer connection" },
|
|
3263
|
+
{ id: "s3_district", weight: 5, critical: true, waitsOn: "uvp_geo_entitlements / uvp_boundaries scope" },
|
|
3264
|
+
{ id: "s4_universe", weight: 25, critical: true, waitsOn: "UVP universe load + total count" },
|
|
3265
|
+
{ id: "s5_layers", weight: 15, critical: false, waitsOn: "UVP enrichment layer joins" },
|
|
3266
|
+
{ id: "s6_verified", weight: 10, critical: false, waitsOn: "VRM Verified tier computation" },
|
|
3267
|
+
{ id: "s7_tribes", weight: 10, critical: false, waitsOn: "Tribes member_count + Hot Tribes warm-up" },
|
|
3268
|
+
{ id: "s8_intelligence", weight: 5, critical: false, waitsOn: "Mode intelligence signals (Polling/Relationship/Petition)" },
|
|
3269
|
+
{ id: "s9_shell", weight: 5, critical: true, waitsOn: "Shell paint-ready handoff" }
|
|
3270
|
+
];
|
|
3271
|
+
var BOOT_STAGE_ORDER = BOOT_STAGE_TABLE.map((s) => s.id);
|
|
3272
|
+
var BOOT_STAGE_WEIGHTS = Object.fromEntries(
|
|
3273
|
+
BOOT_STAGE_TABLE.map((s) => [s.id, s.weight])
|
|
3274
|
+
);
|
|
3275
|
+
function computeWeightedPct(args) {
|
|
3276
|
+
const skipped = new Set(args.skippedStageIds ?? []);
|
|
3277
|
+
const applicable = BOOT_STAGE_ORDER.filter((id) => !skipped.has(id));
|
|
3278
|
+
const applicableWeightTotal = applicable.reduce((sum, id) => sum + BOOT_STAGE_WEIGHTS[id], 0);
|
|
3279
|
+
if (applicableWeightTotal <= 0) return 100;
|
|
3280
|
+
const redistributionFactor = 100 / applicableWeightTotal;
|
|
3281
|
+
const completed = new Set(args.completedStageIds);
|
|
3282
|
+
let pct = 0;
|
|
3283
|
+
for (const id of applicable) {
|
|
3284
|
+
const effectiveWeight = BOOT_STAGE_WEIGHTS[id] * redistributionFactor;
|
|
3285
|
+
if (completed.has(id)) {
|
|
3286
|
+
pct += effectiveWeight;
|
|
3287
|
+
} else if (id === args.currentStageId) {
|
|
3288
|
+
const progress = Math.min(1, Math.max(0, args.currentStageProgress ?? 0));
|
|
3289
|
+
pct += effectiveWeight * progress;
|
|
3290
|
+
}
|
|
3291
|
+
}
|
|
3292
|
+
return Math.min(100, pct);
|
|
3293
|
+
}
|
|
3259
3294
|
var SYNTHETIC_STAGES = [
|
|
3260
3295
|
{ pct: 20, label: "Connecting to your organization\u2026" },
|
|
3261
3296
|
{ pct: 100, label: "Ready." }
|
|
@@ -3334,7 +3369,25 @@ function LoadingScreen({
|
|
|
3334
3369
|
phase: syntheticReady ? "done" : "booting"
|
|
3335
3370
|
};
|
|
3336
3371
|
}, [syntheticReady]);
|
|
3337
|
-
const
|
|
3372
|
+
const weightedPct = react.useMemo(() => {
|
|
3373
|
+
if (!bootProgress) return void 0;
|
|
3374
|
+
if (typeof bootProgress.pct === "number") return bootProgress.pct;
|
|
3375
|
+
if (!bootProgress.completedStageIds && !bootProgress.skippedStageIds) return void 0;
|
|
3376
|
+
return computeWeightedPct({
|
|
3377
|
+
completedStageIds: bootProgress.completedStageIds ?? [],
|
|
3378
|
+
skippedStageIds: bootProgress.skippedStageIds,
|
|
3379
|
+
currentStageId: bootProgress.stageId,
|
|
3380
|
+
currentStageProgress: bootProgress.currentStageProgress
|
|
3381
|
+
});
|
|
3382
|
+
}, [
|
|
3383
|
+
bootProgress,
|
|
3384
|
+
bootProgress?.pct,
|
|
3385
|
+
bootProgress?.completedStageIds,
|
|
3386
|
+
bootProgress?.skippedStageIds,
|
|
3387
|
+
bootProgress?.stageId,
|
|
3388
|
+
bootProgress?.currentStageProgress
|
|
3389
|
+
]);
|
|
3390
|
+
const pct = weightedPct ?? synthetic.pct;
|
|
3338
3391
|
const rawLabel = bootProgress?.label ?? synthetic.label;
|
|
3339
3392
|
const phase = bootProgress?.phase ?? synthetic.phase;
|
|
3340
3393
|
const isFinal = phase === "done" && pct >= 100;
|
|
@@ -3457,11 +3510,82 @@ function LoadingScreen({
|
|
|
3457
3510
|
children: announced
|
|
3458
3511
|
}
|
|
3459
3512
|
),
|
|
3460
|
-
isError && (bootProgress?.onRetry || bootProgress?.onSignOut) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3513
|
+
isError && (bootProgress?.onRetry || bootProgress?.onSignOut) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3514
|
+
"div",
|
|
3515
|
+
{
|
|
3516
|
+
style: {
|
|
3517
|
+
marginTop: "1.25rem",
|
|
3518
|
+
display: "flex",
|
|
3519
|
+
flexDirection: "column",
|
|
3520
|
+
gap: "0.75rem",
|
|
3521
|
+
alignItems: "center"
|
|
3522
|
+
},
|
|
3523
|
+
children: [
|
|
3524
|
+
bootProgress?.onRetry && /* @__PURE__ */ jsxRuntime.jsx(
|
|
3525
|
+
"button",
|
|
3526
|
+
{
|
|
3527
|
+
type: "button",
|
|
3528
|
+
onClick: bootProgress.onRetry,
|
|
3529
|
+
style: {
|
|
3530
|
+
height: 40,
|
|
3531
|
+
padding: "0 1.25rem",
|
|
3532
|
+
borderRadius: "var(--radius-md, 8px)",
|
|
3533
|
+
border: "none",
|
|
3534
|
+
background: "var(--color-race-red, #dc2626)",
|
|
3535
|
+
color: "#fff",
|
|
3536
|
+
fontFamily: "var(--font-sans, ui-sans-serif, system-ui, sans-serif)",
|
|
3537
|
+
fontSize: "0.875rem",
|
|
3538
|
+
fontWeight: 600,
|
|
3539
|
+
cursor: "pointer"
|
|
3540
|
+
},
|
|
3541
|
+
children: "Retry"
|
|
3542
|
+
}
|
|
3543
|
+
),
|
|
3544
|
+
bootProgress?.onSignOut && /* @__PURE__ */ jsxRuntime.jsx(
|
|
3545
|
+
"button",
|
|
3546
|
+
{
|
|
3547
|
+
type: "button",
|
|
3548
|
+
onClick: bootProgress.onSignOut,
|
|
3549
|
+
style: {
|
|
3550
|
+
height: "auto",
|
|
3551
|
+
padding: 0,
|
|
3552
|
+
border: "none",
|
|
3553
|
+
background: "transparent",
|
|
3554
|
+
color: "rgba(255,255,255,0.38)",
|
|
3555
|
+
fontFamily: "var(--font-sans, ui-sans-serif, system-ui, sans-serif)",
|
|
3556
|
+
fontSize: "12.5px",
|
|
3557
|
+
textDecoration: "underline",
|
|
3558
|
+
cursor: "pointer"
|
|
3559
|
+
},
|
|
3560
|
+
children: "Sign out"
|
|
3561
|
+
}
|
|
3562
|
+
)
|
|
3563
|
+
]
|
|
3564
|
+
}
|
|
3565
|
+
)
|
|
3566
|
+
] }),
|
|
3567
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3568
|
+
"div",
|
|
3569
|
+
{
|
|
3570
|
+
style: {
|
|
3571
|
+
position: "absolute",
|
|
3572
|
+
left: 0,
|
|
3573
|
+
right: 0,
|
|
3574
|
+
bottom: 0,
|
|
3575
|
+
display: "flex",
|
|
3576
|
+
alignItems: "center",
|
|
3577
|
+
justifyContent: "space-between",
|
|
3578
|
+
padding: "0 32px 30px",
|
|
3579
|
+
fontFamily: "var(--font-sans, ui-sans-serif, system-ui, sans-serif)",
|
|
3580
|
+
fontSize: "12.5px",
|
|
3581
|
+
color: "rgba(255,255,255,0.38)"
|
|
3582
|
+
},
|
|
3583
|
+
children: [
|
|
3584
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Politogy VRM. Built for the long game." }),
|
|
3585
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontFamily: "var(--font-mono, ui-monospace, monospace)", letterSpacing: "0.04em" }, children: (bootProgress?.version ?? "v\u2014") + " \xB7 " + (bootProgress?.region ?? "\u2014") })
|
|
3586
|
+
]
|
|
3587
|
+
}
|
|
3588
|
+
)
|
|
3465
3589
|
]
|
|
3466
3590
|
}
|
|
3467
3591
|
);
|