@the-portland-company/shell 0.73.1 → 0.75.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 +20 -0
- package/dist/app-chrome.cjs +161 -43
- package/dist/app-chrome.cjs.map +1 -1
- package/dist/app-chrome.d.cts +1 -2
- package/dist/app-chrome.d.ts +1 -2
- package/dist/app-chrome.js +10 -3
- package/dist/app-chrome.js.map +1 -1
- package/dist/chunk-MY6G3LMN.js +125 -0
- package/dist/chunk-MY6G3LMN.js.map +1 -0
- package/dist/{chunk-DFR6CNE4.js → chunk-QUXD4PZ7.js} +72 -46
- package/dist/chunk-QUXD4PZ7.js.map +1 -0
- package/dist/index.cjs +84 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +61 -2
- package/dist/index.d.ts +61 -2
- package/dist/index.js +3 -20
- package/dist/index.js.map +1 -1
- package/dist/native.cjs +154 -43
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.cts +25 -4
- package/dist/native.d.ts +25 -4
- package/dist/native.js +2 -2
- package/package.json +1 -1
- package/dist/FormColumn-DsNP6NVG.d.cts +0 -21
- package/dist/FormColumn-DsNP6NVG.d.ts +0 -21
- package/dist/chunk-DFR6CNE4.js.map +0 -1
- package/dist/chunk-LPSBSAF3.js +0 -26
- package/dist/chunk-LPSBSAF3.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
## 0.75.0
|
|
2
|
+
|
|
3
|
+
Built on top of 0.74.0 (`claude/retire-nav`). Two fixes:
|
|
4
|
+
|
|
5
|
+
- **Regression fix**: restored the `Polls` row to `standardPolitogyNav`'s default Collect section. Commit 03c4dc2 (retiring `app.politogyvrm.com`) dropped it entirely instead of repointing it — Polls (`polls.politogyvrm.com`) is a standalone app, independent of the retired core app, and belongs in the default tree. Apps that don't want it pass `hiddenItems: ['Polls']`.
|
|
6
|
+
- **Cross-app nav prerender**: `NavAppShell` now renders a `<script type="speculationrules">` (via the new `SpeculationRulesScript`, built on `buildNavSpeculationRules`/`collectSiblingAppUrls` in `src/speculation/emitRules.ts`) for every sibling `*.politogyvrm.com` link in the consumer's own sidebar tree, `eagerness: "moderate"` — the browser prerenders on hover/pointerdown of a matching link, no custom JS trigger needed. Sign-out and other destructive rows (by label or `/signout`-style path) are excluded. Browsers without Speculation Rules support fall back, once idle, to `<link rel="prefetch">` tags for the same URLs. Because this is wired into `NavAppShell` itself (used by both `PolitogyAppFrame` and direct `NavAppShell` consumers), every consumer gets it with no per-app opt-in.
|
|
7
|
+
- **Each sibling app must send `Supports-Loading-Mode: credentialed-prerender`** on its responses for cross-origin prerender to activate while the user is authenticated — without it the browser silently falls back to a normal navigation (other agents are adding this header per-app).
|
|
8
|
+
- `buildSpeculationRules`/`AppRegistryEntry` (the old, unused registry-based API) is kept for back-compat and now documented `@deprecated` in favor of `buildNavSpeculationRules`.
|
|
9
|
+
|
|
10
|
+
## 0.74.0
|
|
11
|
+
|
|
12
|
+
Repoint `standardPolitogyNav` off `app.politogyvrm.com` (Reference/UI-Platform → "Retirement of app.politogyvrm.com", DECIDED 2026-10-07; District data target per v44).
|
|
13
|
+
- Dashboard, Battleground, District data → `dashboard.politogyvrm.com`.
|
|
14
|
+
- Organization settings (incl. the depth-3 Subscription & Billing branch) → `settings.politogyvrm.com`.
|
|
15
|
+
- My profile → `auth.politogyvrm.com` (Politogy ID account app).
|
|
16
|
+
- Calls to action → the standalone CTAs app (`ctas.politogyvrm.com`), replacing the legacy in-core feature.
|
|
17
|
+
- Removed the V1 Email Broadcast legacy child row (VRM core's email surface is retired).
|
|
18
|
+
- `coreBaseUrl` is now optional and unused — every row resolves against its V2 host directly. Kept on `StandardNavOptions` so existing callers compile unchanged.
|
|
19
|
+
- Added `PolitogyAppKey` registry entries `dashboard` (`dashboard.politogyvrm.com`) and `settings` (`settings.politogyvrm.com`) so those new V2 apps can drop their own hardcoded chrome config.
|
|
20
|
+
|
|
1
21
|
## 0.72.0
|
|
2
22
|
|
|
3
23
|
Left-Navigation §5, §10 and §12.
|
package/dist/app-chrome.cjs
CHANGED
|
@@ -187,6 +187,91 @@ function writeRailPreference(pref) {
|
|
|
187
187
|
}
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
+
// src/speculation/emitRules.ts
|
|
191
|
+
var DESTRUCTIVE_LABEL_PATTERNS = ["sign out", "signout", "log out", "logout", "delete"];
|
|
192
|
+
var DESTRUCTIVE_PATH_PATTERNS = ["/signout", "/sign-out", "/logout", "/log-out"];
|
|
193
|
+
function isDestructive(item) {
|
|
194
|
+
const label = item.label.toLowerCase();
|
|
195
|
+
if (DESTRUCTIVE_LABEL_PATTERNS.some((p) => label.includes(p))) return true;
|
|
196
|
+
const href = (item.href ?? "").toLowerCase();
|
|
197
|
+
return DESTRUCTIVE_PATH_PATTERNS.some((p) => href.includes(p));
|
|
198
|
+
}
|
|
199
|
+
function collectSiblingAppUrls(items, currentOrigin) {
|
|
200
|
+
const urls = /* @__PURE__ */ new Set();
|
|
201
|
+
const walk = (list) => {
|
|
202
|
+
for (const item of list) {
|
|
203
|
+
if (item.kind === "section") continue;
|
|
204
|
+
if (item.href && !isDestructive(item)) {
|
|
205
|
+
try {
|
|
206
|
+
const url = new URL(item.href, currentOrigin);
|
|
207
|
+
if (url.origin !== currentOrigin && /^https?:$/.test(url.protocol)) {
|
|
208
|
+
urls.add(url.href);
|
|
209
|
+
}
|
|
210
|
+
} catch {
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (item.children?.length) walk(item.children);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
walk(items);
|
|
217
|
+
return Array.from(urls);
|
|
218
|
+
}
|
|
219
|
+
function buildNavSpeculationRules(items, currentOrigin = typeof window !== "undefined" ? window.location.origin : "") {
|
|
220
|
+
const urls = collectSiblingAppUrls(items, currentOrigin);
|
|
221
|
+
if (urls.length === 0) return null;
|
|
222
|
+
return {
|
|
223
|
+
prerender: [{ source: "list", urls, eagerness: "moderate" }]
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// src/speculation/SpeculationRulesScript.tsx
|
|
228
|
+
var SCRIPT_ID = "politogy-speculation-rules";
|
|
229
|
+
var PREFETCH_ATTR = "data-politogy-speculation-prefetch";
|
|
230
|
+
function SpeculationRulesScript({ items }) {
|
|
231
|
+
const origin = typeof window !== "undefined" ? window.location.origin : "";
|
|
232
|
+
const rules = react.useMemo(() => buildNavSpeculationRules(items, origin), [items, origin]);
|
|
233
|
+
const json = rules ? JSON.stringify(rules) : null;
|
|
234
|
+
react.useEffect(() => {
|
|
235
|
+
if (!json || typeof document === "undefined") return;
|
|
236
|
+
let el = document.getElementById(SCRIPT_ID);
|
|
237
|
+
if (!el) {
|
|
238
|
+
el = document.createElement("script");
|
|
239
|
+
el.id = SCRIPT_ID;
|
|
240
|
+
el.type = "speculationrules";
|
|
241
|
+
document.head.appendChild(el);
|
|
242
|
+
}
|
|
243
|
+
el.textContent = json;
|
|
244
|
+
return () => {
|
|
245
|
+
};
|
|
246
|
+
}, [json]);
|
|
247
|
+
react.useEffect(() => {
|
|
248
|
+
if (typeof document === "undefined" || typeof window === "undefined") return;
|
|
249
|
+
const supportsSpecRules = typeof HTMLScriptElement !== "undefined" && typeof HTMLScriptElement.supports === "function" && HTMLScriptElement.supports(
|
|
250
|
+
"speculationrules"
|
|
251
|
+
);
|
|
252
|
+
if (supportsSpecRules) return;
|
|
253
|
+
const urls = collectSiblingAppUrls(items, origin);
|
|
254
|
+
if (urls.length === 0) return;
|
|
255
|
+
const schedule = typeof window.requestIdleCallback === "function" ? window.requestIdleCallback : (cb) => setTimeout(cb, 2e3);
|
|
256
|
+
const added = [];
|
|
257
|
+
schedule(() => {
|
|
258
|
+
for (const url of urls) {
|
|
259
|
+
if (document.querySelector(`link[${PREFETCH_ATTR}][href="${url}"]`)) continue;
|
|
260
|
+
const link = document.createElement("link");
|
|
261
|
+
link.rel = "prefetch";
|
|
262
|
+
link.href = url;
|
|
263
|
+
link.setAttribute(PREFETCH_ATTR, "");
|
|
264
|
+
document.head.appendChild(link);
|
|
265
|
+
added.push(link);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
return () => {
|
|
269
|
+
added.forEach((l) => l.remove());
|
|
270
|
+
};
|
|
271
|
+
}, [items, origin]);
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
|
|
190
275
|
// src/theme-preference.ts
|
|
191
276
|
var THEME_STORAGE_KEY = "politogy_theme";
|
|
192
277
|
var THEME_COOKIE = "politogy_theme";
|
|
@@ -1638,8 +1723,9 @@ function SpecOverlayAction({ orgId, orgName } = {}) {
|
|
|
1638
1723
|
};
|
|
1639
1724
|
}, [open, status && status.matched ? status.target_id : null]);
|
|
1640
1725
|
if (automated || !access?.allowed) return null;
|
|
1641
|
-
const
|
|
1642
|
-
const
|
|
1726
|
+
const hasScore = status && status.matched && typeof status.mismatch_pct === "number";
|
|
1727
|
+
const badgeLabel = hasScore ? `${Math.round(status.mismatch_pct)}%` : status ? "\u2014" : void 0;
|
|
1728
|
+
const badgeTone = hasScore ? status && status.matched && status.passed ? "default" : "danger" : "default";
|
|
1643
1729
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1644
1730
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1645
1731
|
"button",
|
|
@@ -1656,7 +1742,7 @@ function SpecOverlayAction({ orgId, orgName } = {}) {
|
|
|
1656
1742
|
{
|
|
1657
1743
|
className: [
|
|
1658
1744
|
"absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-normal leading-none text-[#FFFFFF]",
|
|
1659
|
-
status && status.matched
|
|
1745
|
+
hasScore ? status && status.matched && status.passed ? "bg-[color:var(--chrome-success,#2f855a)]" : "bg-[color:var(--chrome-danger)]" : "bg-[color:var(--muted)]"
|
|
1660
1746
|
].join(" "),
|
|
1661
1747
|
children: badgeLabel
|
|
1662
1748
|
}
|
|
@@ -1965,6 +2051,9 @@ var PHONEBANK_ORIGIN = "https://phonebank.politogyvrm.com/";
|
|
|
1965
2051
|
var CANVASS_ORIGIN = "https://canvass.politogyvrm.com/";
|
|
1966
2052
|
var SIGNS_ORIGIN = "https://signs.politogyvrm.com/";
|
|
1967
2053
|
var POLLS_ORIGIN = "https://polls.politogyvrm.com/";
|
|
2054
|
+
var SETTINGS_ORIGIN = "https://settings.politogyvrm.com/";
|
|
2055
|
+
var DASHBOARD_ORIGIN = "https://dashboard.politogyvrm.com/";
|
|
2056
|
+
var AUTH_ORIGIN = "https://auth.politogyvrm.com/";
|
|
1968
2057
|
var PETITION_MODE_ORIGIN = "https://petition-mode.politogyvrm.com/";
|
|
1969
2058
|
function applyHiddenItems(items, hidden) {
|
|
1970
2059
|
if (!hidden || hidden.length === 0) return items;
|
|
@@ -1996,29 +2085,23 @@ var APP_EMAIL_CHILDREN = [
|
|
|
1996
2085
|
{ label: "Statistics", icon: "barChart", href: `${EMAIL_APP}/statistics` },
|
|
1997
2086
|
{ label: "Deliverability", icon: "activity", href: `${EMAIL_APP}/deliverability` }
|
|
1998
2087
|
];
|
|
1999
|
-
var EMAIL_V1_LEGACY = { label: "Email V1 (legacy)", icon: "clock", path: "/relationship/email/dashboard" };
|
|
2000
|
-
var CTA_CHILDREN = [
|
|
2001
|
-
{ label: "Dashboard", icon: "grid", path: "/relationship/cta-database/dashboard" },
|
|
2002
|
-
{ label: "Create & Edit", icon: "edit", path: "/relationship/cta-creator/create-and-edit" },
|
|
2003
|
-
{ label: "Submissions", icon: "fileText", path: "/relationship/cta-submissions/submissions" }
|
|
2004
|
-
];
|
|
2005
2088
|
var ORG_SETTINGS_CHILDREN = [
|
|
2006
|
-
{ label: "General", icon: "settings", path: "
|
|
2089
|
+
{ label: "General", icon: "settings", path: "organization-settings" },
|
|
2007
2090
|
{
|
|
2008
2091
|
label: "Subscription & Billing",
|
|
2009
2092
|
icon: "creditCard",
|
|
2010
|
-
path: "
|
|
2093
|
+
path: "organization-settings/subscription-billing",
|
|
2011
2094
|
children: [
|
|
2012
|
-
{ label: "Current Plan", icon: "fileText", path: "
|
|
2013
|
-
{ label: "SMS, MMS & Email Usage", icon: "activity", path: "
|
|
2014
|
-
{ label: "Wallet", icon: "dollarSign", path: "
|
|
2015
|
-
{ label: "10DLC", icon: "messageSquare", path: "
|
|
2016
|
-
{ label: "Billing History", icon: "clock", path: "
|
|
2095
|
+
{ label: "Current Plan", icon: "fileText", path: "organization-settings/subscription-billing/current-plan" },
|
|
2096
|
+
{ label: "SMS, MMS & Email Usage", icon: "activity", path: "organization-settings/subscription-billing/text-email" },
|
|
2097
|
+
{ label: "Wallet", icon: "dollarSign", path: "organization-settings/subscription-billing/wallet" },
|
|
2098
|
+
{ label: "10DLC", icon: "messageSquare", path: "organization-settings/subscription-billing/10dlc" },
|
|
2099
|
+
{ label: "Billing History", icon: "clock", path: "organization-settings/subscription-billing/billing-history" }
|
|
2017
2100
|
]
|
|
2018
2101
|
},
|
|
2019
|
-
{ label: "Email", icon: "mail", path: "
|
|
2020
|
-
{ label: "Users", icon: "users", path: "
|
|
2021
|
-
{ label: "Shared Links", icon: "share", path: "
|
|
2102
|
+
{ label: "Email", icon: "mail", path: "organization-settings/email-settings" },
|
|
2103
|
+
{ label: "Users", icon: "users", path: "organization-settings/users" },
|
|
2104
|
+
{ label: "Shared Links", icon: "share", path: "organization-settings/shared-links" }
|
|
2022
2105
|
];
|
|
2023
2106
|
var APP_FORMS_CHILDREN = [
|
|
2024
2107
|
{ label: "Forms", icon: "list", href: "https://forms.politogyvrm.com/?tab=forms" },
|
|
@@ -2034,6 +2117,10 @@ var APP_POLLS_CHILDREN = [
|
|
|
2034
2117
|
{ label: "Command Center", icon: "grid", href: "https://polls.politogyvrm.com/" },
|
|
2035
2118
|
{ label: "New Poll", icon: "edit", href: "https://polls.politogyvrm.com/polls/new" }
|
|
2036
2119
|
];
|
|
2120
|
+
var APP_CTAS_CHILDREN = [
|
|
2121
|
+
{ label: "CTAs", icon: "list", href: "https://ctas.politogyvrm.com/" },
|
|
2122
|
+
{ label: "Canvas", icon: "edit", href: "https://ctas.politogyvrm.com/?tab=canvas" }
|
|
2123
|
+
];
|
|
2037
2124
|
var APP_A2P_CHILDREN = [
|
|
2038
2125
|
{ label: "Dashboard", icon: "grid", path: "dashboard" },
|
|
2039
2126
|
{ label: "Compose", icon: "edit", path: "compose" },
|
|
@@ -2061,35 +2148,39 @@ var APP_SIGNS_CHILDREN = [
|
|
|
2061
2148
|
{ label: "Reports", icon: "barChart", path: "reports" }
|
|
2062
2149
|
];
|
|
2063
2150
|
function standardPolitogyNav(opts) {
|
|
2064
|
-
const base = opts.coreBaseUrl.replace(/\/+$/, "");
|
|
2065
|
-
const abs = (path) => `${base}${path.startsWith("/") ? path : `/${path}`}`;
|
|
2066
2151
|
const icon = (key) => opts.icons?.[key] ?? standardNavIcons[key];
|
|
2067
2152
|
const orgParam = opts.activeOrgId ? `org=${opts.activeOrgId}` : "";
|
|
2068
2153
|
const withOrg = (url) => orgParam ? `${url}${url.includes("?") ? "&" : "?"}${orgParam}` : url;
|
|
2069
|
-
const leaves = (
|
|
2070
|
-
const branches = (
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2154
|
+
const leaves = (origin, children) => appLeaves(origin, children);
|
|
2155
|
+
const branches = (origin, children) => {
|
|
2156
|
+
const o = origin.replace(/\/+$/, "");
|
|
2157
|
+
return children.map((c) => ({
|
|
2158
|
+
label: c.label,
|
|
2159
|
+
icon: icon(c.icon),
|
|
2160
|
+
href: withOrg(`${o}/${c.path}`),
|
|
2161
|
+
children: c.children ? leaves(origin, c.children) : void 0
|
|
2162
|
+
}));
|
|
2163
|
+
};
|
|
2076
2164
|
const appLeaves = (origin, children, modeParam) => {
|
|
2077
|
-
const
|
|
2165
|
+
const base = origin.replace(/\/+$/, "");
|
|
2078
2166
|
return children.map((c) => {
|
|
2079
|
-
const url = c.path ? `${
|
|
2167
|
+
const url = c.path ? `${base}/${c.path}` : `${base}/`;
|
|
2080
2168
|
const withMode = modeParam ? `${url}${url.includes("?") ? "&" : "?"}mode=${modeParam}` : url;
|
|
2081
2169
|
return { label: c.label, icon: icon(c.icon), href: withOrg(withMode) };
|
|
2082
2170
|
});
|
|
2083
2171
|
};
|
|
2084
2172
|
const accountRows = () => [
|
|
2085
2173
|
{ kind: "section", label: "Account" },
|
|
2086
|
-
// My Profile
|
|
2087
|
-
|
|
2174
|
+
// My Profile moved to the Politogy ID account app (auth.politogyvrm.com)
|
|
2175
|
+
// with the retirement of app.politogyvrm.com.
|
|
2176
|
+
{ label: "My profile", icon: icon("circleUser"), href: withOrg(`${AUTH_ORIGIN}my-profile`) },
|
|
2088
2177
|
{
|
|
2089
2178
|
label: "Organization settings",
|
|
2090
2179
|
icon: icon("settings"),
|
|
2091
|
-
|
|
2092
|
-
|
|
2180
|
+
// Organization settings moved to the standalone Settings app
|
|
2181
|
+
// (settings.politogyvrm.com, Specs/Organization-Settings v12).
|
|
2182
|
+
href: withOrg(`${SETTINGS_ORIGIN}organization-settings`),
|
|
2183
|
+
children: branches(SETTINGS_ORIGIN, ORG_SETTINGS_CHILDREN)
|
|
2093
2184
|
}
|
|
2094
2185
|
];
|
|
2095
2186
|
const buildRelationship = () => {
|
|
@@ -2111,16 +2202,15 @@ function standardPolitogyNav(opts) {
|
|
|
2111
2202
|
};
|
|
2112
2203
|
return [
|
|
2113
2204
|
{ kind: "section", label: "Relationship" },
|
|
2114
|
-
|
|
2205
|
+
// Dashboard moved to the standalone Dashboard app (dashboard.politogyvrm.com,
|
|
2206
|
+
// Specs/Relationship-Dashboard) with the retirement of app.politogyvrm.com.
|
|
2207
|
+
{ label: "Dashboard", icon: icon("layoutDashboard"), href: withOrg(DASHBOARD_ORIGIN) },
|
|
2115
2208
|
contacts,
|
|
2116
2209
|
{
|
|
2117
2210
|
label: "Email broadcast",
|
|
2118
2211
|
icon: icon("mail"),
|
|
2119
2212
|
href: withOrg(`${EMAIL_APP}/dashboard`),
|
|
2120
|
-
children:
|
|
2121
|
-
...APP_EMAIL_CHILDREN.map((c) => ({ label: c.label, icon: icon(c.icon), href: withOrg(c.href) })),
|
|
2122
|
-
...leaves([EMAIL_V1_LEGACY])
|
|
2123
|
-
]
|
|
2213
|
+
children: APP_EMAIL_CHILDREN.map((c) => ({ label: c.label, icon: icon(c.icon), href: withOrg(c.href) }))
|
|
2124
2214
|
},
|
|
2125
2215
|
{
|
|
2126
2216
|
// SMS/MMS Blast is the a2p app entered in RELATIONSHIP mode (a2p is
|
|
@@ -2133,8 +2223,14 @@ function standardPolitogyNav(opts) {
|
|
|
2133
2223
|
children: appLeaves(A2P_ORIGIN, APP_A2P_CHILDREN, "relationship")
|
|
2134
2224
|
},
|
|
2135
2225
|
{ kind: "section", label: "Collect" },
|
|
2136
|
-
//
|
|
2137
|
-
|
|
2226
|
+
// Calls to action moved to the standalone CTAs app (ctas./runtime.
|
|
2227
|
+
// politogyvrm.com, Specs/CTAs) with the retirement of app.politogyvrm.com.
|
|
2228
|
+
{
|
|
2229
|
+
label: "Calls to action",
|
|
2230
|
+
icon: icon("mousePointerClick"),
|
|
2231
|
+
href: withOrg("https://ctas.politogyvrm.com/"),
|
|
2232
|
+
children: APP_CTAS_CHILDREN.map((c) => ({ label: c.label, icon: icon(c.icon), href: withOrg(c.href) }))
|
|
2233
|
+
},
|
|
2138
2234
|
{
|
|
2139
2235
|
label: "Forms",
|
|
2140
2236
|
icon: icon("fileText"),
|
|
@@ -2147,6 +2243,16 @@ function standardPolitogyNav(opts) {
|
|
|
2147
2243
|
href: withOrg("https://surveys.politogyvrm.com/surveys"),
|
|
2148
2244
|
children: APP_SURVEYS_CHILDREN.map((c) => ({ label: c.label, icon: icon(c.icon), href: withOrg(c.href) }))
|
|
2149
2245
|
},
|
|
2246
|
+
// Polls (polls.politogyvrm.com) — kept in the default Collect section;
|
|
2247
|
+
// apps that want it hidden pass `hiddenItems: ['Polls']`. Regression:
|
|
2248
|
+
// dropped entirely in 03c4dc2 when app.politogyvrm.com retired; restored
|
|
2249
|
+
// here (this row is independent of the retired app).
|
|
2250
|
+
{
|
|
2251
|
+
label: "Polls",
|
|
2252
|
+
icon: icon("chartNoAxes"),
|
|
2253
|
+
href: withOrg(POLLS_ORIGIN),
|
|
2254
|
+
children: APP_POLLS_CHILDREN.map((c) => ({ label: c.label, icon: icon(c.icon), href: withOrg(c.href) }))
|
|
2255
|
+
},
|
|
2150
2256
|
...accountRows()
|
|
2151
2257
|
];
|
|
2152
2258
|
};
|
|
@@ -2160,8 +2266,12 @@ function standardPolitogyNav(opts) {
|
|
|
2160
2266
|
// Battleground is the Campaign landing page; there is no Campaign
|
|
2161
2267
|
// Dashboard row, and Voter Contact and Tribes have no row.
|
|
2162
2268
|
{ kind: "section", label: "Race data" },
|
|
2163
|
-
|
|
2164
|
-
|
|
2269
|
+
// Battleground moved to the Dashboard app (dashboard.politogyvrm.com)
|
|
2270
|
+
// until a dedicated Battleground host is decided (UI-Platform route table).
|
|
2271
|
+
{ label: "Battleground", icon: icon("crosshair"), href: withOrg(`${DASHBOARD_ORIGIN}battleground`) },
|
|
2272
|
+
// District data moved to the Dashboard app (dashboard.politogyvrm.com)
|
|
2273
|
+
// per Reference/UI-Platform v44.
|
|
2274
|
+
{ label: "District data", icon: icon("landmark"), href: withOrg(`${DASHBOARD_ORIGIN}districts`) },
|
|
2165
2275
|
{ kind: "section", label: "Research" },
|
|
2166
2276
|
{
|
|
2167
2277
|
label: "Polling",
|
|
@@ -3654,6 +3764,7 @@ function NavAppShell({
|
|
|
3654
3764
|
"data-politogy-mode": modeId ?? modeIdFromLabel(sidebar.mode?.label),
|
|
3655
3765
|
className: "min-h-screen bg-[color:var(--background)] text-[color:var(--foreground)]",
|
|
3656
3766
|
children: [
|
|
3767
|
+
/* @__PURE__ */ jsxRuntime.jsx(SpeculationRulesScript, { items: sidebar.nav.items }),
|
|
3657
3768
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3658
3769
|
NavSidebar,
|
|
3659
3770
|
{
|
|
@@ -4344,6 +4455,13 @@ var POLITOGY_APPS = {
|
|
|
4344
4455
|
// Specs/Left-Navigation §9.2: Polling is a Campaign row (Research).
|
|
4345
4456
|
polls: { title: "Polls", origin: "https://polls.politogyvrm.com", storagePrefix: "polls", mode: "campaign" },
|
|
4346
4457
|
ctas: { title: "CTAs", origin: "https://ctas.politogyvrm.com", storagePrefix: "ctas" },
|
|
4458
|
+
// V2 apps that replace retired app.politogyvrm.com pages (Reference/
|
|
4459
|
+
// UI-Platform v42 "Retirement of app.politogyvrm.com"). Dashboard hosts the
|
|
4460
|
+
// Relationship Dashboard + Campaign Battleground/District data/Campaigns
|
|
4461
|
+
// (Specs/Relationship-Dashboard); Settings hosts org settings & billing
|
|
4462
|
+
// (Specs/Organization-Settings).
|
|
4463
|
+
dashboard: { title: "Dashboard", origin: "https://dashboard.politogyvrm.com", storagePrefix: "dashboard" },
|
|
4464
|
+
settings: { title: "Settings", origin: "https://settings.politogyvrm.com", storagePrefix: "settings" },
|
|
4347
4465
|
petitions: {
|
|
4348
4466
|
title: "Petitions",
|
|
4349
4467
|
origin: "https://petition-mode.politogyvrm.com",
|