@fayz-ai/plugin-marketing 0.10.0 → 0.10.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"MarketingBits.d.ts","sourceRoot":"","sources":["../../src/components/MarketingBits.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,UAAU,CAAA;AAU5D,wBAAgB,OAAO,CAAC,EACtB,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,GAC9D,EAAE;IACD,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,qBA0BA;AAQD,wBAAgB,SAAS,sBAWxB;AAaD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,qBAOjE;AAMD,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,qBAS/D;AAMD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACxB,qBAaA"}
1
+ {"version":3,"file":"MarketingBits.d.ts","sourceRoot":"","sources":["../../src/components/MarketingBits.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,UAAU,CAAA;AAU5D,wBAAgB,OAAO,CAAC,EACtB,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,GAC9D,EAAE;IACD,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,qBA0BA;AAaD,wBAAgB,SAAS,sBAUxB;AAaD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,qBAOjE;AAMD,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,qBAS/D;AAMD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACxB,qBAaA"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import React9, { useState, useEffect, useMemo, useCallback } from 'react';
2
2
  import { connectionSettings, connectionStatus, settingsStatus, createConnectionStore, getActiveTenantId, registerTranslations, createSafeDataProvider, getSupabaseClientOptional, useTranslation, useDataChanged, resolveDataProvider } from '@fayz-ai/core';
3
3
  import { createPluginContext, fayzConnectorOAuth, PluginSettingsPanel, useModuleNavigation, createViewRouter, ModuleActionBar, SettingsGroup, SelectRow, ToggleRow, PermissionGate, useLimitGuard, useOrganizationStore, CrudFormPage, invalidateLimit, CrudListView } from '@fayz-ai/admin';
4
- import { defineKpiWidget, defineCustomWidget, defineTableWidget, ModulePage, DataTable, SubpageHeader, Button, Skeleton, ConfirmDialog, ContentSplit, ContentSplitTrigger, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, MarkdownEditor, DashboardCanvas, SegmentedControl, cn, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter, Badge, SelectSeparator, Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetBody, SheetFooter, Checkbox, toast, KpiCard as KpiCard$1, Card, CardHeader, CardTitle, CardContent, TableWidget } from '@fayz-ai/ui';
4
+ import { defineKpiWidget, defineCustomWidget, defineTableWidget, ModulePage, PageToolbar, DataTable, SubpageHeader, PageHeaderActions, Button, Skeleton, ConfirmDialog, ContentSplit, ContentSplitTrigger, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, MarkdownEditor, DashboardCanvas, RangeControl, cn, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter, SegmentedControl, Badge, SelectSeparator, Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetBody, SheetFooter, Checkbox, toast, KpiCard as KpiCard$1, Card, CardHeader, CardTitle, CardContent, TableWidget } from '@fayz-ai/ui';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
6
  import { History, CheckCircle2, AlertCircle, ChevronRight, Users, Target, Percent, DollarSign, Trash2, Plus, ExternalLink, Sparkles, Pencil, Layers, MousePointerClick, NotebookPen, ArrowUpRight, ArrowDownRight, Settings2, Columns3, CalendarDays, List, ChevronLeft, Loader2, ImagePlus, X, Bike, Utensils, DoorOpen, MessageCircle, Instagram, Mail, Globe, Megaphone, Search, Link2, AtSign, Pin, Twitter, Linkedin, Facebook, Youtube, Music2, Repeat2, Heart, BarChart2, Share2, ThumbsUp, Send, MoreHorizontal, Bookmark, GripVertical, Image, Trophy } from 'lucide-react';
7
7
  import { createStore } from 'zustand/vanilla';
@@ -128,12 +128,11 @@ function RangeTabs() {
128
128
  const range = useMarketingStore((s) => s.range);
129
129
  const setRange = useMarketingStore((s) => s.setRange);
130
130
  return /* @__PURE__ */ jsx(
131
- SegmentedControl,
131
+ RangeControl,
132
132
  {
133
- options: RANGES,
133
+ options: RANGES.map((r) => ({ value: r, label: r })),
134
134
  value: range,
135
- onChange: (r) => void setRange(r),
136
- "aria-label": "Time range"
135
+ onChange: (r) => void setRange(r)
137
136
  }
138
137
  );
139
138
  }
@@ -192,10 +191,7 @@ function ChannelsView({ onOpen }) {
192
191
  { id: "open", header: "", enableSorting: false, cell: () => /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4 text-muted-foreground" }) }
193
192
  ], [t, conversion.labelPlural, conversion.valueLabel, currency]);
194
193
  return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl space-y-4", children: [
195
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
196
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("marketing.channels.subtitle") }),
197
- /* @__PURE__ */ jsx(RangeTabs, {})
198
- ] }),
194
+ /* @__PURE__ */ jsx(PageToolbar, { range: /* @__PURE__ */ jsx(RangeTabs, {}) }),
199
195
  /* @__PURE__ */ jsx(
200
196
  DataTable,
201
197
  {
@@ -355,17 +351,12 @@ function CampaignsView() {
355
351
  }
356
352
  ], [t, conversion.labelPlural, currency, deleteCampaign]);
357
353
  return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl space-y-4", children: [
358
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
359
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("marketing.campaigns.subtitle") }),
360
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
361
- /* @__PURE__ */ jsx(RangeTabs, {}),
362
- /* @__PURE__ */ jsx(PermissionGate, { feature: "marketing", action: "create", children: /* @__PURE__ */ jsxs(Button, { onClick: () => setComposerOpen(true), children: [
363
- /* @__PURE__ */ jsx(Plus, { className: "mr-1.5 h-4 w-4" }),
364
- " ",
365
- t("marketing.campaigns.new")
366
- ] }) })
367
- ] })
368
- ] }),
354
+ /* @__PURE__ */ jsx(PageHeaderActions, { children: /* @__PURE__ */ jsx(PermissionGate, { feature: "marketing", action: "create", children: /* @__PURE__ */ jsxs(Button, { onClick: () => setComposerOpen(true), children: [
355
+ /* @__PURE__ */ jsx(Plus, { className: "mr-1.5 h-4 w-4" }),
356
+ " ",
357
+ t("marketing.campaigns.new")
358
+ ] }) }) }),
359
+ /* @__PURE__ */ jsx(PageToolbar, { range: /* @__PURE__ */ jsx(RangeTabs, {}) }),
369
360
  /* @__PURE__ */ jsx(DataTable, { columns, data: campaigns, emptyMessage: t("marketing.campaigns.empty") }),
370
361
  /* @__PURE__ */ jsx(CampaignComposer, { open: composerOpen, onClose: () => setComposerOpen(false) })
371
362
  ] });
@@ -376,14 +367,7 @@ function FunnelView() {
376
367
  const funnel = useMarketingStore((s) => s.funnel);
377
368
  const max = Math.max(...funnel.map((s) => s.count), 1);
378
369
  return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-4xl space-y-4", children: [
379
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
380
- /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
381
- t("marketing.funnel.subtitlePrefix"),
382
- " ",
383
- conversion.label.toLowerCase()
384
- ] }),
385
- /* @__PURE__ */ jsx(RangeTabs, {})
386
- ] }),
370
+ /* @__PURE__ */ jsx(PageToolbar, { range: /* @__PURE__ */ jsx(RangeTabs, {}) }),
387
371
  /* @__PURE__ */ jsxs("div", { className: "rounded-card border border-border bg-card p-5", children: [
388
372
  /* @__PURE__ */ jsx("div", { className: "space-y-3", children: funnel.map((stage, i) => {
389
373
  const pct = max > 0 ? Math.max(stage.count / max * 100, 4) : 0;
@@ -710,14 +694,12 @@ function LandingPagesView() {
710
694
  }
711
695
  ], [t, deleteLandingPage]);
712
696
  return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl space-y-4", children: [
713
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2", children: [
714
- /* @__PURE__ */ jsx(RangeTabs, {}),
715
- /* @__PURE__ */ jsx(PermissionGate, { feature: "marketing", action: "create", children: /* @__PURE__ */ jsxs(Button, { onClick: openNew, children: [
716
- /* @__PURE__ */ jsx(Plus, { className: "mr-1.5 h-4 w-4" }),
717
- " ",
718
- t("marketing.landing.new")
719
- ] }) })
720
- ] }),
697
+ /* @__PURE__ */ jsx(PageHeaderActions, { children: /* @__PURE__ */ jsx(PermissionGate, { feature: "marketing", action: "create", children: /* @__PURE__ */ jsxs(Button, { onClick: openNew, children: [
698
+ /* @__PURE__ */ jsx(Plus, { className: "mr-1.5 h-4 w-4" }),
699
+ " ",
700
+ t("marketing.landing.new")
701
+ ] }) }) }),
702
+ /* @__PURE__ */ jsx(PageToolbar, { range: /* @__PURE__ */ jsx(RangeTabs, {}) }),
721
703
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-4", children: [
722
704
  /* @__PURE__ */ jsx(KpiCard, { icon: Layers, label: t("marketing.metric.pages"), value: String(pages.length) }),
723
705
  /* @__PURE__ */ jsx(