@fayz-ai/plugin-sites 0.2.3 → 0.9.0-next.0
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/package.json +13 -9
- package/dist/index.cjs +0 -110
- package/dist/index.cjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fayz-ai/plugin-sites",
|
|
3
|
-
"
|
|
3
|
+
"fayz": {
|
|
4
|
+
"status": "preview"
|
|
5
|
+
},
|
|
6
|
+
"version": "0.9.0-next.0",
|
|
4
7
|
"description": "[experimental] Fayz SDK — sites, funnels & landing pages plugin",
|
|
5
8
|
"type": "module",
|
|
6
|
-
"
|
|
9
|
+
"sideEffects": false,
|
|
10
|
+
"main": "./dist/index.js",
|
|
7
11
|
"module": "./dist/index.js",
|
|
8
12
|
"types": "./dist/index.d.ts",
|
|
9
13
|
"exports": {
|
|
10
14
|
".": {
|
|
11
15
|
"source": "./src/index.ts",
|
|
12
16
|
"types": "./dist/index.d.ts",
|
|
13
|
-
"import": "./dist/index.js"
|
|
14
|
-
"require": "./dist/index.cjs"
|
|
17
|
+
"import": "./dist/index.js"
|
|
15
18
|
}
|
|
16
19
|
},
|
|
17
20
|
"files": [
|
|
@@ -20,19 +23,20 @@
|
|
|
20
23
|
],
|
|
21
24
|
"peerDependencies": {
|
|
22
25
|
"react": "^18.0.0 || ^19.0.0",
|
|
23
|
-
"react-dom": "^18.0.0 || ^19.0.0"
|
|
26
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
27
|
+
"lucide-react": ">=0.400.0 <1.0.0"
|
|
24
28
|
},
|
|
25
29
|
"dependencies": {
|
|
26
|
-
"
|
|
27
|
-
"@fayz-ai/
|
|
28
|
-
"@fayz-ai/ui": "^0.7.0"
|
|
30
|
+
"@fayz-ai/core": "^0.9.0-next.0",
|
|
31
|
+
"@fayz-ai/ui": "^0.9.0-next.0"
|
|
29
32
|
},
|
|
30
33
|
"devDependencies": {
|
|
31
34
|
"@types/react": "^18.3.0",
|
|
32
35
|
"react": "^18.3.0",
|
|
33
36
|
"tsup": "^8.2.0",
|
|
34
37
|
"typescript": "^5.5.0",
|
|
35
|
-
"@types/react-dom": "^18.3.0"
|
|
38
|
+
"@types/react-dom": "^18.3.0",
|
|
39
|
+
"lucide-react": "^0.400.0"
|
|
36
40
|
},
|
|
37
41
|
"license": "MIT",
|
|
38
42
|
"keywords": [
|
package/dist/index.cjs
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var React = require('react');
|
|
4
|
-
var lucideReact = require('lucide-react');
|
|
5
|
-
var ui = require('@fayz-ai/ui');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
-
|
|
8
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
-
|
|
10
|
-
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
11
|
-
|
|
12
|
-
// src/index.ts
|
|
13
|
-
var SITES = [
|
|
14
|
-
{ id: "1", name: "Free Consultation Funnel", type: "Funnel", status: "Published", visits: 3820, conversion: 12.4, accent: "#6366f1" },
|
|
15
|
-
{ id: "2", name: "Summer Promo Landing", type: "Landing page", status: "Published", visits: 1560, conversion: 8.1, accent: "#ec4899" },
|
|
16
|
-
{ id: "3", name: "Agency Website", type: "Website", status: "Published", visits: 9240, conversion: 3.2, accent: "#0ea5e9" },
|
|
17
|
-
{ id: "4", name: "Webinar Registration", type: "Funnel", status: "Draft", visits: 0, conversion: 0, accent: "#f59e0b" },
|
|
18
|
-
{ id: "5", name: "Lead Magnet \u2014 Ebook", type: "Landing page", status: "Draft", visits: 0, conversion: 0, accent: "#14b8a6" }
|
|
19
|
-
];
|
|
20
|
-
var TYPE_ICON = { Funnel: lucideReact.Layers, Website: lucideReact.Globe, "Landing page": lucideReact.FileText };
|
|
21
|
-
function Stat({ icon: Icon, label, value }) {
|
|
22
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-card border border-border bg-card p-4", children: [
|
|
23
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
|
|
24
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-4 w-4" }),
|
|
25
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium", children: label })
|
|
26
|
-
] }),
|
|
27
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-2xl font-semibold text-foreground", children: value })
|
|
28
|
-
] });
|
|
29
|
-
}
|
|
30
|
-
function SitesHome() {
|
|
31
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-6xl p-6", children: [
|
|
32
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.PageHeaderActions, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { children: [
|
|
33
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-1.5 h-4 w-4" }),
|
|
34
|
-
" New funnel"
|
|
35
|
-
] }) }),
|
|
36
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 grid grid-cols-2 gap-4 lg:grid-cols-4", children: [
|
|
37
|
-
/* @__PURE__ */ jsxRuntime.jsx(Stat, { icon: lucideReact.Eye, label: "Total visits (30d)", value: "14,620" }),
|
|
38
|
-
/* @__PURE__ */ jsxRuntime.jsx(Stat, { icon: lucideReact.MousePointerClick, label: "Avg. conversion", value: "7.1%" }),
|
|
39
|
-
/* @__PURE__ */ jsxRuntime.jsx(Stat, { icon: lucideReact.Layers, label: "Published funnels", value: "3" }),
|
|
40
|
-
/* @__PURE__ */ jsxRuntime.jsx(Stat, { icon: lucideReact.FileText, label: "Leads captured", value: "1,038" })
|
|
41
|
-
] }),
|
|
42
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: SITES.map((s) => {
|
|
43
|
-
const Icon = TYPE_ICON[s.type];
|
|
44
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group overflow-hidden rounded-card border border-border bg-card", children: [
|
|
45
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-28 items-center justify-center", style: { backgroundColor: `${s.accent}1a` }, children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-8 w-8", style: { color: s.accent } }) }),
|
|
46
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4", children: [
|
|
47
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
48
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-muted-foreground", children: s.type }),
|
|
49
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `rounded-full px-2 py-0.5 text-xs font-medium ${s.status === "Published" ? "bg-emerald-100 text-emerald-700" : "bg-muted text-muted-foreground"}`, children: s.status })
|
|
50
|
-
] }),
|
|
51
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm font-semibold text-foreground", children: s.name }),
|
|
52
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 flex items-center justify-between text-xs text-muted-foreground", children: [
|
|
53
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
54
|
-
s.visits.toLocaleString(),
|
|
55
|
-
" visits"
|
|
56
|
-
] }),
|
|
57
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
58
|
-
s.conversion,
|
|
59
|
-
"% conv."
|
|
60
|
-
] })
|
|
61
|
-
] }),
|
|
62
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "outline", size: "sm", className: "mt-3 w-full", children: [
|
|
63
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { className: "mr-1.5 h-3.5 w-3.5" }),
|
|
64
|
-
" Open editor"
|
|
65
|
-
] })
|
|
66
|
-
] })
|
|
67
|
-
] }, s.id);
|
|
68
|
-
}) }),
|
|
69
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 text-center text-xs text-muted-foreground", children: "Mock preview \xB7 the drag-and-drop page builder (block system + public surfaces) ships in a later milestone." })
|
|
70
|
-
] });
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// src/index.ts
|
|
74
|
-
function createSitesPlugin(options) {
|
|
75
|
-
const PageComponent = () => React__default.default.createElement(SitesHome);
|
|
76
|
-
PageComponent.displayName = "SitesHome";
|
|
77
|
-
return {
|
|
78
|
-
id: "sites",
|
|
79
|
-
name: options?.navLabel ?? "Sites",
|
|
80
|
-
icon: "LayoutTemplate",
|
|
81
|
-
version: "1.0.0",
|
|
82
|
-
scope: options?.scope ?? "universal",
|
|
83
|
-
verticalId: options?.verticalId,
|
|
84
|
-
defaultEnabled: true,
|
|
85
|
-
dependencies: [],
|
|
86
|
-
declaredFeatures: [{ id: "sites", label: "Sites & Funnels", group: "Convert" }],
|
|
87
|
-
navigation: [
|
|
88
|
-
{
|
|
89
|
-
section: options?.navSection ?? "main",
|
|
90
|
-
position: options?.navPosition ?? 7,
|
|
91
|
-
label: options?.navLabel ?? "Sites",
|
|
92
|
-
route: "/sites",
|
|
93
|
-
icon: "LayoutTemplate",
|
|
94
|
-
permission: { feature: "sites", action: "read" }
|
|
95
|
-
}
|
|
96
|
-
],
|
|
97
|
-
routes: [
|
|
98
|
-
{
|
|
99
|
-
path: "/sites",
|
|
100
|
-
component: PageComponent,
|
|
101
|
-
permission: { feature: "sites", action: "read" }
|
|
102
|
-
}
|
|
103
|
-
],
|
|
104
|
-
widgets: []
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
exports.createSitesPlugin = createSitesPlugin;
|
|
109
|
-
//# sourceMappingURL=index.cjs.map
|
|
110
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/views/SitesHome.tsx","../src/index.ts"],"names":["Layers","Globe","FileText","jsxs","jsx","PageHeaderActions","Button","Plus","Eye","MousePointerClick","ExternalLink","React"],"mappings":";;;;;;;;;;;;AAcA,IAAM,KAAA,GAAgB;AAAA,EACpB,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,4BAA4B,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAQ,SAAA,EAAU;AAAA,EACpI,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,wBAAwB,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,QAAQ,SAAA,EAAU;AAAA,EACrI,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,kBAAkB,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,QAAQ,SAAA,EAAU;AAAA,EAC1H,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,wBAAwB,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,QAAQ,SAAA,EAAU;AAAA,EACtH,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,4BAAuB,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,QAAQ,SAAA;AACnH,CAAA;AAEA,IAAM,YAAY,EAAE,MAAA,EAAQA,oBAAQ,OAAA,EAASC,iBAAA,EAAO,gBAAgBC,oBAAA,EAAS;AAE7E,SAAS,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAM,EAAwF;AAC/H,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,sBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAC3E,CAAA;AAAA,oBACAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EACpE,CAAA;AAEJ;AAEO,SAAS,SAAA,GAAY;AAC1B,EAAA,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,oBAAA,EAAA,EACC,0CAACC,SAAA,EAAA,EAAO,QAAA,EAAA;AAAA,sBAAAF,cAAA,CAACG,gBAAA,EAAA,EAAK,WAAU,gBAAA,EAAiB,CAAA;AAAA,MAAE;AAAA,KAAA,EAAW,CAAA,EACxD,CAAA;AAAA,oBAEAJ,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,QAAK,IAAA,EAAMI,eAAA,EAAK,KAAA,EAAM,oBAAA,EAAqB,OAAM,QAAA,EAAS,CAAA;AAAA,qCAC1D,IAAA,EAAA,EAAK,IAAA,EAAMC,+BAAmB,KAAA,EAAM,iBAAA,EAAkB,OAAM,MAAA,EAAO,CAAA;AAAA,qCACnE,IAAA,EAAA,EAAK,IAAA,EAAMT,oBAAQ,KAAA,EAAM,mBAAA,EAAoB,OAAM,GAAA,EAAI,CAAA;AAAA,qCACvD,IAAA,EAAA,EAAK,IAAA,EAAME,sBAAU,KAAA,EAAM,gBAAA,EAAiB,OAAM,OAAA,EAAQ;AAAA,KAAA,EAC7D,CAAA;AAAA,mCAEC,KAAA,EAAA,EAAI,SAAA,EAAU,6DACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAChB,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA;AAC7B,MAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAe,SAAA,EAAU,iEAAA,EACxB,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EAAwC,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,EAAG,EAAE,MAAM,CAAA,EAAA,CAAA,IAC1F,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,EAAG,CAAA,EACxD,CAAA;AAAA,wBACAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,CAAA,CAAE,IAAA,EAAK,CAAA;AAAA,4BACpEA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,6CAAA,EAAgD,CAAA,CAAE,MAAA,KAAW,WAAA,GAAc,iCAAA,GAAoC,gCAAgC,CAAA,CAAA,EAAK,QAAA,EAAA,CAAA,CAAE,MAAA,EAAO;AAAA,WAAA,EAChL,CAAA;AAAA,0BACAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAAA,EAA8C,YAAE,IAAA,EAAK,CAAA;AAAA,0BAClED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,cAAA,CAAA,CAAE,OAAO,cAAA,EAAe;AAAA,cAAE;AAAA,aAAA,EAAO,CAAA;AAAA,4CACvC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,cAAA,CAAA,CAAE,UAAA;AAAA,cAAW;AAAA,aAAA,EAAO;AAAA,WAAA,EAC7B,CAAA;AAAA,0CACCG,SAAA,EAAA,EAAO,OAAA,EAAQ,WAAU,IAAA,EAAK,IAAA,EAAK,WAAU,aAAA,EAC5C,QAAA,EAAA;AAAA,4BAAAF,cAAA,CAACM,wBAAA,EAAA,EAAa,WAAU,oBAAA,EAAqB,CAAA;AAAA,YAAE;AAAA,WAAA,EACjD;AAAA,SAAA,EACF;AAAA,OAAA,EAAA,EAjBQ,EAAE,EAkBZ,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBAEAN,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA,+GAAA,EAE9D;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC/DO,SAAS,kBAAkB,OAAA,EAA8C;AAC9E,EAAA,MAAM,aAAA,GAA8C,MAAMO,sBAAA,CAAM,aAAA,CAAc,SAAS,CAAA;AACvF,EAAA,aAAA,CAAc,WAAA,GAAc,WAAA;AAE5B,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,SAAS,QAAA,IAAY,OAAA;AAAA,IAC3B,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,KAAA,EAAO,SAAS,KAAA,IAAS,WAAA;AAAA,IACzB,YAAY,OAAA,EAAS,UAAA;AAAA,IACrB,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAc,EAAC;AAAA,IACf,gBAAA,EAAkB,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAO,iBAAA,EAAmB,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,IAC9E,UAAA,EAAY;AAAA,MACV;AAAA,QACE,OAAA,EAAS,SAAS,UAAA,IAAc,MAAA;AAAA,QAChC,QAAA,EAAU,SAAS,WAAA,IAAe,CAAA;AAAA,QAClC,KAAA,EAAO,SAAS,QAAA,IAAY,OAAA;AAAA,QAC5B,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM,gBAAA;AAAA,QACN,UAAA,EAAY,EAAE,OAAA,EAAS,OAAA,EAAS,QAAQ,MAAA;AAAgB;AAC1D,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EAAW,aAAA;AAAA,QACX,UAAA,EAAY,EAAE,OAAA,EAAS,OAAA,EAAS,QAAQ,MAAA;AAAgB;AAC1D,KACF;AAAA,IACA,SAAS;AAAC,GACZ;AACF","file":"index.cjs","sourcesContent":["import React from 'react'\nimport { Plus, ExternalLink, MousePointerClick, Eye, Globe, Layers, FileText } from 'lucide-react'\nimport { Button, PageHeaderActions } from '@fayz-ai/ui'\n\ninterface Site {\n id: string\n name: string\n type: 'Funnel' | 'Website' | 'Landing page'\n status: 'Published' | 'Draft'\n visits: number\n conversion: number\n accent: string\n}\n\nconst SITES: Site[] = [\n { id: '1', name: 'Free Consultation Funnel', type: 'Funnel', status: 'Published', visits: 3820, conversion: 12.4, accent: '#6366f1' },\n { id: '2', name: 'Summer Promo Landing', type: 'Landing page', status: 'Published', visits: 1560, conversion: 8.1, accent: '#ec4899' },\n { id: '3', name: 'Agency Website', type: 'Website', status: 'Published', visits: 9240, conversion: 3.2, accent: '#0ea5e9' },\n { id: '4', name: 'Webinar Registration', type: 'Funnel', status: 'Draft', visits: 0, conversion: 0, accent: '#f59e0b' },\n { id: '5', name: 'Lead Magnet — Ebook', type: 'Landing page', status: 'Draft', visits: 0, conversion: 0, accent: '#14b8a6' },\n]\n\nconst TYPE_ICON = { Funnel: Layers, Website: Globe, 'Landing page': FileText } as const\n\nfunction Stat({ icon: Icon, label, value }: { icon: React.ComponentType<{ className?: string }>; label: string; value: string }) {\n return (\n <div className=\"rounded-card border border-border bg-card p-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Icon className=\"h-4 w-4\" /><span className=\"text-xs font-medium\">{label}</span>\n </div>\n <p className=\"mt-2 text-2xl font-semibold text-foreground\">{value}</p>\n </div>\n )\n}\n\nexport function SitesHome() {\n return (\n <div className=\"mx-auto max-w-6xl p-6\">\n <PageHeaderActions>\n <Button><Plus className=\"mr-1.5 h-4 w-4\" /> New funnel</Button>\n </PageHeaderActions>\n\n <div className=\"mt-6 grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <Stat icon={Eye} label=\"Total visits (30d)\" value=\"14,620\" />\n <Stat icon={MousePointerClick} label=\"Avg. conversion\" value=\"7.1%\" />\n <Stat icon={Layers} label=\"Published funnels\" value=\"3\" />\n <Stat icon={FileText} label=\"Leads captured\" value=\"1,038\" />\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {SITES.map((s) => {\n const Icon = TYPE_ICON[s.type]\n return (\n <div key={s.id} className=\"group overflow-hidden rounded-card border border-border bg-card\">\n <div className=\"flex h-28 items-center justify-center\" style={{ backgroundColor: `${s.accent}1a` }}>\n <Icon className=\"h-8 w-8\" style={{ color: s.accent }} />\n </div>\n <div className=\"p-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-muted-foreground\">{s.type}</span>\n <span className={`rounded-full px-2 py-0.5 text-xs font-medium ${s.status === 'Published' ? 'bg-emerald-100 text-emerald-700' : 'bg-muted text-muted-foreground'}`}>{s.status}</span>\n </div>\n <p className=\"mt-1 text-sm font-semibold text-foreground\">{s.name}</p>\n <div className=\"mt-3 flex items-center justify-between text-xs text-muted-foreground\">\n <span>{s.visits.toLocaleString()} visits</span>\n <span>{s.conversion}% conv.</span>\n </div>\n <Button variant=\"outline\" size=\"sm\" className=\"mt-3 w-full\">\n <ExternalLink className=\"mr-1.5 h-3.5 w-3.5\" /> Open editor\n </Button>\n </div>\n </div>\n )\n })}\n </div>\n\n <p className=\"mt-4 text-center text-xs text-muted-foreground\">\n Mock preview · the drag-and-drop page builder (block system + public surfaces) ships in a later milestone.\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { SitesHome } from './views/SitesHome'\n\n// ---------------------------------------------------------------------------\n// @fayz-ai/plugin-sites — websites, funnels & landing pages (GoHighLevel \"Sites\").\n// Universal plugin. M1 ships a rich mock home; the drag-and-drop page builder\n// (block system from architecture-v2 + public surfaces) ships in a later milestone.\n// ---------------------------------------------------------------------------\n\nexport interface SitesPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n scope?: PluginScope\n verticalId?: VerticalId\n}\n\nexport function createSitesPlugin(options?: SitesPluginOptions): PluginManifest {\n const PageComponent: React.ComponentType<unknown> = () => React.createElement(SitesHome)\n PageComponent.displayName = 'SitesHome'\n\n return {\n id: 'sites',\n name: options?.navLabel ?? 'Sites',\n icon: 'LayoutTemplate',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [{ id: 'sites', label: 'Sites & Funnels', group: 'Convert' }],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 7,\n label: options?.navLabel ?? 'Sites',\n route: '/sites',\n icon: 'LayoutTemplate',\n permission: { feature: 'sites', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/sites',\n component: PageComponent,\n permission: { feature: 'sites', action: 'read' as const },\n },\n ],\n widgets: [],\n }\n}\n"]}
|