@the-portland-company/shell 0.95.0 → 0.96.1

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 CHANGED
@@ -1,3 +1,20 @@
1
+ ## 0.96.1
2
+
3
+ Privacy, Terms and Subscriptions open in a new tab (Ben 2026-11-04: clicking Privacy replaced the app with the public Politogy ID page, with no left bar or top bar).
4
+
5
+ - **Left-bar footer links honor `external`.** `NavFooterLink.external` was documented as "opens in a new tab" but the rail footer ignored it, so every app sent the user away from the app in the same tab. External links now get `target="_blank"` and `rel="noopener noreferrer"`; links without `external` keep opening in the same tab. Every app on the frame gets this with a version bump and no code change.
6
+ - **Privacy and Terms point at the website** (Ben 2026-11-04: "Yes, point them now"): Privacy `https://politogyvrm.com/privacy` (was Politogy ID `/privacy-policy`), Terms `https://politogyvrm.com/terms-of-service` (was `/terms-and-conditions`). Subscriptions is unchanged. `footerLinks()` no longer depends on the host, so staging links to the same public pages.
7
+ - Tests: `__tests__/native.test.tsx` ("opens external legal links in a new tab"), `__tests__/retiredHostLinks.test.tsx` (the three addresses).
8
+
9
+ ## 0.96.0
10
+
11
+ One shared "⋯" row menu for list rows (Ben 2026-10-26: Email's broadcast menu stuck open, and on the last row Archive and Delete were cut off by the table frame).
12
+
13
+ - **New `RowMenu`** (root and `/native`): the trigger button plus a panel rendered in a portal on `<body>` with fixed positioning, so a table wrapper or card with `overflow: hidden/auto` never clips it. It opens below the trigger, right-aligned, and flips above when it does not fit below. It closes on an outside click, on Escape (focus back on the trigger), after a `role="menuitem"` is chosen, when another row's menu opens, and on page scroll or resize. Arrow keys, Home and End move between items. Clicks on the trigger and in the panel do not bubble to the row (React carries portal events to ancestors), so a clickable row does not open too. Clicks on anything that is not a menu item (an inline form expanding in the panel) keep it open; the close after a choice waits a tick so a submit button's form still submits. Pass `triggerClassName` / `panelClassName` to use an app's own classes instead of the default token look.
14
+ - **New `RowMenuItem`**: a plain button item (`onSelect`, `disabled`, `danger`).
15
+ - Also exported: `rowMenuPosition()` (the placement math) and the `RowMenuPlacement` type.
16
+ - Tests: `__tests__/rowMenu.test.tsx`.
17
+
1
18
  ## 0.95.0
2
19
 
3
20
  Every app's browser tab shows the Brand's VRM tile (Brand `assets.favicon`; Reference/UI-Platform conformance: "Favicons resolve from Brand `assets.favicon`, not static files").
@@ -3180,6 +3180,7 @@ function NavSidebar({
3180
3180
  "a",
3181
3181
  {
3182
3182
  href: safeHref(l.href),
3183
+ ...l.external ? { target: "_blank", rel: "noopener noreferrer" } : {},
3183
3184
  className: "text-[color:var(--sidebar-caption,var(--sidebar-text-muted,var(--muted)))] hover:text-[color:var(--sidebar-text,var(--foreground))] hover:underline",
3184
3185
  children: l.label
3185
3186
  }
@@ -5668,14 +5669,11 @@ function useIsSuperAdmin() {
5668
5669
  return (state?.orgs ?? []).some((o) => /super/i.test(o.rawRole ?? ""));
5669
5670
  }
5670
5671
  function footerLinks() {
5671
- const auth = authBaseUrl();
5672
- return [
5673
- { label: "Privacy", href: `${auth}/privacy-policy`, external: true },
5674
- { label: "Terms", href: `${auth}/terms-and-conditions`, external: true },
5675
- ...FOOTER_LINKS_STATIC
5676
- ];
5672
+ return FOOTER_LINKS.map((l) => ({ ...l }));
5677
5673
  }
5678
- var FOOTER_LINKS_STATIC = [
5674
+ var FOOTER_LINKS = [
5675
+ { label: "Privacy", href: "https://politogyvrm.com/privacy", external: true },
5676
+ { label: "Terms", href: "https://politogyvrm.com/terms-of-service", external: true },
5679
5677
  {
5680
5678
  label: "Subscriptions",
5681
5679
  href: "https://politogyvrm.com/subscription-cancellation-policy",