@the-portland-company/shell 0.26.0 → 0.28.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 +43 -0
- package/dist/app-chrome.cjs +45 -5
- package/dist/app-chrome.cjs.map +1 -1
- package/dist/app-chrome.js +24 -4
- package/dist/app-chrome.js.map +1 -1
- package/dist/{chunk-QCA2PGKA.js → chunk-I3DWBWY6.js} +25 -5
- package/dist/chunk-I3DWBWY6.js.map +1 -0
- package/dist/native.cjs +23 -3
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.cts +31 -5
- package/dist/native.d.ts +31 -5
- package/dist/native.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-QCA2PGKA.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,46 @@
|
|
|
1
|
+
## 0.28.0 — 2026-07-23
|
|
2
|
+
|
|
3
|
+
### Fixed — DevNotes "Create Task" did nothing
|
|
4
|
+
|
|
5
|
+
`AppDevNotes` mounted `DevNotesProvider` and the menu, but never
|
|
6
|
+
`<DevNotesOverlay />`. The menu only TOGGLES creation mode; the overlay is what
|
|
7
|
+
renders the click-to-place capture layer, the report dots and the report form —
|
|
8
|
+
so on forms / surveys / polls, clicking **Create Task** closed the menu and
|
|
9
|
+
nothing happened at all (HITL bug report 2026-07-23). Contacts escaped it only
|
|
10
|
+
because it still carried its own hand-rolled surface.
|
|
11
|
+
|
|
12
|
+
The chrome now mounts a `DevNotesSurface` at the chrome root: the overlay, plus
|
|
13
|
+
the "View All Tasks" modal (rendered at the root so the top bar's stacking and
|
|
14
|
+
backdrop-blur can't trap it, and mounted only while open so it doesn't fetch
|
|
15
|
+
every user's tasks on page load).
|
|
16
|
+
|
|
17
|
+
## 0.27.0 — 2026-07-23
|
|
18
|
+
|
|
19
|
+
VRM native-chrome parity (shell-nav-handoff §1–§3). All three were verified in
|
|
20
|
+
this package's source before changing anything, and all three are additive —
|
|
21
|
+
forms / surveys / polls / contacts behavior is unchanged.
|
|
22
|
+
|
|
23
|
+
### Added — `NavAppShell contentWrapper`
|
|
24
|
+
|
|
25
|
+
`'padded'` (default) keeps the existing `<main class="px-6 py-7">` + `mx-auto
|
|
26
|
+
max-w-7xl`. `'bare'` renders children directly. VRM wraps every page in the
|
|
27
|
+
shell's own `PageContainer` — which emits its OWN `<main>` and max-width — so
|
|
28
|
+
the default gave it a **nested `<main>`** (invalid HTML) and a doubled gutter on
|
|
29
|
+
Org Settings, Email Broadcast and SMS/MMS Blast.
|
|
30
|
+
|
|
31
|
+
### Added — nav group headers can navigate as well as expand
|
|
32
|
+
|
|
33
|
+
A group header always toggles; when the item also carries an `onClick`, that now
|
|
34
|
+
runs too, so a parent row can open its section dashboard AND expand in one
|
|
35
|
+
click. Existing apps pass no parent `onClick`, so nothing changes for them.
|
|
36
|
+
|
|
37
|
+
### Added — `NavItem.disabled` + `NavItem.disabledTitle`
|
|
38
|
+
|
|
39
|
+
Mirrors `NavTab`'s existing contract: a gated row renders as a non-interactive,
|
|
40
|
+
dimmed `aria-disabled` span with its reason as a tooltip. VRM gates Email / SMS
|
|
41
|
+
until setup is complete and previously had no way to express that, so gated rows
|
|
42
|
+
rendered fully clickable.
|
|
43
|
+
|
|
1
44
|
## 0.26.0 — 2026-07-23
|
|
2
45
|
|
|
3
46
|
### Added — `PolitogyAppFrame` data plumbing (so Contacts can adopt it)
|
package/dist/app-chrome.cjs
CHANGED
|
@@ -1313,6 +1313,17 @@ function NavRow({
|
|
|
1313
1313
|
item.label
|
|
1314
1314
|
] })
|
|
1315
1315
|
] });
|
|
1316
|
+
if (item.disabled) {
|
|
1317
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1318
|
+
"span",
|
|
1319
|
+
{
|
|
1320
|
+
"aria-disabled": "true",
|
|
1321
|
+
title: item.disabledTitle,
|
|
1322
|
+
className: `${wrapperClasses} cursor-not-allowed opacity-50`,
|
|
1323
|
+
children: inner
|
|
1324
|
+
}
|
|
1325
|
+
);
|
|
1326
|
+
}
|
|
1316
1327
|
if (item.onClick && !item.href) {
|
|
1317
1328
|
return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: item.onClick, className: `w-full text-left ${wrapperClasses}`, children: inner });
|
|
1318
1329
|
}
|
|
@@ -1346,7 +1357,10 @@ function NavGroup({
|
|
|
1346
1357
|
"button",
|
|
1347
1358
|
{
|
|
1348
1359
|
type: "button",
|
|
1349
|
-
onClick:
|
|
1360
|
+
onClick: () => {
|
|
1361
|
+
onToggle();
|
|
1362
|
+
item.onClick?.();
|
|
1363
|
+
},
|
|
1350
1364
|
"aria-expanded": open,
|
|
1351
1365
|
className: headerClasses,
|
|
1352
1366
|
children: [
|
|
@@ -1866,14 +1880,20 @@ function useCloseNavDetailsOnOutsideClick() {
|
|
|
1866
1880
|
};
|
|
1867
1881
|
}, []);
|
|
1868
1882
|
}
|
|
1869
|
-
function NavAppShell({
|
|
1883
|
+
function NavAppShell({
|
|
1884
|
+
sidebar,
|
|
1885
|
+
topBar,
|
|
1886
|
+
betaBanner,
|
|
1887
|
+
contentWrapper = "padded",
|
|
1888
|
+
children
|
|
1889
|
+
}) {
|
|
1870
1890
|
useCloseNavDetailsOnOutsideClick();
|
|
1871
1891
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-h-screen bg-[color:var(--background)] text-[color:var(--foreground)]", children: [
|
|
1872
1892
|
/* @__PURE__ */ jsxRuntime.jsx(NavSidebar, { ...sidebar }),
|
|
1873
1893
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:pl-[240px]", children: [
|
|
1874
1894
|
/* @__PURE__ */ jsxRuntime.jsx(NavTopBar, { ...topBar }),
|
|
1875
1895
|
betaBanner ? /* @__PURE__ */ jsxRuntime.jsx(NavBetaBanner, { ...betaBanner }) : null,
|
|
1876
|
-
/* @__PURE__ */ jsxRuntime.jsx("main", { className: "px-6 py-7", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto max-w-7xl", children }) })
|
|
1896
|
+
contentWrapper === "bare" ? children : /* @__PURE__ */ jsxRuntime.jsx("main", { className: "px-6 py-7", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto max-w-7xl", children }) })
|
|
1877
1897
|
] })
|
|
1878
1898
|
] });
|
|
1879
1899
|
}
|
|
@@ -2215,7 +2235,22 @@ function AppDevNotes({
|
|
|
2215
2235
|
}),
|
|
2216
2236
|
[storagePrefix, identity.role]
|
|
2217
2237
|
);
|
|
2218
|
-
return /* @__PURE__ */ jsxRuntime.jsx(devnotes.DevNotesProvider, { adapter, user, config, children });
|
|
2238
|
+
return /* @__PURE__ */ jsxRuntime.jsx(devnotes.DevNotesProvider, { adapter, user, config, children: /* @__PURE__ */ jsxRuntime.jsx(DevNotesSurface, { children }) });
|
|
2239
|
+
}
|
|
2240
|
+
var DevNotesTasksContext = react.createContext({
|
|
2241
|
+
ready: false,
|
|
2242
|
+
openTasks: () => {
|
|
2243
|
+
}
|
|
2244
|
+
});
|
|
2245
|
+
function DevNotesSurface({ children }) {
|
|
2246
|
+
const [tasksOpen, setTasksOpen] = react.useState(false);
|
|
2247
|
+
const openTasks = react.useCallback(() => setTasksOpen(true), []);
|
|
2248
|
+
const tasksCtx = react.useMemo(() => ({ ready: true, openTasks }), [openTasks]);
|
|
2249
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(DevNotesTasksContext.Provider, { value: tasksCtx, children: [
|
|
2250
|
+
children,
|
|
2251
|
+
tasksOpen ? /* @__PURE__ */ jsxRuntime.jsx(devnotes.DevNotesTaskListModal, { open: true, onClose: () => setTasksOpen(false) }) : null,
|
|
2252
|
+
/* @__PURE__ */ jsxRuntime.jsx(devnotes.DevNotesOverlay, {})
|
|
2253
|
+
] });
|
|
2219
2254
|
}
|
|
2220
2255
|
function PolitogyAppChrome({
|
|
2221
2256
|
storagePrefix,
|
|
@@ -2263,13 +2298,18 @@ function ChromeTopBarActions() {
|
|
|
2263
2298
|
{
|
|
2264
2299
|
title: "DevNotes",
|
|
2265
2300
|
description: "Capture bugs and notes, filed straight to Forge.",
|
|
2266
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2301
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(ChromeDevNotesMenu, {})
|
|
2267
2302
|
}
|
|
2268
2303
|
),
|
|
2269
2304
|
/* @__PURE__ */ jsxRuntime.jsx(SupportAction, {}),
|
|
2270
2305
|
/* @__PURE__ */ jsxRuntime.jsx(NotificationsAction, { orgId: state.orgId })
|
|
2271
2306
|
] });
|
|
2272
2307
|
}
|
|
2308
|
+
function ChromeDevNotesMenu() {
|
|
2309
|
+
const { ready, openTasks } = react.useContext(DevNotesTasksContext);
|
|
2310
|
+
if (!ready) return null;
|
|
2311
|
+
return /* @__PURE__ */ jsxRuntime.jsx(devnotes.DevNotesMenu, { position: "top-right", onViewTasks: openTasks });
|
|
2312
|
+
}
|
|
2273
2313
|
function useIsSuperAdmin() {
|
|
2274
2314
|
const state = useChromeState();
|
|
2275
2315
|
return (state?.orgs ?? []).some((o) => /super/i.test(o.rawRole ?? ""));
|