PageSourceSearch

https://zamala.ai/_next/static/chunks/pages/admin/features-3f77d56c8146f18b.js

js zamala.ai collected 2026-10-05 13:24:01 UTC 22,626 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8309],{5881:function(e,t,a){(window.__NEXT_P=window.__NEXT_P||[]).push(["/admin/features",function(){return a(9189)}])},91539:function(e,t,a){"use strict";a.d(t,{EI:function(){return d},Wz:function(){return n},ZH:function(){return s}});var r=a(82729),l=a(68806);function _templateObject(){let e=(0,r._)(["\n  mutation UpsertCampaignFlag($input: UpsertCampaignFlagInput!) {\n    upsertCampaignFlag(input: $input) {\n      key\n      is_enabled\n      starts_at\n      ends_at\n      one_time_only\n      metadata\n      rollout_scope\n      flag_group\n      description\n      display_name\n      admin_surface\n      updated_by_admin_id\n      updated_at\n    }\n  }\n"]);return _templateObject=function(){return e},e}function _templateObject1(){let e=(0,r._)(["\n  mutation ToggleCampaignFlag($key: String!, $enabled: Boolean!) {\n    toggleCampaignFlag(key: $key, enabled: $enabled) {\n      key\n      is_enabled\n      starts_at\n      ends_at\n      one_time_only\n      metadata\n      rollout_scope\n      flag_group\n      description\n      display_name\n      admin_surface\n      updated_by_admin_id\n      updated_at\n    }\n  }\n"]);return _templateObject1=function(){return e},e}function _templateObject2(){let e=(0,r._)(["\n  mutation DeleteCampaignFlag($key: String!) {\n    deleteCampaignFlag(key: $key)\n  }\n"]);return _templateObject2=function(){return e},e}let s=(0,l.Ps)(_templateObject()),n=(0,l.Ps)(_templateObject1()),d=(0,l.Ps)(_templateObject2())},39243:function(e,t,a){"use strict";a.d(t,{d:function(){return s}});var r=a(82729),l=a(68806);function _templateObject(){let e=(0,r._)(["\n  query CampaignFlags {\n    campaignFlags {\n      key\n      is_enabled\n      starts_at\n      ends_at\n      one_time_only\n      metadata\n      rollout_scope\n      flag_group\n      description\n      display_name\n      admin_surface\n      updated_by_admin_id\n      updated_at\n    }\n  }\n"]);return _templateObject=function(){return e},e}let s=(0,l.Ps)(_templateObject())},47053:function(e,t,a){"use strict";function isCampaignFlag(e){return!!(e.starts_at||e.ends_at||e.one_time_only)}a.d(t,{l:function(){return isCampaignFlag}})},9189:function(e,t,a){"use strict";a.r(t),a.d(t,{__N_SSP:function(){return f},default:function(){return AdminFeaturesPage}});var r=a(85893),l=a(67294),s=a(37887),n=a(50319),d=a(82440),i=a(39243),o=a(7003),c=a(91539),u=a(82729),m=a(68806);function _templateObject(){let e=(0,u._)(["\n  query FeatureFlagOverrides($flagKey: String!) {\n    featureFlagOverrides(flagKey: $flagKey) {\n      id\n      flag_key\n      user_id\n      user_email\n      is_enabled\n      updated_at\n    }\n  }\n"]);return _templateObject=function(){return e},e}let g=(0,m.Ps)(_templateObject());var x=a(47053);function feature_flag_overrides_templateObject(){let e=(0,u._)(["\n  mutation SetFeatureFlagOverride(\n    $flagKey: String!\n    $userId: Int!\n    $isEnabled: Boolean!\n  ) {\n    setFeatureFlagOverride(\n      flagKey: $flagKey\n      userId: $userId\n      isEnabled: $isEnabled\n    ) {\n      id\n      flag_key\n      user_id\n      user_email\n      is_enabled\n      updated_at\n    }\n  }\n"]);return feature_flag_overrides_templateObject=function(){return e},e}function _templateObject1(){let e=(0,u._)(["\n  mutation RemoveFeatureFlagOverride($flagKey: String!, $userId: Int!) {\n    removeFeatureFlagOverride(flagKey: $flagKey, userId: $userId)\n  }\n"]);return _templateObject1=function(){return e},e}let p=(0,m.Ps)(feature_flag_overrides_templateObject()),b=(0,m.Ps)(_templateObject1()),h={global:"bg-gray-100 text-gray-700 dark:bg-white/10 dark:text-gray-300",per_pro:"bg-purple-100 text-purple-700 dark:bg-purple-500/20 dark:text-purple-300",plan:"bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300"},y=[{surface:"features",label:"Features",subtitle:"Product features you turn on and off"},{surface:"system",label:"System",subtitle:"Business rules and internal settings — change with care"}];function AdminFeatureFlags(){var e;let{data:t,loading:a,refetch:u,networkStatus:m}=(0,s.a)(i.d,{fetchPolicy:"no-cache",notifyOnNetworkStatusChange:!0,onCompleted:void 0,onError:e=>console.error("[CampaignFlags] onError:",e)}),[g]=(0,n.D)(c.ZH),[p]=(0,n.D)(c.Wz),[b]=(0,n.D)(c.EI),[h,f]=(0,l.useState)([]),[v,_]=(0,l.useState)(""),[k,j]=(0,l.useState)(!1),[N,w]=(0,l.useState)("all"),O=(0,l.useRef)(null),[C,F]=(0,l.useState)(!1),[S,E]=(0,l.useState)(null),[D,I]=(0,l.useState)(null);(0,l.useEffect)(()=>{(null==t?void 0:t.campaignFlags)&&f(t.campaignFlags)},[null==t?void 0:t.campaignFlags]);let[$,P]=(0,l.useState)(""),[K,A]=(0,l.useState)(!1),[L,z]=(0,l.useState)(""),[M,T]=(0,l.useState)(""),[R,J]=(0,l.useState)(!1),[U,q]=(0,l.useState)("{}"),[B,V]=(0,l.useState)("global"),[W,G]=(0,l.useState)("campaign"),[H,Q]=(0,l.useState)(""),[X,Z]=(0,l.useState)(""),[Y,ee]=(0,l.useState)("system"),[et,ea]=(0,l.useState)("features");(0,l.useEffect)(()=>{function handleClickOutside(e){O.current&&!O.current.contains(e.target)&&j(!1)}return document.addEventListener("mousedown",handleClickOutside),()=>document.removeEventListener("mousedown",handleClickOutside)},[]);let er=(0,l.useMemo)(()=>{let e=v.toLowerCase();return h.filter(e=>!(0,x.l)(e)).filter(t=>{var a,r;return t.key.toLowerCase().includes(e)||(null!==(a=t.description)&&void 0!==a?a:"").toLowerCase().includes(e)||(null!==(r=t.display_name)&&void 0!==r?r:"").toLowerCase().includes(e)}).filter(e=>"all"===N||("enabled"===N?!!e.is_enabled:"disabled"!==N||!e.is_enabled)).sort((e,t)=>
1(e.display_name||e.key).localeCompare(t.display_name||t.key))},[h,v,N]),el=(0,l.useMemo)(()=>er.filter(e=>{var t;return(null!==(t=e.admin_surface)&&void 0!==t?t:"system")===et}),[er,et]),closeModal=()=>{F(!1),E(null)},parseMetadata=()=>{try{let e=null==U?void 0:U.trim();if(!e)return null;return JSON.parse(e)}catch(e){return"__INVALID__"}},save=async()=>{let e=parseMetadata();if("__INVALID__"===e){alert("Invalid JSON in metadata");return}await g({variables:{input:{key:$,is_enabled:K,starts_at:L?new Date(L).toISOString():null,ends_at:M?new Date(M).toISOString():null,one_time_only:R,metadata:e,rollout_scope:B,flag_group:W,description:H.trim()||null,display_name:X.trim()||null,admin_surface:Y}},refetchQueries:[{query:i.d}]}),closeModal()},onToggle=async(e,t)=>{f(a=>a.map(a=>a.key===e?{...a,is_enabled:t}:a));try{await p({variables:{key:e,enabled:t}})}catch(a){f(a=>a.map(a=>a.key===e?{...a,is_enabled:!t}:a)),console.error("toggleCampaignFlag error:",a),alert("Failed to update campaign flag")}},onDelete=async e=>{let t=window.confirm('Delete campaign "'.concat(e,'"?'));t&&await b({variables:{key:e},refetchQueries:[{query:i.d}]})};return a?(0,r.jsxs)("div",{className:"h-full flex flex-col",children:[(0,r.jsx)("div",{className:"fixed top-[72px] right-0 left-0 lg:left-[257px] p-4 z-20 bg-gray-50 dark:bg-dark-bg border-b dark:border-dark-edge",children:(0,r.jsx)("h1",{className:"text-xl font-semibold text-epic-gray-900 sm:text-2xl dark:text-white",children:"Features"})}),(0,r.jsx)("div",{className:"flex-grow overflow-auto pt-[140px] pb-20 p-4",children:(0,r.jsx)("div",{className:"text-gray-500 dark:text-gray-400",children:"Loading..."})})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"h-full flex flex-col",children:[(0,r.jsxs)("div",{className:"fixed top-[72px] right-0 left-0 lg:left-[257px] p-4 z-20 bg-gray-50 dark:bg-dark-bg border-b dark:border-dark-edge",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mt-2",children:[(0,r.jsx)("h1",{className:"text-xl font-semibold text-epic-gray-900 sm:text-2xl dark:text-white",children:"Features"}),(0,r.jsx)("button",{type:"button",onClick:()=>{E(null),P(""),A(!1),z(""),T(""),J(!1),q("{}"),V("global"),G("campaign"),Q(""),Z(""),ee("system"),F(!0)},className:"btn-primary ml-4",children:"+ New flag"})]}),(0,r.jsx)("div",{className:"flex items-center justify-between mt-6",children:(0,r.jsxs)("div",{className:"relative w-full max-w-lg flex items-center",children:[(0,r.jsx)("input",{type:"text",placeholder:"Search flags...",className:"input-text w-full bg-gray-50 dark:bg-dark-card rounded-lg",value:v,onChange:e=>_(e.target.value)}),(0,r.jsxs)("div",{className:"relative ml-4",ref:O,children:[(0,r.jsxs)("button",{onClick:()=>j(!k),className:"w-max ml-2 text-gray-700 dark:text-gray-200 px-3 py-2  bg-gray-200 dark:bg-dark-card hover:bg-gray-300 dark:hover:bg-white/10  rounded-lg flex items-center",children:[(0,r.jsx)(o.JO,{name:"filter",size:16,className:"mr-2"}),"enabled"===N?"Enabled only":"disabled"===N?"Disabled only":"All flags"]}),k&&(0,r.jsxs)("ul",{className:"absolute z-10 mt-2 w-40 bg-white dark:bg-dark-card rounded-lg shadow-lg border border-gray-200 dark:border-dark-edge",children:[(0,r.jsx)("li",{children:(0,r.jsx)("button",{onClick:()=>{w("all"),j(!1)},className:"block w-full text-left px-4 py-2 text-sm hover:bg-gray-100 dark:hover:bg-white/10 ".concat("all"===N?"font-semibold text-purple-600":"text-gray-700 dark:text-gray-200"),children:"All flags"})}),(0,r.jsx)("li",{children:(0,r.jsx)("button",{onClick:()=>{w("enabled"),j(!1)},className:"block w-full text-left px-4 py-2 text-sm hover:bg-gray-100 dark:hover:bg-white/10 ".concat("enabled"===N?"font-semibold text-purple-600":"text-gray-700 dark:text-gray-200"),children:"Enabled only"})}),(0,r.jsx)("li",{children:(0,r.jsx)("button",{onClick:()=>{w("disabled"),j(!1)},className:"block w-full text-left px-4 py-2 text-sm hover:bg-gray-100 dark:hover:bg-white/10 ".concat("disabled"===N?"font-semibold text-purple-600":"text-gray-700 dark:text-gray-200"),children:"Disabled only"})})]})]}),(0,r.jsx)("button",{type:"button",onClick:()=>u(),className:"btn-primary ml-4 bg-transparent hover:bg-gray-100 border border-gray-200 text-epic-gray-900 dark:text-white",children:"Refresh"})]})})]}),(0,r.jsxs)("div",{className:"flex-grow overflow-auto pt-[150px] pb-20 px-4",children:[(0,r.jsx)("div",{className:"border-b border-gray-200 dark:border-dark-edge flex gap-6",children:y.map(e=>(0,r.jsx)("button",{type:"button",onClick:()=>ea(e.surface),className:"pb-2 text-sm font-semibold border-b-2 -mb-px transition ".concat(et===e.surface?"border-zamala-violet text-zamala-violet":"border-transparent text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200"),children:e.label},e.surface))}),(0,r.jsx)("p",{className:"mt-3 mb-4 text-sm text-gray-500 dark:text-gray-400",children:null===(e=y.find(e=>
1e.surface===et))||void 0===e?void 0:e.subtitle}),0===el.length?(0,r.jsx)("p",{className:"text-center text-gray-500 dark:text-gray-400 pt-8",children:"No flags found."}):(0,r.jsx)(FlagsTable,{flags:el,onToggle:onToggle,onEdit:e=>{var t,a,r,l,s;E(e),P(e.key),A(!!e.is_enabled),z(e.starts_at?e.starts_at:""),T(e.ends_at?e.ends_at:""),J(!!e.one_time_only),q(e.metadata?JSON.stringify(e.metadata,null,2):"{}"),V(null!==(t=e.rollout_scope)&&void 0!==t?t:"global"),G(null!==(a=e.flag_group)&&void 0!==a?a:"campaign"),Q(null!==(r=e.description)&&void 0!==r?r:""),Z(null!==(l=e.display_name)&&void 0!==l?l:""),ee(null!==(s=e.admin_surface)&&void 0!==s?s:"system"),F(!0)},onDelete:onDelete,onOverrides:I})]})]}),(0,r.jsx)(d.u,{title:S?"Edit flag":"New flag",isOpen:C,onClose:closeModal,children:(0,r.jsxs)("div",{className:"p-2",children:[(0,r.jsx)("label",{className:"text-sm block mt-2",children:"Key"}),(0,r.jsx)("input",{type:"text",className:"mt-1 w-full border p-2 rounded",value:$,onChange:e=>P(e.target.value),disabled:!!S,placeholder:"e.g. founder_vendors"}),(0,r.jsxs)("label",{className:"mt-4 flex items-center",children:[(0,r.jsx)("input",{type:"checkbox",checked:K,onChange:()=>A(e=>!e),className:"mr-2"}),"Enabled"]}),(0,r.jsx)("label",{className:"text-sm block mt-4",children:"Starts at"}),(0,r.jsx)("input",{type:"datetime-local",className:"mt-1 w-full border p-2 rounded",value:L?L.slice(0,16):"",onChange:e=>z(e.target.value)}),(0,r.jsx)("label",{className:"text-sm block mt-4",children:"Ends at"}),(0,r.jsx)("input",{type:"datetime-local",className:"mt-1 w-full border p-2 rounded",value:M?M.slice(0,16):"",onChange:e=>T(e.target.value)}),(0,r.jsxs)("label",{className:"mt-4 flex items-center",children:[(0,r.jsx)("input",{type:"checkbox",checked:R,onChange:()=>J(e=>!e),className:"mr-2"}),"One time only"]}),(0,r.jsx)("label",{className:"text-sm block mt-4",children:"Display name"}),(0,r.jsx)("input",{type:"text",className:"mt-1 w-full border p-2 rounded",value:X,onChange:e=>Z(e.target.value),placeholder:"Friendly name shown in this screen, e.g. Vendor Directory"}),(0,r.jsx)("label",{className:"text-sm block mt-4",children:"Description"}),(0,r.jsx)("input",{type:"text",className:"mt-1 w-full border p-2 rounded",value:H,onChange:e=>Q(e.target.value),placeholder:"What this flag does, in one sentence"}),(0,r.jsx)("label",{className:"text-sm block mt-4",children:"Group"}),(0,r.jsxs)("select",{className:"mt-1 w-full border p-2 rounded bg-white dark:bg-dark-card",value:W,onChange:e=>G(e.target.value),children:[(0,r.jsxs)("option",{value:"feature",children:["Features"," — parts of the product"]}),(0,r.jsxs)("option",{value:"operations",children:["Operations"," — settings and emergency switches"]}),(0,r.jsxs)("option",{value:"campaign",children:["Campaigns & Rules"," — campaigns and business model rules"]})]}),(0,r.jsx)("label",{className:"text-sm block mt-4",children:"Tab"}),(0,r.jsxs)("select",{className:"mt-1 w-full border p-2 rounded bg-white dark:bg-dark-card",value:Y,onChange:e=>ee(e.target.value),children:[(0,r.jsx)("option",{value:"features",children:"Features — product switches, the default tab"}),(0,r.jsx)("option",{value:"system",children:"System — business rules and internal settings"})]}),(0,r.jsx)("label",{className:"text-sm block mt-4",children:"Rollout scope"}),(0,r.jsxs)("select",{className:"mt-1 w-full border p-2 rounded bg-white dark:bg-dark-card",value:B,onChange:e=>V(e.target.value),children:[(0,r.jsx)("option",{value:"global",children:"global — one switch for everyone"}),(0,r.jsx)("option",{value:"per_pro",children:"per_pro — global default + per-Pro overrides"}),(0,r.jsx)("option",{value:"plan",disabled:!0,children:"plan — reserved for subscription plans (coming later)"})]}),(0,r.jsx)("label",{className:"text-sm block mt-4",children:"Metadata (JSON)"}),(0,r.jsx)("textarea",{className:"mt-1 w-full border p-2 rounded font-mono text-xs",rows:8,value:U,onChange:e=>q(e.target.value),placeholder:'{\n  "threshold": 90,\n  "credit_reward": 20,\n  "priority_months": 3\n}'}),(0,r.jsx)("button",{className:"mt-4 bg-purple-600 hover:bg-purple-700 text-white px-4 py-2 rounded transition-all",onClick:save,disabled:!$.trim(),children:"Save"})]})}),D&&(0,r.jsx)(OverridesModal,{flag:D,onClose:()=>I(null)})]})}function OverridesModal(e){var t,a,i;let{flag:o,onClose:c}=e,{data:u,loading:m,refetch:x}=(0,s.a)(g,{variables:{flagKey:o.key},fetchPolicy:"no-cache",onError:e=>console.error("[FeatureFlagOverrides] onError:",e)}),[h,{loading:y}]=(0,n.D)(p),[f]=(0,n.D)(b),[v,_]=(0,l.useState)(""),[k,j]=(0,l.useState)(!0),N=null!==(t=null==u?void 0:u.featureFlagOverrides)&&void 0!==t?t:[],addOverride=async()=>{let e=Number(v);if(!Number.isInteger(e)||e<=0){alert("User ID must be a positive integer");return}try{await h({variables:{flagKey:o.key,userId:e,isEnabled:k}}),_(""),await x()}catch(e){console.error("setFeatureFlagOverride error:",e),alert((null==e?void 0:e.message)||"Failed to save override")}},onRemove=async e=>{let t=window.confirm("Remove the override for user ".concat(e,"? They fall back to the global flag state."));if(t)try{await f({variables:{flagKey:o.key,userId:e}}),await x()}catch(e){console.error("removeFeatureFlagOverride error:",e),alert((null==e?void 0:e.message)||"Failed to remove override")}};return(0,r.jsx)(d.u,{title:"Overrides — ".concat(o.key),isOpen:!0,onClose:c,children:(0,r.jsxs)("div",{className:"p-2",children:[(0,r.jsxs)("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:["An override wins over the flag's global state for that user. Global right now:"," ",(0,r.jsx)("span",{className:"font-semibold",children:o.is_enabled?"enabled":"disabled"}),(null!==(a=o.rollout_scope)&&void 0!==a?a:"global")!=="per_pro"&&(0,r.jsxs)(r.Fragment,{children:[" ","— note: this flag's scope is"," ",(0,r.jsx)("span",{className:"font-semibold",children:null!==(i=o.rollout_scope)&&void 0!==i?i:"global"}),", overrides are meant for per_pro flags."]})]}),(0,r.jsxs)("div",{className:"mt-4 flex items-end gap-2",children:[(0,r.jsxs)("div",{className:"flex-grow",children:[(0,r.jsx)("label",{className:"text-sm block",children:"User ID"}
1),(0,r.jsx)("input",{type:"number",min:1,className:"mt-1 w-full border p-2 rounded",value:v,onChange:e=>_(e.target.value),placeholder:"e.g. 42"})]}),(0,r.jsxs)("label",{className:"flex items-center pb-2",children:[(0,r.jsx)("input",{type:"checkbox",checked:k,onChange:()=>j(e=>!e),className:"mr-2"}),"Enabled"]}),(0,r.jsx)("button",{type:"button",className:"bg-purple-600 hover:bg-purple-700 text-white px-4 py-2 rounded transition-all disabled:opacity-50",onClick:addOverride,disabled:y||!v.trim(),children:"Add"})]}),(0,r.jsx)("div",{className:"mt-4",children:m?(0,r.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"Loading..."}):0===N.length?(0,r.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"No overrides for this flag."}):(0,r.jsxs)("table",{className:"min-w-full divide-y divide-gray-200 dark:divide-gray-600",children:[(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{children:[(0,r.jsx)("th",{className:"py-2 text-xs font-medium text-left text-gray-500 uppercase dark:text-gray-400",children:"User"}),(0,r.jsx)("th",{className:"py-2 text-xs font-medium text-left text-gray-500 uppercase dark:text-gray-400",children:"State"}),(0,r.jsx)("th",{className:"py-2 text-xs font-medium text-right text-gray-500 uppercase dark:text-gray-400",children:"Actions"})]})}),(0,r.jsx)("tbody",{children:N.map(e=>(0,r.jsxs)("tr",{className:"border-b dark:border-dark-edge text-sm",children:[(0,r.jsxs)("td",{className:"py-2 pr-2 text-gray-900 dark:text-white",children:[e.user_email||"user ".concat(e.user_id)," ",(0,r.jsxs)("span",{className:"text-xs text-gray-400",children:["(#",e.user_id,")"]})]}),(0,r.jsx)("td",{className:"py-2 pr-2",children:(0,r.jsx)("span",{className:"px-2 py-1 rounded-full text-xs font-medium ".concat(e.is_enabled?"bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300":"bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300"),children:e.is_enabled?"enabled":"disabled"})}),(0,r.jsx)("td",{className:"py-2 text-right",children:(0,r.jsx)("button",{type:"button",onClick:()=>onRemove(e.user_id),className:"text-red-500 text-xs font-medium",children:"Remove"})})]},e.id))})]})})]})})}function FlagsTable(e){let{flags:t,onToggle:a,onEdit:l,onDelete:s,onOverrides:n}=e;return(0,r.jsx)("div",{className:"overflow-hidden shadow rounded-lg",children:(0,r.jsxs)("table",{className:"min-w-full divide-y divide-gray-200 dark:divide-gray-600",children:[(0,r.jsx)("thead",{className:"bg-gray-100 dark:bg-gray-700",children:(0,r.jsxs)("tr",{children:[(0,r.jsx)("th",{className:"p-4 text-xs font-medium text-left text-gray-500 uppercase dark:text-gray-400 w-2/5",children:"Flag"}),(0,r.jsx)("th",{className:"p-4 text-xs font-medium text-left text-gray-500 uppercase dark:text-gray-400",children:"Enabled"}),(0,r.jsx)("th",{className:"p-4 text-xs font-medium text-left text-gray-500 uppercase dark:text-gray-400",children:"Starts"}),(0,r.jsx)("th",{className:"p-4 text-xs font-medium text-left text-gray-500 uppercase dark:text-gray-400",children:"Ends"}),(0,r.jsx)("th",{className:"p-4 text-xs font-medium text-left text-gray-500 uppercase dark:text-gray-400",children:"One-time"}),(0,r.jsx)("th",{className:"p-4 text-xs font-medium text-left text-gray-500 uppercase dark:text-gray-400",children:"Scope"}),(0,r.jsx)("th",{className:"p-4 text-xs font-medium text-right text-gray-500 uppercase dark:text-gray-400",children:"Actions"})]})}),(0,r.jsx)("tbody",{children:t.map(e=>{var t,d;return(0,r.jsxs)("tr",{className:"bg-white border-b dark:bg-dark-bg dark:border-dark-edge hover:bg-gray-100 dark:hover:bg-epic-gray-800 transition",children:[(0,r.jsxs)("td",{className:"p-4",children:[(0,r.jsx)("p",{className:"text-sm font-semibold text-gray-900 dark:text-white",children:e.display_name||e.key}),e.description&&(0,r.jsx)("p",{className:"mt-0.5 text-sm text-gray-500 dark:text-gray-400",children:e.description}),(0,r.jsx)("p",{className:"mt-1 text-xs font-mono text-gray-400 dark:text-gray-500",children:e.key})]}),(0,r.jsx)("td",{className:"p-4 text-sm text-gray-500 dark:text-gray-400",children:(0,r.jsxs)("label",{className:"inline-flex items-center cursor-pointer",children:[(0,r.jsx)("input",{type:"checkbox",checked:!!e.is_enabled,onChange:t=>a(e.key,t.target.checked),className:"sr-only"}),(0,r.jsx)("div",{className:"w-11 h-6 rounded-full transition ".concat(e.is_enabled?"bg-zamala-violet":"bg-gray-300")}),(0,r.jsx)("div",{className:"-ml-10 w-5 h-5 bg-white rounded-full shadow transform transition ".concat(e.is_enabled?"translate-x-5":"translate-x-0")})]})}),(0,r.jsx)("td",{className:"p-4 text-sm text-gray-500 dark:text-gray-400",children:e.starts_at?new Date(e.starts_at).toLocaleStr
1ing():"-"}),(0,r.jsx)("td",{className:"p-4 text-sm text-gray-500 dark:text-gray-400",children:e.ends_at?new Date(e.ends_at).toLocaleString():"-"}),(0,r.jsx)("td",{className:"p-4 text-sm text-gray-500 dark:text-gray-400",children:e.one_time_only?"Yes":"No"}),(0,r.jsx)("td",{className:"p-4 text-sm",children:(0,r.jsx)("span",{className:"px-2 py-1 rounded-full text-xs font-medium ".concat(h[null!==(t=e.rollout_scope)&&void 0!==t?t:"global"]),children:null!==(d=e.rollout_scope)&&void 0!==d?d:"global"})}),(0,r.jsxs)("td",{className:"p-4 flex justify-end space-x-3",children:[(0,r.jsx)("button",{type:"button",onClick:()=>n(e),className:"text-gray-500 dark:text-gray-300 text-xs font-medium border border-gray-300 dark:border-dark-edge rounded px-2 py-1 hover:bg-gray-100 dark:hover:bg-white/10",title:"Per-Pro overrides",children:"Overrides"}),(0,r.jsx)("button",{type:"button",onClick:()=>l(e),className:"text-purple-500",children:(0,r.jsx)(o.JO,{name:"edit",size:20,className:"inline-block"})}),(0,r.jsx)("button",{type:"button",onClick:()=>s(e.key),className:"text-red-500",children:(0,r.jsx)(o.JO,{name:"delete",size:20,className:"inline-block"})})]})]},e.key)})})]})})}var f=!0;function AdminFeaturesPage(){return(0,r.jsx)(AdminFeatureFlags,{})}}},function(e){e.O(0,[9774,2888,179],function(){return e(e.s=5881)}),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.