The settings / management hub that runs a page — opened by its owner or admin. Granular roles Owner · Admin · Editor, staff-only posting, basic insights free (deeper analytics a later paid tier), and a Channel slot reserved for R10. Extends the PP7/PP8 manage frames in pages-platform.html. Mockup for design sign-off.
The spine an admin/owner opens. A single settings list: Edit page (identity → M6), Roles & staff (→ M2), Who can post (shows "Staff only"), Insights (→ M4), a Channel slot reserved for R10 ("soon"), and the owner-only Transfer / Delete (→ M5), visually fenced. Reuses .mg-mode / .mg-set / .mg-srow / .mg-danger verbatim.
The people list with role chips — Owner · Admin · Editor. Per-person ⋯ opens change-role / remove. A short legend explains each role's powers, and the "Add staff" CTA leads to M3. Owner row can't be removed here; ownership only moves via Transfer (M5).
Search a Nyburs user → confirm the pick → choose a role. As Owner you can set Admin or Editor; an Admin reaches this same screen but the Admin option is locked (only Owner promotes to Admin). One confirm grants access. Reuses the platform search-field + segmented choice patterns.
The free tier shown in Manage: followers, post reach, engagement, plus a small 7-day trend. Below sits the paid hook — a gold "Deeper analytics" teaser (per-area breakdown, audience, the parent rollup leaderboard) marked as a future premium tier, not built. Reuses .mg-ins verbatim; the teaser borrows the platform's gold lock vocabulary.
The two destructive owner powers, each behind a confirm sheet. Transfer: pick an Admin to become the new Owner (you drop to Admin) — a warning explains it's a one-way handover. Delete: a type-to-confirm destructive sheet removes the page, followers & posts for good. Reuses .mg-danger + a scrim sheet on the same tokens.
The existing PP3/PP7 edit surface, opened from the hub: cover, logo, the brand-colour swatch, and pencils-in-place for name, handle (with a confirm on a transfer-style change of an existing page), and about. Place & level are fixed after creation (shown, locked). Reuses .mg-idcard / .mg-row / .mg-pen verbatim — the same component PP7/PP8 already use.
The locked decisions this surface implements, plus a GraphQL contract sketch for the build. All dev-first; flag-gated until the place-affiliated-pages initiative lands.
# ---- enums ---- enum PageRole { OWNER ADMIN EDITOR } enum PagePostPolicy { STAFF_ONLY } # no PUBLIC / no approval queue (locked) # ---- types ---- type PageStaff { user: User! role: PageRole! addedBy: User addedAt: DateTime! } type PageInsightsBasic { # free tier — counts only followers: Int! newFollowers: Int! postReach: Int! engagement: Int! profileViews: Int! postsPublished: Int! trend7d: [Int!]! range: DateRange! } # deep/per-area rollup = separate PAID resolver, gated # ---- queries (viewer-role-scoped) ---- pageManage(pageId: ID!): PageManageView! # null/forbidden for EDITOR pageStaff(pageId: ID!): [PageStaff!]! pageInsightsBasic(pageId: ID!, range: DateRange): PageInsightsBasic! # ---- mutations (server enforces role matrix) ---- addPageStaff(pageId: ID!, userId: ID!, role: PageRole!): PageStaff! # OWNER → ADMIN|EDITOR ; ADMIN → EDITOR only ; never OWNER changePageStaffRole(pageId: ID!, userId: ID!, role: PageRole!): PageStaff! removePageStaff(pageId: ID!, userId: ID!): Boolean! setPagePostPolicy(pageId: ID!, policy: PagePostPolicy!): Page! # STAFF_ONLY updatePageIdentity(pageId: ID!, input: PageIdentityInput!): Page! # name·about·handle·logo·brandColor·cover ; place/level/category immutable transferPageOwnership(pageId: ID!, toUserId: ID!): Page! # OWNER only ; target must be an existing ADMIN ; caller → ADMIN deletePage(pageId: ID!, confirm: String!): Boolean! # OWNER only ; confirm == "DELETE" # ---- R10 (next, not built) ---- linkPageChannel(pageId: ID!, channelId: ID!): Page! # soon # ---- enforcement (resolver guards, NOT UI-only) ---- # · post-as-page: writer.role IN (OWNER,ADMIN,EDITOR) AND policy==STAFF_ONLY # · settings/role mutations: role IN (OWNER,ADMIN) ; addAdmin/promote: OWNER # · transfer/delete: OWNER ; every mutation re-checks server-side