Files
FrenoCorp/dist/assets/KPIDashboard-Cq888Xkl.js

3 lines
36 KiB
JavaScript

import{i as f,t as x,e as ae,c as pe,b as Q,S as $,f as fe}from"./main-B-KzsHRi.js";var ge=x('<div class=freno-kpi-panel-content><div class=freno-kpi-panel-header><div><h2>Product KPIs</h2><p class=freno-text-muted>Mixpanel-powered product analytics</p></div><div class=freno-kpi-external-links><a href=https://mixpanel.com target=_blank rel="noopener noreferrer"class="freno-btn freno-btn-secondary freno-btn-small">Open Mixpanel ↗</a></div></div><div class=freno-kpi-metrics-grid></div><div class=freno-kpi-info-card><h3>About Mixpanel Integration</h3><p>Product KPIs are powered by Mixpanel analytics. Once the Mixpanel SDK is integrated and events are flowing, these metrics will populate automatically.</p><ul><li>Track user signups, project creation, feature usage</li><li>Set up funnels for conversion analysis</li><li>Monitor retention and engagement cohorts'),he=x('<div class="freno-kpi-metric-card freno-kpi-metric-pending"><div class=freno-kpi-metric-header><span class=freno-kpi-metric-label></span><span class="freno-kpi-badge freno-badge-draft">Pending</span></div><div class=freno-kpi-metric-value>—</div><div class=freno-kpi-metric-target>Target: ');const ye=[{key:"mau",label:"Monthly Active Users",target:"Growth MoM",unit:"users"},{key:"paying_users",label:"Paying Users",target:"50K by EOY",unit:"users"},{key:"conversion_rate",label:"Conversion Rate",target:">3%",unit:"%"},{key:"nps",label:"Net Promoter Score",target:">60",unit:"pts"},{key:"viral_coefficient",label:"Viral Coefficient",target:">0.5",unit:""}],be=()=>(()=>{var t=ge(),e=t.firstChild,r=e.nextSibling;return f(r,()=>ye.map(i=>(()=>{var u=he(),l=u.firstChild,p=l.firstChild,c=l.nextSibling,d=c.nextSibling;return d.firstChild,f(p,()=>i.label),f(d,()=>i.target,null),u})())),t})();var _e=x('<div class=freno-kpi-panel-content><div class=freno-kpi-panel-header><div><h2>Acquisition KPIs</h2><p class=freno-text-muted>GA4-powered web analytics</p></div><div class=freno-kpi-external-links><a href=https://analytics.google.com target=_blank rel="noopener noreferrer"class="freno-btn freno-btn-secondary freno-btn-small">Open GA4 ↗</a></div></div><div class=freno-kpi-metrics-grid></div><div class=freno-kpi-info-card><h3>About GA4 Integration</h3><p>Acquisition KPIs are powered by Google Analytics 4. Once GA4 is configured with enhanced e-commerce tracking, these metrics will populate automatically.</p><ul><li>Track traffic sources and channel attribution</li><li>Monitor CAC across marketing channels</li><li>Analyze landing page conversion funnels'),Se=x('<div class="freno-kpi-metric-card freno-kpi-metric-pending"><div class=freno-kpi-metric-header><span class=freno-kpi-metric-label></span><span class="freno-kpi-badge freno-badge-draft">Pending</span></div><div class=freno-kpi-metric-value>—</div><div class=freno-kpi-metric-target>Target: ');const ve=[{key:"cac",label:"Customer Acquisition Cost",target:"<$15",unit:"USD"},{key:"traffic_sources",label:"Traffic by Source",target:"Diversified",unit:"%"},{key:"signup_rate",label:"Signup Conversion Rate",target:">5%",unit:"%"},{key:"channel_breakdown",label:"Channel Performance",target:"All channels",unit:""}],Ne=()=>(()=>{var t=_e(),e=t.firstChild,r=e.nextSibling;return f(r,()=>ve.map(i=>(()=>{var u=Se(),l=u.firstChild,p=l.firstChild,c=l.nextSibling,d=c.nextSibling;return d.firstChild,f(p,()=>i.label),f(d,()=>i.target,null),u})())),t})();var we=x('<div class=freno-kpi-panel-content><div class=freno-kpi-panel-header><div><h2>Revenue KPIs</h2><p class=freno-text-muted>Stripe-powered revenue analytics</p></div><div class=freno-kpi-external-links><a href=https://dashboard.stripe.com target=_blank rel="noopener noreferrer"class="freno-btn freno-btn-secondary freno-btn-small">Open Stripe ↗</a></div></div><div class=freno-kpi-metrics-grid></div><div class=freno-kpi-info-card><h3>About Stripe Integration</h3><p>Revenue KPIs are powered by Stripe. Once Stripe webhooks are configured and subscription events are flowing, these metrics will populate automatically.</p><ul><li>Track MRR, ARPU, and subscription changes</li><li>Monitor churn with automated alerts</li><li>Analyze LTV with cohort analysis'),Ie=x('<div class="freno-kpi-metric-card freno-kpi-metric-pending"><div class=freno-kpi-metric-header><span class=freno-kpi-metric-label></span><span class="freno-kpi-badge freno-badge-draft">Pending</span></div><div class=freno-kpi-metric-value>—</div><div class=freno-kpi-metric-target>Target: ');const xe=[{key:"mrr",label:"Monthly Recurring Revenue",target:"$550K by EOY",unit:"USD"},{key:"churn_rate",label:"Monthly Churn Rate",target:"<3%",unit:"%"},{key:"ltv",label:"Customer Lifetime Value",target:">$120",unit:"USD"},{key:"arpu",label:"Avg Revenue Per User",target:"Growing",unit:"USD"},{key:"upgrades",label:"Plan Upgrades",target:">10% MoM",unit:"%"}],Le=()=>(()=>{var t=we(),e=t.firstChild,r=e.nextSibling;return f(r,()=>xe.map(i=>(()=>{var u=Ie(),l=u.firstChild,p=l.firstChild,c=l.nextSibling,d=c.nextSibling;return d.firstChild,f(p,()=>i.label),f(d,()=>i.target,null),u})())),t})(),o=Symbol.for("drizzle:entityKind");function S(t,e){if(!t||typeof t!="object")return!1;if(t instanceof e)return!0;if(!Object.prototype.hasOwnProperty.call(e,o))throw new Error(`Class "${e.name??"<unknown>"}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);let r=Object.getPrototypeOf(t).constructor;if(r)for(;r;){if(o in r&&r[o]===e[o])return!0;r=Object.getPrototypeOf(r)}return!1}class G{constructor(e,r){this.table=e,this.config=r,this.name=r.name,this.keyAsName=r.keyAsName,this.notNull=r.notNull,this.default=r.default,this.defaultFn=r.defaultFn,this.onUpdateFn=r.onUpdateFn,this.hasDefault=r.hasDefault,this.primary=r.primaryKey,this.isUnique=r.isUnique,this.uniqueName=r.uniqueName,this.uniqueType=r.uniqueType,this.dataType=r.dataType,this.columnType=r.columnType,this.generated=r.generated,this.generatedIdentity=r.generatedIdentity}static[o]="Column";name;keyAsName;primary;notNull;default;defaultFn;onUpdateFn;hasDefault;isUnique;uniqueName;uniqueType;dataType;columnType;enumValues=void 0;generated=void 0;generatedIdentity=void 0;config;mapFromDriverValue(e){return e}mapToDriverValue(e){return e}shouldDisableInsert(){return this.config.generated!==void 0&&this.config.generated.type!=="byDefault"}}class Qe{static[o]="ColumnBuilder";config;constructor(e,r,i){this.config={name:e,keyAsName:e==="",notNull:!1,default:void 0,hasDefault:!1,primaryKey:!1,isUnique:!1,uniqueName:void 0,uniqueType:void 0,dataType:r,columnType:i,generated:void 0}}$type(){return this}notNull(){return this.config.notNull=!0,this}default(e){return this.config.default=e,this.config.hasDefault=!0,this}$defaultFn(e){return this.config.defaultFn=e,this.config.hasDefault=!0,this}$default=this.$defaultFn;$onUpdateFn(e){return this.config.onUpdateFn=e,this.config.hasDefault=!0,this}$onUpdate=this.$onUpdateFn;primaryKey(){return this.config.primaryKey=!0,this.config.notNull=!0,this}setName(e){this.config.name===""&&(this.config.name=e)}}const D=Symbol.for("drizzle:Name"),Z=Symbol.for("drizzle:isPgEnum");function Be(t){return!!t&&typeof t=="function"&&Z in t&&t[Z]===!0}class se{static[o]="Subquery";constructor(e,r,i,u=!1,l=[]){this._={brand:"Subquery",sql:e,selectedFields:r,alias:i,isWith:u,usedTables:l}}}const De={startActiveSpan(t,e){return e()}},A=Symbol.for("drizzle:ViewBaseConfig"),U=Symbol.for("drizzle:Schema"),ee=Symbol.for("drizzle:Columns"),te=Symbol.for("drizzle:ExtraConfigColumns"),V=Symbol.for("drizzle:OriginalName"),j=Symbol.for("drizzle:BaseName"),P=Symbol.for("drizzle:IsAlias"),re=Symbol.for("drizzle:ExtraConfigBuilder"),Ae=Symbol.for("drizzle:IsDrizzleTable");class _{static[o]="Table";static Symbol={Name:D,Schema:U,OriginalName:V,Columns:ee,ExtraConfigColumns:te,BaseName:j,IsAlias:P,ExtraConfigBuilder:re};[D];[V];[U];[ee];[te];[j];[P]=!1;[Ae]=!0;[re]=void 0;constructor(e,r,i){this[D]=this[V]=e,this[U]=r,this[j]=i}}function Te(t){return t!=null&&typeof t.getSQL=="function"}function Ce(t){const e={sql:"",params:[]};for(const r of t)e.sql+=r.sql,e.params.push(...r.params),r.typings?.length&&(e.typings||(e.typings=[]),e.typings.push(...r.typings));return e}class v{static[o]="StringChunk";value;constructor(e){this.value=Array.isArray(e)?e:[e]}getSQL(){return new b([this])}}class b{constructor(e){this.queryChunks=e;for(const r of e)if(S(r,_)){const i=r[_.Symbol.Schema];this.usedTables.push(i===void 0?r[_.Symbol.Name]:i+"."+r[_.Symbol.Name])}}static[o]="SQL";decoder=oe;shouldInlineParams=!1;usedTables=[];append(e){return this.queryChunks.push(...e.queryChunks),this}toQuery(e){return De.startActiveSpan("drizzle.buildSQL",r=>{const i=this.buildQueryFromSourceParams(this.queryChunks,e);return r?.setAttributes({"drizzle.query.text":i.sql,"drizzle.query.params":JSON.stringify(i.params)}),i})}buildQueryFromSourceParams(e,r){const i=Object.assign({},r,{inlineParams:r.inlineParams||this.shouldInlineParams,paramStartIndex:r.paramStartIndex||{value:0}}),{casing:u,escapeName:l,escapeParam:p,prepareTyping:c,inlineParams:d,paramStartIndex:y}=i;return Ce(e.map(s=>{if(S(s,v))return{sql:s.value.join(""),params:[]};if(S(s,O))return{sql:l(s.value),params:[]};if(s===void 0)return{sql:"",params:[]};if(Array.isArray(s)){const m=[new v("(")];for(const[g,K]of s.entries())m.push(K),g<s.length-1&&m.push(new v(", "));return m.push(new v(")")),this.buildQueryFromSourceParams(m,i)}if(S(s,b))return this.buildQueryFromSourceParams(s.queryChunks,{...i,inlineParams:d||s.shouldInlineParams});if(S(s,_)){const m=s[_.Symbol.Schema],g=s[_.Symbol.Name];return{sql:m===void 0||s[P]?l(g):l(m)+"."+l(g),params:[]}}if(S(s,G)){const m=u.getColumnCasing(s);if(r.invokeSource==="indexes")return{sql:l(m),params:[]};const g=s.table[_.Symbol.Schema];return{sql:s.table[P]||g===void 0?l(s.table[_.Symbol.Name])+"."+l(m):l(g)+"."+l(s.table[_.Symbol.Name])+"."+l(m),params:[]}}if(S(s,Pe)){const m=s[A].schema,g=s[A].name;return{sql:m===void 0||s[A].isAlias?l(g):l(m)+"."+l(g),params:[]}}if(S(s,ue)){if(S(s.value,E))return{sql:p(y.value++,s),params:[s],typings:["none"]};const m=s.value===null?null:s.encoder.mapToDriverValue(s.value);if(S(m,b))return this.buildQueryFromSourceParams([m],i);if(d)return{sql:this.mapInlineParam(m,i),params:[]};let g=["none"];return c&&(g=[c(s.encoder)]),{sql:p(y.value++,m),params:[m],typings:g}}return S(s,E)?{sql:p(y.value++,s),params:[s],typings:["none"]}:S(s,b.Aliased)&&s.fieldAlias!==void 0?{sql:l(s.fieldAlias),params:[]}:S(s,se)?s._.isWith?{sql:l(s._.alias),params:[]}:this.buildQueryFromSourceParams([new v("("),s._.sql,new v(") "),new O(s._.alias)],i):Be(s)?s.schema?{sql:l(s.schema)+"."+l(s.enumName),params:[]}:{sql:l(s.enumName),params:[]}:Te(s)?s.shouldOmitSQLParens?.()?this.buildQueryFromSourceParams([s.getSQL()],i):this.buildQueryFromSourceParams([new v("("),s.getSQL(),new v(")")],i):d?{sql:this.mapInlineParam(s,i),params:[]}:{sql:p(y.value++,s),params:[s],typings:["none"]}}))}mapInlineParam(e,{escapeString:r}){if(e===null)return"null";if(typeof e=="number"||typeof e=="boolean")return e.toString();if(typeof e=="string")return r(e);if(typeof e=="object"){const i=e.toString();return r(i==="[object Object]"?JSON.stringify(e):i)}throw new Error("Unexpected param value: "+e)}getSQL(){return this}as(e){return e===void 0?this:new b.Aliased(this,e)}mapWith(e){return this.decoder=typeof e=="function"?{mapFromDriverValue:e}:e,this}inlineParams(){return this.shouldInlineParams=!0,this}if(e){return e?this:void 0}}class O{constructor(e){this.value=e}static[o]="Name";brand;getSQL(){return new b([this])}}const oe={mapFromDriverValue:t=>t},le={mapToDriverValue:t=>t};({...oe,...le});class ue{constructor(e,r=le){this.value=e,this.encoder=r}static[o]="Param";brand;getSQL(){return new b([this])}}function R(t,...e){const r=[];(e.length>0||t.length>0&&t[0]!=="")&&r.push(new v(t[0]));for(const[i,u]of e.entries())r.push(u,new v(t[i+1]));return new b(r)}(t=>{function e(){return new b([])}t.empty=e;function r(d){return new b(d)}t.fromList=r;function i(d){return new b([new v(d)])}t.raw=i;function u(d,y){const s=[];for(const[m,g]of d.entries())m>0&&y!==void 0&&s.push(y),s.push(g);return new b(s)}t.join=u;function l(d){return new O(d)}t.identifier=l;function p(d){return new E(d)}t.placeholder=p;function c(d,y){return new ue(d,y)}t.param=c})(R||(R={}));(t=>{class e{constructor(i,u){this.sql=i,this.fieldAlias=u}static[o]="SQL.Aliased";isSelectionField=!1;getSQL(){return this.sql}clone(){return new e(this.sql,this.fieldAlias)}}t.Aliased=e})(b||(b={}));class E{constructor(e){this.name=e}static[o]="Placeholder";getSQL(){return new b([this])}}const $e=Symbol.for("drizzle:IsDrizzleView");class Pe{static[o]="View";[A];[$e]=!0;constructor({name:e,schema:r,selectedFields:i,query:u}){this[A]={name:e,originalName:e,schema:r,selectedFields:i,query:u,isExisting:!u,isAlias:!1}}getSQL(){return new b([this])}}G.prototype.getSQL=function(){return new b([this])};_.prototype.getSQL=function(){return new b([this])};se.prototype.getSQL=function(){return new b([this])};function C(t,e){return{name:typeof t=="string"&&t.length>0?t:"",config:typeof t=="object"?t:e}}const de=typeof TextDecoder>"u"?null:new TextDecoder;class qe{static[o]="SQLiteForeignKeyBuilder";reference;_onUpdate;_onDelete;constructor(e,r){this.reference=()=>{const{name:i,columns:u,foreignColumns:l}=e();return{name:i,columns:u,foreignTable:l[0].table,foreignColumns:l}},r&&(this._onUpdate=r.onUpdate,this._onDelete=r.onDelete)}onUpdate(e){return this._onUpdate=e,this}onDelete(e){return this._onDelete=e,this}build(e){return new Ke(e,this)}}class Ke{constructor(e,r){this.table=e,this.reference=r.reference,this.onUpdate=r._onUpdate,this.onDelete=r._onDelete}static[o]="SQLiteForeignKey";reference;onUpdate;onDelete;getName(){const{name:e,columns:r,foreignColumns:i}=this.reference(),u=r.map(c=>c.name),l=i.map(c=>c.name),p=[this.table[D],...u,i[0].table[D],...l];return e??`${p.join("_")}_fk`}}function ke(t,e){return`${t[D]}_${e.join("_")}_unique`}class N extends Qe{static[o]="SQLiteColumnBuilder";foreignKeyConfigs=[];references(e,r={}){return this.foreignKeyConfigs.push({ref:e,actions:r}),this}unique(e){return this.config.isUnique=!0,this.config.uniqueName=e,this}generatedAlwaysAs(e,r){return this.config.generated={as:e,type:"always",mode:r?.mode??"virtual"},this}buildForeignKeys(e,r){return this.foreignKeyConfigs.map(({ref:i,actions:u})=>((l,p)=>{const c=new qe(()=>{const d=l();return{columns:[e],foreignColumns:[d]}});return p.onUpdate&&c.onUpdate(p.onUpdate),p.onDelete&&c.onDelete(p.onDelete),c.build(r)})(i,u))}}class w extends G{constructor(e,r){r.uniqueName||(r.uniqueName=ke(e,[r.name])),super(e,r),this.table=e}static[o]="SQLiteColumn"}class Fe extends N{static[o]="SQLiteBigIntBuilder";constructor(e){super(e,"bigint","SQLiteBigInt")}build(e){return new ze(e,this.config)}}class ze extends w{static[o]="SQLiteBigInt";getSQLType(){return"blob"}mapFromDriverValue(e){if(typeof Buffer<"u"&&Buffer.from){const r=Buffer.isBuffer(e)?e:e instanceof ArrayBuffer?Buffer.from(e):e.buffer?Buffer.from(e.buffer,e.byteOffset,e.byteLength):Buffer.from(e);return BigInt(r.toString("utf8"))}return BigInt(de.decode(e))}mapToDriverValue(e){return Buffer.from(e.toString())}}class Ue extends N{static[o]="SQLiteBlobJsonBuilder";constructor(e){super(e,"json","SQLiteBlobJson")}build(e){return new Ve(e,this.config)}}class Ve extends w{static[o]="SQLiteBlobJson";getSQLType(){return"blob"}mapFromDriverValue(e){if(typeof Buffer<"u"&&Buffer.from){const r=Buffer.isBuffer(e)?e:e instanceof ArrayBuffer?Buffer.from(e):e.buffer?Buffer.from(e.buffer,e.byteOffset,e.byteLength):Buffer.from(e);return JSON.parse(r.toString("utf8"))}return JSON.parse(de.decode(e))}mapToDriverValue(e){return Buffer.from(JSON.stringify(e))}}class je extends N{static[o]="SQLiteBlobBufferBuilder";constructor(e){super(e,"buffer","SQLiteBlobBuffer")}build(e){return new Oe(e,this.config)}}class Oe extends w{static[o]="SQLiteBlobBuffer";mapFromDriverValue(e){return Buffer.isBuffer(e)?e:Buffer.from(e)}getSQLType(){return"blob"}}function Re(t,e){const{name:r,config:i}=C(t,e);return i?.mode==="json"?new Ue(r):i?.mode==="bigint"?new Fe(r):new je(r)}class Ee extends N{static[o]="SQLiteCustomColumnBuilder";constructor(e,r,i){super(e,"custom","SQLiteCustomColumn"),this.config.fieldConfig=r,this.config.customTypeParams=i}build(e){return new Me(e,this.config)}}class Me extends w{static[o]="SQLiteCustomColumn";sqlName;mapTo;mapFrom;constructor(e,r){super(e,r),this.sqlName=r.customTypeParams.dataType(r.fieldConfig),this.mapTo=r.customTypeParams.toDriver,this.mapFrom=r.customTypeParams.fromDriver}getSQLType(){return this.sqlName}mapFromDriverValue(e){return typeof this.mapFrom=="function"?this.mapFrom(e):e}mapToDriverValue(e){return typeof this.mapTo=="function"?this.mapTo(e):e}}function Je(t){return(e,r)=>{const{name:i,config:u}=C(e,r);return new Ee(i,u,t)}}class W extends N{static[o]="SQLiteBaseIntegerBuilder";constructor(e,r,i){super(e,r,i),this.config.autoIncrement=!1}primaryKey(e){return e?.autoIncrement&&(this.config.autoIncrement=!0),this.config.hasDefault=!0,super.primaryKey()}}class H extends w{static[o]="SQLiteBaseInteger";autoIncrement=this.config.autoIncrement;getSQLType(){return"integer"}}class Ge extends W{static[o]="SQLiteIntegerBuilder";constructor(e){super(e,"number","SQLiteInteger")}build(e){return new We(e,this.config)}}class We extends H{static[o]="SQLiteInteger"}class He extends W{static[o]="SQLiteTimestampBuilder";constructor(e,r){super(e,"date","SQLiteTimestamp"),this.config.mode=r}defaultNow(){return this.default(R`(cast((julianday('now') - 2440587.5)*86400000 as integer))`)}build(e){return new Ye(e,this.config)}}class Ye extends H{static[o]="SQLiteTimestamp";mode=this.config.mode;mapFromDriverValue(e){return this.config.mode==="timestamp"?new Date(e*1e3):new Date(e)}mapToDriverValue(e){const r=e.getTime();return this.config.mode==="timestamp"?Math.floor(r/1e3):r}}class Xe extends W{static[o]="SQLiteBooleanBuilder";constructor(e,r){super(e,"boolean","SQLiteBoolean"),this.config.mode=r}build(e){return new Ze(e,this.config)}}class Ze extends H{static[o]="SQLiteBoolean";mode=this.config.mode;mapFromDriverValue(e){return Number(e)===1}mapToDriverValue(e){return e?1:0}}function n(t,e){const{name:r,config:i}=C(t,e);return i?.mode==="timestamp"||i?.mode==="timestamp_ms"?new He(r,i.mode):i?.mode==="boolean"?new Xe(r,i.mode):new Ge(r)}class et extends N{static[o]="SQLiteNumericBuilder";constructor(e){super(e,"string","SQLiteNumeric")}build(e){return new tt(e,this.config)}}class tt extends w{static[o]="SQLiteNumeric";mapFromDriverValue(e){return typeof e=="string"?e:String(e)}getSQLType(){return"numeric"}}class rt extends N{static[o]="SQLiteNumericNumberBuilder";constructor(e){super(e,"number","SQLiteNumericNumber")}build(e){return new nt(e,this.config)}}class nt extends w{static[o]="SQLiteNumericNumber";mapFromDriverValue(e){return typeof e=="number"?e:Number(e)}mapToDriverValue=String;getSQLType(){return"numeric"}}class it extends N{static[o]="SQLiteNumericBigIntBuilder";constructor(e){super(e,"bigint","SQLiteNumericBigInt")}build(e){return new at(e,this.config)}}class at extends w{static[o]="SQLiteNumericBigInt";mapFromDriverValue=BigInt;mapToDriverValue=String;getSQLType(){return"numeric"}}function st(t,e){const{name:r,config:i}=C(t,e),u=i?.mode;return u==="number"?new rt(r):u==="bigint"?new it(r):new et(r)}class ot extends N{static[o]="SQLiteRealBuilder";constructor(e){super(e,"number","SQLiteReal")}build(e){return new lt(e,this.config)}}class lt extends w{static[o]="SQLiteReal";getSQLType(){return"real"}}function T(t){return new ot(t??"")}class ut extends N{static[o]="SQLiteTextBuilder";constructor(e,r){super(e,"string","SQLiteText"),this.config.enumValues=r.enum,this.config.length=r.length}build(e){return new dt(e,this.config)}}class dt extends w{static[o]="SQLiteText";enumValues=this.config.enumValues;length=this.config.length;constructor(e,r){super(e,r)}getSQLType(){return`text${this.config.length?`(${this.config.length})`:""}`}}class ct extends N{static[o]="SQLiteTextJsonBuilder";constructor(e){super(e,"json","SQLiteTextJson")}build(e){return new mt(e,this.config)}}class mt extends w{static[o]="SQLiteTextJson";getSQLType(){return"text"}mapFromDriverValue(e){return JSON.parse(e)}mapToDriverValue(e){return JSON.stringify(e)}}function a(t,e={}){const{name:r,config:i}=C(t,e);return i.mode==="json"?new ct(r):new ut(r,i)}function pt(){return{blob:Re,customType:Je,integer:n,numeric:st,real:T,text:a}}const M=Symbol.for("drizzle:SQLiteInlineForeignKeys");class ne extends _{static[o]="SQLiteTable";static Symbol=Object.assign({},_.Symbol,{InlineForeignKeys:M});[_.Symbol.Columns];[M]=[];[_.Symbol.ExtraConfigBuilder]=void 0}function ft(t,e,r,i,u=t){const l=new ne(t,i,u),p=typeof e=="function"?e(pt()):e,c=Object.fromEntries(Object.entries(p).map(([y,s])=>{const m=s;m.setName(y);const g=m.build(l);return l[M].push(...m.buildForeignKeys(g,l)),[y,g]})),d=Object.assign(l,c);return d[_.Symbol.Columns]=c,d[_.Symbol.ExtraConfigColumns]=c,r&&(d[ne.Symbol.ExtraConfigBuilder]=r),d}const h=(t,e,r)=>ft(t,e,r);class ce{constructor(e,r){this.name=e,this.unique=r}static[o]="SQLiteIndexBuilderOn";on(...e){return new gt(this.name,e,this.unique)}}class gt{static[o]="SQLiteIndexBuilder";config;constructor(e,r,i){this.config={name:e,columns:r,unique:i,where:void 0}}where(e){return this.config.where=e,this}build(e){return new ht(this.config,e)}}class ht{static[o]="SQLiteIndex";config;constructor(e,r){this.config={...e,table:r}}}function I(t){return new ce(t,!1)}function yt(t){return new ce(t,!0)}const L=h("users",{id:n("id").primaryKey({autoIncrement:!0}),email:a("email").notNull().unique(),username:a("username").notNull().unique(),fullName:a("full_name"),avatarUrl:a("avatar_url"),role:a("role",{enum:["admin","editor","viewer"]}).notNull().default("viewer"),isActive:n("is_active",{mode:"boolean"}).notNull().default(!0),lastLoginAt:n("last_login_at",{mode:"timestamp"}),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().default(new Date)}),bt=h("teams",{id:a("id").primaryKey(),name:a("name").notNull(),ownerId:n("owner_id").notNull().references(()=>L.id),createdAt:n("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},t=>[I("idx_teams_owner").on(t.ownerId)]);h("team_members",{id:n("id").primaryKey({autoIncrement:!0}),teamId:a("team_id").notNull().references(()=>bt.id,{onDelete:"cascade"}),userId:n("user_id").notNull().references(()=>L.id,{onDelete:"cascade"}),role:a("role",{enum:["owner","admin","editor","viewer"]}).notNull().default("editor"),joinedAt:n("joined_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},t=>({uniqueTeamUser:I("team_members_team_user_unique").on(t.teamId,t.userId),userIdx:I("idx_team_members_user").on(t.userId)}));const q=h("projects",{id:n("id").primaryKey({autoIncrement:!0}),name:a("name").notNull(),description:a("description"),ownerId:n("owner_id").notNull().references(()=>L.id),isPublic:n("is_public",{mode:"boolean"}).notNull().default(!1),theme:a("theme"),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().default(new Date)});h("project_members",{id:n("id").primaryKey({autoIncrement:!0}),projectId:n("project_id").notNull().references(()=>q.id,{onDelete:"cascade"}),userId:n("user_id").notNull().references(()=>L.id,{onDelete:"cascade"}),role:a("role",{enum:["owner","admin","editor","viewer"]}).notNull().default("editor"),addedAt:n("added_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},t=>({uniqueProjectUser:I("project_members_project_user_unique").on(t.projectId,t.userId),userIdx:I("idx_project_members_user").on(t.userId)}));const _t=h("scripts",{id:n("id").primaryKey({autoIncrement:!0}),projectId:n("project_id").notNull().references(()=>q.id),title:a("title").notNull(),slug:a("slug").notNull(),genre:a("genre"),logline:a("logline"),status:a("status",{enum:["draft","revision","final","published"]}).notNull().default("draft"),currentVersion:n("current_version").notNull().default(1),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().default(new Date)}),J=h("characters",{id:n("id").primaryKey({autoIncrement:!0}),projectId:n("project_id").notNull().references(()=>q.id),name:a("name").notNull(),slug:a("slug").notNull(),role:a("role",{enum:["protagonist","antagonist","supporting","background","ensemble"]}).notNull().default("supporting"),bio:a("bio"),description:a("description"),arc:a("arc"),arcType:a("arc_type",{enum:["positive","negative","flat","complex"]}),age:n("age"),gender:a("gender"),voice:a("voice"),traits:a("traits"),motivation:a("motivation"),conflict:a("conflict"),secret:a("secret"),imageUrl:a("image_url"),createdAt:n("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:n("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)});h("character_relationships",{id:n("id").primaryKey({autoIncrement:!0}),characterIdA:n("character_a_id").notNull().references(()=>J.id),characterIdB:n("character_b_id").notNull().references(()=>J.id),relationshipType:a("relationship_type",{enum:["family","romantic","friendship","rivalry","mentor","alliance","conflict","professional","other"]}).notNull(),description:a("description"),strength:n("strength").notNull().default(50),isAntagonistic:n("is_antagonistic",{mode:"boolean"}).notNull().default(!1),createdAt:n("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:n("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)},t=>({uniquePair:yt("character_relationships_unique_pair").on(t.characterIdA,t.characterIdB)}));const St=h("scenes",{id:n("id").primaryKey({autoIncrement:!0}),projectId:n("project_id").notNull().references(()=>q.id),title:a("title").notNull(),content:a("content").notNull().default(""),order:n("order").notNull().default(0),createdAt:n("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:n("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)});h("scene_characters",{id:n("id").primaryKey({autoIncrement:!0}),sceneId:n("scene_id").notNull().references(()=>St.id),characterId:n("character_id").notNull().references(()=>J.id),screenTime:n("screen_time"),dialogueLines:n("dialogue_lines").default(0)});const vt=h("revisions",{id:n("id").primaryKey({autoIncrement:!0}),scriptId:n("script_id").notNull().references(()=>_t.id),versionNumber:n("version_number").notNull(),branchName:a("branch_name").notNull().default("main"),parentRevisionId:n("parent_revision_id"),title:a("title").notNull(),summary:a("summary"),content:a("content").notNull(),authorId:n("author_id").notNull().references(()=>L.id),status:a("status",{enum:["draft","pending_review","accepted","rejected"]}).notNull().default("draft"),reviewedById:n("reviewed_by_id").references(()=>L.id),reviewedAt:n("reviewed_at",{mode:"timestamp"}),createdAt:n("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},t=>({scriptVersionIdx:I("revisions_script_version_idx").on(t.scriptId,t.versionNumber),scriptBranchIdx:I("revisions_script_branch_idx").on(t.scriptId,t.branchName),authorIdx:I("revisions_author_idx").on(t.authorId)}));h("revision_changes",{id:n("id").primaryKey({autoIncrement:!0}),revisionId:n("revision_id").notNull().references(()=>vt.id),changeType:a("change_type",{enum:["addition","deletion","modification"]}).notNull(),elementType:a("element_type"),oldContent:a("old_content"),newContent:a("new_content"),sceneNumber:n("scene_number"),lineNumber:n("line_number"),pageNumber:n("page_number"),createdAt:n("created_at",{mode:"timestamp"}).notNull().$defaultFn(()=>new Date)},t=>({revisionIdx:I("revision_changes_revision_idx").on(t.revisionId),changeTypeIdx:I("revision_changes_type_idx").on(t.changeType)}));h("kpi_snapshots",{id:n("id").primaryKey({autoIncrement:!0}),kpiKey:a("kpi_key").notNull(),kpiValue:T("kpi_value").notNull(),periodStart:n("period_start",{mode:"timestamp"}).notNull(),periodEnd:n("period_end",{mode:"timestamp"}).notNull(),metadata:a("metadata"),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date)});const Nt=h("alert_rules",{id:n("id").primaryKey({autoIncrement:!0}),name:a("name").notNull(),kpiKey:a("kpi_key").notNull(),condition:a("condition",{enum:["above","below","equals","increasing","decreasing"]}).notNull(),threshold:T("threshold").notNull(),severity:a("severity",{enum:["low","medium","high","critical"]}).notNull().default("medium"),channelId:a("channel_id"),isActive:n("is_active",{mode:"boolean"}).notNull().default(!0),cooldownMinutes:n("cooldown_minutes").notNull().default(60),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().default(new Date)});h("alerts",{id:n("id").primaryKey({autoIncrement:!0}),ruleId:n("rule_id").notNull().references(()=>Nt.id),kpiKey:a("kpi_key").notNull(),kpiValue:T("kpi_value").notNull(),threshold:T("threshold").notNull(),severity:a("severity",{enum:["low","medium","high","critical"]}).notNull(),message:a("message").notNull(),wasSent:n("was_sent",{mode:"boolean"}).notNull().default(!1),sentAt:n("sent_at",{mode:"timestamp"}),acknowledgedBy:n("acknowledged_by").references(()=>L.id),acknowledgedAt:n("acknowledged_at",{mode:"timestamp"}),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date)});h("scheduled_reports",{id:n("id").primaryKey({autoIncrement:!0}),name:a("name").notNull(),reportType:a("report_type",{enum:["weekly_kpi","monthly_kpi","cohort_analysis","nps_summary","custom"]}).notNull(),schedule:a("schedule").notNull(),recipients:a("recipients").notNull(),format:a("format",{enum:["slack","email","both"]}).notNull().default("slack"),isActive:n("is_active",{mode:"boolean"}).notNull().default(!0),lastRunAt:n("last_run_at",{mode:"timestamp"}),nextRunAt:n("next_run_at",{mode:"timestamp"}),metadata:a("metadata"),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().default(new Date)});h("nps_responses",{id:n("id").primaryKey({autoIncrement:!0}),userId:n("user_id").references(()=>L.id),score:n("score").notNull(),category:a("category",{enum:["detractor","passive","promoter"]}).notNull(),feedback:a("feedback"),surveyId:a("survey_id"),respondentEmail:a("respondent_email"),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date)});const wt=h("cohorts",{id:n("id").primaryKey({autoIncrement:!0}),name:a("name").notNull(),definition:a("definition").notNull(),periodStart:n("period_start",{mode:"timestamp"}).notNull(),periodEnd:n("period_end",{mode:"timestamp"}),size:n("size").notNull().default(0),retentionData:a("retention_data"),metadata:a("metadata"),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().default(new Date)});h("cohort_members",{id:n("id").primaryKey({autoIncrement:!0}),cohortId:n("cohort_id").notNull().references(()=>wt.id),userId:n("user_id").notNull().references(()=>L.id),joinedAt:n("joined_at",{mode:"timestamp"}).notNull().default(new Date)});const It=h("waitlist_signups",{id:n("id").primaryKey({autoIncrement:!0}),email:a("email").notNull().unique(),name:a("name"),source:a("source").notNull().default("organic"),status:a("status").notNull().default("waitlist"),metadata:a("metadata"),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date),updatedAt:n("updated_at",{mode:"timestamp"}).notNull().default(new Date)});h("waitlist_events",{id:n("id").primaryKey({autoIncrement:!0}),signupId:n("signup_id").notNull().references(()=>It.id),eventType:a("event_type").notNull(),eventData:a("event_data"),createdAt:n("created_at",{mode:"timestamp"}).notNull().default(new Date)});const xt={mau:{warning:1e3,critical:500,direction:"higher"},paying_users:{warning:100,critical:50,direction:"higher"},mrr:{warning:5e3,critical:2e3,direction:"higher"},conversion_rate:{warning:2,critical:1,direction:"higher"},churn_rate:{warning:5,critical:3,direction:"lower"},cac:{warning:12,critical:15,direction:"lower"},ltv:{warning:100,critical:80,direction:"higher"},nps:{warning:40,critical:20,direction:"higher"},viral_coefficient:{warning:.3,critical:.1,direction:"higher"}};var Lt=x('<div class=freno-kpi-panel-content><div class=freno-kpi-panel-header><div><h2>Unified KPI Report</h2><p class=freno-text-muted>Cross-tool KPI summary template</p></div></div><div class=freno-kpi-report-template><div class=freno-kpi-info-card><h3>KPI Thresholds Reference</h3><p>All tracked KPIs with their target thresholds and alert levels. This template is designed for weekly/monthly reporting across all analytics tools.</p></div><table class=freno-kpi-table><thead><tr><th>KPI</th><th>Category</th><th>Warning Threshold</th><th>Critical Threshold</th><th>Direction</th></tr></thead><tbody></tbody></table><div class=freno-kpi-info-card><h3>Reporting Schedule</h3><ul><li><strong>Weekly Report:</strong> Auto-generated every Monday at 9:00 AM</li><li><strong>Monthly Report:</strong> Auto-generated on the 1st of each month</li><li><strong>Alert Thresholds:</strong> Real-time notifications via Slack when KPIs breach warning/critical levels</li></ul></div><div class=freno-kpi-info-card><h3>External Dashboards</h3><ul><li><a href=https://mixpanel.com target=_blank rel="noopener noreferrer">Mixpanel</a> — Product analytics (MAU, retention, funnels, viral coefficient)</li><li><a href=https://analytics.google.com target=_blank rel="noopener noreferrer">Google Analytics 4</a> — Web analytics (traffic sources, CAC tracking)</li><li><a href=https://dashboard.stripe.com target=_blank rel="noopener noreferrer">Stripe</a> — Revenue tracking (MRR, churn, LTV)'),Qt=x("<tr><td class=freno-kpi-table-key></td><td><span class=freno-kpi-badge></span></td><td></td><td></td><td><span>");const Bt=()=>{const t=Object.entries(xt);return(()=>{var e=Lt(),r=e.firstChild,i=r.nextSibling,u=i.firstChild,l=u.nextSibling,p=l.firstChild,c=p.nextSibling;return f(c,()=>t.map(([d,y])=>(()=>{var s=Qt(),m=s.firstChild,g=m.nextSibling,K=g.firstChild,k=g.nextSibling,F=k.nextSibling,me=F.nextSibling,z=me.firstChild;return f(m,()=>d.replace(/_/g," ").replace(/\b\w/g,B=>B.toUpperCase())),f(K,()=>Dt(d)),f(k,()=>y.warning,null),f(k,()=>ie(d),null),f(F,()=>y.critical,null),f(F,()=>ie(d),null),f(z,()=>y.direction==="higher"?"↑ Higher is better":"↓ Lower is better"),ae(B=>{var Y=y.direction==="higher",X=y.direction==="lower";return Y!==B.e&&z.classList.toggle("freno-text-success",B.e=Y),X!==B.t&&z.classList.toggle("freno-text-error",B.t=X),B},{e:void 0,t:void 0}),s})())),e})()};function Dt(t){const e=["mau","paying_users","conversion_rate","nps","viral_coefficient"],r=["cac"],i=["mrr","churn_rate","ltv"];return e.includes(t)?"Product":r.includes(t)?"Acquisition":i.includes(t)?"Revenue":"Other"}function ie(t){return{cac:" USD",mrr:" USD",ltv:" USD",churn_rate:"%",conversion_rate:"%",mau:"",paying_users:"",nps:" pts",viral_coefficient:""}[t]||""}var At=x("<div class=freno-kpi-dashboard><div class=freno-page-header><div><h1>KPI Dashboard</h1><p class=freno-text-muted>Real-time metrics across product, acquisition, and revenue</p></div></div><div class=freno-kpi-tabs></div><div class=freno-kpi-panel>"),Tt=x("<button class=freno-kpi-tab><span class=freno-kpi-tab-icon></span><span>");const Ct=[{id:"product",label:"Product KPIs",icon:"📈"},{id:"acquisition",label:"Acquisition KPIs",icon:"🎯"},{id:"revenue",label:"Revenue KPIs",icon:"💰"},{id:"report",label:"Unified Report",icon:"📋"}],Pt=()=>{const[t,e]=pe("product");return(()=>{var r=At(),i=r.firstChild,u=i.nextSibling,l=u.nextSibling;return f(u,()=>Ct.map(p=>(()=>{var c=Tt(),d=c.firstChild,y=d.nextSibling;return c.$$click=()=>e(p.id),f(d,()=>p.icon),f(y,()=>p.label),ae(()=>c.classList.toggle("freno-kpi-tab-active",t()===p.id)),c})())),f(l,Q($,{get when(){return t()==="product"},get children(){return Q(be,{})}}),null),f(l,Q($,{get when(){return t()==="acquisition"},get children(){return Q(Ne,{})}}),null),f(l,Q($,{get when(){return t()==="revenue"},get children(){return Q(Le,{})}}),null),f(l,Q($,{get when(){return t()==="report"},get children(){return Q(Bt,{})}}),null),r})()};fe(["click"]);export{Pt as KPIDashboard};
//# sourceMappingURL=KPIDashboard-Cq888Xkl.js.map