// Mock data for Brightnest Brand OS demo

const BRAND = {
  name: "Brightnest",
  initial: "B",
  workspace: "Brightnest",
  role: "Brand workspace",
};

const COLORS = [
  { nm: "Ink",       hex: "#0A0A0A", role: "Primary" },
  { nm: "Paper",     hex: "#F6F5F1", role: "Surface" },
  { nm: "Ember",     hex: "#D9712F", role: "Accent" },
  { nm: "Moss",      hex: "#3D5A40", role: "Secondary" },
  { nm: "Stone",     hex: "#8A8780", role: "Neutral" },
  { nm: "Cloud",     hex: "#FFFFFF", role: "Surface alt" },
];

const TYPE_SCALE = [
  { lbl: "Display", family: "Instrument Serif", weights: "Regular · Italic", note: "Editorial display moments only" },
  { lbl: "Sans",    family: "Geist",            weights: "300 / 400 / 500",   note: "Interface, body, captions" },
  { lbl: "Mono",    family: "Geist Mono",       weights: "400 / 500",          note: "Tokens, labels, metadata" },
];

const VOICE_PILLARS = [
  { h: "Calm, never quiet.",  do: "Lead with the why. Concrete > clever.", dont: "No hype, no exclamation points." },
  { h: "Warm, but exact.",     do: "Specific nouns. Precise verbs.",       dont: "Avoid 'amazing', 'revolutionary'." },
  { h: "Plainly confident.",   do: "Short sentences. Active voice.",       dont: "Don't hedge. Don't apologize." },
];

const RECENT_ASSETS = [
  { ttl: "Spring Campaign — Hero Lockup",  meta: "LOGO · v3 · PNG / SVG",     when: "Updated 2h ago",   by: "Anna L." },
  { ttl: "Founders Series — Portraits 01", meta: "IMAGERY · 12 files",        when: "Updated yesterday", by: "Marko E." },
  { ttl: "Voice & Tone — Spring Refresh",  meta: "GUIDELINES · 8 pages",      when: "Updated 3d ago",    by: "Sofia R." },
  { ttl: "Color Tokens — Web v2.1",        meta: "TOKENS · 24 swatches",      when: "Updated 5d ago",    by: "System"   },
];

const ACTIVITY = [
  { t: "09:42", who: "Sofia R.",  msg: "approved 3 ad variants in Spring/Garden launch.", tag: "Studio" },
  { t: "09:14", who: "Marko E.",  msg: "uploaded 14 portrait shots to Imagery / Founders.", tag: "Library" },
  { t: "Yest.", who: "Anna L.",   msg: "drafted 6 captions for Instagram week 21.",        tag: "Content" },
  { t: "Yest.", who: "System",    msg: "regenerated color tokens (web, iOS, Android).",     tag: "Tokens" },
  { t: "Mon",  who: "Henrik N.",  msg: "left 4 comments on 'Garden — outdoor sofa'.",       tag: "Review" },
  { t: "Mon",  who: "Anna L.",    msg: "scheduled 'Weekend brief' email for Fri 09:00.",    tag: "Content" },
];

const TEMPLATES = [
  { id: "ig-sq",     name: "Instagram — Square",     meta: "1080 × 1080 · IG / FB",  glyph: "B", ratio: "square" },
  { id: "ig-story",  name: "Instagram — Story",      meta: "1080 × 1920 · IG / TT",  glyph: "S", ratio: "story" },
  { id: "fb-feed",   name: "Meta Ad — Feed",         meta: "1200 × 1500 · Paid",     glyph: "F", ratio: "portrait" },
  { id: "newsletter",name: "Newsletter — Header",    meta: "1600 × 600 · Email",     glyph: "N", ratio: "portrait" },
  { id: "billboard", name: "Out-of-home — Billboard",meta: "6000 × 3000 · Print",    glyph: "O", ratio: "portrait" },
  { id: "blogcard",  name: "Editorial — Article",    meta: "1600 × 900 · Web",       glyph: "E", ratio: "portrait" },
];

const COPY_VARIANTS = [
  { k: "Headline / 01", txt: "A quieter kind of light." },
  { k: "Headline / 02", txt: "Built slow, on purpose." },
  { k: "Headline / 03", txt: "Made for the long evening." },
  { k: "Body",          txt: "Our Spring collection brings outdoor materials back inside — oak, linen, hand-thrown ceramics. Built once, kept for decades." },
  { k: "CTA",           txt: "See the collection →" },
];

// Content plan — fields mirror Brightnest's content-plan spreadsheet
// (Mall + Tekniskt_rör ej + Q1-2026 sheets).

// Status flow, in the order publishing teams move through.
const STATUS_OPTIONS = [
  { id: "draft",     label: "Ej påbörjad",        tone: "muted" },
  { id: "production",label: "I produktion",       tone: "amber" },
  { id: "review",    label: "Redo för korrektur", tone: "blue"  },
  { id: "approved",  label: "Redo för publicering", tone: "violet" },
  { id: "scheduled", label: "Schemalagd",         tone: "ink"   },
  { id: "published", label: "Publicerad",         tone: "green" },
];

// Channels (PLATTFORM in the sheet) + a short code for the dot color.
const CHANNEL_OPTIONS = [
  { id: "instagram",  label: "Instagram",  short: "IG"  },
  { id: "linkedin",   label: "LinkedIn",   short: "LI"  },
  { id: "facebook",   label: "Facebook",   short: "FB"  },
  { id: "newsletter", label: "Nyhetsbrev", short: "NB"  },
  { id: "web",        label: "Webb",       short: "WEB" },
  { id: "tiktok",     label: "TikTok",     short: "TT"  },
  { id: "youtube",    label: "YouTube",    short: "YT"  },
];

// Inläggstyp — common values seen in the sheet.
const POSTTYPE_OPTIONS = [
  "Feed", "Karusell", "Story", "Reel", "Annons", "Artikel", "Nyhetsbrev",
];

const SPONSORING_OPTIONS = ["Organiskt", "Sponsrat"];

// Permissions — atomic capabilities. Roles bundle these.
const PERMISSIONS = [
  { id: "view",             label: "Se innehåll",            desc: "Se planerade och publicerade inlägg" },
  { id: "comment",          label: "Kommentera",              desc: "Lämna feedback och kommentarer" },
  { id: "approve_brand",    label: "Brand-godkänna",          desc: "Slutgiltigt internt godkännande" },
  { id: "approve_customer", label: "Kundgodkänna",            desc: "Godkänna som kund" },
  { id: "create",           label: "Skapa innehåll",          desc: "Lägga upp nya inlägg och tillgångar" },
  { id: "edit",             label: "Redigera innehåll",       desc: "Ändra befintliga inlägg" },
  { id: "publish",          label: "Publicera",               desc: "Skicka iväg ett godkänt inlägg" },
  { id: "manage_users",     label: "Hantera personer & roller", desc: "Bjuda in personer, redigera roller och flöden" },
];

// Roles — built-in plus room for custom.
const ROLES = [
  { id: "owner",             name: "Workspace-ägare",   scope: "internal", builtin: true,  perms: ["view","comment","approve_brand","create","edit","publish","manage_users"] },
  { id: "producer",          name: "Producent",         scope: "internal", builtin: true,  perms: ["view","comment","create","edit","publish"] },
  { id: "editor",            name: "Editor",            scope: "internal", builtin: true,  perms: ["view","comment","create","edit"] },
  { id: "customer_approver", name: "Kund — godkännare", scope: "customer", builtin: true,  perms: ["view","comment","approve_customer"] },
  { id: "customer_viewer",   name: "Kund — läsare",     scope: "customer", builtin: true,  perms: ["view","comment"] },
];

// People — internal team + customer contacts.
const PEOPLE = [
  { id: "anna",    name: "Anna Lindqvist",      initials: "AL", email: "anna@brightnest.se",     org: "Brightnest",   roleId: "owner",             status: "active" },
  { id: "victor",  name: "Victor Forsberg",     initials: "VF", email: "victor@brightnest.se",   org: "Brightnest",   roleId: "producer",          status: "active" },
  { id: "johanna", name: "Johanna Andersson",   initials: "JA", email: "johanna@brightnest.se",  org: "Brightnest",   roleId: "producer",          status: "active" },
  { id: "julia",   name: "Julia Lindström",     initials: "JL", email: "julia@brightnest.se",    org: "Brightnest",   roleId: "editor",            status: "active" },
  { id: "amanda",  name: "Amanda Markusson",    initials: "AM", email: "amanda@brightnest.se",   org: "Brightnest",   roleId: "editor",            status: "active" },
  { id: "freddie", name: "Freddie Holm",        initials: "FH", email: "freddie@brightnest.se",  org: "Brightnest",   roleId: "editor",            status: "active" },
  { id: "tessan",  name: "Tessan Bergqvist",    initials: "TB", email: "tessan@brightnest.se",   org: "Brightnest",   roleId: "editor",            status: "active" },
  { id: "maggan",  name: "Margareta Nilsson",   initials: "MN", email: "maggan@brightnest.se",   org: "Brightnest",   roleId: "editor",            status: "active" },
  { id: "jacob",   name: "Jacob Nilsson",       initials: "JN", email: "jacob@brightnest.se",    org: "Brightnest",   roleId: "editor",            status: "active" },
  { id: "alex",    name: "Alexander Sundström", initials: "AS", email: "alex@brightnest.se",     org: "Brightnest",   roleId: "editor",            status: "active" },
  { id: "frida",   name: "Frida A Johansson",   initials: "FJ", email: "frida@brightnest.se",    org: "Brightnest",   roleId: "producer",          status: "active" },
  { id: "shelsea", name: "Shelsea Karlsson",    initials: "SK", email: "shelsea@brightnest.se",  org: "Brightnest",   roleId: "editor",            status: "active" },
  // Customer contacts
  { id: "linda",   name: "Linda Söderberg",     initials: "LS", email: "linda@norrtag.se",       org: "Norrtåg",      roleId: "customer_approver", status: "active" },
  { id: "magnus",  name: "Magnus Karlsson",     initials: "MK", email: "magnus@norrtag.se",      org: "Norrtåg",      roleId: "customer_viewer",   status: "invited" },
  { id: "elin",    name: "Elin Holm",           initials: "EH", email: "elin@lulea.se",          org: "Luleå kommun", roleId: "customer_approver", status: "active" },
];

// Backwards-compat alias for the existing OwnerPicker.
const TEAM = PEOPLE;

// Platforms & supported formats. Pixel sizes and channel mapping are
// what Studio and Content Plan use to render previews and filter pills.
const PLATFORMS = [
  {
    id: "instagram", channelId: "instagram", label: "Instagram", enabled: true,
    formats: [
      { id: "ig_feed_square",   label: "Feed · 1:1",   w: 1080, h: 1080, kind: "organic" },
      { id: "ig_feed_portrait", label: "Feed · 4:5",   w: 1080, h: 1350, kind: "organic" },
      { id: "ig_story",         label: "Story · 9:16", w: 1080, h: 1920, kind: "organic" },
      { id: "ig_reel",          label: "Reel · 9:16",  w: 1080, h: 1920, kind: "organic" },
      { id: "ig_ad",            label: "Annons · 1:1", w: 1080, h: 1080, kind: "ad" },
    ],
  },
  {
    id: "linkedin", channelId: "linkedin", label: "LinkedIn", enabled: true,
    formats: [
      { id: "li_feed",     label: "Feed · 1.91:1", w: 1200, h: 627,  kind: "organic" },
      { id: "li_carousel", label: "Karusell · 1:1", w: 1080, h: 1080, kind: "organic" },
      { id: "li_ad",       label: "Annons · 1.91:1", w: 1200, h: 627, kind: "ad" },
    ],
  },
  {
    id: "facebook", channelId: "facebook", label: "Facebook", enabled: true,
    formats: [
      { id: "fb_feed", label: "Feed · 1.91:1", w: 1200, h: 630, kind: "organic" },
      { id: "fb_ad",   label: "Annons · 1:1",  w: 1080, h: 1080, kind: "ad" },
    ],
  },
  {
    id: "newsletter", channelId: "newsletter", label: "Nyhetsbrev", enabled: true,
    formats: [
      { id: "nl_hero", label: "Hero · 2:1", w: 1200, h: 600, kind: "email" },
    ],
  },
  {
    id: "web", channelId: "web", label: "Webb", enabled: true,
    formats: [
      { id: "web_hero",  label: "Hero · 16:9",  w: 1920, h: 1080, kind: "web" },
      { id: "web_thumb", label: "Thumb · 16:10", w: 1280, h: 800, kind: "web" },
    ],
  },
  {
    id: "tiktok", channelId: "tiktok", label: "TikTok", enabled: false,
    formats: [
      { id: "tt_video", label: "Video · 9:16", w: 1080, h: 1920, kind: "organic" },
    ],
  },
  {
    id: "youtube", channelId: "youtube", label: "YouTube", enabled: false,
    formats: [
      { id: "yt_video",  label: "Video · 16:9",   w: 1920, h: 1080, kind: "organic" },
      { id: "yt_shorts", label: "Shorts · 9:16", w: 1080, h: 1920, kind: "organic" },
    ],
  },
];

// Approval flows — ordered stages, each names the permission required to sign off.
const APPROVAL_FLOWS = [
  {
    id: "standard",
    name: "Standardflöde",
    description: "Brand-godkännande → kundgodkännande → publicering.",
    isDefault: true,
    stages: [
      { id: "brand",    label: "Brand-godkännande",   requirePermission: "approve_brand" },
      { id: "customer", label: "Kundgodkännande",     requirePermission: "approve_customer" },
      { id: "publish",  label: "Klar för publicering",requirePermission: "publish" },
    ],
  },
  {
    id: "fast",
    name: "Snabbflöde (internt)",
    description: "Bara internt — för organiska inlägg utan kunddialog.",
    isDefault: false,
    stages: [
      { id: "brand",   label: "Brand-godkännande",    requirePermission: "approve_brand" },
      { id: "publish", label: "Klar för publicering", requirePermission: "publish" },
    ],
  },
];

// Posts — one entry per scheduled item.
const POSTS = [
  {
    id: "p001", date: "2026-05-04", time: "07:00",
    topic: "Spring/Garden — Meta-annons set A",
    type: "Annons", sponsoring: "Sponsrat",
    channels: ["instagram", "facebook"],
    owners: ["victor", "amanda"],
    status: "published",
    copy: {
      instagram: "Trädgården vaknar. Set A — fyra varianter, samma stillsamma ton.",
      facebook:  "Set A släppt: fyra varianter, samma stillsamma ton. Mer på sidan.",
      linkedin:  "", web: ""
    },
    url: "https://brightnest.se/spring-garden", sokvag: "/Internt/Jobb/2026/2026-05 Spring/Set-A",
    linkRubrik: "Spring/Garden — kollektionen",
    notering: "Paid set A live från måndag. Sponsring 3 500 kr/v.",
    feedback: "Bra CTR i första dygnet — fortsätt monitorera."
  },
  {
    id: "p002", date: "2026-05-06", time: "17:00",
    topic: "IG-karusell — ljus i hemmet",
    type: "Karusell", sponsoring: "Organiskt",
    channels: ["instagram"], owners: ["johanna"],
    status: "published",
    copy: { instagram: "Sex sätt att flytta ljus utan att flytta möbler.", facebook: "", linkedin: "", web: "" },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Ljus karusell",
    linkRubrik: "", notering: "Karusell, 6 slides 1080×1350.", feedback: ""
  },
  {
    id: "p003", date: "2026-05-08", time: "09:00",
    topic: "Nyhetsbrev / w19",
    type: "Nyhetsbrev", sponsoring: "Organiskt",
    channels: ["newsletter"], owners: ["anna"],
    status: "published",
    copy: { instagram: "", facebook: "", linkedin: "", web: "Veckans utskick — w19, sex sektioner." },
    url: "", sokvag: "/Internt/Nyhetsbrev/2026/w19",
    linkRubrik: "", notering: "", feedback: ""
  },
  {
    id: "p004", date: "2026-05-11", time: "06:00",
    topic: "Case: The Luleå way",
    type: "Artikel", sponsoring: "Sponsrat",
    channels: ["linkedin", "web"],
    owners: ["victor", "johanna"],
    status: "scheduled",
    copy: {
      instagram: "",
      facebook:  "",
      linkedin:  "Vad händer egentligen med en stad när framtiden knackar på? Vi tittade närmare på Luleå.",
      web:       "Bakom kulisserna: så byggde vi Luleås nya platsvarumärke. Läs hela caset."
    },
    url: "https://brightnest.se/news/bakom-kulisserna-saa-byggde-vi-lulea",
    sokvag: "/Internt/Jobb/2026/2026-05 Luleå case",
    linkRubrik: "Case · The Luleå way",
    notering: "Krediter: Sidovärn fotograf.",
    feedback: ""
  },
  {
    id: "p005", date: "2026-05-13", time: "10:00",
    topic: "Editorial — Slow design",
    type: "Artikel", sponsoring: "Organiskt",
    channels: ["web", "linkedin"],
    owners: ["anna", "freddie"],
    status: "review",
    copy: {
      instagram: "",
      facebook:  "",
      linkedin:  "Slow design är inte motsatsen till snabb. Det är motsatsen till slarvig.",
      web:       "En text om att designa för decennier — inte för säsonger. ~1400 ord."
    },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Slow design",
    linkRubrik: "Slow design — varför vi gör som vi gör",
    notering: "Korr hos Tessan. Backas innan publik.",
    feedback: "Stryk avsnitt om materialval — för långt."
  },
  {
    id: "p006", date: "2026-05-13", time: "18:00",
    topic: "IG-reel — Workshop",
    type: "Reel", sponsoring: "Organiskt",
    channels: ["instagram"], owners: ["julia", "amanda"],
    status: "scheduled",
    copy: { instagram: "En kväll på verkstaden. Linne, lera, ljus. 0:42.", facebook: "", linkedin: "", web: "" },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Workshop reel",
    linkRubrik: "", notering: "Klipp: Jacob.", feedback: ""
  },
  {
    id: "p007", date: "2026-05-14", time: "09:00",
    topic: "Nyhetsbrev / w20",
    type: "Nyhetsbrev", sponsoring: "Organiskt",
    channels: ["newsletter"], owners: ["anna"],
    status: "production",
    copy: { instagram: "", facebook: "", linkedin: "", web: "Veckans utskick — w20." },
    url: "", sokvag: "/Internt/Nyhetsbrev/2026/w20",
    linkRubrik: "", notering: "Behöver bild från Spring-skjutningen.", feedback: ""
  },
  {
    id: "p008", date: "2026-05-15", time: "12:00",
    topic: "Porträtt: Frida A Johansson",
    type: "Karusell", sponsoring: "Organiskt",
    channels: ["instagram", "linkedin"],
    owners: ["johanna", "frida"],
    status: "approved",
    copy: {
      instagram: "Möt Frida — vår nya art director. 8 bilder, 3 år, 1 koncept.",
      facebook:  "",
      linkedin:  "Vi välkomnar Frida A Johansson som art director. Lite om vad hon gör hos oss.",
      web:       ""
    },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Porträtt Frida",
    linkRubrik: "", notering: "", feedback: ""
  },
  {
    id: "p009", date: "2026-05-16", time: "07:00",
    topic: "Garden — bord-annons",
    type: "Annons", sponsoring: "Sponsrat",
    channels: ["instagram", "facebook"], owners: ["amanda", "victor"],
    status: "scheduled",
    copy: {
      instagram: "Ett bord. Sex stolar. En sommar du faktiskt orkar laga mat på.",
      facebook:  "Helgens favorit: Garden-bordet. Set + leverans i hela landet.",
      linkedin:  "", web: ""
    },
    url: "https://brightnest.se/garden/table", sokvag: "/Internt/Jobb/2026/2026-05 Garden table",
    linkRubrik: "Garden — bordet", notering: "", feedback: ""
  },
  {
    id: "p010", date: "2026-05-18", time: "08:00",
    topic: "Founders pt. 2",
    type: "Artikel", sponsoring: "Organiskt",
    channels: ["web", "linkedin"], owners: ["freddie", "tessan"],
    status: "draft",
    copy: {
      instagram: "", facebook: "",
      linkedin:  "Andra delen i serien — om risken att skala för fort.",
      web:       "Founders pt. 2 — ~900 ord. Vi pratar om åren ingen ville prata om."
    },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Founders 2",
    linkRubrik: "", notering: "", feedback: ""
  },
  {
    id: "p011", date: "2026-05-20", time: "12:00",
    topic: "IG-story — Studio tour",
    type: "Story", sponsoring: "Organiskt",
    channels: ["instagram"], owners: ["jacob"],
    status: "approved",
    copy: { instagram: "Snabb tur i studion. 6 frames, sticker-quiz på sista.", facebook: "", linkedin: "", web: "" },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Studio tour",
    linkRubrik: "", notering: "", feedback: ""
  },
  {
    id: "p012", date: "2026-05-20", time: "18:00",
    topic: "Reel — Linen story",
    type: "Reel", sponsoring: "Organiskt",
    channels: ["instagram", "tiktok"], owners: ["julia", "alex"],
    status: "production",
    copy: { instagram: "Från fält till våning. Linnet som inte rynkar sig av att leva.", facebook: "", linkedin: "", web: "" },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Linen reel",
    linkRubrik: "", notering: "", feedback: ""
  },
  {
    id: "p013", date: "2026-05-22", time: "09:00",
    topic: "Nyhetsbrev / w21",
    type: "Nyhetsbrev", sponsoring: "Organiskt",
    channels: ["newsletter"], owners: ["anna"],
    status: "draft",
    copy: { instagram: "", facebook: "", linkedin: "", web: "Veckans utskick — w21." },
    url: "", sokvag: "/Internt/Nyhetsbrev/2026/w21",
    linkRubrik: "", notering: "", feedback: ""
  },
  {
    id: "p014", date: "2026-05-25", time: "07:00",
    topic: "Spring/Garden — Meta-annons set B",
    type: "Annons", sponsoring: "Sponsrat",
    channels: ["instagram", "facebook"], owners: ["victor", "amanda"],
    status: "draft",
    copy: { instagram: "Set B testar varma ljus och tysta CTA.", facebook: "", linkedin: "", web: "" },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Set B",
    linkRubrik: "", notering: "Iteration på Set A — sänk priset på CTA.", feedback: ""
  },
  {
    id: "p015", date: "2026-05-27", time: "10:00",
    topic: "Editorial — Ljus & rum",
    type: "Artikel", sponsoring: "Organiskt",
    channels: ["web"], owners: ["freddie"],
    status: "draft",
    copy: { instagram: "", facebook: "", linkedin: "", web: "Om dagsljus, väggfärger och konsten att inte överbelysa." },
    url: "", sokvag: "/Internt/Jobb/2026/2026-05 Ljus rum",
    linkRubrik: "", notering: "", feedback: ""
  },
];

// Synthesize a plausible approval history per post based on its status so the
// pipeline UI has something to render out of the box. Real-world this would
// come from the backend.
(() => {
  const reachedByStatus = { draft: 0, production: 0, review: 0, approved: 2, scheduled: 2, published: 3 };
  const stageOrder = ["brand", "customer", "publish"];
  const stageSigner = { brand: "anna", customer: "linda", publish: "anna" };
  const stageWhen   = "2026-05-12T09:30";
  for (const p of POSTS) {
    if (!p.flowId) p.flowId = "standard";
    if (!p.approvals) {
      p.approvals = {};
      const reached = reachedByStatus[p.status] ?? 0;
      for (let i = 0; i < reached; i++) {
        const s = stageOrder[i];
        p.approvals[s] = { by: stageSigner[s], at: stageWhen };
      }
    }
  }
})();

// Approval helpers — shared across ContentPlan / Studio / future surfaces.
function flowForPost(post) {
  return APPROVAL_FLOWS.find(f => f.id === post.flowId) || APPROVAL_FLOWS.find(f => f.isDefault) || APPROVAL_FLOWS[0];
}
function nextStage(post) {
  const flow = flowForPost(post);
  if (!flow) return null;
  return flow.stages.find(s => !post.approvals?.[s.id]) || null;
}
function stageStatus(post, stageId) {
  if (post.approvals?.[stageId]) return "done";
  const next = nextStage(post);
  if (next && next.id === stageId) return "current";
  return "upcoming";
}
function roleById(roleId) { return ROLES.find(r => r.id === roleId); }
function personCan(person, perm) {
  if (!person) return false;
  const r = roleById(person.roleId);
  return !!r && r.perms.includes(perm);
}

Object.assign(window, {
  BRAND, COLORS, TYPE_SCALE, VOICE_PILLARS, RECENT_ASSETS, ACTIVITY,
  TEMPLATES, COPY_VARIANTS,
  POSTS, TEAM, STATUS_OPTIONS, CHANNEL_OPTIONS, POSTTYPE_OPTIONS, SPONSORING_OPTIONS,
  PERMISSIONS, ROLES, PEOPLE, APPROVAL_FLOWS, PLATFORMS,
  flowForPost, nextStage, stageStatus, roleById, personCan,
});
