rahman-resources 0.9.2 → 0.12.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/lib/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 2,
3
- "generatedAt": "2026-05-11T06:12:19.160Z",
3
+ "generatedAt": "2026-05-15T03:23:22.231Z",
4
4
  "repo": "rahmanef63/resource-site",
5
5
  "branch": "main",
6
6
  "layouts": [
@@ -804,177 +804,7 @@
804
804
  "primaryFile": "app/preview/riset-kit/public/page.tsx"
805
805
  }
806
806
  ],
807
- "recipes": [
808
- {
809
- "slug": "block-editor",
810
- "title": "Notion-Style Block Editor",
811
- "description": "21-block contenteditable editor with slash command menu, markdown shortcuts, drag handles. Real-time via Convex.",
812
- "source": "notion-page-clone",
813
- "files": [
814
- "frontend/slices/notion/slices/editor/BlockEditor.tsx",
815
- "frontend/slices/notion/slices/editor/SlashMenu.tsx",
816
- "frontend/slices/notion/slices/editor/blockSpecs.ts"
817
- ],
818
- "exampleCode": "import { BlockEditor } from \"@/frontend/slices/notion/slices/editor/BlockEditor\";\n\n<BlockEditor pageId={pageId} />",
819
- "agentRecipe": "Already copied at frontend/slices/notion/slices/editor/. See PORT-NOTION.md for Vite→Next port checklist (routing rewrite, use-client markers, Convex API surface rename).",
820
- "tags": [
821
- "editor",
822
- "notion",
823
- "blocks",
824
- "real-time"
825
- ]
826
- },
827
- {
828
- "slug": "page-tree-sidebar",
829
- "title": "Page Tree Sidebar",
830
- "description": "Hierarchical workspace sidebar with @dnd-kit drag-drop reordering, favorites, recents.",
831
- "source": "notion-page-clone",
832
- "files": [
833
- "frontend/slices/notion/slices/workspace-sidebar/components/WorkspaceSidebar.tsx",
834
- "frontend/slices/notion/slices/workspace-sidebar/components/SortablePageRow.tsx"
835
- ],
836
- "exampleCode": "import { WorkspaceSidebar } from \"@/frontend/slices/notion/slices/workspace-sidebar/components/WorkspaceSidebar\";\n\n<WorkspaceSidebar />",
837
- "agentRecipe": "Mount WorkspaceSidebar inside the left slot of <ThreeColumnLayout>. State backed by Zustand store at frontend/slices/notion/shared/lib/store.tsx.",
838
- "tags": [
839
- "sidebar",
840
- "tree",
841
- "dnd-kit",
842
- "navigation"
843
- ]
844
- },
845
- {
846
- "slug": "multi-block-selection",
847
- "title": "Multi-Block Selection",
848
- "description": "Marquee + click+shift selection of editor blocks with floating toolbar. Bulk actions: delete, duplicate, convert.",
849
- "source": "notion-page-clone",
850
- "files": [
851
- "frontend/slices/notion/slices/block-selection/components/BlockSelectionProvider.tsx",
852
- "frontend/slices/notion/slices/block-selection/components/MarqueeOverlay.tsx"
853
- ],
854
- "exampleCode": "import { BlockSelectionProvider } from \"@/frontend/slices/notion/slices/block-selection/components/BlockSelectionProvider\";\n\n<BlockSelectionProvider>\n <BlockEditor />\n</BlockSelectionProvider>",
855
- "agentRecipe": "Wrap BlockEditor with BlockSelectionProvider. The marquee overlay attaches to document; toolbar floats above the selection bounding box.",
856
- "tags": [
857
- "selection",
858
- "editor",
859
- "bulk",
860
- "marquee"
861
- ]
862
- },
863
- {
864
- "slug": "database-views",
865
- "title": "Database Views (11 types)",
866
- "description": "Properties+rows database with 11 view types: table, board, calendar, timeline, chart, gallery, map. Per-view filter/sort/group.",
867
- "source": "notion-page-clone",
868
- "files": [
869
- "frontend/slices/notion/slices/databases/DatabaseBlock.tsx",
870
- "frontend/slices/notion/slices/databases/views/TableView.tsx",
871
- "frontend/slices/notion/slices/databases/views/BoardView.tsx"
872
- ],
873
- "exampleCode": "import { DatabaseBlock } from \"@/frontend/slices/notion/slices/databases/DatabaseBlock\";\n\n<DatabaseBlock databaseId={dbId} />",
874
- "agentRecipe": "DatabaseBlock auto-routes to the active view component. Add custom property types by extending PropertyCell.tsx.",
875
- "tags": [
876
- "database",
877
- "views",
878
- "table",
879
- "kanban",
880
- "calendar"
881
- ]
882
- },
883
- {
884
- "slug": "command-palette",
885
- "title": "Command Palette (⌘K)",
886
- "description": "Cmd+K modal: feature navigation, workspace switching, theme, sign-out, custom commands. Auto-builds from feature registry.",
887
- "source": "kitab-core + notion-page-clone",
888
- "files": [
889
- "frontend/shared/foundation/utils/system/command-menu/components.tsx"
890
- ],
891
- "exampleCode": "import { CommandMenu } from \"@/frontend/shared/foundation/utils/system/command-menu/components\";\n\n<CommandMenu actions={customActions} />",
892
- "agentRecipe": "Mount CommandMenu once at the app shell level. It listens for Cmd+K globally. Pass extra commands via the actions prop or register via the command-registry.",
893
- "tags": [
894
- "palette",
895
- "cmd-k",
896
- "navigation"
897
- ]
898
- },
899
- {
900
- "slug": "comments-threaded",
901
- "title": "Threaded Comments",
902
- "description": "Page + block-level threaded comments with resolved state. Real-time via Convex.",
903
- "source": "notion-page-clone",
904
- "files": [
905
- "frontend/slices/notion/slices/comments/components/BlockCommentsPopover.tsx",
906
- "frontend/slices/notion/slices/comments/hooks/useComments.ts"
907
- ],
908
- "exampleCode": "import { BlockCommentsPopover } from \"@/frontend/slices/notion/slices/comments/components/BlockCommentsPopover\";\n\n<BlockCommentsPopover blockId={blockId} pageId={pageId} />",
909
- "agentRecipe": "Anchor comments by passing pageId (always) and optional blockId. Use useComments(blockId) hook for the reactive list.",
910
- "tags": [
911
- "comments",
912
- "real-time",
913
- "threading"
914
- ]
915
- },
916
- {
917
- "slug": "theme-preset-switcher",
918
- "title": "Theme Preset Switcher",
919
- "description": "Runtime theme swap (colors + fonts + shadows + tracking). OKLch CSS vars per preset. Persists to localStorage + Convex.",
920
- "source": "rahmanef.com",
921
- "files": [
922
- "frontend/shared/theme/theme-presets.ts",
923
- "frontend/shared/ui/components/theme-preset-switcher.tsx"
924
- ],
925
- "exampleCode": "import { ThemePresetSwitcher } from \"@/frontend/shared/ui/components/theme-preset-switcher\";\n\n<ThemePresetSwitcher />",
926
- "agentRecipe": "Add a new preset by appending a CSS block in app/globals.css with [data-theme=\"<name>\"], then register in preset-groups.ts.",
927
- "tags": [
928
- "theme",
929
- "presets",
930
- "oklch",
931
- "design-system"
932
- ]
933
- },
934
- {
935
- "slug": "icon-picker",
936
- "title": "Notion-Style Icon Picker",
937
- "description": "Emoji + lucide icon picker with search, 10-color Notion palette, Twemoji/native toggle. One string stores emoji OR lucide:Name OR with ?c=hex tint — backwards-compat with raw-emoji fields.",
938
- "source": "notion-page-clone",
939
- "files": [
940
- "frontend/slices/notion/slices/icon-picker/components/IconPicker.tsx",
941
- "frontend/slices/notion/slices/icon-picker/components/DynamicIcon.tsx",
942
- "frontend/slices/notion/slices/icon-picker/lib/parse.ts",
943
- "frontend/slices/notion/slices/icon-picker/lib/colors.ts",
944
- "frontend/slices/notion/slices/icon-picker/lib/emoji-catalog.ts",
945
- "frontend/slices/notion/slices/icon-picker/lib/lucide-catalog.ts",
946
- "frontend/slices/notion/slices/icon-picker/lib/twemoji.ts",
947
- "frontend/slices/notion/slices/icon-picker/lib/style-pref.ts"
948
- ],
949
- "exampleCode": "import { IconPickerPopover, DynamicIcon } from \"@/frontend/slices/notion/slices/icon-picker\";\n\n<IconPickerPopover value={page.icon} onChange={(v) => updateIcon(v)} onClear={() => updateIcon(\"\")} />\n<DynamicIcon value={page.icon} className=\"text-2xl\" />",
950
- "agentRecipe": "Single icon field stores emoji or 'lucide:Name' plus optional '?c=hex'. parseIconValue() decodes; lucideValue()/withColor() build. Add 'icon: v.string()' to Convex table — no migration needed for existing emoji fields. Popover variant for inline UI, Inline for sheets/dialogs.",
951
- "tags": [
952
- "icon",
953
- "emoji",
954
- "lucide",
955
- "picker",
956
- "twemoji",
957
- "notion"
958
- ]
959
- },
960
- {
961
- "slug": "contact-form-resend",
962
- "title": "Contact Form + Resend",
963
- "description": "Contact form posting to Resend email API. Server Action + Zod input validation.",
964
- "source": "cescadesigns",
965
- "files": [
966
- "recipes/contact-form-resend/src/page.tsx"
967
- ],
968
- "exampleCode": "// app/api/contact/route.ts\nimport { Resend } from \"resend\";\nconst resend = new Resend(process.env.RESEND_API_KEY!);\n\nexport async function POST(req: Request) {\n const data = await req.formData();\n await resend.emails.send({\n from: \"form@yourdomain.com\",\n to: \"you@yourdomain.com\",\n subject: `From ${data.get(\"name\")}`,\n html: `<p>${data.get(\"message\")}</p>`,\n });\n return Response.json({ ok: true });\n}",
969
- "agentRecipe": "Wire ContactForm.tsx (form action /api/contact) to the route handler. Always validate inputs with Zod server-side.",
970
- "tags": [
971
- "form",
972
- "email",
973
- "resend",
974
- "server-action"
975
- ]
976
- }
977
- ],
807
+ "recipes": [],
978
808
  "features": [
979
809
  {
980
810
  "slug": "convex-auth",
@@ -998,6 +828,27 @@
998
828
  "no-clerk"
999
829
  ]
1000
830
  },
831
+ {
832
+ "slug": "doku-payment",
833
+ "title": "DOKU — Indonesia Payment",
834
+ "category": "payment",
835
+ "description": "Pembayaran lokal Indonesia via DOKU — Checkout (hosted) + Direct (VA / QRIS / e-Wallet / PayLater / Minimarket / Kartu). HMAC-signed REST + signature-verified webhook + idempotent retries. Sibling slice to midtrans-payment dengan paymentOrders schema yang dishare.",
836
+ "source": "rahmanef63/resource-site",
837
+ "docsUrl": "https://sandbox.doku.com/integration",
838
+ "install": "",
839
+ "npmPackages": [],
840
+ "exampleCode": "",
841
+ "agentRecipe": "DOKU dual-mode: Checkout (hosted, all channels) atau Direct (single channel, returns VA/QRIS/deeplink). Webhook di /webhooks/doku verify HMAC-SHA256 (canonical: Client-Id + Request-Id + Request-Timestamp + Request-Target + Digest). Idempotency by request_id index. Server-only — no NEXT_PUBLIC_*. Sandbox default (api-sandbox.doku.com); flip DOKU_IS_PRODUCTION=true for live.",
842
+ "tags": [
843
+ "payment",
844
+ "doku",
845
+ "indonesia",
846
+ "qris",
847
+ "virtual-account",
848
+ "ewallet",
849
+ "checkout"
850
+ ]
851
+ },
1001
852
  {
1002
853
  "slug": "midtrans-payment",
1003
854
  "title": "Midtrans — Indonesia Payment",
@@ -1125,6 +976,107 @@
1125
976
  "bookings"
1126
977
  ]
1127
978
  },
979
+ {
980
+ "slug": "full-width-toggle",
981
+ "title": "Full Width Toggle",
982
+ "category": "ui",
983
+ "description": "Page-container width toggle (contained / wide / full). Per-device localStorage + cross-tab sync. Ships useFullWidth hook + FullWidthToggle button (icon/button/segment variants) + WidthContainer wrapper. Zero backend, zero env.",
984
+ "source": "rahmanef63/resource-site",
985
+ "docsUrl": "",
986
+ "install": "",
987
+ "npmPackages": [],
988
+ "exampleCode": "",
989
+ "agentRecipe": "Drop <WidthContainer> around page content, <FullWidthToggle variant='icon' /> in topbar. Variant 'segment' best for settings page. Hook useFullWidth() returns [mode, setMode, cycle]. SSR-safe — defaults to 'contained' until hydrate.",
990
+ "tags": [
991
+ "ui",
992
+ "layout",
993
+ "preference",
994
+ "localstorage",
995
+ "dashboard"
996
+ ]
997
+ },
998
+ {
999
+ "slug": "command-menu",
1000
+ "title": "Command Menu (⌘K)",
1001
+ "category": "ui",
1002
+ "description": "Global ⌘K command palette. Auto-builds entries from your feature registry (defineFeature) + custom actions. Fuzzy search via cmdk. Mount once at app shell; listens globally. Facade slice — pulls from template-base/frontend/slices/command-menu which re-exports shared/foundation/utils/system/command-menu.",
1003
+ "source": "superspace + kitab-core",
1004
+ "docsUrl": "https://cmdk.paco.me",
1005
+ "install": "npm i cmdk",
1006
+ "npmPackages": [
1007
+ "cmdk"
1008
+ ],
1009
+ "exampleCode": "",
1010
+ "agentRecipe": "Mount <CommandMenu actions={...} /> once at the dashboard shell level. Listens for Cmd+K globally. Actions auto-build from feature registry + workspace + theme/sign-out. Add custom commands via actions prop or by registering in command-registry.ts.",
1011
+ "tags": [
1012
+ "ui",
1013
+ "palette",
1014
+ "cmd-k",
1015
+ "navigation",
1016
+ "keyboard"
1017
+ ]
1018
+ },
1019
+ {
1020
+ "slug": "motion-primitives",
1021
+ "title": "Motion Primitives (8)",
1022
+ "category": "ui",
1023
+ "description": "Eight ready-to-style motion components: marquee, kinetic-heading, magnetic, cursor-spotlight, stat-counter, reading-progress, grain, lightbox. Framer-Motion-powered, tree-shakeable. Facade slice — pulls from template-base/frontend/slices/motion-primitives.",
1024
+ "source": "rahmanef.com",
1025
+ "docsUrl": "",
1026
+ "install": "npm i framer-motion",
1027
+ "npmPackages": [
1028
+ "framer-motion"
1029
+ ],
1030
+ "exampleCode": "",
1031
+ "agentRecipe": "Each primitive is independently importable from @/features/motion-primitives. Use marquee for logo strips, kinetic-heading for hero text, magnetic for CTA buttons, cursor-spotlight for hover-reveal panels, stat-counter for animated numbers, reading-progress for blog top bar, grain for film texture, lightbox for image gallery.",
1032
+ "tags": [
1033
+ "ui",
1034
+ "motion",
1035
+ "animation",
1036
+ "marquee",
1037
+ "framer-motion"
1038
+ ]
1039
+ },
1040
+ {
1041
+ "slug": "responsive-dialog",
1042
+ "title": "Responsive Dialog (Sheet ↔ Modal)",
1043
+ "category": "ui",
1044
+ "description": "ResponsiveDialog — auto-switches between bottom Sheet (mobile) and centered Dialog (desktop) at the md breakpoint. Same API as shadcn Dialog. Kitab forbids raw <dialog>; use this everywhere. Facade slice — pulls from template-base/frontend/slices/responsive-dialog.",
1045
+ "source": "superspace",
1046
+ "docsUrl": "",
1047
+ "install": "",
1048
+ "npmPackages": [],
1049
+ "exampleCode": "",
1050
+ "agentRecipe": "Drop-in for shadcn Dialog. Use <ResponsiveDialog><ResponsiveDialogTrigger>…</ResponsiveDialogTrigger><ResponsiveDialogContent>…</ResponsiveDialogContent></ResponsiveDialog>. On mobile renders as Sheet sliding from bottom; on desktop as centered Dialog. Threshold via useMediaQuery('(min-width: 768px)').",
1051
+ "tags": [
1052
+ "ui",
1053
+ "dialog",
1054
+ "modal",
1055
+ "sheet",
1056
+ "responsive",
1057
+ "primitive"
1058
+ ]
1059
+ },
1060
+ {
1061
+ "slug": "dashboard-shell",
1062
+ "title": "Dashboard Shell — Responsive",
1063
+ "category": "ui",
1064
+ "description": "ResponsiveDashboardShell — desktop sidebar + topbar, mobile dock + sheet sidebar, breakpoint-aware. Ports superspace's layout/dashboard/{Desktop,Mobile,Responsive}DashboardShell + sidebar primary/secondary slots. Facade slice — pulls from template-base/frontend/slices/dashboard-shell.",
1065
+ "source": "superspace",
1066
+ "docsUrl": "",
1067
+ "install": "",
1068
+ "npmPackages": [],
1069
+ "exampleCode": "",
1070
+ "agentRecipe": "Wraps app/(admin) routes. <ResponsiveDashboardShell sidebar={<AppSidebar />} topbar={<TopBar />}>{children}</ResponsiveDashboardShell>. Mobile: sidebar collapses to <Sheet>. Desktop: persistent sidebar + topbar. Embed FullWidthToggle in topbar for instant container resize.",
1071
+ "tags": [
1072
+ "ui",
1073
+ "layout",
1074
+ "dashboard",
1075
+ "sidebar",
1076
+ "topbar",
1077
+ "responsive"
1078
+ ]
1079
+ },
1128
1080
  {
1129
1081
  "slug": "broadcast-channel-sync",
1130
1082
  "title": "BroadcastChannel — Cross-tab Sync",
@@ -1142,6 +1094,185 @@
1142
1094
  "broadcast-channel",
1143
1095
  "demo-pattern"
1144
1096
  ]
1097
+ },
1098
+ {
1099
+ "slug": "rbac-roles",
1100
+ "title": "RBAC — Tiered System Roles",
1101
+ "category": "auth",
1102
+ "description": "Workspace-scoped RBAC with 6 system roles (owner/admin/manager/staff/client/guest) and three tier presets — solo, influencer, organization. Env-based platform admin bypass via PLATFORM_ADMIN_EMAILS. checkPermission / requirePermission helpers, role seeding mutation, @convex-dev/auth aware (no Clerk).",
1103
+ "source": "superspace",
1104
+ "install": "npx rahman-resources add rbac-roles",
1105
+ "npmPackages": [],
1106
+ "exampleCode": "",
1107
+ "agentRecipe": "Three tier presets pick which system roles to seed: solo (owner+admin), influencer (+manager), organization (6 roles). Platform admin via env PLATFORM_ADMIN_EMAILS bypasses all checks. Resolution: platform admin → workspace owner → membership.additionalPermissions → role.permissions.",
1108
+ "tags": [
1109
+ "rbac",
1110
+ "auth",
1111
+ "permissions",
1112
+ "roles",
1113
+ "workspaces"
1114
+ ]
1115
+ },
1116
+ {
1117
+ "slug": "admin-panel",
1118
+ "title": "Admin Panel — Unified Product Admin",
1119
+ "category": "infra",
1120
+ "description": "17-section admin surface (events, funnels, attribution, users, A/B, flags, pricing, CMS, email, audit, ...) gated by RBAC. Auto-filters sidebar by tier (solo/influencer/organization) and user permissions. Single backend resolver (getMyAdminAccess) mirrors frontend gate so UI can never leak.",
1121
+ "source": "superspace + spec",
1122
+ "install": "npx rahman-resources add admin-panel",
1123
+ "npmPackages": [],
1124
+ "exampleCode": "",
1125
+ "agentRecipe": "Wrap pages with <AdminPage workspaceId tier>. AccessGate hides UI for non-admins, AdminShell renders 2-col layout with sidebar filtered by tier+perms. ADMIN_SECTIONS in config.ts is SSOT (17 entries). Personal-brand-os = tier 'solo' = owner sees everything.",
1126
+ "tags": [
1127
+ "admin",
1128
+ "owner",
1129
+ "platform",
1130
+ "rbac",
1131
+ "instrumentation",
1132
+ "panel"
1133
+ ]
1134
+ },
1135
+ {
1136
+ "slug": "event-tracking",
1137
+ "title": "Event Tracking — P0 Instrumentation",
1138
+ "category": "data",
1139
+ "description": "Client SDK + Convex ingestion endpoint for structured product events. Auto-captures page_view/signup/login + UTM/referrer/first-touch attribution. Batched flush via requestIdleCallback. Targets <100ms p99 ingestion.",
1140
+ "source": "spec + superspace analytics",
1141
+ "install": "npx rahman-resources add event-tracking",
1142
+ "npmPackages": [],
1143
+ "exampleCode": "",
1144
+ "agentRecipe": "Writes to analyticsEvents table (no new schema). Anonymous page_view allowed pre-signup; other events require workspaceId. Session id per tab (sessionStorage), first-touch UTM in localStorage. Flush every ~500ms via requestIdleCallback. Cap retry queue at 500.",
1145
+ "tags": [
1146
+ "events",
1147
+ "analytics",
1148
+ "instrumentation",
1149
+ "attribution",
1150
+ "utm",
1151
+ "p0"
1152
+ ]
1153
+ },
1154
+ {
1155
+ "slug": "theme-preset-switcher",
1156
+ "title": "Theme Preset Switcher",
1157
+ "category": "ui",
1158
+ "description": "Runtime theme swap (colors + fonts + shadows + tracking). OKLch CSS vars per preset. Persists to localStorage + Convex. Add a new preset by appending a CSS block in app/globals.css with [data-theme=\"<name>\"], then register in preset-groups.ts.",
1159
+ "source": "rahmanef.com",
1160
+ "install": "npx rahman-resources add theme-preset-switcher",
1161
+ "npmPackages": [],
1162
+ "exampleCode": "",
1163
+ "agentRecipe": "Import ThemePresetSwitcher from @/frontend/shared/ui/components/theme-preset-switcher and mount in the topbar. Presets live in theme-presets.ts; preset-groups.ts groups them for the picker UI.",
1164
+ "tags": [
1165
+ "theme",
1166
+ "presets",
1167
+ "oklch",
1168
+ "design-system"
1169
+ ]
1170
+ },
1171
+ {
1172
+ "slug": "icon-picker",
1173
+ "title": "Notion-Style Icon Picker",
1174
+ "category": "ui",
1175
+ "description": "Emoji + lucide icon picker with search, 10-color Notion palette, Twemoji/native toggle. One string stores emoji OR lucide:Name OR with ?c=hex tint — backwards-compat with raw-emoji fields. Single icon field stores emoji or 'lucide:Name' plus optional '?c=hex'.",
1176
+ "source": "notion-page-clone",
1177
+ "install": "npx rahman-resources add icon-picker",
1178
+ "npmPackages": [],
1179
+ "exampleCode": "",
1180
+ "agentRecipe": "parseIconValue() decodes; lucideValue()/withColor() build. Add 'icon: v.string()' to Convex table — no migration needed for existing emoji fields. Popover variant for inline UI, Inline for sheets/dialogs.",
1181
+ "tags": [
1182
+ "icon",
1183
+ "emoji",
1184
+ "lucide",
1185
+ "picker",
1186
+ "twemoji",
1187
+ "notion"
1188
+ ]
1189
+ },
1190
+ {
1191
+ "slug": "contact-form-resend",
1192
+ "title": "Contact Form + Resend",
1193
+ "category": "email",
1194
+ "description": "Contact form posting to Resend email API. Server Action + Zod input validation. Convex mutation for storage + Resend send.",
1195
+ "source": "cescadesigns",
1196
+ "install": "npx rahman-resources add contact-form-resend",
1197
+ "npmPackages": [],
1198
+ "exampleCode": "",
1199
+ "agentRecipe": "Wire contactMessages.send mutation in convex/. Server emails via Resend from form@yourdomain.com. Always validate inputs with Zod or v.* server-side. Anonymous allowed.",
1200
+ "tags": [
1201
+ "form",
1202
+ "email",
1203
+ "resend",
1204
+ "convex"
1205
+ ]
1206
+ },
1207
+ {
1208
+ "slug": "admin",
1209
+ "title": "Admin — Generic Shell",
1210
+ "category": "infra",
1211
+ "description": "Landing page scaffold + Convex admin probe (isAdmin / counts). Consumer composes feature panels into the grid. Gated by requireAdmin on Convex side; superadmin email gate via SUPER_ADMIN_EMAIL env.",
1212
+ "source": "rahmanef63/resource-site",
1213
+ "install": "npx rahman-resources add admin",
1214
+ "npmPackages": [],
1215
+ "exampleCode": "",
1216
+ "agentRecipe": "Run `rr add admin`. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address.",
1217
+ "tags": [
1218
+ "infra",
1219
+ "admin",
1220
+ "shell",
1221
+ "crud"
1222
+ ]
1223
+ },
1224
+ {
1225
+ "slug": "audit-log",
1226
+ "title": "Audit Log — Workspace Events",
1227
+ "category": "infra",
1228
+ "description": "Workspace-scoped audit event recorder. Canonical logAuditEvent helper for mutations + actions; supports entity tracking, before/after diff, IP/user-agent capture.",
1229
+ "source": "rahmanef63/resource-site",
1230
+ "install": "npx rahman-resources add audit-log",
1231
+ "npmPackages": [],
1232
+ "exampleCode": "",
1233
+ "agentRecipe": "Run `rr add audit-log`. Import logAuditEvent from convex/_shared/auditLogger.ts and call inside every workspace-scoped mutation with { action, workspaceId, entityType, entityId, before?, after? }.",
1234
+ "tags": [
1235
+ "infra",
1236
+ "audit",
1237
+ "compliance",
1238
+ "logging"
1239
+ ]
1240
+ },
1241
+ {
1242
+ "slug": "comments",
1243
+ "title": "Comments — Threaded",
1244
+ "category": "content",
1245
+ "description": "Workspace-scoped threaded comments anchored to pages or blocks. Soft-delete + resolve semantics. useComments(opts) hook returns items + openCount + CRUD mutations.",
1246
+ "source": "rahmanef63/resource-site",
1247
+ "install": "npx rahman-resources add comments",
1248
+ "npmPackages": [],
1249
+ "exampleCode": "",
1250
+ "agentRecipe": "Run `rr add comments`. Use useComments({ pageId } | { blockId }) — returns items, openCount, addComment, editComment, resolveComment, deleteComment. resolvedAt!=null = thread closed but visible.",
1251
+ "tags": [
1252
+ "content",
1253
+ "social",
1254
+ "comments",
1255
+ "threaded",
1256
+ "annotations"
1257
+ ]
1258
+ },
1259
+ {
1260
+ "slug": "seo",
1261
+ "title": "SEO — AI Metadata Generator",
1262
+ "category": "content",
1263
+ "description": "Service slice for SEO metadata generation — Anthropic-backed action with per-user 24h cost guard. No public route. Backend exposes generate + generateAndApply mutations gated by requireAdmin.",
1264
+ "source": "rahmanef63/resource-site",
1265
+ "install": "npx rahman-resources add seo",
1266
+ "npmPackages": [],
1267
+ "exampleCode": "",
1268
+ "agentRecipe": "Run `rr add seo`. Call seo.generate from server actions or admin mutations. Cost guard rate-limits per-user within 24h via callsInWindow query.",
1269
+ "tags": [
1270
+ "content",
1271
+ "seo",
1272
+ "ai",
1273
+ "anthropic",
1274
+ "metadata-generator"
1275
+ ]
1145
1276
  }
1146
1277
  ],
1147
1278
  "slices": [
@@ -1149,6 +1280,7 @@
1149
1280
  "slug": "convex-auth",
1150
1281
  "title": "Convex Auth — Email Magic Link",
1151
1282
  "category": "auth",
1283
+ "kind": "backend",
1152
1284
  "version": "0.1.0",
1153
1285
  "description": "@convex-dev/auth with email magic link via Resend. Self-hosted Convex friendly. Hard mandate per kitab CLAUDE.md (no Clerk).",
1154
1286
  "source": "rahmanef63/resource-site",
@@ -1198,39 +1330,45 @@
1198
1330
  "agentRecipe": "Run `rr add convex-auth`. Then create convex/auth.ts using the kitab pattern (Resend provider). Set env via `npx convex env set` for self-hosted."
1199
1331
  },
1200
1332
  {
1201
- "slug": "midtrans-payment",
1202
- "title": "Midtrans — Indonesia Payment",
1333
+ "slug": "doku-payment",
1334
+ "title": "DOKU — Indonesia Payment",
1203
1335
  "category": "payment",
1336
+ "kind": "full",
1204
1337
  "version": "0.1.0",
1205
- "description": "Pembayaran lokal Indonesia via Midtrans Snap (BCA, Mandiri, BRI, e-wallet GoPay/OVO/Dana, QRIS). Webhook untuk konfirmasi. Provider-isolated under components/providers/midtrans + actions/midtrans so Doku/Stripe land as siblings.",
1338
+ "description": "Pembayaran lokal Indonesia via DOKU Checkout (hosted) + Direct (VA / QRIS / e-Wallet / PayLater / Minimarket / Kartu). HMAC-signed REST + signature-verified webhook + idempotent retries. Sibling slice to midtrans-payment dengan paymentOrders schema yang dishare.",
1206
1339
  "source": "rahmanef63/resource-site",
1207
- "slicePath": "frontend/slices/midtrans-payment",
1340
+ "slicePath": "frontend/slices/doku-payment",
1208
1341
  "convexPaths": [
1209
1342
  "convex/features/payment"
1210
1343
  ],
1211
- "npm": [
1212
- "midtrans-client@^1.4.2"
1213
- ],
1344
+ "npm": [],
1214
1345
  "shadcn": [
1215
1346
  "card",
1216
1347
  "button",
1217
1348
  "dialog",
1218
1349
  "input",
1219
- "label"
1350
+ "label",
1351
+ "select",
1352
+ "badge",
1353
+ "skeleton"
1220
1354
  ],
1221
1355
  "env": [
1222
1356
  {
1223
- "name": "MIDTRANS_SERVER_KEY",
1357
+ "name": "DOKU_CLIENT_ID",
1224
1358
  "scope": "convex",
1225
1359
  "required": true
1226
1360
  },
1227
1361
  {
1228
- "name": "MIDTRANS_CLIENT_KEY",
1229
- "scope": "next-public",
1362
+ "name": "DOKU_SECRET_KEY",
1363
+ "scope": "convex",
1230
1364
  "required": true
1231
1365
  },
1232
1366
  {
1233
- "name": "MIDTRANS_IS_PRODUCTION",
1367
+ "name": "DOKU_IS_PRODUCTION",
1368
+ "scope": "convex"
1369
+ },
1370
+ {
1371
+ "name": "DOKU_NOTIFY_PATH",
1234
1372
  "scope": "convex"
1235
1373
  }
1236
1374
  ],
@@ -1242,7 +1380,66 @@
1242
1380
  }
1243
1381
  ],
1244
1382
  "providers": [
1245
- "midtrans"
1383
+ "doku"
1384
+ ],
1385
+ "tags": [
1386
+ "payment",
1387
+ "doku",
1388
+ "indonesia",
1389
+ "qris",
1390
+ "virtual-account",
1391
+ "ewallet",
1392
+ "checkout"
1393
+ ],
1394
+ "agentRecipe": "DOKU dual-mode: Checkout (hosted, all channels) atau Direct (single channel, returns VA/QRIS/deeplink). Webhook di /webhooks/doku verify HMAC-SHA256 (canonical: Client-Id + Request-Id + Request-Timestamp + Request-Target + Digest). Idempotency by request_id index. Server-only — no NEXT_PUBLIC_*. Sandbox default (api-sandbox.doku.com); flip DOKU_IS_PRODUCTION=true for live."
1395
+ },
1396
+ {
1397
+ "slug": "midtrans-payment",
1398
+ "title": "Midtrans — Indonesia Payment",
1399
+ "category": "payment",
1400
+ "kind": "full",
1401
+ "version": "0.1.0",
1402
+ "description": "Pembayaran lokal Indonesia via Midtrans Snap (BCA, Mandiri, BRI, e-wallet GoPay/OVO/Dana, QRIS). Webhook untuk konfirmasi. Provider-isolated under components/providers/midtrans + actions/midtrans so Doku/Stripe land as siblings.",
1403
+ "source": "rahmanef63/resource-site",
1404
+ "slicePath": "frontend/slices/midtrans-payment",
1405
+ "convexPaths": [
1406
+ "convex/features/payment"
1407
+ ],
1408
+ "npm": [
1409
+ "midtrans-client@^1.4.2"
1410
+ ],
1411
+ "shadcn": [
1412
+ "card",
1413
+ "button",
1414
+ "dialog",
1415
+ "input",
1416
+ "label"
1417
+ ],
1418
+ "env": [
1419
+ {
1420
+ "name": "MIDTRANS_SERVER_KEY",
1421
+ "scope": "convex",
1422
+ "required": true
1423
+ },
1424
+ {
1425
+ "name": "MIDTRANS_CLIENT_KEY",
1426
+ "scope": "next-public",
1427
+ "required": true
1428
+ },
1429
+ {
1430
+ "name": "MIDTRANS_IS_PRODUCTION",
1431
+ "scope": "convex"
1432
+ }
1433
+ ],
1434
+ "peers": [
1435
+ {
1436
+ "slug": "convex-auth",
1437
+ "range": "^0.1",
1438
+ "reason": "Order ownership requires authenticated user."
1439
+ }
1440
+ ],
1441
+ "providers": [
1442
+ "midtrans"
1246
1443
  ],
1247
1444
  "tags": [
1248
1445
  "payment",
@@ -1257,6 +1454,7 @@
1257
1454
  "slug": "resend-newsletter",
1258
1455
  "title": "Resend — Transactional & Newsletter",
1259
1456
  "category": "email",
1457
+ "kind": "backend",
1260
1458
  "version": "0.1.0",
1261
1459
  "description": "Transactional email + newsletter blast via Resend. Double opt-in flow + audience segmentation. Magic-link delivery for Convex Auth.",
1262
1460
  "source": "rahmanef63/resource-site",
@@ -1299,6 +1497,7 @@
1299
1497
  "slug": "ai-router",
1300
1498
  "title": "AI Router (OpenRouter)",
1301
1499
  "category": "ai",
1500
+ "kind": "backend",
1302
1501
  "version": "0.1.0",
1303
1502
  "description": "Tier-routed LLM access via OpenRouter — nano (Haiku) for classification, mid (Sonnet) for chat, flagship (Opus) for deep reasoning. Per-call usage log.",
1304
1503
  "source": "rahmanef63/resource-site",
@@ -1334,6 +1533,7 @@
1334
1533
  "slug": "vector-search",
1335
1534
  "title": "Convex Vector Search",
1336
1535
  "category": "search",
1536
+ "kind": "full",
1337
1537
  "version": "0.1.0",
1338
1538
  "description": "Embeddings-based search via Convex's built-in vector index. Embed via OpenAI text-embedding-3-small (1536-dim), query via vectorIndex().",
1339
1539
  "source": "rahmanef63/resource-site",
@@ -1370,6 +1570,7 @@
1370
1570
  "slug": "mdx-blog",
1371
1571
  "title": "MDX Blog",
1372
1572
  "category": "content",
1573
+ "kind": "ui",
1373
1574
  "version": "0.1.0",
1374
1575
  "description": "Markdown-with-JSX untuk blog post. File-based under content/blog/*.mdx. Auto-generate ToC, reading-time, syntax highlight, plus embed React components inline.",
1375
1576
  "source": "rahmanef63/resource-site",
@@ -1398,6 +1599,7 @@
1398
1599
  "slug": "cal-com-booking",
1399
1600
  "title": "Cal.com Booking",
1400
1601
  "category": "data",
1602
+ "kind": "full",
1401
1603
  "version": "0.1.0",
1402
1604
  "description": "Embedded Cal.com booking widget + webhook receiver to mirror bookings into Convex.",
1403
1605
  "source": "rahmanef63/resource-site",
@@ -1433,10 +1635,156 @@
1433
1635
  ],
1434
1636
  "agentRecipe": "Embed Cal.com via @calcom/embed-react di halaman services. Configure webhook di Cal.com dashboard → POST ke /api/cal-webhook → upsert booking di Convex."
1435
1637
  },
1638
+ {
1639
+ "slug": "full-width-toggle",
1640
+ "title": "Full Width Toggle",
1641
+ "category": "ui",
1642
+ "kind": "ui",
1643
+ "version": "0.1.0",
1644
+ "description": "Page-container width toggle (contained / wide / full). Per-device localStorage + cross-tab sync. Ships useFullWidth hook + FullWidthToggle button (icon/button/segment variants) + WidthContainer wrapper. Zero backend, zero env.",
1645
+ "source": "rahmanef63/resource-site",
1646
+ "slicePath": "frontend/slices/full-width-toggle",
1647
+ "convexPaths": [],
1648
+ "npm": [],
1649
+ "shadcn": [
1650
+ "button"
1651
+ ],
1652
+ "env": [],
1653
+ "peers": [],
1654
+ "providers": [],
1655
+ "tags": [
1656
+ "ui",
1657
+ "layout",
1658
+ "preference",
1659
+ "localstorage",
1660
+ "dashboard"
1661
+ ],
1662
+ "agentRecipe": "Drop <WidthContainer> around page content, <FullWidthToggle variant='icon' /> in topbar. Variant 'segment' best for settings page. Hook useFullWidth() returns [mode, setMode, cycle]. SSR-safe — defaults to 'contained' until hydrate."
1663
+ },
1664
+ {
1665
+ "slug": "command-menu",
1666
+ "title": "Command Menu (⌘K)",
1667
+ "category": "ui",
1668
+ "kind": "ui",
1669
+ "version": "0.1.0",
1670
+ "description": "Global ⌘K command palette. Auto-builds entries from your feature registry (defineFeature) + custom actions. Fuzzy search via cmdk. Mount once at app shell; listens globally. Facade slice — pulls from template-base/frontend/slices/command-menu which re-exports shared/foundation/utils/system/command-menu.",
1671
+ "source": "superspace + kitab-core",
1672
+ "slicePath": "template-base/frontend/slices/command-menu",
1673
+ "convexPaths": [],
1674
+ "npm": [
1675
+ "cmdk@^1.0.0"
1676
+ ],
1677
+ "shadcn": [
1678
+ "command",
1679
+ "dialog"
1680
+ ],
1681
+ "env": [],
1682
+ "peers": [],
1683
+ "providers": [],
1684
+ "tags": [
1685
+ "ui",
1686
+ "palette",
1687
+ "cmd-k",
1688
+ "navigation",
1689
+ "keyboard"
1690
+ ],
1691
+ "agentRecipe": "Mount <CommandMenu actions={...} /> once at the dashboard shell level. Listens for Cmd+K globally. Actions auto-build from feature registry + workspace + theme/sign-out. Add custom commands via actions prop or by registering in command-registry.ts."
1692
+ },
1693
+ {
1694
+ "slug": "motion-primitives",
1695
+ "title": "Motion Primitives (8)",
1696
+ "category": "ui",
1697
+ "kind": "ui",
1698
+ "version": "0.1.0",
1699
+ "description": "Eight ready-to-style motion components: marquee, kinetic-heading, magnetic, cursor-spotlight, stat-counter, reading-progress, grain, lightbox. Framer-Motion-powered, tree-shakeable. Facade slice — pulls from template-base/frontend/slices/motion-primitives.",
1700
+ "source": "rahmanef.com",
1701
+ "slicePath": "template-base/frontend/slices/motion-primitives",
1702
+ "convexPaths": [],
1703
+ "npm": [
1704
+ "framer-motion@^11.0.0"
1705
+ ],
1706
+ "shadcn": [],
1707
+ "env": [],
1708
+ "peers": [],
1709
+ "providers": [],
1710
+ "tags": [
1711
+ "ui",
1712
+ "motion",
1713
+ "animation",
1714
+ "marquee",
1715
+ "framer-motion"
1716
+ ],
1717
+ "agentRecipe": "Each primitive is independently importable from @/features/motion-primitives. Use marquee for logo strips, kinetic-heading for hero text, magnetic for CTA buttons, cursor-spotlight for hover-reveal panels, stat-counter for animated numbers, reading-progress for blog top bar, grain for film texture, lightbox for image gallery."
1718
+ },
1719
+ {
1720
+ "slug": "responsive-dialog",
1721
+ "title": "Responsive Dialog (Sheet ↔ Modal)",
1722
+ "category": "ui",
1723
+ "kind": "ui",
1724
+ "version": "0.1.0",
1725
+ "description": "ResponsiveDialog — auto-switches between bottom Sheet (mobile) and centered Dialog (desktop) at the md breakpoint. Same API as shadcn Dialog. Kitab forbids raw <dialog>; use this everywhere. Facade slice — pulls from template-base/frontend/slices/responsive-dialog.",
1726
+ "source": "superspace",
1727
+ "slicePath": "template-base/frontend/slices/responsive-dialog",
1728
+ "convexPaths": [],
1729
+ "npm": [],
1730
+ "shadcn": [
1731
+ "dialog",
1732
+ "sheet"
1733
+ ],
1734
+ "env": [],
1735
+ "peers": [],
1736
+ "providers": [],
1737
+ "tags": [
1738
+ "ui",
1739
+ "dialog",
1740
+ "modal",
1741
+ "sheet",
1742
+ "responsive",
1743
+ "primitive"
1744
+ ],
1745
+ "agentRecipe": "Drop-in for shadcn Dialog. Use <ResponsiveDialog><ResponsiveDialogTrigger>…</ResponsiveDialogTrigger><ResponsiveDialogContent>…</ResponsiveDialogContent></ResponsiveDialog>. On mobile renders as Sheet sliding from bottom; on desktop as centered Dialog. Threshold via useMediaQuery('(min-width: 768px)')."
1746
+ },
1747
+ {
1748
+ "slug": "dashboard-shell",
1749
+ "title": "Dashboard Shell — Responsive",
1750
+ "category": "ui",
1751
+ "kind": "ui",
1752
+ "version": "0.1.0",
1753
+ "description": "ResponsiveDashboardShell — desktop sidebar + topbar, mobile dock + sheet sidebar, breakpoint-aware. Ports superspace's layout/dashboard/{Desktop,Mobile,Responsive}DashboardShell + sidebar primary/secondary slots. Facade slice — pulls from template-base/frontend/slices/dashboard-shell.",
1754
+ "source": "superspace",
1755
+ "slicePath": "template-base/frontend/slices/dashboard-shell",
1756
+ "convexPaths": [],
1757
+ "npm": [],
1758
+ "shadcn": [
1759
+ "sheet",
1760
+ "scroll-area",
1761
+ "separator",
1762
+ "tooltip"
1763
+ ],
1764
+ "env": [],
1765
+ "peers": [
1766
+ {
1767
+ "slug": "full-width-toggle",
1768
+ "range": "^0.1",
1769
+ "reason": "Topbar surfaces the width toggle when this is mounted."
1770
+ }
1771
+ ],
1772
+ "providers": [],
1773
+ "tags": [
1774
+ "ui",
1775
+ "layout",
1776
+ "dashboard",
1777
+ "sidebar",
1778
+ "topbar",
1779
+ "responsive"
1780
+ ],
1781
+ "agentRecipe": "Wraps app/(admin) routes. <ResponsiveDashboardShell sidebar={<AppSidebar />} topbar={<TopBar />}>{children}</ResponsiveDashboardShell>. Mobile: sidebar collapses to <Sheet>. Desktop: persistent sidebar + topbar. Embed FullWidthToggle in topbar for instant container resize."
1782
+ },
1436
1783
  {
1437
1784
  "slug": "broadcast-channel-sync",
1438
1785
  "title": "BroadcastChannel — Cross-tab Sync",
1439
1786
  "category": "realtime",
1787
+ "kind": "ui",
1440
1788
  "version": "0.1.0",
1441
1789
  "description": "Same-origin cross-tab + cross-iframe state sync via BroadcastChannel API. Tiny, no backend, no install.",
1442
1790
  "source": "Web Platform — BroadcastChannel API",
@@ -1454,6 +1802,356 @@
1454
1802
  "demo-pattern"
1455
1803
  ],
1456
1804
  "agentRecipe": "Use BroadcastChannel only for demo / cross-iframe state mirroring. Production data still goes through Convex realtime. Use the useBroadcastSync(channelName, initial) hook from @/features/broadcast-channel-sync."
1805
+ },
1806
+ {
1807
+ "slug": "rbac-roles",
1808
+ "title": "RBAC — Tiered System Roles",
1809
+ "category": "auth",
1810
+ "kind": "backend",
1811
+ "version": "0.1.0",
1812
+ "description": "Workspace-scoped RBAC with 6 system roles (owner/admin/manager/staff/client/guest) and three tier presets — solo, influencer, organization. Env-based platform admin bypass via PLATFORM_ADMIN_EMAILS. checkPermission / requirePermission helpers, role seeding mutation, @convex-dev/auth aware (no Clerk).",
1813
+ "source": "superspace",
1814
+ "slicePath": "",
1815
+ "convexPaths": [
1816
+ "template-base/convex/lib/rbac"
1817
+ ],
1818
+ "npm": [],
1819
+ "shadcn": [],
1820
+ "env": [
1821
+ {
1822
+ "name": "PLATFORM_ADMIN_EMAILS",
1823
+ "scope": "convex",
1824
+ "description": "Comma-separated emails granted cross-workspace admin."
1825
+ }
1826
+ ],
1827
+ "peers": [
1828
+ {
1829
+ "slug": "convex-auth",
1830
+ "range": "^0.1",
1831
+ "reason": "RBAC checks the authed user identity."
1832
+ }
1833
+ ],
1834
+ "providers": [],
1835
+ "tags": [
1836
+ "rbac",
1837
+ "auth",
1838
+ "permissions",
1839
+ "roles",
1840
+ "workspaces"
1841
+ ],
1842
+ "agentRecipe": "Three tier presets pick which system roles to seed: solo (owner+admin), influencer (+manager), organization (6 roles). Platform admin via env PLATFORM_ADMIN_EMAILS bypasses all checks. Resolution: platform admin → workspace owner → membership.additionalPermissions → role.permissions."
1843
+ },
1844
+ {
1845
+ "slug": "admin-panel",
1846
+ "title": "Admin Panel — Unified Product Admin",
1847
+ "category": "infra",
1848
+ "kind": "full",
1849
+ "version": "0.1.0",
1850
+ "description": "17-section admin surface (events, funnels, attribution, users, A/B, flags, pricing, CMS, email, audit, ...) gated by RBAC. Auto-filters sidebar by tier (solo/influencer/organization) and user permissions. Single backend resolver (getMyAdminAccess) mirrors frontend gate so UI can never leak.",
1851
+ "source": "superspace + spec",
1852
+ "slicePath": "template-base/frontend/slices/admin-panel",
1853
+ "convexPaths": [
1854
+ "template-base/convex/features/admin-panel"
1855
+ ],
1856
+ "npm": [],
1857
+ "shadcn": [
1858
+ "card",
1859
+ "badge",
1860
+ "button"
1861
+ ],
1862
+ "env": [],
1863
+ "peers": [
1864
+ {
1865
+ "slug": "rbac-roles",
1866
+ "range": "^0.1",
1867
+ "reason": "Admin sections require RBAC perms — must seed roles first."
1868
+ }
1869
+ ],
1870
+ "providers": [],
1871
+ "tags": [
1872
+ "admin",
1873
+ "owner",
1874
+ "platform",
1875
+ "rbac",
1876
+ "instrumentation",
1877
+ "panel"
1878
+ ],
1879
+ "agentRecipe": "Wrap pages with <AdminPage workspaceId tier>. AccessGate hides UI for non-admins, AdminShell renders 2-col layout with sidebar filtered by tier+perms. ADMIN_SECTIONS in config.ts is SSOT (17 entries). Personal-brand-os = tier 'solo' = owner sees everything."
1880
+ },
1881
+ {
1882
+ "slug": "event-tracking",
1883
+ "title": "Event Tracking — P0 Instrumentation",
1884
+ "category": "data",
1885
+ "kind": "full",
1886
+ "version": "0.1.0",
1887
+ "description": "Client SDK + Convex ingestion endpoint for structured product events. Auto-captures page_view/signup/login + UTM/referrer/first-touch attribution. Batched flush via requestIdleCallback. Targets <100ms p99 ingestion.",
1888
+ "source": "spec + superspace analytics",
1889
+ "slicePath": "template-base/frontend/slices/admin-panel/slices/events",
1890
+ "convexPaths": [
1891
+ "template-base/convex/features/admin-panel",
1892
+ "template-base/convex/features/analytics"
1893
+ ],
1894
+ "npm": [],
1895
+ "shadcn": [],
1896
+ "env": [],
1897
+ "peers": [
1898
+ {
1899
+ "slug": "admin-panel",
1900
+ "range": "^0.1",
1901
+ "reason": "Lives under admin slice events subfolder."
1902
+ }
1903
+ ],
1904
+ "providers": [],
1905
+ "tags": [
1906
+ "events",
1907
+ "analytics",
1908
+ "instrumentation",
1909
+ "attribution",
1910
+ "utm",
1911
+ "p0"
1912
+ ],
1913
+ "agentRecipe": "Writes to analyticsEvents table (no new schema). Anonymous page_view allowed pre-signup; other events require workspaceId. Session id per tab (sessionStorage), first-touch UTM in localStorage. Flush every ~500ms via requestIdleCallback. Cap retry queue at 500."
1914
+ },
1915
+ {
1916
+ "slug": "theme-preset-switcher",
1917
+ "title": "Theme Preset Switcher",
1918
+ "category": "ui",
1919
+ "kind": "ui",
1920
+ "version": "0.1.0",
1921
+ "description": "Runtime theme swap (colors + fonts + shadows + tracking). OKLch CSS vars per preset. Persists to localStorage + Convex. Add a new preset by appending a CSS block in app/globals.css with [data-theme=\"<name>\"], then register in preset-groups.ts.",
1922
+ "source": "rahmanef.com",
1923
+ "slicePath": "template-base/frontend/shared/theme",
1924
+ "convexPaths": [],
1925
+ "npm": [],
1926
+ "shadcn": [],
1927
+ "env": [],
1928
+ "peers": [],
1929
+ "providers": [],
1930
+ "tags": [
1931
+ "theme",
1932
+ "presets",
1933
+ "oklch",
1934
+ "design-system"
1935
+ ],
1936
+ "agentRecipe": "Import ThemePresetSwitcher from @/frontend/shared/ui/components/theme-preset-switcher and mount in the topbar. Presets live in theme-presets.ts; preset-groups.ts groups them for the picker UI."
1937
+ },
1938
+ {
1939
+ "slug": "icon-picker",
1940
+ "title": "Notion-Style Icon Picker",
1941
+ "category": "ui",
1942
+ "kind": "ui",
1943
+ "version": "0.1.0",
1944
+ "description": "Emoji + lucide icon picker with search, 10-color Notion palette, Twemoji/native toggle. One string stores emoji OR lucide:Name OR with ?c=hex tint — backwards-compat with raw-emoji fields. Single icon field stores emoji or 'lucide:Name' plus optional '?c=hex'.",
1945
+ "source": "notion-page-clone",
1946
+ "slicePath": "template-base/frontend/slices/notion/slices/icon-picker",
1947
+ "convexPaths": [],
1948
+ "npm": [],
1949
+ "shadcn": [
1950
+ "popover",
1951
+ "button",
1952
+ "input"
1953
+ ],
1954
+ "env": [],
1955
+ "peers": [],
1956
+ "providers": [],
1957
+ "tags": [
1958
+ "icon",
1959
+ "emoji",
1960
+ "lucide",
1961
+ "picker",
1962
+ "twemoji",
1963
+ "notion"
1964
+ ],
1965
+ "agentRecipe": "parseIconValue() decodes; lucideValue()/withColor() build. Add 'icon: v.string()' to Convex table — no migration needed for existing emoji fields. Popover variant for inline UI, Inline for sheets/dialogs."
1966
+ },
1967
+ {
1968
+ "slug": "contact-form-resend",
1969
+ "title": "Contact Form + Resend",
1970
+ "category": "email",
1971
+ "kind": "full",
1972
+ "version": "0.1.0",
1973
+ "description": "Contact form posting to Resend email API. Server Action + Zod input validation. Convex mutation for storage + Resend send.",
1974
+ "source": "cescadesigns",
1975
+ "slicePath": "template-base/frontend/slices/contact-form-resend",
1976
+ "convexPaths": [],
1977
+ "npm": [
1978
+ "resend@^4.0.0",
1979
+ "framer-motion@^11.0.0"
1980
+ ],
1981
+ "shadcn": [
1982
+ "card",
1983
+ "button",
1984
+ "input",
1985
+ "label",
1986
+ "textarea"
1987
+ ],
1988
+ "env": [
1989
+ {
1990
+ "name": "RESEND_API_KEY",
1991
+ "scope": "convex",
1992
+ "required": true
1993
+ }
1994
+ ],
1995
+ "peers": [
1996
+ {
1997
+ "slug": "convex-auth",
1998
+ "range": "^0.1",
1999
+ "reason": "Optional — anonymous submission works without auth."
2000
+ }
2001
+ ],
2002
+ "providers": [],
2003
+ "tags": [
2004
+ "form",
2005
+ "email",
2006
+ "resend",
2007
+ "convex"
2008
+ ],
2009
+ "agentRecipe": "Wire contactMessages.send mutation in convex/. Server emails via Resend from form@yourdomain.com. Always validate inputs with Zod or v.* server-side. Anonymous allowed."
2010
+ },
2011
+ {
2012
+ "slug": "admin",
2013
+ "title": "Admin — Generic Shell",
2014
+ "category": "infra",
2015
+ "kind": "full",
2016
+ "version": "0.1.0",
2017
+ "description": "Landing page scaffold + Convex admin probe (isAdmin / counts). Consumer composes feature panels into the grid. Gated by requireAdmin on Convex side; superadmin email gate via SUPER_ADMIN_EMAIL env.",
2018
+ "source": "rahmanef63/resource-site",
2019
+ "slicePath": "frontend/slices/admin",
2020
+ "convexPaths": [
2021
+ "convex/features/admin"
2022
+ ],
2023
+ "npm": [],
2024
+ "shadcn": [
2025
+ "card",
2026
+ "button"
2027
+ ],
2028
+ "env": [
2029
+ {
2030
+ "name": "SUPER_ADMIN_EMAIL",
2031
+ "scope": "convex",
2032
+ "required": false
2033
+ }
2034
+ ],
2035
+ "peers": [
2036
+ {
2037
+ "slug": "convex-auth",
2038
+ "range": "^0.1",
2039
+ "reason": "requireAdmin gate uses convex-auth user identity."
2040
+ }
2041
+ ],
2042
+ "providers": [],
2043
+ "tags": [
2044
+ "infra",
2045
+ "admin",
2046
+ "shell",
2047
+ "crud"
2048
+ ],
2049
+ "agentRecipe": "Run `rr add admin`. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address."
2050
+ },
2051
+ {
2052
+ "slug": "audit-log",
2053
+ "title": "Audit Log — Workspace Events",
2054
+ "category": "infra",
2055
+ "kind": "backend",
2056
+ "version": "0.1.0",
2057
+ "description": "Workspace-scoped audit event recorder. Canonical logAuditEvent helper for mutations + actions; supports entity tracking, before/after diff, IP/user-agent capture.",
2058
+ "source": "rahmanef63/resource-site",
2059
+ "slicePath": "frontend/slices/audit-log",
2060
+ "convexPaths": [
2061
+ "convex/features/audit-log"
2062
+ ],
2063
+ "npm": [],
2064
+ "shadcn": [],
2065
+ "env": [],
2066
+ "peers": [
2067
+ {
2068
+ "slug": "convex-auth",
2069
+ "range": "^0.1",
2070
+ "reason": "Event actor resolved via authenticated user."
2071
+ }
2072
+ ],
2073
+ "providers": [],
2074
+ "tags": [
2075
+ "infra",
2076
+ "audit",
2077
+ "compliance",
2078
+ "logging"
2079
+ ],
2080
+ "agentRecipe": "Run `rr add audit-log`. Import logAuditEvent from convex/_shared/auditLogger.ts and call inside every workspace-scoped mutation with { action, workspaceId, entityType, entityId, before?, after? }."
2081
+ },
2082
+ {
2083
+ "slug": "comments",
2084
+ "title": "Comments — Threaded",
2085
+ "category": "content",
2086
+ "kind": "full",
2087
+ "version": "0.1.0",
2088
+ "description": "Workspace-scoped threaded comments anchored to pages or blocks. Soft-delete + resolve semantics. useComments(opts) hook returns items + openCount + CRUD mutations.",
2089
+ "source": "rahmanef63/resource-site",
2090
+ "slicePath": "frontend/slices/comments",
2091
+ "convexPaths": [
2092
+ "convex/features/comments"
2093
+ ],
2094
+ "npm": [],
2095
+ "shadcn": [
2096
+ "button",
2097
+ "textarea",
2098
+ "avatar"
2099
+ ],
2100
+ "env": [],
2101
+ "peers": [
2102
+ {
2103
+ "slug": "convex-auth",
2104
+ "range": "^0.1",
2105
+ "reason": "Comment author identity from convex-auth."
2106
+ }
2107
+ ],
2108
+ "providers": [],
2109
+ "tags": [
2110
+ "content",
2111
+ "social",
2112
+ "comments",
2113
+ "threaded",
2114
+ "annotations"
2115
+ ],
2116
+ "agentRecipe": "Run `rr add comments`. Use useComments({ pageId } | { blockId }) — returns items, openCount, addComment, editComment, resolveComment, deleteComment. resolvedAt!=null = thread closed but visible."
2117
+ },
2118
+ {
2119
+ "slug": "seo",
2120
+ "title": "SEO — AI Metadata Generator",
2121
+ "category": "content",
2122
+ "kind": "full",
2123
+ "version": "0.1.0",
2124
+ "description": "Service slice for SEO metadata generation — Anthropic-backed action with per-user 24h cost guard. No public route. Backend exposes generate + generateAndApply mutations gated by requireAdmin.",
2125
+ "source": "rahmanef63/resource-site",
2126
+ "slicePath": "frontend/slices/seo",
2127
+ "convexPaths": [
2128
+ "convex/features/seo"
2129
+ ],
2130
+ "npm": [],
2131
+ "shadcn": [],
2132
+ "env": [
2133
+ {
2134
+ "name": "ANTHROPIC_API_KEY",
2135
+ "scope": "server",
2136
+ "required": true
2137
+ }
2138
+ ],
2139
+ "peers": [
2140
+ {
2141
+ "slug": "convex-auth",
2142
+ "range": "^0.1",
2143
+ "reason": "Cost guard + requireAdmin gates use convex-auth user identity."
2144
+ }
2145
+ ],
2146
+ "providers": [],
2147
+ "tags": [
2148
+ "content",
2149
+ "seo",
2150
+ "ai",
2151
+ "anthropic",
2152
+ "metadata-generator"
2153
+ ],
2154
+ "agentRecipe": "Run `rr add seo`. Call seo.generate from server actions or admin mutations. Cost guard rate-limits per-user within 24h via callsInWindow query."
1457
2155
  }
1458
2156
  ]
1459
2157
  }