rahman-resources 1.6.0 → 1.8.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.
Files changed (2) hide show
  1. package/lib/manifest.json +2423 -1222
  2. package/package.json +1 -1
package/lib/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 2,
3
- "generatedAt": "2026-05-17T13:25:57.345Z",
3
+ "generatedAt": "2026-05-23T06:29:18.092Z",
4
4
  "repo": "rahmanef63/resource-site",
5
5
  "branch": "main",
6
6
  "layouts": [
@@ -31,24 +31,24 @@
31
31
  "app/preview/personal-brand-os/public/resources/page.tsx",
32
32
  "app/preview/personal-brand-os/public/contact/page.tsx",
33
33
  "app/preview/personal-brand-os/public/about/page.tsx",
34
- "app/preview/personal-brand-os/admin/layout.tsx",
35
- "app/preview/personal-brand-os/admin/page.tsx",
36
- "app/preview/personal-brand-os/admin/posts/page.tsx",
37
- "app/preview/personal-brand-os/admin/posts/new/page.tsx",
38
- "app/preview/personal-brand-os/admin/posts/[id]/page.tsx",
39
- "app/preview/personal-brand-os/admin/portfolio/page.tsx",
40
- "app/preview/personal-brand-os/admin/portfolio/new/page.tsx",
41
- "app/preview/personal-brand-os/admin/portfolio/[id]/page.tsx",
42
- "app/preview/personal-brand-os/admin/services/page.tsx",
43
- "app/preview/personal-brand-os/admin/resources/page.tsx",
44
- "app/preview/personal-brand-os/admin/leads/page.tsx",
45
- "app/preview/personal-brand-os/admin/comments/page.tsx",
46
- "app/preview/personal-brand-os/admin/chatbot/page.tsx",
47
- "app/preview/personal-brand-os/admin/newsletter/page.tsx",
48
- "app/preview/personal-brand-os/admin/analytics/page.tsx",
49
- "app/preview/personal-brand-os/admin/settings/site/page.tsx",
50
- "app/preview/personal-brand-os/admin/settings/team/page.tsx",
51
- "app/preview/personal-brand-os/admin/settings/ai/page.tsx",
34
+ "app/preview/personal-brand-os/dashboard/admin/layout.tsx",
35
+ "app/preview/personal-brand-os/dashboard/admin/page.tsx",
36
+ "app/preview/personal-brand-os/dashboard/admin/posts/page.tsx",
37
+ "app/preview/personal-brand-os/dashboard/admin/posts/new/page.tsx",
38
+ "app/preview/personal-brand-os/dashboard/admin/posts/[id]/page.tsx",
39
+ "app/preview/personal-brand-os/dashboard/admin/portfolio/page.tsx",
40
+ "app/preview/personal-brand-os/dashboard/admin/portfolio/new/page.tsx",
41
+ "app/preview/personal-brand-os/dashboard/admin/portfolio/[id]/page.tsx",
42
+ "app/preview/personal-brand-os/dashboard/admin/services/page.tsx",
43
+ "app/preview/personal-brand-os/dashboard/admin/resources/page.tsx",
44
+ "app/preview/personal-brand-os/dashboard/admin/leads/page.tsx",
45
+ "app/preview/personal-brand-os/dashboard/admin/comments/page.tsx",
46
+ "app/preview/personal-brand-os/dashboard/admin/chatbot/page.tsx",
47
+ "app/preview/personal-brand-os/dashboard/admin/newsletter/page.tsx",
48
+ "app/preview/personal-brand-os/dashboard/admin/analytics/page.tsx",
49
+ "app/preview/personal-brand-os/dashboard/admin/settings/site/page.tsx",
50
+ "app/preview/personal-brand-os/dashboard/admin/settings/team/page.tsx",
51
+ "app/preview/personal-brand-os/dashboard/admin/settings/ai/page.tsx",
52
52
  "components/templates/_shared/index.ts",
53
53
  "components/templates/_shared/types/common.ts",
54
54
  "components/templates/_shared/utils/index.ts",
@@ -77,7 +77,7 @@
77
77
  "components/templates/personal-brand/slices/resources/ResourcesPage.tsx",
78
78
  "components/templates/personal-brand/slices/about/AboutPage.tsx",
79
79
  "components/templates/personal-brand/slices/contact/ContactPage.tsx",
80
- "app/preview/personal-brand-os/admin/admin-shell-client.tsx",
80
+ "app/preview/personal-brand-os/dashboard/admin/admin-shell-client.tsx",
81
81
  "components/templates/personal-brand/slices/admin/dashboard/DashboardView.tsx",
82
82
  "components/templates/personal-brand/slices/admin/posts/PostsList.tsx",
83
83
  "components/templates/personal-brand/slices/admin/posts/PostEditor.tsx",
@@ -170,15 +170,15 @@
170
170
  "app/preview/agency-studio-os/public/portfolio/[slug]/page.tsx",
171
171
  "app/preview/agency-studio-os/public/about/page.tsx",
172
172
  "app/preview/agency-studio-os/public/contact/page.tsx",
173
- "app/preview/agency-studio-os/admin/layout.tsx",
174
- "app/preview/agency-studio-os/admin/page.tsx",
175
- "app/preview/agency-studio-os/admin/projects/page.tsx",
176
- "app/preview/agency-studio-os/admin/projects/new/page.tsx",
177
- "app/preview/agency-studio-os/admin/projects/[id]/page.tsx",
178
- "app/preview/agency-studio-os/admin/clients/page.tsx",
179
- "app/preview/agency-studio-os/admin/services/page.tsx",
180
- "app/preview/agency-studio-os/admin/leads/page.tsx",
181
- "app/preview/agency-studio-os/admin/settings/page.tsx",
173
+ "app/preview/agency-studio-os/dashboard/admin/layout.tsx",
174
+ "app/preview/agency-studio-os/dashboard/admin/page.tsx",
175
+ "app/preview/agency-studio-os/dashboard/admin/projects/page.tsx",
176
+ "app/preview/agency-studio-os/dashboard/admin/projects/new/page.tsx",
177
+ "app/preview/agency-studio-os/dashboard/admin/projects/[id]/page.tsx",
178
+ "app/preview/agency-studio-os/dashboard/admin/clients/page.tsx",
179
+ "app/preview/agency-studio-os/dashboard/admin/services/page.tsx",
180
+ "app/preview/agency-studio-os/dashboard/admin/leads/page.tsx",
181
+ "app/preview/agency-studio-os/dashboard/admin/settings/page.tsx",
182
182
  "components/templates/agency-studio/shared/types.ts",
183
183
  "components/templates/agency-studio/shared/store.tsx",
184
184
  "components/templates/agency-studio/shared/seed.ts",
@@ -190,7 +190,7 @@
190
190
  "components/templates/agency-studio/slices/portfolio/PortfolioDetailPage.tsx",
191
191
  "components/templates/agency-studio/slices/about/AboutPage.tsx",
192
192
  "components/templates/agency-studio/slices/contact/ContactPage.tsx",
193
- "app/preview/agency-studio-os/admin/admin-shell-client.tsx",
193
+ "app/preview/agency-studio-os/dashboard/admin/admin-shell-client.tsx",
194
194
  "components/templates/agency-studio/slices/admin/dashboard/DashboardView.tsx",
195
195
  "components/templates/agency-studio/slices/admin/projects/ProjectsList.tsx",
196
196
  "components/templates/agency-studio/slices/admin/projects/ProjectEditor.tsx",
@@ -416,12 +416,90 @@
416
416
  ],
417
417
  "primaryFile": "README.md"
418
418
  },
419
+ {
420
+ "slug": "notion-page-clone-os",
421
+ "title": "Notion Page Clone OS — localStorage demo (pointer to open-silong for production)",
422
+ "category": "website-template",
423
+ "status": "stable",
424
+ "description": "localStorage-only DEMO of a Notion-clone surface — tree-structured sidebar + page editor + embedded databases. Built from rr's notion-shell wrappers (NotionSidebar / NotionPage / NotionBlock / NotionDatabase) + notion-blocks primitives (equation / code / notify / drag-fill grid) + createTemplateStore (localStorage + BroadcastChannel). No Convex, no auth, no multi-user — drop-in starter for evaluating the UI or embedding a Notion-style editor in your own project. **For the production-grade Convex-backed product (multi-workspace + auth + sharing + comments + snapshots + MCP), use the open-source open-silong repo: https://github.com/rahmanef63/open-silong (silong.rahmanef.com).** This rr template is the DEMO; the github repo is the PRODUCT.",
425
+ "source": "synthesized + notion-shell wrappers + notion-blocks bundle; production stack at github.com/rahmanef63/open-silong",
426
+ "repoPath": "app/preview/notion-page-clone-os",
427
+ "pullPaths": [
428
+ "app/preview/notion-page-clone-os",
429
+ "components/templates/_shared",
430
+ "components/templates/notion-page-clone",
431
+ "frontend/slices/notion-blocks",
432
+ "frontend/slices/notion-shell",
433
+ "frontend/slices/icon-picker",
434
+ "frontend/slices/equation",
435
+ "frontend/slices/code-block",
436
+ "frontend/slices/notifications",
437
+ "frontend/slices/database-cell-selection"
438
+ ],
439
+ "files": [
440
+ "app/preview/notion-page-clone-os/public/layout.tsx",
441
+ "app/preview/notion-page-clone-os/public/page.tsx",
442
+ "app/preview/notion-page-clone-os/public/d/[id]/page.tsx",
443
+ "app/preview/notion-page-clone-os/public/db/[id]/page.tsx",
444
+ "app/preview/notion-page-clone-os/dashboard/admin/layout.tsx",
445
+ "app/preview/notion-page-clone-os/dashboard/admin/admin-shell-client.tsx",
446
+ "app/preview/notion-page-clone-os/dashboard/admin/page.tsx",
447
+ "app/preview/notion-page-clone-os/dashboard/admin/snippets/page.tsx",
448
+ "components/templates/notion-page-clone/shared/site-config.ts",
449
+ "components/templates/notion-page-clone/shared/nav-config.ts",
450
+ "components/templates/notion-page-clone/shared/types.ts",
451
+ "components/templates/notion-page-clone/shared/store.tsx",
452
+ "components/templates/notion-page-clone/shared/seed.ts",
453
+ "components/templates/notion-page-clone/slices/admin/snippets/SnippetsView.tsx",
454
+ "components/templates/notion-page-clone/slices/notion-app/Dashboard.tsx",
455
+ "components/templates/notion-page-clone/slices/notion-app/DocView.tsx",
456
+ "components/templates/notion-page-clone/slices/notion-app/DatabaseView.tsx",
457
+ "components/templates/notion-page-clone/slices/notion-app/hooks.ts",
458
+ "components/templates/notion-page-clone/slices/notion-app/block-renderers.tsx",
459
+ "components/templates/notion-page-clone/shared/notion-reducer.ts",
460
+ "components/templates/notion-page-clone/shared/notion-db-reducer.ts"
461
+ ],
462
+ "dependencies": [
463
+ "next@^16",
464
+ "react@^19",
465
+ "react-dom@^19",
466
+ "lucide-react",
467
+ "katex@^0.16.45",
468
+ "highlight.js@^11.11.1",
469
+ "rahman-shared@^0.2.0",
470
+ "tailwindcss@^4"
471
+ ],
472
+ "shadcnComponents": [
473
+ "badge",
474
+ "button",
475
+ "popover",
476
+ "dropdown-menu",
477
+ "input",
478
+ "label",
479
+ "switch",
480
+ "textarea",
481
+ "select",
482
+ "dialog"
483
+ ],
484
+ "agentRecipe": "Run `npx rr init <app> --template notion-page-clone-os`. Cascades notion-shell (wrappers) + notion-blocks (4 editor primitives) + icon-picker. Edit components/templates/notion-page-clone/shared/site-config.ts to set brand; seed.ts to bootstrap docs + databases. Sidebar CRUD already wired — hover a row → +/✎/🗑.",
485
+ "tags": [
486
+ "template",
487
+ "notion",
488
+ "notes",
489
+ "blocks",
490
+ "katex",
491
+ "code",
492
+ "editor",
493
+ "indonesia"
494
+ ],
495
+ "primaryFile": "app/preview/notion-page-clone-os/public/page.tsx"
496
+ },
419
497
  {
420
498
  "slug": "saas-marketing-os",
421
499
  "title": "SaaS Marketing OS",
422
500
  "category": "website-template",
423
501
  "status": "stable",
424
- "description": "Public-only marketing site for a SaaS product — landing, pricing, features, blog, changelog, about, contact. MDX-driven blog + changelog. No admin (CMS via MDX files in repo).",
502
+ "description": "Marketing site for a SaaS product — landing, pricing, features, blog, changelog, about, contact backed by a full admin panel (Pages, Posts, Pricing, Features, Customers, Subscriptions, Leads, Changelog, Settings). Same grouped Pages + Features sidebar pattern as every other template.",
425
503
  "source": "synthesized + mdx-blog feature",
426
504
  "repoPath": "app/preview/saas-marketing-os",
427
505
  "pullPaths": [
@@ -451,7 +529,29 @@
451
529
  "components/templates/saas-marketing/slices/blog/BlogDetail.tsx",
452
530
  "components/templates/saas-marketing/slices/changelog/ChangelogPage.tsx",
453
531
  "components/templates/saas-marketing/slices/about/AboutPage.tsx",
454
- "components/templates/saas-marketing/slices/contact/ContactPage.tsx"
532
+ "components/templates/saas-marketing/slices/contact/ContactPage.tsx",
533
+ "app/preview/saas-marketing-os/dashboard/layout.tsx",
534
+ "app/preview/saas-marketing-os/dashboard/dashboard-shell-client.tsx",
535
+ "app/preview/saas-marketing-os/dashboard/admin/page.tsx",
536
+ "app/preview/saas-marketing-os/dashboard/admin/pages/page.tsx",
537
+ "app/preview/saas-marketing-os/dashboard/admin/pages/[id]/page.tsx",
538
+ "app/preview/saas-marketing-os/dashboard/admin/landing/page.tsx",
539
+ "app/preview/saas-marketing-os/dashboard/admin/landing/[id]/page.tsx",
540
+ "app/preview/saas-marketing-os/dashboard/admin/posts/page.tsx",
541
+ "app/preview/saas-marketing-os/dashboard/admin/posts/[id]/page.tsx",
542
+ "app/preview/saas-marketing-os/dashboard/admin/pricing/page.tsx",
543
+ "app/preview/saas-marketing-os/dashboard/admin/pricing/[id]/page.tsx",
544
+ "app/preview/saas-marketing-os/dashboard/admin/features/page.tsx",
545
+ "app/preview/saas-marketing-os/dashboard/admin/features/[id]/page.tsx",
546
+ "app/preview/saas-marketing-os/dashboard/admin/customers/page.tsx",
547
+ "app/preview/saas-marketing-os/dashboard/admin/customers/[id]/page.tsx",
548
+ "app/preview/saas-marketing-os/dashboard/admin/subscriptions/page.tsx",
549
+ "app/preview/saas-marketing-os/dashboard/admin/subscriptions/[id]/page.tsx",
550
+ "app/preview/saas-marketing-os/dashboard/admin/leads/page.tsx",
551
+ "app/preview/saas-marketing-os/dashboard/admin/leads/[id]/page.tsx",
552
+ "app/preview/saas-marketing-os/dashboard/admin/changelog/page.tsx",
553
+ "app/preview/saas-marketing-os/dashboard/admin/changelog/[id]/page.tsx",
554
+ "app/preview/saas-marketing-os/dashboard/admin/settings/page.tsx"
455
555
  ],
456
556
  "dependencies": [
457
557
  "next@^16",
@@ -482,7 +582,8 @@
482
582
  "marketing",
483
583
  "mdx",
484
584
  "blog",
485
- "changelog"
585
+ "changelog",
586
+ "admin"
486
587
  ],
487
588
  "primaryFile": "app/preview/saas-marketing-os/public/page.tsx"
488
589
  },
@@ -506,18 +607,18 @@
506
607
  "app/preview/kreator-studio-os/public/page.tsx",
507
608
  "app/preview/kreator-studio-os/public/posts/page.tsx",
508
609
  "app/preview/kreator-studio-os/public/about/page.tsx",
509
- "app/preview/kreator-studio-os/admin/layout.tsx",
510
- "app/preview/kreator-studio-os/admin/page.tsx",
511
- "app/preview/kreator-studio-os/admin/admin-shell-client.tsx",
512
- "app/preview/kreator-studio-os/admin/planner/page.tsx",
513
- "app/preview/kreator-studio-os/admin/voice/page.tsx",
514
- "app/preview/kreator-studio-os/admin/scripts/page.tsx",
515
- "app/preview/kreator-studio-os/admin/carousels/page.tsx",
516
- "app/preview/kreator-studio-os/admin/assets/page.tsx",
517
- "app/preview/kreator-studio-os/admin/performance/page.tsx",
518
- "app/preview/kreator-studio-os/admin/newsletter/page.tsx",
519
- "app/preview/kreator-studio-os/admin/comments/page.tsx",
520
- "app/preview/kreator-studio-os/admin/settings/page.tsx",
610
+ "app/preview/kreator-studio-os/dashboard/admin/layout.tsx",
611
+ "app/preview/kreator-studio-os/dashboard/admin/page.tsx",
612
+ "app/preview/kreator-studio-os/dashboard/admin/admin-shell-client.tsx",
613
+ "app/preview/kreator-studio-os/dashboard/admin/planner/page.tsx",
614
+ "app/preview/kreator-studio-os/dashboard/admin/voice/page.tsx",
615
+ "app/preview/kreator-studio-os/dashboard/admin/scripts/page.tsx",
616
+ "app/preview/kreator-studio-os/dashboard/admin/carousels/page.tsx",
617
+ "app/preview/kreator-studio-os/dashboard/admin/assets/page.tsx",
618
+ "app/preview/kreator-studio-os/dashboard/admin/performance/page.tsx",
619
+ "app/preview/kreator-studio-os/dashboard/admin/newsletter/page.tsx",
620
+ "app/preview/kreator-studio-os/dashboard/admin/comments/page.tsx",
621
+ "app/preview/kreator-studio-os/dashboard/admin/settings/page.tsx",
521
622
  "components/templates/kreator-studio/shared/site-config.ts",
522
623
  "components/templates/kreator-studio/shared/types.ts",
523
624
  "components/templates/kreator-studio/shared/seed.ts",
@@ -588,16 +689,16 @@
588
689
  "app/preview/konsultan-os/public/page.tsx",
589
690
  "app/preview/konsultan-os/public/case-studies/page.tsx",
590
691
  "app/preview/konsultan-os/public/contact/page.tsx",
591
- "app/preview/konsultan-os/admin/layout.tsx",
592
- "app/preview/konsultan-os/admin/page.tsx",
593
- "app/preview/konsultan-os/admin/admin-shell-client.tsx",
594
- "app/preview/konsultan-os/admin/clients/page.tsx",
595
- "app/preview/konsultan-os/admin/proposals/page.tsx",
596
- "app/preview/konsultan-os/admin/contracts/page.tsx",
597
- "app/preview/konsultan-os/admin/projects/page.tsx",
598
- "app/preview/konsultan-os/admin/billing/page.tsx",
599
- "app/preview/konsultan-os/admin/documents/page.tsx",
600
- "app/preview/konsultan-os/admin/settings/page.tsx",
692
+ "app/preview/konsultan-os/dashboard/admin/layout.tsx",
693
+ "app/preview/konsultan-os/dashboard/admin/page.tsx",
694
+ "app/preview/konsultan-os/dashboard/admin/admin-shell-client.tsx",
695
+ "app/preview/konsultan-os/dashboard/admin/clients/page.tsx",
696
+ "app/preview/konsultan-os/dashboard/admin/proposals/page.tsx",
697
+ "app/preview/konsultan-os/dashboard/admin/contracts/page.tsx",
698
+ "app/preview/konsultan-os/dashboard/admin/projects/page.tsx",
699
+ "app/preview/konsultan-os/dashboard/admin/billing/page.tsx",
700
+ "app/preview/konsultan-os/dashboard/admin/documents/page.tsx",
701
+ "app/preview/konsultan-os/dashboard/admin/settings/page.tsx",
601
702
  "components/templates/konsultan/shared/site-config.ts",
602
703
  "components/templates/konsultan/shared/types.ts",
603
704
  "components/templates/konsultan/shared/seed.ts",
@@ -667,16 +768,16 @@
667
768
  "app/preview/wirausaha-os/public/page.tsx",
668
769
  "app/preview/wirausaha-os/public/services/page.tsx",
669
770
  "app/preview/wirausaha-os/public/contact/page.tsx",
670
- "app/preview/wirausaha-os/admin/layout.tsx",
671
- "app/preview/wirausaha-os/admin/page.tsx",
672
- "app/preview/wirausaha-os/admin/admin-shell-client.tsx",
673
- "app/preview/wirausaha-os/admin/businesses/page.tsx",
674
- "app/preview/wirausaha-os/admin/inventory/page.tsx",
675
- "app/preview/wirausaha-os/admin/orders/page.tsx",
676
- "app/preview/wirausaha-os/admin/customers/page.tsx",
677
- "app/preview/wirausaha-os/admin/finance/page.tsx",
678
- "app/preview/wirausaha-os/admin/staff/page.tsx",
679
- "app/preview/wirausaha-os/admin/settings/page.tsx",
771
+ "app/preview/wirausaha-os/dashboard/admin/layout.tsx",
772
+ "app/preview/wirausaha-os/dashboard/admin/page.tsx",
773
+ "app/preview/wirausaha-os/dashboard/admin/admin-shell-client.tsx",
774
+ "app/preview/wirausaha-os/dashboard/admin/businesses/page.tsx",
775
+ "app/preview/wirausaha-os/dashboard/admin/inventory/page.tsx",
776
+ "app/preview/wirausaha-os/dashboard/admin/orders/page.tsx",
777
+ "app/preview/wirausaha-os/dashboard/admin/customers/page.tsx",
778
+ "app/preview/wirausaha-os/dashboard/admin/finance/page.tsx",
779
+ "app/preview/wirausaha-os/dashboard/admin/staff/page.tsx",
780
+ "app/preview/wirausaha-os/dashboard/admin/settings/page.tsx",
680
781
  "components/templates/wirausaha/shared/site-config.ts",
681
782
  "components/templates/wirausaha/shared/types.ts",
682
783
  "components/templates/wirausaha/shared/seed.ts",
@@ -747,15 +848,15 @@
747
848
  "app/preview/riset-kit/public/page.tsx",
748
849
  "app/preview/riset-kit/public/library/page.tsx",
749
850
  "app/preview/riset-kit/public/about/page.tsx",
750
- "app/preview/riset-kit/admin/layout.tsx",
751
- "app/preview/riset-kit/admin/page.tsx",
752
- "app/preview/riset-kit/admin/admin-shell-client.tsx",
753
- "app/preview/riset-kit/admin/documents/page.tsx",
754
- "app/preview/riset-kit/admin/notes/page.tsx",
755
- "app/preview/riset-kit/admin/citations/page.tsx",
756
- "app/preview/riset-kit/admin/ai-reader/page.tsx",
757
- "app/preview/riset-kit/admin/lit-review/page.tsx",
758
- "app/preview/riset-kit/admin/settings/page.tsx",
851
+ "app/preview/riset-kit/dashboard/admin/layout.tsx",
852
+ "app/preview/riset-kit/dashboard/admin/page.tsx",
853
+ "app/preview/riset-kit/dashboard/admin/admin-shell-client.tsx",
854
+ "app/preview/riset-kit/dashboard/admin/documents/page.tsx",
855
+ "app/preview/riset-kit/dashboard/admin/notes/page.tsx",
856
+ "app/preview/riset-kit/dashboard/admin/citations/page.tsx",
857
+ "app/preview/riset-kit/dashboard/admin/ai-reader/page.tsx",
858
+ "app/preview/riset-kit/dashboard/admin/lit-review/page.tsx",
859
+ "app/preview/riset-kit/dashboard/admin/settings/page.tsx",
759
860
  "components/templates/research/shared/site-config.ts",
760
861
  "components/templates/research/shared/types.ts",
761
862
  "components/templates/research/shared/seed.ts",
@@ -1559,7 +1660,8 @@
1559
1660
  "cmd-k",
1560
1661
  "navigation",
1561
1662
  "keyboard",
1562
- "search"
1663
+ "search",
1664
+ "notion-like"
1563
1665
  ]
1564
1666
  },
1565
1667
  {
@@ -1623,6 +1725,28 @@
1623
1725
  "responsive"
1624
1726
  ]
1625
1727
  },
1728
+ {
1729
+ "slug": "three-column",
1730
+ "title": "Three-Column Layout — Sidebar/Content/Inspector",
1731
+ "category": "ui",
1732
+ "description": "ThreeColumnLayoutAdvanced — collapsible left/right + resizable widths + responsive breakpoints + PanelSection compound (Header/Items/Footer) + per-panel footer slots. Models shadcn sidebar API for the panel interior. Pair with PanelGroup/PanelMenu/PanelSeparator primitives. Trigger ≠ header (V-wave separation rule).",
1733
+ "source": "superspace",
1734
+ "docsUrl": "",
1735
+ "install": "",
1736
+ "npmPackages": [],
1737
+ "exampleCode": "",
1738
+ "agentRecipe": "Run `npx rr add three-column`. <ThreeColumnLayoutAdvanced preset=\"feature\" storageKey persistState left={…PanelSection…} center={…PanelSection unstyled…} right={…PanelSection…} leftFooter centerFooter rightFooter />. Center column SHOULD pass `unstyled` to drop sidebar tokens — body is content surface. `storageKey` MUST differ per slice or persisted widths collide.",
1739
+ "tags": [
1740
+ "ui",
1741
+ "layout",
1742
+ "three-column",
1743
+ "sidebar",
1744
+ "inspector",
1745
+ "panel-section",
1746
+ "responsive",
1747
+ "resizable"
1748
+ ]
1749
+ },
1626
1750
  {
1627
1751
  "slug": "broadcast-channel-sync",
1628
1752
  "title": "BroadcastChannel — Cross-tab Sync",
@@ -1697,23 +1821,6 @@
1697
1821
  "p0"
1698
1822
  ]
1699
1823
  },
1700
- {
1701
- "slug": "theme-preset-switcher",
1702
- "title": "Theme Preset Switcher",
1703
- "category": "ui",
1704
- "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.",
1705
- "source": "rahmanef.com",
1706
- "install": "npx rahman-resources add theme-preset-switcher",
1707
- "npmPackages": [],
1708
- "exampleCode": "",
1709
- "agentRecipe": "Run `npx rr add theme-preset-switcher`. 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.",
1710
- "tags": [
1711
- "theme",
1712
- "presets",
1713
- "oklch",
1714
- "design-system"
1715
- ]
1716
- },
1717
1824
  {
1718
1825
  "slug": "icon-picker",
1719
1826
  "title": "Icon Picker",
@@ -1730,7 +1837,8 @@
1730
1837
  "lucide",
1731
1838
  "picker",
1732
1839
  "twemoji",
1733
- "notion"
1840
+ "notion",
1841
+ "notion-like"
1734
1842
  ]
1735
1843
  },
1736
1844
  {
@@ -1911,7 +2019,7 @@
1911
2019
  "install": "npx rahman-resources add admin",
1912
2020
  "npmPackages": [],
1913
2021
  "exampleCode": "",
1914
- "agentRecipe": "Run `rr add admin`. Wire <AdminPage labels={...} /> at /admin and call buildAdminStats({ sliceRegistry, queryTable }) inside convex/features/admin/queries.ts — sliceRegistry.entries flat-maps each feature's admin.activity[] declarations. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address.",
2022
+ "agentRecipe": "Run `rr add admin`. Wire <AdminPage labels={...} /> at /admin and call buildAdminStats({ sliceRegistry, queryTable }) inside convex/features/admin/query.ts — sliceRegistry.entries flat-maps each feature's admin.activity[] declarations. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address.",
1915
2023
  "tags": [
1916
2024
  "infra",
1917
2025
  "admin",
@@ -2008,1558 +2116,2651 @@
2008
2116
  "job-search",
2009
2117
  "indonesia"
2010
2118
  ]
2011
- }
2012
- ],
2013
- "slices": [
2014
- {
2015
- "slug": "convex-auth",
2016
- "title": "Convex Auth — Multi-Provider Sign-in",
2017
- "category": "auth",
2018
- "kind": "backend",
2019
- "version": "0.2.0",
2020
- "description": "@convex-dev/auth with Password (PBKDF2-SHA256 100k, self-hosted-friendly), Anonymous (guest), Google OAuth, and Resend magic-link. Ships a production SignInPage with i18n, prop-driven provider list, and split Login/Register tabs. No Clerk.",
2021
- "source": "rahmanef63/resource-site",
2022
- "slicePath": "frontend/slices/convex-auth",
2023
- "convexPaths": [
2024
- "convex/features/auth"
2025
- ],
2026
- "npm": [
2027
- "@convex-dev/auth@^0.0.92",
2028
- "@auth/core@^0.37.4",
2029
- "resend@^4.0.0"
2030
- ],
2031
- "shadcn": [
2032
- "button",
2033
- "card",
2034
- "input",
2035
- "label",
2036
- "tabs",
2037
- "alert"
2038
- ],
2039
- "env": [
2040
- {
2041
- "name": "AUTH_RESEND_KEY",
2042
- "scope": "convex"
2043
- },
2044
- {
2045
- "name": "JWT_PRIVATE_KEY",
2046
- "scope": "convex"
2047
- },
2048
- {
2049
- "name": "JWKS",
2050
- "scope": "convex"
2051
- },
2052
- {
2053
- "name": "SITE_URL",
2054
- "scope": "convex"
2055
- },
2056
- {
2057
- "name": "AUTH_GOOGLE_ID",
2058
- "scope": "convex"
2059
- },
2060
- {
2061
- "name": "AUTH_GOOGLE_SECRET",
2062
- "scope": "convex"
2063
- }
2064
- ],
2065
- "peers": [],
2066
- "providers": [],
2067
- "tags": [
2068
- "auth",
2069
- "convex",
2070
- "password",
2071
- "magic-link",
2072
- "google",
2073
- "anonymous",
2074
- "no-clerk",
2075
- "pbkdf2"
2076
- ],
2077
- "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."
2078
2119
  },
2079
2120
  {
2080
- "slug": "doku-payment",
2081
- "title": "DOKU — Indonesia Payment",
2082
- "category": "payment",
2083
- "kind": "full",
2084
- "version": "0.1.0",
2085
- "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.",
2086
- "source": "rahmanef63/resource-site",
2087
- "slicePath": "frontend/slices/doku-payment",
2088
- "convexPaths": [
2089
- "convex/features/payment"
2090
- ],
2091
- "npm": [],
2092
- "shadcn": [
2093
- "card",
2094
- "button",
2095
- "dialog",
2096
- "input",
2097
- "label",
2098
- "select",
2099
- "badge",
2100
- "skeleton"
2101
- ],
2102
- "env": [
2103
- {
2104
- "name": "DOKU_CLIENT_ID",
2105
- "scope": "convex",
2106
- "required": true
2107
- },
2108
- {
2109
- "name": "DOKU_SECRET_KEY",
2110
- "scope": "convex",
2111
- "required": true
2112
- },
2113
- {
2114
- "name": "DOKU_IS_PRODUCTION",
2115
- "scope": "convex"
2116
- },
2117
- {
2118
- "name": "DOKU_NOTIFY_PATH",
2119
- "scope": "convex"
2120
- }
2121
- ],
2122
- "peers": [
2123
- {
2124
- "slug": "convex-auth",
2125
- "range": "^0.1",
2126
- "reason": "Order ownership requires authenticated user."
2127
- }
2128
- ],
2129
- "providers": [
2130
- "doku"
2131
- ],
2121
+ "slug": "pricing-page",
2122
+ "title": "Pricing Page",
2123
+ "category": "ui",
2124
+ "description": "Canonical pricing tier section — eyebrow + headline + 2/3/4 column tier grid with optional FAQ accordion below. Tiers fully data-driven (name/price/period/bullets/cta/featured/badge). Featured variant configurable (ring/scale/tint). Single SSOT — every saas/marketing template consumes this slice for pricing pages so admin-edited tiers propagate without per-template rewriting.",
2125
+ "source": "rahman-resources",
2126
+ "install": "npx rahman-resources add pricing-page",
2127
+ "npmPackages": [],
2128
+ "exampleCode": "",
2129
+ "agentRecipe": "Run `npx rr add pricing-page`. <PricingSection eyebrow title subtitle tiers columns faq faqTitle featuredVariant /> — only `title` + `tiers` required. Each tier: `{ id, name, price, period?, blurb?, bullets[], cta?, featured?, badge? }`. Pass `featuredVariant=\"scale\"` for a popped-forward card or `\"tint\"` for a colored background. Wire admin CRUD via your store hook → useTiers() → pass array.",
2132
2130
  "tags": [
2133
- "payment",
2134
- "doku",
2135
- "indonesia",
2136
- "qris",
2137
- "virtual-account",
2138
- "ewallet",
2139
- "checkout"
2140
- ],
2141
- "agentRecipe": "Run `npx rr add doku-payment`. 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."
2131
+ "ui",
2132
+ "pricing",
2133
+ "section",
2134
+ "marketing",
2135
+ "saas",
2136
+ "tiers",
2137
+ "faq"
2138
+ ]
2142
2139
  },
2143
2140
  {
2144
- "slug": "midtrans-payment",
2145
- "title": "Midtrans — Indonesia Payment",
2146
- "category": "payment",
2147
- "kind": "full",
2148
- "version": "0.1.0",
2149
- "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.",
2150
- "source": "rahmanef63/resource-site",
2151
- "slicePath": "frontend/slices/midtrans-payment",
2152
- "convexPaths": [
2153
- "convex/features/payment"
2154
- ],
2155
- "npm": [
2156
- "midtrans-client@^1.4.2"
2157
- ],
2158
- "shadcn": [
2159
- "card",
2160
- "button",
2161
- "dialog",
2162
- "input",
2163
- "label"
2164
- ],
2165
- "env": [
2166
- {
2167
- "name": "MIDTRANS_SERVER_KEY",
2168
- "scope": "convex",
2169
- "required": true
2170
- },
2171
- {
2172
- "name": "MIDTRANS_CLIENT_KEY",
2173
- "scope": "next-public",
2174
- "required": true
2175
- },
2176
- {
2177
- "name": "MIDTRANS_IS_PRODUCTION",
2178
- "scope": "convex"
2179
- }
2180
- ],
2181
- "peers": [
2182
- {
2183
- "slug": "convex-auth",
2184
- "range": "^0.1",
2185
- "reason": "Order ownership requires authenticated user."
2186
- }
2187
- ],
2188
- "providers": [
2189
- "midtrans"
2190
- ],
2141
+ "slug": "feature-grid",
2142
+ "title": "Feature Grid",
2143
+ "category": "ui",
2144
+ "description": "Canonical features grid section — eyebrow + headline + 1/2/3/4 column item grid in three layout variants (cards, minimal, alternating). Items accept Lucide icon component OR string label, optional image (next/image), optional link CTA. Single SSOT — every template consumes this slice for features pages so admin-edited items propagate without per-template duplication.",
2145
+ "source": "rahman-resources",
2146
+ "install": "npx rahman-resources add feature-grid",
2147
+ "npmPackages": [],
2148
+ "exampleCode": "",
2149
+ "agentRecipe": "Run `npx rr add feature-grid`. <FeatureGridSection eyebrow title subtitle items columns layout align /> — only `items` required. Each item: `{ id, title, body, icon?, image?, link? }`. `icon` can be a LucideIcon component (rendered as 5×5 inline) or a string (rendered as letter fallback). `layout=\"alternating\"` produces image+text rows that flip per index — set `image` per item for that variant.",
2191
2150
  "tags": [
2192
- "payment",
2193
- "midtrans",
2194
- "indonesia",
2195
- "qris",
2196
- "snap"
2197
- ],
2198
- "agentRecipe": "Run `npx rr add midtrans-payment`. Midtrans Snap untuk pembayaran instant. Webhook ke Convex HTTP action /api/midtrans-callback untuk update order status. Ingat: PPN 11% sudah included di amount, jangan double-count."
2151
+ "ui",
2152
+ "features",
2153
+ "section",
2154
+ "marketing",
2155
+ "grid",
2156
+ "saas"
2157
+ ]
2199
2158
  },
2200
2159
  {
2201
- "slug": "resend-newsletter",
2202
- "title": "Resend — Transactional & Newsletter",
2160
+ "slug": "landing-sections",
2161
+ "title": "Landing Sections",
2162
+ "category": "infra",
2163
+ "description": "CRUD-driven admin editor for the public landing-page composition. Ships a pure reducer + LandingProvider store adapter + admin LandingView/LandingEditorView built on the shared CRUD primitives, plus a per-section LandingSectionShell that handles background image + custom Tailwind className overlay. Sections carry { kind, order, title, subtitle, enabled, imageUrl, imageRatio, bgImageUrl, className, config (JSON) } with up/down reorder arrows. Consumers map each `kind` (hero, features, pricing, blog, changelog, testimonials, portfolio, services, stats, newsletter, faq, cta, custom) to their own renderer wrapped in <LandingSectionShell>. Canonical pattern used by all 7 rr website templates.",
2164
+ "source": "rahman-resources",
2165
+ "install": "npx rahman-resources add landing-sections",
2166
+ "npmPackages": [],
2167
+ "exampleCode": "",
2168
+ "agentRecipe": "Run `npx rr add landing-sections`. Fold `landingReducer` into your root reducer (cases LANDING_UPSERT + LANDING_DELETE), seed State.landingSections with `defaultLandingSections()`, wrap your StoreProvider with `<LandingProvider value={adapter}/>` where adapter maps {items, publicBase, adminBase, create, update, remove} from your dispatch. Mount `<LandingView/>` at `/admin/landing` and `<LandingEditorView id={params.id}/>` at `/admin/landing/[id]`. In HomePage iterate `state.landingSections.filter(s => s.enabled).sort((a,b) => a.order - b.order)` and render each through `<LandingSectionShell section={s}>` wrapping your own per-`kind` renderer.",
2169
+ "tags": [
2170
+ "admin",
2171
+ "landing",
2172
+ "cms",
2173
+ "sections",
2174
+ "crud"
2175
+ ]
2176
+ },
2177
+ {
2178
+ "slug": "faq-section",
2179
+ "title": "FAQ Section",
2180
+ "category": "ui",
2181
+ "description": "Canonical FAQ accordion section — eyebrow + headline + accordion item list. Three layouts (single column, two-column, grouped by category). Optional footer CTA (\"Still have questions?\"). Items fully data-driven. Single SSOT — every template consumes this slice for FAQ blocks so admin-edited Q&A propagates without per-template rewrite.",
2182
+ "source": "rahman-resources",
2183
+ "install": "npx rahman-resources add faq-section",
2184
+ "npmPackages": [],
2185
+ "exampleCode": "",
2186
+ "agentRecipe": "Run `npx rr add faq-section`. <FAQSection items title subtitle layout multiple defaultOpen footerCta /> — only `items` required. Each item: `{ id, q, a, category? }`. `layout=\"grouped\"` buckets by `category`. `multiple` lets users open several at once. `footerCta={{ label, href }}` wires a contact link below the accordion.",
2187
+ "tags": [
2188
+ "ui",
2189
+ "faq",
2190
+ "section",
2191
+ "accordion",
2192
+ "marketing"
2193
+ ]
2194
+ },
2195
+ {
2196
+ "slug": "testimonials-grid",
2197
+ "title": "Testimonials Grid",
2198
+ "category": "ui",
2199
+ "description": "Canonical testimonials section — quote + author + role/company + optional avatar + optional star rating. Three layouts (uniform cards grid, centered quote-stack, CSS masonry). `featured` testimonials get a ring accent. Pairs naturally with the `testimonials` backend slice (Convex queries) but has zero coupling — pass any item array.",
2200
+ "source": "rahman-resources",
2201
+ "install": "npx rahman-resources add testimonials-grid",
2202
+ "npmPackages": [],
2203
+ "exampleCode": "",
2204
+ "agentRecipe": "Run `npx rr add testimonials-grid`. <TestimonialsGridSection items title subtitle columns layout align /> — only `items` required. Each item: `{ id, quote, author, role?, company?, avatar?, rating?, featured? }`. `layout=\"quote-stack\"` renders a centered no-card scroll for editorial sites. `layout=\"masonry\"` uses CSS columns for variable-height quotes.",
2205
+ "tags": [
2206
+ "ui",
2207
+ "testimonials",
2208
+ "section",
2209
+ "marketing",
2210
+ "social-proof",
2211
+ "saas"
2212
+ ]
2213
+ },
2214
+ {
2215
+ "slug": "blog-section",
2216
+ "title": "Blog Section",
2217
+ "category": "ui",
2218
+ "description": "Canonical blog list + detail section. <BlogListSection> renders 3 layouts (cards grid, minimal list, featured-split with hero + side rail). <BlogPostView> renders the single-post page with cover + meta + paragraph-split body. Both pass through `hrefFor`/`backHref` so each template controls routing — single SSOT for /blog and /blog/[slug] across all templates.",
2219
+ "source": "rahman-resources",
2220
+ "install": "npx rahman-resources add blog-section",
2221
+ "npmPackages": [],
2222
+ "exampleCode": "",
2223
+ "agentRecipe": "Run `npx rr add blog-section`. <BlogListSection posts hrefFor title columns layout limit /> for /blog — `hrefFor(post)` returns the per-post URL. <BlogPostView post backHref renderBody /> for /blog/[slug] — `renderBody` defaults to paragraph-split on `\\n\\n` (swap for an MDX renderer if you use mdx-blog).",
2224
+ "tags": [
2225
+ "ui",
2226
+ "blog",
2227
+ "section",
2228
+ "marketing",
2229
+ "content",
2230
+ "list",
2231
+ "detail"
2232
+ ]
2233
+ },
2234
+ {
2235
+ "slug": "changelog-feed",
2236
+ "title": "Changelog Feed",
2237
+ "category": "ui",
2238
+ "description": "Canonical /changelog or /whats-new section. Entries support 5 kinds (feature/improvement/fix/chore/breaking) with color-coded badges. Three layouts (timeline with date-rail, large cards, minimal list). Optional `limit` for \"Recent updates\" excerpts on home pages. Optional `groups` per entry for sub-sectioned bullet lists.",
2239
+ "source": "rahman-resources",
2240
+ "install": "npx rahman-resources add changelog-feed",
2241
+ "npmPackages": [],
2242
+ "exampleCode": "",
2243
+ "agentRecipe": "Run `npx rr add changelog-feed`. <ChangelogFeedSection entries title subtitle layout sortDescending limit /> — only `entries` required. Each entry: `{ id, version, date, kind, title, body, bullets?, groups? }`. `layout=\"timeline\"` adds a left date-rail; `layout=\"list\"` is the most compact. Pass `limit={3}` on home pages to show recent releases.",
2244
+ "tags": [
2245
+ "ui",
2246
+ "changelog",
2247
+ "section",
2248
+ "saas",
2249
+ "release-notes",
2250
+ "marketing"
2251
+ ]
2252
+ },
2253
+ {
2254
+ "slug": "portfolio-section",
2255
+ "title": "Portfolio Section",
2256
+ "category": "ui",
2257
+ "description": "Canonical portfolio list + detail section. <PortfolioListSection> renders 3 layouts (uniform 16:9 grid, CSS masonry, asymmetric with featured hero). <PortfolioDetailView> renders title + meta + cover + body + gallery + external link + related items. Both pass through `hrefFor`/`backHref` so each template controls routing — single SSOT for /portfolio and /portfolio/[slug] across agency-studio and personal-brand.",
2258
+ "source": "rahman-resources",
2259
+ "install": "npx rahman-resources add portfolio-section",
2260
+ "npmPackages": [],
2261
+ "exampleCode": "",
2262
+ "agentRecipe": "Run `npx rr add portfolio-section`. <PortfolioListSection items hrefFor title columns layout limit /> for /portfolio — each item `{ id, slug, title, summary?, year?, client?, role?, tags?, cover: {src,alt}, gallery?, link? }`. <PortfolioDetailView item backHref renderBody related hrefForRelated /> for /portfolio/[slug] — `renderBody` defaults to paragraph split; override for project-specific layouts (problem/approach/result, brief/outcome, etc).",
2263
+ "tags": [
2264
+ "ui",
2265
+ "portfolio",
2266
+ "section",
2267
+ "marketing",
2268
+ "case-study",
2269
+ "list",
2270
+ "detail"
2271
+ ]
2272
+ },
2273
+ {
2274
+ "slug": "theme-presets",
2275
+ "title": "Theme Presets — unified switcher with bundled tweakcn registry",
2276
+ "category": "ui",
2277
+ "description": "Single unified theme controller for next-themes apps. ThemePresetSwitcher ships a Palette-icon Popover trigger with three stacked sections: (1) sticky light/dark/system mode tabs, (2) sticky preset-count row with a Default reset button, (3) scrollable color-preset list grouped by mood (Profesional / Bold / Hangat / Artistik / Gelap + Lainnya). Hover-to-preview + click-to-commit + restore-on-close semantics. ThemePresetProvider context wraps state so deeply-nested consumers read via useThemePreset() instead of mounting the switcher directly. ThemeColorSync wrapper enables live tweakcn-CSS-variable preview on routes that need it. Tweakcn registry (~30 curated presets after HIDDEN_PRESETS filter drops Doom 64 / Cyberpunk / Neo Brutalism / Bubblegum / Candyland / Pastel Dreams) ships inside the slice as registry-data.json and loads lazily via dynamic import — code-splits into its own chunk, zero consumer public/ setup, no network roundtrip to a hosted URL. localStorage key `host:theme-preset` (rename via slice fork). CK-1F (2026-05-23) — collapsed prior TweakcnSwitcher + ThemePicker + phantom `theme-preset-switcher` catalog entry into this single component.",
2278
+ "source": "CareerPack + notion-page-clone",
2279
+ "install": "npx rahman-resources add theme-presets",
2280
+ "npmPackages": [],
2281
+ "exampleCode": "",
2282
+ "agentRecipe": "Run `npx rr add theme-presets` (registry-data.json ships inside the slice — no separate public/ copy step). Wrap your tree once with `<ThemePresetProvider>` (inside next-themes' ThemeProvider). Mount `<ThemePresetSwitcher />` anywhere in your header / sidebar / settings — one component handles light/dark/system + preset palette. Wrap dashboard with `<ThemeColorSync>` if you need live tweakcn variable preview on inner routes. Deeply-nested consumers read state via `useThemePreset()` (returns `{ presetName, registry, setPreset, preview, restore, isReady }`). For lower-level access: `applyTweakcnPreset(name)`, `previewTweakcnPreset(name)`, `restoreTweakcnPreset()`, `groupTweakcnPresets(items)`, `tweakcnSwatches(preset)` all exported from `@/features/theme-presets`. To rename localStorage key, fork `STORAGE_KEY` in `lib/tweakcn/types.ts`.",
2283
+ "tags": [
2284
+ "ui",
2285
+ "theme",
2286
+ "tweakcn",
2287
+ "color",
2288
+ "preset",
2289
+ "switcher",
2290
+ "popover",
2291
+ "next-themes",
2292
+ "notion-like"
2293
+ ]
2294
+ },
2295
+ {
2296
+ "slug": "files",
2297
+ "title": "Files — pluggable upload + URL resolver with storage-adapter contract",
2298
+ "category": "data",
2299
+ "description": "Host-pluggable file upload + URL resolution. Ships <FileUploadButton>, <FileChip>, useFileUpload(), useFileUrl() — all reading from a FilesAdapter the host wires via <FilesAdapterProvider>. Bundled localStorage demo adapter stores blobs as data URLs (small files only). Drop in your own adapter for Convex / S3 / GCS / R2. The slice itself has zero backend coupling, proving the storage-adapter pattern for the rest of the open-silong blocked-pending-adapter wave (cover, workspace-io, templates, …).",
2300
+ "source": "notion-page-clone",
2301
+ "install": "npx rahman-resources add files",
2302
+ "npmPackages": [],
2303
+ "exampleCode": "",
2304
+ "agentRecipe": "Run `npx rr add files`. Wrap your tree with `<FilesAdapterProvider adapter={...}>` — pass `useLocalStorageFilesAdapter()` for a quick demo or implement `FilesAdapter` (upload + remove + useUrl) against your backend. Then drop `<FileUploadButton onUploaded={...}>` anywhere; pair with `<FileChip fileRef={...}>` for rendered chips. Hooks: `useFileUpload()` returns `{upload, uploading, progress, removeFromStorage}`; `useFileUrl(storageId)` resolves to a fetchable URL (Convex adapter uses useQuery for live invalidation; demo reads localStorage synchronously). To wire S3: implement the FilesAdapter interface with presigned URLs + DELETE; the slice doesn't care which backend you pick.",
2305
+ "tags": [
2306
+ "data",
2307
+ "upload",
2308
+ "files",
2309
+ "storage",
2310
+ "adapter",
2311
+ "portable",
2312
+ "notion-like"
2313
+ ]
2314
+ },
2315
+ {
2316
+ "slug": "equation",
2317
+ "title": "Equation — Notion-style KaTeX block primitive",
2318
+ "category": "ui",
2319
+ "description": "Inline-or-display LaTeX equation block — Notion-inspired primitive. KaTeX-rendered with edit/preview toggle, raw-text fallback when KaTeX fails to parse. Pure UI primitive (zero Convex tables, zero global state). Lifted from notion-page-clone (Nosion). Use standalone OR bundled via the notion-blocks bundle. Drop into any React surface — docs, marketing landing, editor.",
2320
+ "source": "notion-page-clone",
2321
+ "install": "npx rahman-resources add equation",
2322
+ "npmPackages": [],
2323
+ "exampleCode": "",
2324
+ "agentRecipe": "Run `npx rr add equation`. Single npm dep: katex. Import `import { EquationBlock } from \"@/features/equation\"`. Props-driven: pass `value` (LaTeX string) + `onChange`. For display-mode (block-level) pass `displayMode`. Renders raw text if KaTeX parse fails. Bundled inside notion-blocks if you also want code/notify/drag-fill.",
2325
+ "tags": [
2326
+ "ui",
2327
+ "notion",
2328
+ "notion-like",
2329
+ "equation",
2330
+ "katex",
2331
+ "latex",
2332
+ "math",
2333
+ "block",
2334
+ "primitive",
2335
+ "editor"
2336
+ ]
2337
+ },
2338
+ {
2339
+ "slug": "code-block",
2340
+ "title": "Code Block — Notion-style syntax-highlighted code primitive",
2341
+ "category": "ui",
2342
+ "description": "Highlight.js-powered code block — Notion-inspired primitive. Language selector dropdown (auto-detect + 50+ language packs), copy-to-clipboard button, line-wrap toggle. Pure-UI primitive — no Convex tables. Lifted from notion-page-clone (Nosion). Use standalone OR bundled via notion-blocks.",
2343
+ "source": "notion-page-clone",
2344
+ "install": "npx rahman-resources add code-block",
2345
+ "npmPackages": [],
2346
+ "exampleCode": "",
2347
+ "agentRecipe": "Run `npx rr add code-block`. Single npm dep: highlight.js. Import `import { CodeBlock, languageLabel } from \"@/features/code-block\"`. Props: `value` + `onChange` + `language` + `onLanguageChange`. Bundled inside notion-blocks if you also want equation/notify/drag-fill.",
2348
+ "tags": [
2349
+ "ui",
2350
+ "notion",
2351
+ "notion-like",
2352
+ "code",
2353
+ "syntax",
2354
+ "highlight",
2355
+ "highlight.js",
2356
+ "block",
2357
+ "primitive",
2358
+ "editor"
2359
+ ]
2360
+ },
2361
+ {
2362
+ "slug": "notifications",
2363
+ "title": "Notifications — Notion-style per-page Notify Me",
2364
+ "category": "ui",
2365
+ "description": "Pure-client per-page subscription primitive — Notion-inspired bell button + popover. State stored in localStorage (no backend needed). Shipped as a `NotifyMePopover` toggled from a page-action bell. Frequency choices: instant / daily digest / weekly digest. Lifted from notion-page-clone (Nosion). Use standalone OR bundled via notion-blocks.",
2366
+ "source": "notion-page-clone",
2367
+ "install": "npx rahman-resources add notifications",
2368
+ "npmPackages": [],
2369
+ "exampleCode": "",
2370
+ "agentRecipe": "Run `npx rr add notifications`. Zero npm deps (only shadcn button + popover). Import `import { NotifyMePopover, useSubscription } from \"@/features/notifications\"`. Drop the popover anywhere; useSubscription(pageId) hook returns `{ isSubscribed, frequency, subscribe, unsubscribe, setFrequency }` reading from localStorage. To wire a real backend, swap the localStorage hook for your own.",
2371
+ "tags": [
2372
+ "ui",
2373
+ "notion",
2374
+ "notion-like",
2375
+ "notifications",
2376
+ "subscribe",
2377
+ "notify",
2378
+ "bell",
2379
+ "popover",
2380
+ "localstorage",
2381
+ "primitive"
2382
+ ]
2383
+ },
2384
+ {
2385
+ "slug": "database-cell-selection",
2386
+ "title": "Database Cell Selection — Notion-style drag-fill + multi-select",
2387
+ "category": "ui",
2388
+ "description": "Notion-style grid cell interaction primitives: drag-fill (Sheets/Excel-style range fill), multi-cell selection with shift-click + arrow-key extension, paste-from-clipboard column adapter. Pure-UI hooks + components, no Convex tables. Lifted from notion-page-clone (Nosion). Pair with any tabular UI (notion-shell databases, ag-grid, custom React table, etc.).",
2389
+ "source": "notion-page-clone",
2390
+ "install": "npx rahman-resources add database-cell-selection",
2391
+ "npmPackages": [],
2392
+ "exampleCode": "",
2393
+ "agentRecipe": "Run `npx rr add database-cell-selection`. Zero deps. Import `import { useDragFill, SelectableCell, useCellSelection } from \"@/features/database-cell-selection\"`. Wrap your grid container with the selection hook; per-cell `<SelectableCell row col>` provides the click-and-drag affordance. Drag handles supplied by useDragFill. Composable with notion-shell's NotionDatabase or any custom grid.",
2394
+ "tags": [
2395
+ "ui",
2396
+ "notion",
2397
+ "notion-like",
2398
+ "database",
2399
+ "grid",
2400
+ "cell",
2401
+ "selection",
2402
+ "drag-fill",
2403
+ "spreadsheet",
2404
+ "primitive",
2405
+ "table"
2406
+ ]
2407
+ },
2408
+ {
2409
+ "slug": "notion-database",
2410
+ "title": "Notion-like Database Table — full table with import/export (11 views · 16 cells · CSV + JSON)",
2411
+ "category": "ui",
2412
+ "description": "Portable Notion-style database table surface — full capability in one slice. Optional companion to notion-shell — install shell alone for pages + sidebar + block editor, add notion-database when you want embedded databases with full table capability. Ships NotionDatabase (full DB UI w/ ViewTabs + ViewOptions + per-column menu + FilterBuilder/SortBuilder popovers), NotionProperty (value + schema editor), 16 property-cell types (text / number / checkbox / select / multi_select / status / date / url / email / phone / files / person / formula / created_time / last_edited_time / unique_id), 11 built-in views: Table / Board / List / Gallery / Calendar / Feed PLUS Chart (recharts bar/line/area/pie/donut + inline kind/X/agg/Y pickers) / Dashboard (KPI strip + group breakdowns + recent updates) / Form (public-facing submit-to-create — title + per-property inputs, optional required-field validation, configurable show/hide + success message via inline Settings panel) / Map (SVG world + lat/lng pins, no leaflet) / Timeline (Gantt-style with drag-to-shift / drag-to-resize). FilterBuilder + SortBuilder exported standalone for toolbar embedding. Formula cells use a pure expression engine ({{title}}/{{prop}} interpolation + concat/upper/lower/round/if/etc fns + `=expr` math). Files cells store URL refs (paste-URL workflow; host can plug `files` slice adapter for upload). Person cells are simplified vs upstream — no user directory lookup, just initials chips. Created_time / last_edited_time read row.createdAt / row.updatedAt directly. unique_id auto-derives from row position + optional prefix. Pure helpers: applyView, groupBy, bucketByDate. Domain types live in notion-shell (single source of truth — Page.rowOfDatabaseId + rowProps reference them) and re-exported here. Relation + rollup property types deferred to upstream open-silong mega-bundle (need cross-DB context). v0.5 added drop-in Convex backend templates (dual-mode: minimal single-user OR full multi-workspace) from open-silong's template-base/. v0.6 (Phase 7.10) merges former database-io slice in-tree: DatabaseIOActions toolbar (Export CSV/JSON · Import CSV/JSON · Download dynamic CSV/JSON templates), CsvImportDialog (auto-map columns + create-new-of-type picker), JsonImportDialog (schema diff + import), exportDatabase / exportDatabaseToCsv / parseExport / parseCsv / buildCsvTemplate / buildJsonTemplate helpers — all from `@/features/notion-database`. CsvNewProperty + JsonImportResult.newProperties now expose `tempId` so host can remap rowProps keys when persisting (single import handler serves both formats). Cell editor UX consolidated v0.5.3 — SelectCell + MultiSelectCell share OptionPicker (shared/identical popover: search-as-create + per-option rename/color/delete). Property-type lists single-source via PROPERTY_TYPE_META registry (v0.5.2).",
2413
+ "source": "open-silong",
2414
+ "install": "npx rahman-resources add notion-database",
2415
+ "npmPackages": [],
2416
+ "exampleCode": "",
2417
+ "agentRecipe": "Run `npx rr add notion-database` (cascades notion-shell as peer). Import: `import { NotionDatabase, NotionProperty, VIEW_REGISTRY, DatabaseIOActions } from \"@/features/notion-database\"`. NotionDatabase ships full props-driven DB UI — host owns rows + dispatches CRUD callbacks. For just one view in isolation, import the specific view component (TableView / BoardView / etc.). Property cells auto-render via renderPropertyCell helper. Pure helpers: applyView / groupBy / bucketByDate. For import/export, mount `<DatabaseIOActions db={db} rows={rows} onImport={async ({ newProperties, rows }) => { const tempToReal: Record<string, string> = {}; for (const np of newProperties) { const realId = await dispatchAddProperty(np); tempToReal[np.tempId] = realId; } for (const r of rows) { const rowId = await dispatchAddRow(r.title); for (const [propKey, v] of Object.entries(r.rowProps)) { await dispatchSetValue(rowId, tempToReal[propKey] ?? propKey, v); } } }} />` next to your DB toolbar — exports CSV/JSON + imports w/ schema diff + downloads dynamic templates from live db.properties. tempId on each new property lets host remap rowProps keys to its real backend ids. For backend persistence, copy template-base/database-silong/convex/ from the open-silong repo: handlers go to convex/, schema fragment merges into convex/schema.ts. Pick _shared/minimal/ (single-user, noop authz) or _shared/full/ (requires @convex-dev/auth + workspaces tables). See CONVEX-BACKEND.md.",
2418
+ "tags": [
2419
+ "ui",
2420
+ "notion",
2421
+ "notion-like",
2422
+ "database",
2423
+ "table",
2424
+ "board",
2425
+ "list",
2426
+ "gallery",
2427
+ "calendar",
2428
+ "feed",
2429
+ "chart",
2430
+ "dashboard",
2431
+ "form",
2432
+ "map",
2433
+ "timeline",
2434
+ "gantt",
2435
+ "kanban",
2436
+ "views",
2437
+ "filter",
2438
+ "sort",
2439
+ "property",
2440
+ "files",
2441
+ "person",
2442
+ "formula",
2443
+ "timestamp",
2444
+ "unique-id",
2445
+ "csv",
2446
+ "json",
2447
+ "import",
2448
+ "export",
2449
+ "template",
2450
+ "data",
2451
+ "backup",
2452
+ "primitive",
2453
+ "optional",
2454
+ "embeddable"
2455
+ ]
2456
+ },
2457
+ {
2458
+ "slug": "database-io",
2459
+ "title": "[DEPRECATED] Database IO — merged into notion-database v0.6",
2460
+ "category": "ui",
2461
+ "description": "DEPRECATED — all functionality merged into `notion-database` v0.6 (Phase 7.10, 2026-05-22). This slice is now a thin re-export shim from `@/features/notion-database` to keep existing consumers compiling. New code should `npx rr add notion-database` (now bundles CSV + JSON import/export + dynamic templates) instead of installing this separately. Slice will be removed in v1.0. Original surface (DatabaseIOActions / CsvImportDialog / JsonImportDialog / exportDatabase / buildCsvTemplate / buildJsonTemplate) remains exported from notion-database — see its catalog entry. Merge rationale: 100% peer coupling to notion-database (every file imported Database/Page/Property types from it) + zero independent install path (always installed alongside notion-database in practice) = no modularity benefit from separation.",
2462
+ "source": "notion-page-clone",
2463
+ "install": "npx rahman-resources add database-io",
2464
+ "npmPackages": [],
2465
+ "exampleCode": "",
2466
+ "agentRecipe": "⚠️ DEPRECATED — use `npx rr add notion-database` (now bundles import/export). This slice is a thin re-export shim from `@/features/notion-database` for back-compat. New code: `import { DatabaseIOActions } from \"@/features/notion-database\"`. Remove when migration complete; slice scheduled for removal in v1.0.",
2467
+ "tags": [
2468
+ "ui",
2469
+ "notion",
2470
+ "notion-like",
2471
+ "database",
2472
+ "csv",
2473
+ "json",
2474
+ "import",
2475
+ "export",
2476
+ "template",
2477
+ "data",
2478
+ "backup",
2479
+ "spreadsheet",
2480
+ "wire-format",
2481
+ "primitive",
2482
+ "optional"
2483
+ ]
2484
+ },
2485
+ {
2486
+ "slug": "notion-shell",
2487
+ "title": "Notion Shell — page + sidebar + block editor primitives (pure, no database)",
2488
+ "category": "ui",
2489
+ "description": "Portable Notion-style PAGE + SIDEBAR + BLOCK editor primitives. CI-wave (2026-05-21) split the database surface out — install the optional `notion-database` peer for embedded TableView / BoardView / ListView / GalleryView / CalendarView / FeedView, NotionDatabase, NotionProperty, ViewTabs, ViewOptions, ColumnHeaderMenu, property-cells. notion-shell alone gives you Notion-clone pages + sidebar + editor without the database weight. Domain types (Database, Property, PropertyValue, DbView, DatabaseViewConfig, DatabaseFilter, DatabaseSort) remain in notion-shell as the single source of truth (Page.rowOfDatabaseId + rowProps reference them). FULL OLD DESC BELOW: Portable Notion-style wrapper primitives. PAGE EDITOR: NotionPage (optional cover image band + header + body), NotionHeader / NotionSidebar / NotionBlock (live inline-markdown decorator, hover actions menu, optional dragHandle slot), SlashMenu (searchable block-type picker w/ keyboard nav), BlockActionsMenu (turn-into / duplicate / delete), InsertBlockButton (`+` trigger w/ SlashMenu), SortableBlockList (@dnd-kit render-prop wrapper for block reorder), PageActionsMenu (header dropdown: cover/favorite/duplicate/export/trash). DATABASE: NotionDatabase (full DB surface w/ tabs + options + per-column menu), NotionProperty (10 property-cell types), 6 built-in views (Table/Board/List/Gallery/Calendar/Feed), ViewTabs, ViewOptions (sort + filter + search popover), ColumnHeaderMenu. SPECIALISED BLOCK RENDERERS: ImageRenderer (URL + caption + preview), EmbedRenderer (YouTube/Vimeo/Loom/Figma/CodePen/Spotify auto-detect + iframe fallback). Pure helpers: applyView, groupBy, bucketByDate. Pure / props-driven — host owns data + change handlers.",
2490
+ "source": "notion-page-clone",
2491
+ "install": "npx rahman-resources add notion-shell",
2492
+ "npmPackages": [],
2493
+ "exampleCode": "",
2494
+ "agentRecipe": "Run `npx rr add notion-shell` for the portable UI wrappers ONLY (no backend). NPM deps: @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/utilities. Import: `import { NotionPage, NotionSidebar, NotionBlock, NotionDatabase, SortableBlockList, PageActionsMenu, InsertBlockButton, ViewTabs, ImageRenderer, EmbedRenderer } from \"@/features/notion-shell\"`. NotionBlock ships slash menu + decorator + actions menu + dragHandle slot. NotionPage ships optional cover prop. SortableBlockList wraps a render-prop callback `(id, dragProps) => <NotionBlock dragHandle={...} />`. NotionDatabase ships 6 views via VIEW_REGISTRY. Property cells: text/number/checkbox/select/multi-select/status/date/url/email/phone all built in. For rich icon UX wire `renderIcon` + `renderIconPicker` to `@/features/icon-picker`. **PRODUCT POINTER: the full Convex-backed Notion-clone OS (multi-workspace + auth + sharing + comments + snapshots + MCP) lives at https://github.com/rahmanef63/open-silong — clone that repo for the production stack; use this slice when you only need to embed the Notion-style UI in another project.**",
2495
+ "tags": [
2496
+ "ui",
2497
+ "notion",
2498
+ "shell",
2499
+ "wrapper",
2500
+ "sidebar",
2501
+ "page",
2502
+ "database",
2503
+ "primitive",
2504
+ "portable",
2505
+ "slash-menu",
2506
+ "decorator",
2507
+ "wysiwyg",
2508
+ "views",
2509
+ "kanban",
2510
+ "calendar",
2511
+ "gallery",
2512
+ "drag",
2513
+ "cover",
2514
+ "embed",
2515
+ "image",
2516
+ "notion-like"
2517
+ ]
2518
+ },
2519
+ {
2520
+ "slug": "workspace-shell",
2521
+ "title": "Workspace Shell — atomic (workspace × menuSet) NavContext",
2522
+ "category": "ui",
2523
+ "description": "Unified workspace + menu navigation primitive. NavContext = (workspaceId, menuSetId) atomic pair. 2-tier dropdown switcher (workspace radio + menuSet picker), ContextBadge header chip, full editor with tabs (menus / workspace tree / settings), tiered RBAC (admin menus.manage, user menus.fork). Replaces silo'd menu-store + workspace-store slices in superspace. Resolver chain: user nav-context cache > user assignment > workspace default > system. Source: superspace.",
2524
+ "source": "superspace",
2525
+ "docsUrl": "",
2526
+ "install": "",
2527
+ "npmPackages": [],
2528
+ "exampleCode": "",
2529
+ "agentRecipe": "Run `npx rr add workspace-shell`. Tables prefixed `workspaceShell_*` (menuSets, menuItems, itemComponents, wsAssignments, userAssignments, rolePerms, navContext). Mount `<NavContextProvider workspaceId={wsId}>` inside your auth provider; use `useNavContext(wsId)` to read `{workspace, menuSet, source, effectiveMenuItems, setMenuSet, forkMenuSet}`. Drop-in `<WorkspaceSwitcher canFork />` in sidebar header. Tiered RBAC: `menus.manage` for workspace-default editing, `menus.fork` for user-personal copy. Resolver chain: user cache → user assignment → workspace default → none. Pair with audit-log slice for context-switch / fork events (graceful try/catch if absent). Effective items query applies role filter via workspaceShell_rolePerms (no rolePerms → show all, pre-RBAC compat).",
2530
+ "tags": [
2531
+ "ui",
2532
+ "navigation",
2533
+ "workspace",
2534
+ "menu",
2535
+ "shell",
2536
+ "convex",
2537
+ "rbac"
2538
+ ]
2539
+ }
2540
+ ],
2541
+ "slices": [
2542
+ {
2543
+ "slug": "convex-auth",
2544
+ "title": "Convex Auth — Multi-Provider Sign-in",
2545
+ "category": "auth",
2546
+ "kind": "backend",
2547
+ "version": "0.2.0",
2548
+ "description": "@convex-dev/auth with Password (PBKDF2-SHA256 100k, self-hosted-friendly), Anonymous (guest), Google OAuth, and Resend magic-link. Ships a production SignInPage with i18n, prop-driven provider list, and split Login/Register tabs. No Clerk.",
2549
+ "source": "rahmanef63/resource-site",
2550
+ "slicePath": "frontend/slices/convex-auth",
2551
+ "convexPaths": [
2552
+ "convex/features/auth"
2553
+ ],
2554
+ "npm": [
2555
+ "@convex-dev/auth@^0.0.92",
2556
+ "@auth/core@^0.37.4",
2557
+ "resend@^4.0.0"
2558
+ ],
2559
+ "shadcn": [
2560
+ "button",
2561
+ "card",
2562
+ "input",
2563
+ "label",
2564
+ "tabs",
2565
+ "alert"
2566
+ ],
2567
+ "env": [
2568
+ {
2569
+ "name": "AUTH_RESEND_KEY",
2570
+ "scope": "convex"
2571
+ },
2572
+ {
2573
+ "name": "JWT_PRIVATE_KEY",
2574
+ "scope": "convex"
2575
+ },
2576
+ {
2577
+ "name": "JWKS",
2578
+ "scope": "convex"
2579
+ },
2580
+ {
2581
+ "name": "SITE_URL",
2582
+ "scope": "convex"
2583
+ },
2584
+ {
2585
+ "name": "AUTH_GOOGLE_ID",
2586
+ "scope": "convex"
2587
+ },
2588
+ {
2589
+ "name": "AUTH_GOOGLE_SECRET",
2590
+ "scope": "convex"
2591
+ }
2592
+ ],
2593
+ "peers": [],
2594
+ "providers": [],
2595
+ "tags": [
2596
+ "auth",
2597
+ "convex",
2598
+ "password",
2599
+ "magic-link",
2600
+ "google",
2601
+ "anonymous",
2602
+ "no-clerk",
2603
+ "pbkdf2"
2604
+ ],
2605
+ "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."
2606
+ },
2607
+ {
2608
+ "slug": "doku-payment",
2609
+ "title": "DOKU — Indonesia Payment",
2610
+ "category": "payment",
2611
+ "kind": "full",
2612
+ "version": "0.1.0",
2613
+ "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.",
2614
+ "source": "rahmanef63/resource-site",
2615
+ "slicePath": "frontend/slices/doku-payment",
2616
+ "convexPaths": [
2617
+ "convex/features/payment"
2618
+ ],
2619
+ "npm": [],
2620
+ "shadcn": [
2621
+ "card",
2622
+ "button",
2623
+ "dialog",
2624
+ "input",
2625
+ "label",
2626
+ "select",
2627
+ "badge",
2628
+ "skeleton"
2629
+ ],
2630
+ "env": [
2631
+ {
2632
+ "name": "DOKU_CLIENT_ID",
2633
+ "scope": "convex",
2634
+ "required": true
2635
+ },
2636
+ {
2637
+ "name": "DOKU_SECRET_KEY",
2638
+ "scope": "convex",
2639
+ "required": true
2640
+ },
2641
+ {
2642
+ "name": "DOKU_IS_PRODUCTION",
2643
+ "scope": "convex"
2644
+ },
2645
+ {
2646
+ "name": "DOKU_NOTIFY_PATH",
2647
+ "scope": "convex"
2648
+ }
2649
+ ],
2650
+ "peers": [
2651
+ {
2652
+ "slug": "convex-auth",
2653
+ "range": "^0.1",
2654
+ "reason": "Order ownership requires authenticated user."
2655
+ }
2656
+ ],
2657
+ "providers": [
2658
+ "doku"
2659
+ ],
2660
+ "tags": [
2661
+ "payment",
2662
+ "doku",
2663
+ "indonesia",
2664
+ "qris",
2665
+ "virtual-account",
2666
+ "ewallet",
2667
+ "checkout"
2668
+ ],
2669
+ "agentRecipe": "Run `npx rr add doku-payment`. 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."
2670
+ },
2671
+ {
2672
+ "slug": "midtrans-payment",
2673
+ "title": "Midtrans — Indonesia Payment",
2674
+ "category": "payment",
2675
+ "kind": "full",
2676
+ "version": "0.1.0",
2677
+ "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.",
2678
+ "source": "rahmanef63/resource-site",
2679
+ "slicePath": "frontend/slices/midtrans-payment",
2680
+ "convexPaths": [
2681
+ "convex/features/payment"
2682
+ ],
2683
+ "npm": [
2684
+ "midtrans-client@^1.4.2"
2685
+ ],
2686
+ "shadcn": [
2687
+ "card",
2688
+ "button",
2689
+ "dialog",
2690
+ "input",
2691
+ "label"
2692
+ ],
2693
+ "env": [
2694
+ {
2695
+ "name": "MIDTRANS_SERVER_KEY",
2696
+ "scope": "convex",
2697
+ "required": true
2698
+ },
2699
+ {
2700
+ "name": "MIDTRANS_CLIENT_KEY",
2701
+ "scope": "next-public",
2702
+ "required": true
2703
+ },
2704
+ {
2705
+ "name": "MIDTRANS_IS_PRODUCTION",
2706
+ "scope": "convex"
2707
+ }
2708
+ ],
2709
+ "peers": [
2710
+ {
2711
+ "slug": "convex-auth",
2712
+ "range": "^0.1",
2713
+ "reason": "Order ownership requires authenticated user."
2714
+ }
2715
+ ],
2716
+ "providers": [
2717
+ "midtrans"
2718
+ ],
2719
+ "tags": [
2720
+ "payment",
2721
+ "midtrans",
2722
+ "indonesia",
2723
+ "qris",
2724
+ "snap"
2725
+ ],
2726
+ "agentRecipe": "Run `npx rr add midtrans-payment`. Midtrans Snap untuk pembayaran instant. Webhook ke Convex HTTP action /api/midtrans-callback untuk update order status. Ingat: PPN 11% sudah included di amount, jangan double-count."
2727
+ },
2728
+ {
2729
+ "slug": "resend-newsletter",
2730
+ "title": "Resend — Transactional & Newsletter",
2203
2731
  "category": "email",
2204
2732
  "kind": "backend",
2205
2733
  "version": "0.1.0",
2206
- "description": "Transactional email + newsletter blast via Resend. Double opt-in flow + audience segmentation. Magic-link delivery for Convex Auth.",
2734
+ "description": "Transactional email + newsletter blast via Resend. Double opt-in flow + audience segmentation. Magic-link delivery for Convex Auth.",
2735
+ "source": "rahmanef63/resource-site",
2736
+ "slicePath": "frontend/slices/resend-newsletter",
2737
+ "convexPaths": [
2738
+ "convex/features/newsletter"
2739
+ ],
2740
+ "npm": [
2741
+ "resend@^4.0.0"
2742
+ ],
2743
+ "shadcn": [
2744
+ "button",
2745
+ "card",
2746
+ "input",
2747
+ "label",
2748
+ "textarea"
2749
+ ],
2750
+ "env": [
2751
+ {
2752
+ "name": "RESEND_API_KEY",
2753
+ "scope": "convex",
2754
+ "required": true
2755
+ },
2756
+ {
2757
+ "name": "RESEND_FROM",
2758
+ "scope": "convex",
2759
+ "required": true
2760
+ }
2761
+ ],
2762
+ "peers": [],
2763
+ "providers": [],
2764
+ "tags": [
2765
+ "email",
2766
+ "newsletter",
2767
+ "resend"
2768
+ ],
2769
+ "agentRecipe": "Run `npx rr add resend-newsletter`. Use Resend Audiences API for newsletter — store subscriber emails in Convex too for segmentation. Double opt-in: subscriber.create with status 'pending' → click link → status 'confirmed'."
2770
+ },
2771
+ {
2772
+ "slug": "ai-chat",
2773
+ "title": "AI Chat — Workbench / Sidebar / Search",
2774
+ "category": "ai",
2775
+ "kind": "full",
2776
+ "version": "0.1.0",
2777
+ "description": "One conversational AI feature, three render modes. Same Convex backend (threads + streaming + tool calls + RAG), pick the surface via prop:\n\n • workbench — Claude.ai / ChatGPT three-column page (default)\n • sidebar — collapsible copilot panel inside another CRUD app\n • search — single-question + answer + citations (Perplexity)\n\nUse cases:\n – Customer-support chatbot embedded in your marketing site\n – Developer copilot in your PR/docs admin\n – Knowledge-base search over your blog + docs corpus\n – Internal AI assistant in your dashboard\n\nWhat it ships: multi-provider (Anthropic / OpenAI / Google / Mistral / Ollama), multimodal (text + image + PDF + audio), typed tool calls with inline inspector, agent mode (plan→execute→reflect), branching threads, RAG citations, resumable streams, usage telemetry. Public surface = consumer chat; admin surface = persona, fallback, guardrails per-bot.",
2778
+ "source": "rahmanef63/resource-site",
2779
+ "slicePath": "frontend/slices/ai-chat",
2780
+ "convexPaths": [
2781
+ "convex/features/ai"
2782
+ ],
2783
+ "npm": [
2784
+ "ai@^4.0.0",
2785
+ "@ai-sdk/anthropic@^0.0.50",
2786
+ "@ai-sdk/openai@^0.0.60"
2787
+ ],
2788
+ "shadcn": [
2789
+ "button",
2790
+ "card",
2791
+ "badge",
2792
+ "avatar",
2793
+ "scroll-area",
2794
+ "select",
2795
+ "separator",
2796
+ "slider",
2797
+ "switch",
2798
+ "textarea",
2799
+ "tabs",
2800
+ "command",
2801
+ "sheet"
2802
+ ],
2803
+ "env": [
2804
+ {
2805
+ "name": "ANTHROPIC_API_KEY",
2806
+ "scope": "convex",
2807
+ "required": false
2808
+ },
2809
+ {
2810
+ "name": "OPENAI_API_KEY",
2811
+ "scope": "convex",
2812
+ "required": false
2813
+ },
2814
+ {
2815
+ "name": "GOOGLE_GENERATIVE_AI_API_KEY",
2816
+ "scope": "convex",
2817
+ "required": false
2818
+ }
2819
+ ],
2820
+ "peers": [
2821
+ {
2822
+ "slug": "convex-auth",
2823
+ "range": "^0.1",
2824
+ "reason": "Thread ownership requires authenticated user."
2825
+ },
2826
+ {
2827
+ "slug": "ai-router",
2828
+ "range": "^0.1",
2829
+ "reason": "Routes provider calls through tiered proxy."
2830
+ },
2831
+ {
2832
+ "slug": "ai-admin",
2833
+ "range": "^0.1",
2834
+ "reason": "Reads instructions / skills / tools / models from ai-admin registry."
2835
+ },
2836
+ {
2837
+ "slug": "vector-search",
2838
+ "range": "^0.1",
2839
+ "reason": "Optional — RAG / search modes pull workspace embeddings."
2840
+ }
2841
+ ],
2842
+ "providers": [],
2843
+ "tags": [
2844
+ "ai",
2845
+ "ai:chat",
2846
+ "streaming",
2847
+ "multimodal",
2848
+ "tool-calls",
2849
+ "agent-mode",
2850
+ "rag",
2851
+ "citations",
2852
+ "branching",
2853
+ "history"
2854
+ ],
2855
+ "agentRecipe": "Run `npx rr add ai-chat`. Pick `mode=\"workbench\" | \"sidebar\" | \"search\"` on `<AIChat />` (or use the convenience exports `<AIChatWorkbench />`, `<AIChatSidebar />`, `<AIChatSearch />`). Same backend tables + streaming action for all three."
2856
+ },
2857
+ {
2858
+ "slug": "ai-studio",
2859
+ "title": "AI Studio — Generation Canvas",
2860
+ "category": "ai",
2861
+ "kind": "full",
2862
+ "version": "0.1.0",
2863
+ "description": "AI is the primary UI — single big prompt input → live-streaming output → variation grid → version tree. Suno / Midjourney / Lovable / v0 pattern. Output kinds: text, code, image, audio (configurable per template).\n\nUse cases:\n – AI image generation product (creative output)\n – AI logo / banner / social-post studio\n – AI code-snippet generator (component scaffolder)\n – AI music / voiceover producer\n – AI blog-draft factory (text)\n\nFeatures: prompt history, branch + compare outputs, like + favorite, share-to-link, templates from ai-admin.",
2864
+ "source": "rahmanef63/resource-site",
2865
+ "slicePath": "frontend/slices/ai-studio",
2866
+ "convexPaths": [
2867
+ "convex/features/ai"
2868
+ ],
2869
+ "npm": [
2870
+ "ai@^4.0.0"
2871
+ ],
2872
+ "shadcn": [
2873
+ "button",
2874
+ "card",
2875
+ "badge",
2876
+ "textarea",
2877
+ "tabs",
2878
+ "tooltip",
2879
+ "scroll-area",
2880
+ "select"
2881
+ ],
2882
+ "env": [],
2883
+ "peers": [
2884
+ {
2885
+ "slug": "convex-auth",
2886
+ "range": "^0.1",
2887
+ "reason": "Generation history per user."
2888
+ },
2889
+ {
2890
+ "slug": "ai-router",
2891
+ "range": "^0.1",
2892
+ "reason": "All generation calls flow through router."
2893
+ },
2894
+ {
2895
+ "slug": "ai-admin",
2896
+ "range": "^0.1",
2897
+ "reason": "Templates + few-shot library + moderation rules live in ai-admin."
2898
+ }
2899
+ ],
2900
+ "providers": [],
2901
+ "tags": [
2902
+ "ai",
2903
+ "ai:studio",
2904
+ "generation",
2905
+ "streaming",
2906
+ "history",
2907
+ "branching",
2908
+ "image-gen"
2909
+ ],
2910
+ "agentRecipe": "Run `npx rr add ai-studio`. Mount `<GeneratorCanvas />` at /. Use case: prompt → output IS the entire product. Wire your output renderer (text/image/code/audio) via the OutputSlot adapter. Templates loaded from ai-admin.studio.templates."
2911
+ },
2912
+ {
2913
+ "slug": "ai-agents",
2914
+ "title": "AI Agents — Autonomous Workers",
2915
+ "category": "ai",
2916
+ "kind": "full",
2917
+ "version": "0.1.0",
2918
+ "description": "Background AI workers. Define an agent (skill × model × tools × max-iter), trigger it on-demand or on a cron schedule, watch the step-by-step trace as it runs. Devin / Replit-Agent / Manus pattern.\n\nUse cases:\n – Nightly audit-bp on the codebase (PR-reviewer style)\n – Weekly SEO crawl + content suggestions\n – Auto-moderate comment queue\n – Scheduled data ingestion + summarization\n – Long-form research task with multi-source citations\n\nFeatures: queue + live trace, per-step retry policy, hard cost cap, shareable trace URLs, full audit-log integration.",
2919
+ "source": "rahmanef63/resource-site",
2920
+ "slicePath": "frontend/slices/ai-agents",
2921
+ "convexPaths": [
2922
+ "convex/features/ai"
2923
+ ],
2924
+ "npm": [
2925
+ "ai@^4.0.0"
2926
+ ],
2927
+ "shadcn": [
2928
+ "button",
2929
+ "card",
2930
+ "badge",
2931
+ "table",
2932
+ "tabs",
2933
+ "scroll-area",
2934
+ "progress"
2935
+ ],
2936
+ "env": [],
2937
+ "peers": [
2938
+ {
2939
+ "slug": "convex-auth",
2940
+ "range": "^0.1",
2941
+ "reason": "Per-user agent run ownership."
2942
+ },
2943
+ {
2944
+ "slug": "ai-router",
2945
+ "range": "^0.1",
2946
+ "reason": "Step calls flow through router."
2947
+ },
2948
+ {
2949
+ "slug": "ai-admin",
2950
+ "range": "^0.1",
2951
+ "reason": "Agent definitions live in ai-admin → Agents."
2952
+ },
2953
+ {
2954
+ "slug": "audit-log",
2955
+ "range": "^0.1",
2956
+ "reason": "Every step logged."
2957
+ }
2958
+ ],
2959
+ "providers": [],
2960
+ "tags": [
2961
+ "ai",
2962
+ "ai:agents",
2963
+ "agent-mode",
2964
+ "tool-calls",
2965
+ "async",
2966
+ "queue",
2967
+ "traces"
2968
+ ],
2969
+ "agentRecipe": "Run `npx rr add ai-agents`. Mount `<RunnerDashboard />` at /agents. Trigger runs via `runAgent({agentSlug, input, scheduleAt?})`. Cron scheduler via Convex cron — wire if you need scheduled runs. Agent definitions managed in ai-admin."
2970
+ },
2971
+ {
2972
+ "slug": "ai-admin",
2973
+ "title": "AI Admin — Console (Instructions · Skills · Tools · Agents · Providers)",
2974
+ "category": "ai",
2975
+ "kind": "full",
2976
+ "version": "0.2.0",
2977
+ "description": "Central operator console for the whole AI stack. Every other ai-* feature reads its registries from here. Tabs ordered to match the build-flow:\n\n 1. Providers — register Anthropic / OpenAI / Google / Mistral / Ollama (API keys AES-encrypted at rest)\n 2. Models — per-provider catalog (capabilities, context window, pricing)\n 3. Instructions — custom system-prompt library (Claude Projects-style)\n 4. Skills — named instruction + model default + tool defaults (consumed by chat + studio)\n 5. Tools — JSON-schema function specs + impl (http / convex / shell) + sandbox flag\n 6. Agents — skill × model × tools × max-iter (consumed by ai-agents)\n 7. Budgets — per-workspace cost caps + alerts + hard kill\n 8. Audit — every AI call: actor / agent / tokens / cost / latency / outcome\n\nIncludes Create-Agent / Create-Skill / Create-Tool / Create-Instruction wizards.",
2978
+ "source": "rahmanef63/resource-site",
2979
+ "slicePath": "frontend/slices/ai-admin",
2980
+ "convexPaths": [
2981
+ "convex/features/ai"
2982
+ ],
2983
+ "npm": [],
2984
+ "shadcn": [
2985
+ "card",
2986
+ "button",
2987
+ "badge",
2988
+ "tabs",
2989
+ "table",
2990
+ "dialog",
2991
+ "input",
2992
+ "label",
2993
+ "select",
2994
+ "textarea",
2995
+ "switch",
2996
+ "command"
2997
+ ],
2998
+ "env": [
2999
+ {
3000
+ "name": "AI_ADMIN_ENCRYPTION_KEY",
3001
+ "scope": "convex",
3002
+ "required": true,
3003
+ "description": "Encrypts stored provider API keys at rest."
3004
+ }
3005
+ ],
3006
+ "peers": [
3007
+ {
3008
+ "slug": "convex-auth",
3009
+ "range": "^0.1",
3010
+ "reason": "requireAdmin gate."
3011
+ },
3012
+ {
3013
+ "slug": "rbac-roles",
3014
+ "range": "^0.1",
3015
+ "reason": "Section gated by ai.* permissions (manage_providers, manage_skills, etc)."
3016
+ },
3017
+ {
3018
+ "slug": "admin-panel",
3019
+ "range": "^0.1",
3020
+ "reason": "Lives as a registered admin section."
3021
+ },
3022
+ {
3023
+ "slug": "audit-log",
3024
+ "range": "^0.1",
3025
+ "reason": "Every config change + AI call routes through audit-log."
3026
+ }
3027
+ ],
3028
+ "providers": [],
3029
+ "tags": [
3030
+ "ai",
3031
+ "ai:admin",
3032
+ "instructions",
3033
+ "skills",
3034
+ "tools",
3035
+ "agents",
3036
+ "providers",
3037
+ "models",
3038
+ "budgets",
3039
+ "audit"
3040
+ ],
3041
+ "agentRecipe": "Run `npx rr add ai-admin`. Adds an `AI` section to the admin-panel ADMIN_SECTIONS registry. Sub-tabs ordered to match build-flow: Providers → Models → Instructions → Skills → Tools → Agents → Budgets → Audit. Includes Create-* wizards for instructions / skills / tools / agents. API keys AES-encrypted via AI_ADMIN_ENCRYPTION_KEY env. The instruction / skill / tool / agent registries are SSOTs consumed by every ai-* consumer slice (chat + studio + agents)."
3042
+ },
3043
+ {
3044
+ "slug": "ai-router",
3045
+ "title": "AI Router — Backend Provider Proxy",
3046
+ "category": "ai",
3047
+ "kind": "backend",
3048
+ "version": "0.1.0",
3049
+ "description": "Backend infrastructure (no UI). Single proxy that every other ai-* feature calls. Tier-routed — nano (Haiku) for classification, mid (Sonnet) for chat, flagship (Opus) for deep reasoning. Per-call usage log + cost guard. Works with direct provider keys or OpenRouter umbrella.\n\nNot something you mount — installed automatically as a peer when you add ai-chat / ai-studio / ai-agents.",
2207
3050
  "source": "rahmanef63/resource-site",
2208
- "slicePath": "frontend/slices/resend-newsletter",
3051
+ "slicePath": "frontend/slices/ai-router",
2209
3052
  "convexPaths": [
2210
- "convex/features/newsletter"
3053
+ "convex/features/ai"
3054
+ ],
3055
+ "npm": [
3056
+ "ai@^4.0.0",
3057
+ "@openrouter/ai-sdk-provider@^0.0.5"
3058
+ ],
3059
+ "shadcn": [
3060
+ "button"
3061
+ ],
3062
+ "env": [
3063
+ {
3064
+ "name": "OPENROUTER_API_KEY",
3065
+ "scope": "convex",
3066
+ "required": true
3067
+ }
3068
+ ],
3069
+ "peers": [],
3070
+ "providers": [],
3071
+ "tags": [
3072
+ "ai",
3073
+ "ai:backend",
3074
+ "tier-routing",
3075
+ "cost-guard"
3076
+ ],
3077
+ "agentRecipe": "Run `npx rr add ai-router`. Wrap every AI call through ai-router. Tiers: nano = quick classification (spam-flag, headline-suggest), mid = chat / draft, flagship = methodology-review / deep-think. Token usage logs to ai_usage table for the cost dashboard."
3078
+ },
3079
+ {
3080
+ "slug": "vector-search",
3081
+ "title": "Convex Vector Search",
3082
+ "category": "search",
3083
+ "kind": "full",
3084
+ "version": "0.1.0",
3085
+ "description": "Embeddings-based search via Convex's built-in vector index. Embed via OpenAI text-embedding-3-small (1536-dim), query via vectorIndex().",
3086
+ "source": "rahmanef63/resource-site",
3087
+ "slicePath": "frontend/slices/vector-search",
3088
+ "convexPaths": [
3089
+ "convex/features/search"
3090
+ ],
3091
+ "npm": [
3092
+ "@convex-dev/vector-search@^0.0.5"
3093
+ ],
3094
+ "shadcn": [
3095
+ "card",
3096
+ "input"
3097
+ ],
3098
+ "env": [
3099
+ {
3100
+ "name": "OPENAI_API_KEY",
3101
+ "scope": "convex",
3102
+ "required": true
3103
+ }
3104
+ ],
3105
+ "peers": [],
3106
+ "providers": [],
3107
+ "tags": [
3108
+ "search",
3109
+ "vector",
3110
+ "embeddings",
3111
+ "convex",
3112
+ "rag"
3113
+ ],
3114
+ "agentRecipe": "Run `npx rr add vector-search`. Add embedding field + vectorIndex per searchable table. Re-embed on upsert via Convex action. Cache embeddings — don't re-call OpenAI on every read."
3115
+ },
3116
+ {
3117
+ "slug": "mdx-blog",
3118
+ "title": "MDX Blog",
3119
+ "category": "content",
3120
+ "kind": "ui",
3121
+ "version": "0.2.0",
3122
+ "description": "Markdown-with-JSX untuk blog post. File-based MDX content collection. Portable defineMdxBlog(opts) factory dengan 4 config props (basePath, contentDir, labels.list, nav) — defaults preserve legacy /blog + content/blog. Auto-generate ToC, reading-time, syntax highlight, plus embed React components inline.",
3123
+ "source": "rahmanef63/resource-site",
3124
+ "slicePath": "frontend/slices/mdx-blog",
3125
+ "convexPaths": [],
3126
+ "npm": [
3127
+ "@next/mdx@^16.0.0",
3128
+ "gray-matter@^4.0.3",
3129
+ "rehype-pretty-code@^0.14.0"
3130
+ ],
3131
+ "shadcn": [
3132
+ "card"
3133
+ ],
3134
+ "env": [],
3135
+ "peers": [],
3136
+ "providers": [],
3137
+ "tags": [
3138
+ "content",
3139
+ "blog",
3140
+ "mdx",
3141
+ "static"
3142
+ ],
3143
+ "agentRecipe": "Run `npx rr add mdx-blog`. Store post body sebagai markdown di content/blog/*.mdx. Render dengan MDXRemote di [slug]/page.tsx. Auto-extract headings ke ToC via remark plugin custom."
3144
+ },
3145
+ {
3146
+ "slug": "cal-com-booking",
3147
+ "title": "Cal.com Booking",
3148
+ "category": "data",
3149
+ "kind": "full",
3150
+ "version": "0.1.0",
3151
+ "description": "Embedded Cal.com booking widget + webhook receiver to mirror bookings into Convex.",
3152
+ "source": "rahmanef63/resource-site",
3153
+ "slicePath": "frontend/slices/cal-com-booking",
3154
+ "convexPaths": [
3155
+ "convex/features/bookings"
3156
+ ],
3157
+ "npm": [
3158
+ "@calcom/embed-react@^1.5.0"
3159
+ ],
3160
+ "shadcn": [
3161
+ "card"
3162
+ ],
3163
+ "env": [
3164
+ {
3165
+ "name": "NEXT_PUBLIC_CALCOM_USERNAME",
3166
+ "scope": "next-public",
3167
+ "required": true
3168
+ },
3169
+ {
3170
+ "name": "CALCOM_WEBHOOK_SECRET",
3171
+ "scope": "convex",
3172
+ "required": true
3173
+ }
3174
+ ],
3175
+ "peers": [],
3176
+ "providers": [],
3177
+ "tags": [
3178
+ "data",
3179
+ "scheduling",
3180
+ "cal-com",
3181
+ "bookings"
3182
+ ],
3183
+ "agentRecipe": "Run `npx rr add cal-com-booking`. 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."
3184
+ },
3185
+ {
3186
+ "slug": "full-width-toggle",
3187
+ "title": "Full Width Toggle",
3188
+ "category": "ui",
3189
+ "kind": "ui",
3190
+ "version": "0.1.0",
3191
+ "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.",
3192
+ "source": "rahmanef63/resource-site",
3193
+ "slicePath": "frontend/slices/full-width-toggle",
3194
+ "convexPaths": [],
3195
+ "npm": [],
3196
+ "shadcn": [
3197
+ "button"
3198
+ ],
3199
+ "env": [],
3200
+ "peers": [],
3201
+ "providers": [],
3202
+ "tags": [
3203
+ "ui",
3204
+ "layout",
3205
+ "preference",
3206
+ "localstorage",
3207
+ "dashboard"
3208
+ ],
3209
+ "agentRecipe": "Run `npx rr add full-width-toggle`. 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."
3210
+ },
3211
+ {
3212
+ "slug": "command-menu",
3213
+ "title": "Command Menu",
3214
+ "category": "ui",
3215
+ "kind": "ui",
3216
+ "version": "0.2.0",
3217
+ "description": "Renderless ⌘K command palette + generic search modal. Consumer supplies CommandGroup[] + onSelect + label bag; slice owns dialog chrome, ⌘K hotkey, MRU history. Pulled UP from notion-page-clone's command-palette renderless surface (Wave N+3.7) — Nosion adapters dropped at the kitab boundary.",
3218
+ "source": "notion-page-clone (consumerVersion 0.3.0) + earlier superspace facade",
3219
+ "slicePath": "frontend/slices/command-menu",
3220
+ "convexPaths": [],
3221
+ "npm": [
3222
+ "cmdk@^1.0.0"
3223
+ ],
3224
+ "shadcn": [
3225
+ "command",
3226
+ "dialog"
3227
+ ],
3228
+ "env": [],
3229
+ "peers": [],
3230
+ "providers": [],
3231
+ "tags": [
3232
+ "ui",
3233
+ "palette",
3234
+ "cmd-k",
3235
+ "navigation",
3236
+ "keyboard",
3237
+ "search",
3238
+ "notion-like"
2211
3239
  ],
3240
+ "agentRecipe": "Run `npx rr add command-menu`. Wire <CommandPalette groups={...} onHistorySelect={...} labels={...} /> at the dashboard shell. Build groups from your feature registry; each item.onSelect handles navigation. Use <SearchModal bindings={{ pages, databases, recents, isLoading, onQueryChange, onSelectPage, onSelectDatabase }} /> for the search dialog — see slice README.md for adapter shapes."
3241
+ },
3242
+ {
3243
+ "slug": "motion-primitives",
3244
+ "title": "Motion Primitives (8)",
3245
+ "category": "ui",
3246
+ "kind": "ui",
3247
+ "version": "0.1.0",
3248
+ "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.",
3249
+ "source": "rahmanef.com",
3250
+ "slicePath": "template-base/frontend/slices/motion-primitives",
3251
+ "convexPaths": [],
2212
3252
  "npm": [
2213
- "resend@^4.0.0"
3253
+ "framer-motion@^11.0.0"
2214
3254
  ],
2215
- "shadcn": [
2216
- "button",
2217
- "card",
2218
- "input",
2219
- "label",
2220
- "textarea"
3255
+ "shadcn": [],
3256
+ "env": [],
3257
+ "peers": [],
3258
+ "providers": [],
3259
+ "tags": [
3260
+ "ui",
3261
+ "motion",
3262
+ "animation",
3263
+ "marquee",
3264
+ "framer-motion"
2221
3265
  ],
2222
- "env": [
2223
- {
2224
- "name": "RESEND_API_KEY",
2225
- "scope": "convex",
2226
- "required": true
2227
- },
2228
- {
2229
- "name": "RESEND_FROM",
2230
- "scope": "convex",
2231
- "required": true
2232
- }
3266
+ "agentRecipe": "Run `npx rr add motion-primitives`. 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."
3267
+ },
3268
+ {
3269
+ "slug": "responsive-dialog",
3270
+ "title": "Responsive Dialog (Sheet ↔ Modal)",
3271
+ "category": "ui",
3272
+ "kind": "ui",
3273
+ "version": "0.1.0",
3274
+ "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.",
3275
+ "source": "superspace",
3276
+ "slicePath": "template-base/frontend/slices/responsive-dialog",
3277
+ "convexPaths": [],
3278
+ "npm": [],
3279
+ "shadcn": [
3280
+ "dialog",
3281
+ "sheet"
2233
3282
  ],
3283
+ "env": [],
2234
3284
  "peers": [],
2235
3285
  "providers": [],
2236
3286
  "tags": [
2237
- "email",
2238
- "newsletter",
2239
- "resend"
3287
+ "ui",
3288
+ "dialog",
3289
+ "modal",
3290
+ "sheet",
3291
+ "responsive",
3292
+ "primitive"
2240
3293
  ],
2241
- "agentRecipe": "Run `npx rr add resend-newsletter`. Use Resend Audiences API for newsletter store subscriber emails in Convex too for segmentation. Double opt-in: subscriber.create with status 'pending' → click link → status 'confirmed'."
3294
+ "agentRecipe": "Run `npx rr add responsive-dialog`. 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)')."
2242
3295
  },
2243
3296
  {
2244
- "slug": "ai-chat",
2245
- "title": "AI ChatWorkbench / Sidebar / Search",
2246
- "category": "ai",
2247
- "kind": "full",
3297
+ "slug": "dashboard-shell",
3298
+ "title": "Dashboard ShellResponsive",
3299
+ "category": "ui",
3300
+ "kind": "ui",
2248
3301
  "version": "0.1.0",
2249
- "description": "One conversational AI feature, three render modes. Same Convex backend (threads + streaming + tool calls + RAG), pick the surface via prop:\n\n • workbench — Claude.ai / ChatGPT three-column page (default)\n • sidebar — collapsible copilot panel inside another CRUD app\n • search — single-question + answer + citations (Perplexity)\n\nUse cases:\n – Customer-support chatbot embedded in your marketing site\n – Developer copilot in your PR/docs admin\n – Knowledge-base search over your blog + docs corpus\n – Internal AI assistant in your dashboard\n\nWhat it ships: multi-provider (Anthropic / OpenAI / Google / Mistral / Ollama), multimodal (text + image + PDF + audio), typed tool calls with inline inspector, agent mode (plan→execute→reflect), branching threads, RAG citations, resumable streams, usage telemetry. Public surface = consumer chat; admin surface = persona, fallback, guardrails per-bot.",
2250
- "source": "rahmanef63/resource-site",
2251
- "slicePath": "frontend/slices/ai-chat",
2252
- "convexPaths": [
2253
- "convex/features/ai"
3302
+ "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.",
3303
+ "source": "superspace",
3304
+ "slicePath": "template-base/frontend/slices/dashboard-shell",
3305
+ "convexPaths": [],
3306
+ "npm": [],
3307
+ "shadcn": [
3308
+ "sheet",
3309
+ "scroll-area",
3310
+ "separator",
3311
+ "tooltip"
2254
3312
  ],
2255
- "npm": [
2256
- "ai@^4.0.0",
2257
- "@ai-sdk/anthropic@^0.0.50",
2258
- "@ai-sdk/openai@^0.0.60"
3313
+ "env": [],
3314
+ "peers": [
3315
+ {
3316
+ "slug": "full-width-toggle",
3317
+ "range": "^0.1",
3318
+ "reason": "Topbar surfaces the width toggle when this is mounted."
3319
+ }
3320
+ ],
3321
+ "providers": [],
3322
+ "tags": [
3323
+ "ui",
3324
+ "layout",
3325
+ "dashboard",
3326
+ "sidebar",
3327
+ "topbar",
3328
+ "responsive"
2259
3329
  ],
3330
+ "agentRecipe": "Run `npx rr add dashboard-shell`. 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."
3331
+ },
3332
+ {
3333
+ "slug": "three-column",
3334
+ "title": "Three-Column Layout — Sidebar/Content/Inspector",
3335
+ "category": "ui",
3336
+ "kind": "ui",
3337
+ "version": "0.1.0",
3338
+ "description": "ThreeColumnLayoutAdvanced — collapsible left/right + resizable widths + responsive breakpoints + PanelSection compound (Header/Items/Footer) + per-panel footer slots. Models shadcn sidebar API for the panel interior. Pair with PanelGroup/PanelMenu/PanelSeparator primitives. Trigger ≠ header (V-wave separation rule).",
3339
+ "source": "superspace",
3340
+ "slicePath": "template-base/frontend/slices/three-column",
3341
+ "convexPaths": [],
3342
+ "npm": [],
2260
3343
  "shadcn": [
2261
- "button",
2262
- "card",
2263
- "badge",
2264
- "avatar",
3344
+ "sheet",
2265
3345
  "scroll-area",
2266
- "select",
2267
3346
  "separator",
2268
- "slider",
2269
- "switch",
2270
- "textarea",
2271
- "tabs",
2272
- "command",
2273
- "sheet"
3347
+ "tooltip"
3348
+ ],
3349
+ "env": [],
3350
+ "peers": [],
3351
+ "providers": [],
3352
+ "tags": [
3353
+ "ui",
3354
+ "layout",
3355
+ "three-column",
3356
+ "sidebar",
3357
+ "inspector",
3358
+ "panel-section",
3359
+ "responsive",
3360
+ "resizable"
3361
+ ],
3362
+ "agentRecipe": "Run `npx rr add three-column`. <ThreeColumnLayoutAdvanced preset=\"feature\" storageKey persistState left={…PanelSection…} center={…PanelSection unstyled…} right={…PanelSection…} leftFooter centerFooter rightFooter />. Center column SHOULD pass `unstyled` to drop sidebar tokens — body is content surface. `storageKey` MUST differ per slice or persisted widths collide."
3363
+ },
3364
+ {
3365
+ "slug": "broadcast-channel-sync",
3366
+ "title": "BroadcastChannel — Cross-tab Sync",
3367
+ "category": "realtime",
3368
+ "kind": "ui",
3369
+ "version": "0.1.0",
3370
+ "description": "Same-origin cross-tab + cross-iframe state sync via BroadcastChannel API. Tiny, no backend, no install.",
3371
+ "source": "Web Platform — BroadcastChannel API",
3372
+ "slicePath": "frontend/slices/broadcast-channel-sync",
3373
+ "convexPaths": [],
3374
+ "npm": [],
3375
+ "shadcn": [],
3376
+ "env": [],
3377
+ "peers": [],
3378
+ "providers": [],
3379
+ "tags": [
3380
+ "realtime",
3381
+ "cross-tab",
3382
+ "broadcast-channel",
3383
+ "demo-pattern"
3384
+ ],
3385
+ "agentRecipe": "Run `npx rr add broadcast-channel-sync`. 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."
3386
+ },
3387
+ {
3388
+ "slug": "rbac-roles",
3389
+ "title": "RBAC — Tiered System Roles",
3390
+ "category": "auth",
3391
+ "kind": "backend",
3392
+ "version": "0.1.0",
3393
+ "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).",
3394
+ "source": "superspace",
3395
+ "slicePath": "",
3396
+ "convexPaths": [
3397
+ "template-base/convex/lib/rbac"
2274
3398
  ],
3399
+ "npm": [],
3400
+ "shadcn": [],
2275
3401
  "env": [
2276
3402
  {
2277
- "name": "ANTHROPIC_API_KEY",
2278
- "scope": "convex",
2279
- "required": false
2280
- },
2281
- {
2282
- "name": "OPENAI_API_KEY",
2283
- "scope": "convex",
2284
- "required": false
2285
- },
2286
- {
2287
- "name": "GOOGLE_GENERATIVE_AI_API_KEY",
3403
+ "name": "PLATFORM_ADMIN_EMAILS",
2288
3404
  "scope": "convex",
2289
- "required": false
3405
+ "description": "Comma-separated emails granted cross-workspace admin."
2290
3406
  }
2291
3407
  ],
2292
3408
  "peers": [
2293
3409
  {
2294
3410
  "slug": "convex-auth",
2295
3411
  "range": "^0.1",
2296
- "reason": "Thread ownership requires authenticated user."
2297
- },
2298
- {
2299
- "slug": "ai-router",
2300
- "range": "^0.1",
2301
- "reason": "Routes provider calls through tiered proxy."
2302
- },
2303
- {
2304
- "slug": "ai-admin",
2305
- "range": "^0.1",
2306
- "reason": "Reads instructions / skills / tools / models from ai-admin registry."
2307
- },
2308
- {
2309
- "slug": "vector-search",
2310
- "range": "^0.1",
2311
- "reason": "Optional — RAG / search modes pull workspace embeddings."
3412
+ "reason": "RBAC checks the authed user identity."
2312
3413
  }
2313
3414
  ],
2314
3415
  "providers": [],
2315
3416
  "tags": [
2316
- "ai",
2317
- "ai:chat",
2318
- "streaming",
2319
- "multimodal",
2320
- "tool-calls",
2321
- "agent-mode",
2322
- "rag",
2323
- "citations",
2324
- "branching",
2325
- "history"
3417
+ "rbac",
3418
+ "auth",
3419
+ "permissions",
3420
+ "roles",
3421
+ "workspaces"
2326
3422
  ],
2327
- "agentRecipe": "Run `npx rr add ai-chat`. Pick `mode=\"workbench\" | \"sidebar\" | \"search\"` on `<AIChat />` (or use the convenience exports `<AIChatWorkbench />`, `<AIChatSidebar />`, `<AIChatSearch />`). Same backend tables + streaming action for all three."
3423
+ "agentRecipe": "Run `npx rr add rbac-roles`. 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."
2328
3424
  },
2329
3425
  {
2330
- "slug": "ai-studio",
2331
- "title": "AI StudioGeneration Canvas",
2332
- "category": "ai",
3426
+ "slug": "admin-panel",
3427
+ "title": "Admin PanelUnified Product Admin",
3428
+ "category": "infra",
2333
3429
  "kind": "full",
2334
3430
  "version": "0.1.0",
2335
- "description": "AI is the primary UI — single big prompt input → live-streaming output variation grid version tree. Suno / Midjourney / Lovable / v0 pattern. Output kinds: text, code, image, audio (configurable per template).\n\nUse cases:\n – AI image generation product (creative output)\n – AI logo / banner / social-post studio\n – AI code-snippet generator (component scaffolder)\n – AI music / voiceover producer\n – AI blog-draft factory (text)\n\nFeatures: prompt history, branch + compare outputs, like + favorite, share-to-link, templates from ai-admin.",
2336
- "source": "rahmanef63/resource-site",
2337
- "slicePath": "frontend/slices/ai-studio",
3431
+ "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.",
3432
+ "source": "superspace + spec",
3433
+ "slicePath": "template-base/frontend/slices/admin-panel",
2338
3434
  "convexPaths": [
2339
- "convex/features/ai"
2340
- ],
2341
- "npm": [
2342
- "ai@^4.0.0"
3435
+ "template-base/convex/features/admin-panel"
2343
3436
  ],
3437
+ "npm": [],
2344
3438
  "shadcn": [
2345
- "button",
2346
3439
  "card",
2347
3440
  "badge",
2348
- "textarea",
2349
- "tabs",
2350
- "tooltip",
2351
- "scroll-area",
2352
- "select"
3441
+ "button"
2353
3442
  ],
2354
3443
  "env": [],
2355
3444
  "peers": [
2356
3445
  {
2357
- "slug": "convex-auth",
2358
- "range": "^0.1",
2359
- "reason": "Generation history per user."
2360
- },
2361
- {
2362
- "slug": "ai-router",
2363
- "range": "^0.1",
2364
- "reason": "All generation calls flow through router."
2365
- },
2366
- {
2367
- "slug": "ai-admin",
3446
+ "slug": "rbac-roles",
2368
3447
  "range": "^0.1",
2369
- "reason": "Templates + few-shot library + moderation rules live in ai-admin."
3448
+ "reason": "Admin sections require RBAC perms must seed roles first."
2370
3449
  }
2371
3450
  ],
2372
3451
  "providers": [],
2373
3452
  "tags": [
2374
- "ai",
2375
- "ai:studio",
2376
- "generation",
2377
- "streaming",
2378
- "history",
2379
- "branching",
2380
- "image-gen"
3453
+ "admin",
3454
+ "owner",
3455
+ "platform",
3456
+ "rbac",
3457
+ "instrumentation",
3458
+ "panel"
2381
3459
  ],
2382
- "agentRecipe": "Run `npx rr add ai-studio`. Mount `<GeneratorCanvas />` at /. Use case: prompt output IS the entire product. Wire your output renderer (text/image/code/audio) via the OutputSlot adapter. Templates loaded from ai-admin.studio.templates."
3460
+ "agentRecipe": "Run `npx rr add admin-panel`. 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."
2383
3461
  },
2384
3462
  {
2385
- "slug": "ai-agents",
2386
- "title": "AI AgentsAutonomous Workers",
2387
- "category": "ai",
3463
+ "slug": "event-tracking",
3464
+ "title": "Event TrackingP0 Instrumentation",
3465
+ "category": "data",
2388
3466
  "kind": "full",
2389
3467
  "version": "0.1.0",
2390
- "description": "Background AI workers. Define an agent (skill × model × tools × max-iter), trigger it on-demand or on a cron schedule, watch the step-by-step trace as it runs. Devin / Replit-Agent / Manus pattern.\n\nUse cases:\n – Nightly audit-bp on the codebase (PR-reviewer style)\n – Weekly SEO crawl + content suggestions\n – Auto-moderate comment queue\n – Scheduled data ingestion + summarization\n – Long-form research task with multi-source citations\n\nFeatures: queue + live trace, per-step retry policy, hard cost cap, shareable trace URLs, full audit-log integration.",
2391
- "source": "rahmanef63/resource-site",
2392
- "slicePath": "frontend/slices/ai-agents",
3468
+ "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.",
3469
+ "source": "spec + superspace analytics",
3470
+ "slicePath": "template-base/frontend/slices/admin-panel/slices/events",
2393
3471
  "convexPaths": [
2394
- "convex/features/ai"
2395
- ],
2396
- "npm": [
2397
- "ai@^4.0.0"
2398
- ],
2399
- "shadcn": [
2400
- "button",
2401
- "card",
2402
- "badge",
2403
- "table",
2404
- "tabs",
2405
- "scroll-area",
2406
- "progress"
3472
+ "template-base/convex/features/admin-panel",
3473
+ "template-base/convex/features/analytics"
2407
3474
  ],
3475
+ "npm": [],
3476
+ "shadcn": [],
2408
3477
  "env": [],
2409
3478
  "peers": [
2410
3479
  {
2411
- "slug": "convex-auth",
2412
- "range": "^0.1",
2413
- "reason": "Per-user agent run ownership."
2414
- },
2415
- {
2416
- "slug": "ai-router",
2417
- "range": "^0.1",
2418
- "reason": "Step calls flow through router."
2419
- },
2420
- {
2421
- "slug": "ai-admin",
2422
- "range": "^0.1",
2423
- "reason": "Agent definitions live in ai-admin → Agents."
2424
- },
2425
- {
2426
- "slug": "audit-log",
3480
+ "slug": "admin-panel",
2427
3481
  "range": "^0.1",
2428
- "reason": "Every step logged."
3482
+ "reason": "Lives under admin slice events subfolder."
2429
3483
  }
2430
3484
  ],
2431
3485
  "providers": [],
2432
3486
  "tags": [
2433
- "ai",
2434
- "ai:agents",
2435
- "agent-mode",
2436
- "tool-calls",
2437
- "async",
2438
- "queue",
2439
- "traces"
3487
+ "events",
3488
+ "analytics",
3489
+ "instrumentation",
3490
+ "attribution",
3491
+ "utm",
3492
+ "p0"
2440
3493
  ],
2441
- "agentRecipe": "Run `npx rr add ai-agents`. Mount `<RunnerDashboard />` at /agents. Trigger runs via `runAgent({agentSlug, input, scheduleAt?})`. Cron scheduler via Convex cron wire if you need scheduled runs. Agent definitions managed in ai-admin."
3494
+ "agentRecipe": "Run `npx rr add event-tracking`. 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."
2442
3495
  },
2443
3496
  {
2444
- "slug": "ai-admin",
2445
- "title": "AI Admin — Console (Instructions · Skills · Tools · Agents · Providers)",
2446
- "category": "ai",
2447
- "kind": "full",
3497
+ "slug": "icon-picker",
3498
+ "title": "Icon Picker",
3499
+ "category": "ui",
3500
+ "kind": "ui",
2448
3501
  "version": "0.2.0",
2449
- "description": "Central operator console for the whole AI stack. Every other ai-* feature reads its registries from here. Tabs ordered to match the build-flow:\n\n 1. Providers — register Anthropic / OpenAI / Google / Mistral / Ollama (API keys AES-encrypted at rest)\n 2. Models per-provider catalog (capabilities, context window, pricing)\n 3. Instructions — custom system-prompt library (Claude Projects-style)\n 4. Skills — named instruction + model default + tool defaults (consumed by chat + studio)\n 5. Tools — JSON-schema function specs + impl (http / convex / shell) + sandbox flag\n 6. Agents — skill × model × tools × max-iter (consumed by ai-agents)\n 7. Budgets — per-workspace cost caps + alerts + hard kill\n 8. Audit every AI call: actor / agent / tokens / cost / latency / outcome\n\nIncludes Create-Agent / Create-Skill / Create-Tool / Create-Instruction wizards.",
2450
- "source": "rahmanef63/resource-site",
2451
- "slicePath": "frontend/slices/ai-admin",
2452
- "convexPaths": [
2453
- "convex/features/ai"
2454
- ],
3502
+ "description": "Emoji + lucide icon picker with search, 10-color palette, Twemoji/native toggle, recents tracking. One string stores emoji OR lucide:Name OR with ?c=hex tintbackwards-compat with raw-emoji fields. Two variants: Popover (compact trigger) and Inline (full sheet/dialog use). Lifted 2026-05-16 from notion-page-clonefull implementation (19 files) including emoji-keywords search index, twemoji renderer, lucide-catalog, recents store, style-pref hook.",
3503
+ "source": "notion-page-clone",
3504
+ "slicePath": "frontend/slices/icon-picker",
3505
+ "convexPaths": [],
2455
3506
  "npm": [],
2456
3507
  "shadcn": [
2457
- "card",
3508
+ "popover",
2458
3509
  "button",
2459
- "badge",
2460
- "tabs",
2461
- "table",
2462
- "dialog",
2463
3510
  "input",
2464
- "label",
2465
- "select",
2466
- "textarea",
2467
- "switch",
2468
- "command"
3511
+ "scroll-area",
3512
+ "tabs"
2469
3513
  ],
2470
- "env": [
2471
- {
2472
- "name": "AI_ADMIN_ENCRYPTION_KEY",
2473
- "scope": "convex",
2474
- "required": true,
2475
- "description": "Encrypts stored provider API keys at rest."
2476
- }
3514
+ "env": [],
3515
+ "peers": [],
3516
+ "providers": [],
3517
+ "tags": [
3518
+ "icon",
3519
+ "emoji",
3520
+ "lucide",
3521
+ "picker",
3522
+ "twemoji",
3523
+ "notion",
3524
+ "notion-like"
2477
3525
  ],
2478
- "peers": [
2479
- {
2480
- "slug": "convex-auth",
2481
- "range": "^0.1",
2482
- "reason": "requireAdmin gate."
2483
- },
2484
- {
2485
- "slug": "rbac-roles",
2486
- "range": "^0.1",
2487
- "reason": "Section gated by ai.* permissions (manage_providers, manage_skills, etc)."
2488
- },
2489
- {
2490
- "slug": "admin-panel",
2491
- "range": "^0.1",
2492
- "reason": "Lives as a registered admin section."
2493
- },
2494
- {
2495
- "slug": "audit-log",
2496
- "range": "^0.1",
2497
- "reason": "Every config change + AI call routes through audit-log."
2498
- }
3526
+ "agentRecipe": "Run `npx rr add icon-picker`. parseIconValue() decodes; lucideValue()/withColor() build. Add 'icon: v.string()' to Convex table — no migration needed for existing emoji fields. <IconPicker> wraps any trigger (Popover); <IconPickerInline> for sheets/dialogs. <DynamicIcon> renders from parsed value."
3527
+ },
3528
+ {
3529
+ "slug": "cta",
3530
+ "title": "Call to Action",
3531
+ "category": "ui",
3532
+ "kind": "ui",
3533
+ "version": "0.1.0",
3534
+ "description": "Brutalist call-to-action section — eyebrow label, serif headline, body, arrow CTA. Pair with CtaButton standalone for inline placements. Lifted 2026-05-16 from rahmanef.com; assumes Tailwind tracking-brutal / tracking-brutal-sm utilities OR drop them for the default tracking scale.",
3535
+ "source": "rahmanef.com",
3536
+ "slicePath": "frontend/slices/cta",
3537
+ "convexPaths": [],
3538
+ "npm": [
3539
+ "lucide-react@^0.400.0"
2499
3540
  ],
3541
+ "shadcn": [],
3542
+ "env": [],
3543
+ "peers": [],
2500
3544
  "providers": [],
2501
3545
  "tags": [
2502
- "ai",
2503
- "ai:admin",
2504
- "instructions",
2505
- "skills",
2506
- "tools",
2507
- "agents",
2508
- "providers",
2509
- "models",
2510
- "budgets",
2511
- "audit"
3546
+ "ui",
3547
+ "marketing",
3548
+ "cta",
3549
+ "section",
3550
+ "brutalist"
3551
+ ],
3552
+ "agentRecipe": "Run `npx rr add cta`. <CtaView eyebrow title body href ctaLabel /> renders the full section; <CtaButton href label /> drops a standalone arrow button anywhere. Override tracking-brutal utilities in tailwind.config or swap for tracking-wide if your design system has no brutal preset."
3553
+ },
3554
+ {
3555
+ "slug": "hero",
3556
+ "title": "Hero",
3557
+ "category": "ui",
3558
+ "kind": "ui",
3559
+ "version": "0.1.0",
3560
+ "description": "Editorial split-grid landing hero — eyebrow pill + large serif H1 + italic pull-quote + 1-2 button CTA row + right-column portrait card with optional caption. Fully props-driven (title/quote/ctas/image). Sanitized from rahmanef.com on 2026-05-16: SITE_CONFIG hardcode dropped, custom Heading/Section primitives replaced with raw semantic elements + stock Tailwind tracking-widest so the slice ships without consumer preset utilities.",
3561
+ "source": "rahmanef.com",
3562
+ "slicePath": "frontend/slices/hero",
3563
+ "convexPaths": [],
3564
+ "npm": [
3565
+ "lucide-react@^0.400.0"
3566
+ ],
3567
+ "shadcn": [],
3568
+ "env": [],
3569
+ "peers": [],
3570
+ "providers": [],
3571
+ "tags": [
3572
+ "ui",
3573
+ "hero",
3574
+ "marketing",
3575
+ "landing",
3576
+ "section",
3577
+ "editorial",
3578
+ "brutalist"
3579
+ ],
3580
+ "agentRecipe": "Run `npx rr add hero`. <HeroView title eyebrow quote ctas image imageCaption /> — all props optional except title. Pass `image={undefined}` for text-only hero (auto-collapses to single 12-column row). Pairs visually with cta slice (same brutalist border + serif scale)."
3581
+ },
3582
+ {
3583
+ "slug": "rate-limit",
3584
+ "title": "Rate Limit",
3585
+ "category": "infra",
3586
+ "kind": "backend",
3587
+ "version": "0.1.0",
3588
+ "description": "Convex-backed per-key request counter. Atomic check-and-increment via `consume` mutation; expired rows pruned by `_pruneExpired` internalMutation wired to a 5-min cron. Replaces single-replica in-memory Map so multi-replica Next deployments share buckets. Caller chooses key namespace (csp:<ip>, mcp:<ip>, oauth_token:<ip>). Lifted 2026-05-16 from rahmanef.com.",
3589
+ "source": "rahmanef.com",
3590
+ "slicePath": "frontend/slices/rate-limit",
3591
+ "convexPaths": [
3592
+ "convex/features/rate-limit"
3593
+ ],
3594
+ "npm": [],
3595
+ "shadcn": [],
3596
+ "env": [],
3597
+ "peers": [],
3598
+ "providers": [],
3599
+ "tags": [
3600
+ "infra",
3601
+ "rate-limit",
3602
+ "convex",
3603
+ "backend",
3604
+ "throttle"
2512
3605
  ],
2513
- "agentRecipe": "Run `npx rr add ai-admin`. Adds an `AI` section to the admin-panel ADMIN_SECTIONS registry. Sub-tabs ordered to match build-flow: Providers → Models → Instructions → Skills → Tools → Agents → Budgets → Audit. Includes Create-* wizards for instructions / skills / tools / agents. API keys AES-encrypted via AI_ADMIN_ENCRYPTION_KEY env. The instruction / skill / tool / agent registries are SSOTs consumed by every ai-* consumer slice (chat + studio + agents)."
3606
+ "agentRecipe": "Run `npx rr add rate-limit`. Compose `rateLimitTables` into root convex/schema.ts. Wire `internal.features.rate_limit.mutations._pruneExpired` into convex/crons.ts every 5 min. Call `api.features.rate_limit.mutations.consume({ key, limit, windowMs })` from server-side handlers keep a fail-open wrapper so a Convex outage doesn't 503 the route."
2514
3607
  },
2515
3608
  {
2516
- "slug": "ai-router",
2517
- "title": "AI Router — Backend Provider Proxy",
2518
- "category": "ai",
3609
+ "slug": "subscribers",
3610
+ "title": "Subscribers",
3611
+ "category": "email",
2519
3612
  "kind": "backend",
2520
3613
  "version": "0.1.0",
2521
- "description": "Backend infrastructure (no UI). Single proxy that every other ai-* feature calls. Tier-routed nano (Haiku) for classification, mid (Sonnet) for chat, flagship (Opus) for deep reasoning. Per-call usage log + cost guard. Works with direct provider keys or OpenRouter umbrella.\n\nNot something you mountinstalled automatically as a peer when you add ai-chat / ai-studio / ai-agents.",
2522
- "source": "rahmanef63/resource-site",
2523
- "slicePath": "frontend/slices/ai-router",
3614
+ "description": "Newsletter list with honeypot + per-email rate-limit + token-based unsubscribe + admin remove. Public `subscribe` returns status strings (`created` / `already` / `resubscribed` / `honeypot`); admin `listAll` / `count` queries gated by `requireAdmin` (rr `_shared/auth`). Lifted 2026-05-16 from rahmanef.com; sanitized: token args dropped, sibling `analyticsEvents` insert removed wrap subscribe in a consumer action if you want funnel telemetry.",
3615
+ "source": "rahmanef.com",
3616
+ "slicePath": "frontend/slices/subscribers",
2524
3617
  "convexPaths": [
2525
- "convex/features/ai"
2526
- ],
2527
- "npm": [
2528
- "ai@^4.0.0",
2529
- "@openrouter/ai-sdk-provider@^0.0.5"
2530
- ],
2531
- "shadcn": [
2532
- "button"
3618
+ "convex/features/subscribers"
2533
3619
  ],
3620
+ "npm": [],
3621
+ "shadcn": [],
2534
3622
  "env": [
2535
3623
  {
2536
- "name": "OPENROUTER_API_KEY",
3624
+ "name": "SUPER_ADMIN_EMAIL",
2537
3625
  "scope": "convex",
2538
- "required": true
3626
+ "required": false,
3627
+ "description": "Optional super-admin gate for admin queries."
3628
+ }
3629
+ ],
3630
+ "peers": [
3631
+ {
3632
+ "slug": "convex-auth",
3633
+ "range": "^0.1",
3634
+ "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
2539
3635
  }
2540
3636
  ],
2541
- "peers": [],
2542
3637
  "providers": [],
2543
3638
  "tags": [
2544
- "ai",
2545
- "ai:backend",
2546
- "tier-routing",
2547
- "cost-guard"
3639
+ "email",
3640
+ "newsletter",
3641
+ "subscribers",
3642
+ "convex",
3643
+ "backend"
2548
3644
  ],
2549
- "agentRecipe": "Run `npx rr add ai-router`. Wrap every AI call through ai-router. Tiers: nano = quick classification (spam-flag, headline-suggest), mid = chat / draft, flagship = methodology-review / deep-think. Token usage logs to ai_usage table for the cost dashboard."
3645
+ "agentRecipe": "Run `npx rr add subscribers`. Compose `subscribersTables` into root convex/schema.ts. Public form posts `api.features.subscribers.mutations.subscribe({ email, source, website })` `website` is the honeypot, leave it `\"\"` from the form. Render unsubscribe link `/unsubscribe?t=<token>` and call `unsubscribe({ token })`."
2550
3646
  },
2551
3647
  {
2552
- "slug": "vector-search",
2553
- "title": "Convex Vector Search",
2554
- "category": "search",
2555
- "kind": "full",
3648
+ "slug": "testimonials",
3649
+ "title": "Testimonials",
3650
+ "category": "content",
3651
+ "kind": "backend",
2556
3652
  "version": "0.1.0",
2557
- "description": "Embeddings-based search via Convex's built-in vector index. Embed via OpenAI text-embedding-3-small (1536-dim), query via vectorIndex().",
2558
- "source": "rahmanef63/resource-site",
2559
- "slicePath": "frontend/slices/vector-search",
3653
+ "description": "Quote/name/role rotator backend. Public `listAll` + `get` (no auth — testimonials are public), admin CRUD via `requireAdmin`, internal `seed` for one-shot bootstrap. Indexed by `order` so carousel/grid keeps stable rotation. Lifted 2026-05-16 from rahmanef.com; token-based admin gate swapped for rr `_shared/auth`.",
3654
+ "source": "rahmanef.com",
3655
+ "slicePath": "frontend/slices/testimonials",
2560
3656
  "convexPaths": [
2561
- "convex/features/search"
2562
- ],
2563
- "npm": [
2564
- "@convex-dev/vector-search@^0.0.5"
2565
- ],
2566
- "shadcn": [
2567
- "card",
2568
- "input"
3657
+ "convex/features/testimonials"
2569
3658
  ],
3659
+ "npm": [],
3660
+ "shadcn": [],
2570
3661
  "env": [
2571
3662
  {
2572
- "name": "OPENAI_API_KEY",
3663
+ "name": "SUPER_ADMIN_EMAIL",
2573
3664
  "scope": "convex",
2574
- "required": true
3665
+ "required": false
3666
+ }
3667
+ ],
3668
+ "peers": [
3669
+ {
3670
+ "slug": "convex-auth",
3671
+ "range": "^0.1",
3672
+ "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
2575
3673
  }
2576
3674
  ],
2577
- "peers": [],
2578
3675
  "providers": [],
2579
3676
  "tags": [
2580
- "search",
2581
- "vector",
2582
- "embeddings",
3677
+ "content",
3678
+ "testimonials",
2583
3679
  "convex",
2584
- "rag"
3680
+ "backend",
3681
+ "marketing"
2585
3682
  ],
2586
- "agentRecipe": "Run `npx rr add vector-search`. Add embedding field + vectorIndex per searchable table. Re-embed on upsert via Convex action. Cache embeddings — don't re-call OpenAI on every read."
3683
+ "agentRecipe": "Run `npx rr add testimonials`. Compose `testimonialsTables` into root schema. Bootstrap via `npx convex run internal.features.testimonials.mutations.seed '{\"items\":[{\"quote\":\"...\",\"name\":\"...\",\"role\":\"...\",\"order\":1}]}'`. Render with `useQuery(api.features.testimonials.queries.listAll)`."
2587
3684
  },
2588
3685
  {
2589
- "slug": "mdx-blog",
2590
- "title": "MDX Blog",
3686
+ "slug": "services",
3687
+ "title": "Services",
2591
3688
  "category": "content",
2592
- "kind": "ui",
2593
- "version": "0.2.0",
2594
- "description": "Markdown-with-JSX untuk blog post. File-based MDX content collection. Portable defineMdxBlog(opts) factory dengan 4 config props (basePath, contentDir, labels.list, nav) defaults preserve legacy /blog + content/blog. Auto-generate ToC, reading-time, syntax highlight, plus embed React components inline.",
2595
- "source": "rahmanef63/resource-site",
2596
- "slicePath": "frontend/slices/mdx-blog",
2597
- "convexPaths": [],
2598
- "npm": [
2599
- "@next/mdx@^16.0.0",
2600
- "gray-matter@^4.0.3",
2601
- "rehype-pretty-code@^0.14.0"
3689
+ "kind": "backend",
3690
+ "version": "0.1.0",
3691
+ "description": "Service offerings backend title + summary + deliverables array + sort order. Public read, admin CRUD, internal seed. Pairs with a frontend services grid/list (consumer-side). Lifted 2026-05-16 from rahmanef.com; token-based admin gate swapped for rr `_shared/auth`.",
3692
+ "source": "rahmanef.com",
3693
+ "slicePath": "frontend/slices/services",
3694
+ "convexPaths": [
3695
+ "convex/features/services"
2602
3696
  ],
2603
- "shadcn": [
2604
- "card"
3697
+ "npm": [],
3698
+ "shadcn": [],
3699
+ "env": [
3700
+ {
3701
+ "name": "SUPER_ADMIN_EMAIL",
3702
+ "scope": "convex",
3703
+ "required": false
3704
+ }
3705
+ ],
3706
+ "peers": [
3707
+ {
3708
+ "slug": "convex-auth",
3709
+ "range": "^0.1",
3710
+ "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
3711
+ }
2605
3712
  ],
2606
- "env": [],
2607
- "peers": [],
2608
3713
  "providers": [],
2609
3714
  "tags": [
2610
3715
  "content",
2611
- "blog",
2612
- "mdx",
2613
- "static"
3716
+ "services",
3717
+ "convex",
3718
+ "backend",
3719
+ "marketing",
3720
+ "agency"
2614
3721
  ],
2615
- "agentRecipe": "Run `npx rr add mdx-blog`. Store post body sebagai markdown di content/blog/*.mdx. Render dengan MDXRemote di [slug]/page.tsx. Auto-extract headings ke ToC via remark plugin custom."
3722
+ "agentRecipe": "Run `npx rr add services`. Compose `servicesTables` into root schema. Use `useQuery(api.features.services.queries.listAll)` from a server component / route to render service cards. CRUD via admin UI calling `create` / `update` / `remove` after `requireAdmin` passes."
2616
3723
  },
2617
3724
  {
2618
- "slug": "cal-com-booking",
2619
- "title": "Cal.com Booking",
2620
- "category": "data",
2621
- "kind": "full",
3725
+ "slug": "socials",
3726
+ "title": "Socials",
3727
+ "category": "content",
3728
+ "kind": "backend",
2622
3729
  "version": "0.1.0",
2623
- "description": "Embedded Cal.com booking widget + webhook receiver to mirror bookings into Convex.",
2624
- "source": "rahmanef63/resource-site",
2625
- "slicePath": "frontend/slices/cal-com-booking",
3730
+ "description": "Single source of truth for profile/social links. Powers JSON-LD `Person.sameAs` (Google entity graph), IndieWeb `<link rel=\"me\">` tags, and footer/contact/about UI surfaces. URL-deduped, ordered, `visible` / `featured` / `relMe` / `sameAs` flags. Lifted 2026-05-16 from rahmanef.com; token-based admin gate swapped, baked-in 14-platform rahmanef seed dropped — `seed` now takes items via args so each adopter ships their own list.",
3731
+ "source": "rahmanef.com",
3732
+ "slicePath": "frontend/slices/socials",
2626
3733
  "convexPaths": [
2627
- "convex/features/bookings"
2628
- ],
2629
- "npm": [
2630
- "@calcom/embed-react@^1.5.0"
2631
- ],
2632
- "shadcn": [
2633
- "card"
3734
+ "convex/features/socials"
2634
3735
  ],
3736
+ "npm": [],
3737
+ "shadcn": [],
2635
3738
  "env": [
2636
3739
  {
2637
- "name": "NEXT_PUBLIC_CALCOM_USERNAME",
2638
- "scope": "next-public",
2639
- "required": true
2640
- },
2641
- {
2642
- "name": "CALCOM_WEBHOOK_SECRET",
3740
+ "name": "SUPER_ADMIN_EMAIL",
2643
3741
  "scope": "convex",
2644
- "required": true
3742
+ "required": false
3743
+ }
3744
+ ],
3745
+ "peers": [
3746
+ {
3747
+ "slug": "convex-auth",
3748
+ "range": "^0.1",
3749
+ "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
2645
3750
  }
2646
3751
  ],
2647
- "peers": [],
2648
3752
  "providers": [],
2649
3753
  "tags": [
2650
- "data",
2651
- "scheduling",
2652
- "cal-com",
2653
- "bookings"
3754
+ "content",
3755
+ "socials",
3756
+ "seo",
3757
+ "indieweb",
3758
+ "convex",
3759
+ "backend"
2654
3760
  ],
2655
- "agentRecipe": "Run `npx rr add cal-com-booking`. 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."
3761
+ "agentRecipe": "Run `npx rr add socials`. Compose `socialsTables` into root schema. Bootstrap with `npx convex run internal.features.socials.mutations.seed '{\"items\":[{\"platform\":\"github\",\"url\":\"https://github.com/<you>\",\"order\":1,\"visible\":true,\"featured\":true,\"sameAs\":true,\"relMe\":true}]}'`. Wire `useQuery(api.features.socials.queries.listVisible)` into footer for entity-graph SEO."
2656
3762
  },
2657
3763
  {
2658
- "slug": "full-width-toggle",
2659
- "title": "Full Width Toggle",
2660
- "category": "ui",
2661
- "kind": "ui",
3764
+ "slug": "create-your-mcp",
3765
+ "title": "Create Your MCP",
3766
+ "category": "ai",
3767
+ "kind": "full",
2662
3768
  "version": "0.1.0",
2663
- "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.",
2664
- "source": "rahmanef63/resource-site",
2665
- "slicePath": "frontend/slices/full-width-toggle",
2666
- "convexPaths": [],
2667
- "npm": [],
2668
- "shadcn": [
2669
- "button"
2670
- ],
2671
- "env": [],
2672
- "peers": [],
2673
- "providers": [],
2674
- "tags": [
2675
- "ui",
2676
- "layout",
2677
- "preference",
2678
- "localstorage",
2679
- "dashboard"
3769
+ "description": "Turn any rr-based app into an MCP server that ChatGPT custom apps, Claude.ai connectors, Cursor MCP, and other AI clients authenticate to. OAuth 2.1 + PKCE flow with code → bearer exchange, env-configured vendor-host allowlist, single-use codes, 1-year bearer tokens, scope-tagged tools, opaque error collapsing, constant-time token compare. Static MCP_API_KEY fallback for service-account / CI scripts. Sanitized 2026-05-16 from rahmanef.com's production MCP integration — vendor literals (chatgpt.com / OpenAI paths) replaced with MCP_OAUTH_ALLOWED_HOSTS + MCP_OAUTH_ALLOWED_PATH_PREFIXES env vars so the slice ships portable.",
3770
+ "source": "rahmanef.com",
3771
+ "slicePath": "frontend/slices/create-your-mcp",
3772
+ "convexPaths": [
3773
+ "convex/features/create-your-mcp"
2680
3774
  ],
2681
- "agentRecipe": "Run `npx rr add full-width-toggle`. 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."
2682
- },
2683
- {
2684
- "slug": "command-menu",
2685
- "title": "Command Menu",
2686
- "category": "ui",
2687
- "kind": "ui",
2688
- "version": "0.2.0",
2689
- "description": "Renderless ⌘K command palette + generic search modal. Consumer supplies CommandGroup[] + onSelect + label bag; slice owns dialog chrome, ⌘K hotkey, MRU history. Pulled UP from notion-page-clone's command-palette renderless surface (Wave N+3.7) — Nosion adapters dropped at the kitab boundary.",
2690
- "source": "notion-page-clone (consumerVersion 0.3.0) + earlier superspace facade",
2691
- "slicePath": "frontend/slices/command-menu",
2692
- "convexPaths": [],
2693
- "npm": [
2694
- "cmdk@^1.0.0"
3775
+ "npm": [],
3776
+ "shadcn": [],
3777
+ "env": [
3778
+ {
3779
+ "name": "MCP_API_KEY",
3780
+ "scope": "server",
3781
+ "required": false,
3782
+ "description": "Static bearer for service-account / CI access. Min 32 chars. Must match Convex env."
3783
+ },
3784
+ {
3785
+ "name": "MCP_OAUTH_ALLOWED_HOSTS",
3786
+ "scope": "convex",
3787
+ "required": false,
3788
+ "description": "CSV vendor domains for redirect_uri (chatgpt.com,claude.ai,cursor.sh)."
3789
+ },
3790
+ {
3791
+ "name": "MCP_OAUTH_ALLOWED_PATH_PREFIXES",
3792
+ "scope": "convex",
3793
+ "required": false,
3794
+ "description": "CSV path prefixes under allowed hosts (/aip/,/connector/,/oauth/)."
3795
+ },
3796
+ {
3797
+ "name": "NEXT_PUBLIC_SITE_URL",
3798
+ "scope": "next-public",
3799
+ "required": true,
3800
+ "description": "Public site origin for WWW-Authenticate challenge."
3801
+ }
2695
3802
  ],
2696
- "shadcn": [
2697
- "command",
2698
- "dialog"
3803
+ "peers": [
3804
+ {
3805
+ "slug": "convex-auth",
3806
+ "range": "^0.1",
3807
+ "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
3808
+ }
2699
3809
  ],
2700
- "env": [],
2701
- "peers": [],
2702
3810
  "providers": [],
2703
3811
  "tags": [
2704
- "ui",
2705
- "palette",
2706
- "cmd-k",
2707
- "navigation",
2708
- "keyboard",
2709
- "search"
3812
+ "ai",
3813
+ "mcp",
3814
+ "oauth",
3815
+ "pkce",
3816
+ "chatgpt",
3817
+ "claude",
3818
+ "cursor",
3819
+ "convex",
3820
+ "integration"
2710
3821
  ],
2711
- "agentRecipe": "Run `npx rr add command-menu`. Wire <CommandPalette groups={...} onHistorySelect={...} labels={...} /> at the dashboard shell. Build groups from your feature registry; each item.onSelect handles navigation. Use <SearchModal bindings={{ pages, databases, recents, isLoading, onQueryChange, onSelectPage, onSelectDatabase }} /> for the search dialog see slice README.md for adapter shapes."
3822
+ "agentRecipe": "Run `npx rr add create-your-mcp`. Compose `createYourMcpTables` into root schema. Move `slices/create-your-mcp/routes/mcp.route.ts` `app/api/mcp/route.ts` and `oauth-token.route.ts` `app/api/oauth/token/route.ts`. Set MCP_OAUTH_ALLOWED_HOSTS (CSV vendor domains). Mount `<McpAdminView />` at /admin/mcp. Connect ChatGPT/Claude/Cursor via the setup form rendered by the admin view."
2712
3823
  },
2713
3824
  {
2714
- "slug": "motion-primitives",
2715
- "title": "Motion Primitives (8)",
2716
- "category": "ui",
2717
- "kind": "ui",
3825
+ "slug": "contact-form-resend",
3826
+ "title": "Contact Form + Resend",
3827
+ "category": "email",
3828
+ "kind": "full",
2718
3829
  "version": "0.1.0",
2719
- "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.",
2720
- "source": "rahmanef.com",
2721
- "slicePath": "template-base/frontend/slices/motion-primitives",
3830
+ "description": "Contact form posting to Resend email API. Server Action + Zod input validation. Convex mutation for storage + Resend send.",
3831
+ "source": "cescadesigns",
3832
+ "slicePath": "template-base/frontend/slices/contact-form-resend",
2722
3833
  "convexPaths": [],
2723
3834
  "npm": [
3835
+ "resend@^4.0.0",
2724
3836
  "framer-motion@^11.0.0"
2725
3837
  ],
2726
- "shadcn": [],
2727
- "env": [],
2728
- "peers": [],
2729
- "providers": [],
2730
- "tags": [
2731
- "ui",
2732
- "motion",
2733
- "animation",
2734
- "marquee",
2735
- "framer-motion"
2736
- ],
2737
- "agentRecipe": "Run `npx rr add motion-primitives`. 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."
2738
- },
2739
- {
2740
- "slug": "responsive-dialog",
2741
- "title": "Responsive Dialog (Sheet ↔ Modal)",
2742
- "category": "ui",
2743
- "kind": "ui",
2744
- "version": "0.1.0",
2745
- "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.",
2746
- "source": "superspace",
2747
- "slicePath": "template-base/frontend/slices/responsive-dialog",
2748
- "convexPaths": [],
2749
- "npm": [],
2750
3838
  "shadcn": [
2751
- "dialog",
2752
- "sheet"
3839
+ "card",
3840
+ "button",
3841
+ "input",
3842
+ "label",
3843
+ "textarea"
3844
+ ],
3845
+ "env": [
3846
+ {
3847
+ "name": "RESEND_API_KEY",
3848
+ "scope": "convex",
3849
+ "required": true
3850
+ }
3851
+ ],
3852
+ "peers": [
3853
+ {
3854
+ "slug": "convex-auth",
3855
+ "range": "^0.1",
3856
+ "reason": "Optional — anonymous submission works without auth."
3857
+ }
2753
3858
  ],
2754
- "env": [],
2755
- "peers": [],
2756
3859
  "providers": [],
2757
3860
  "tags": [
2758
- "ui",
2759
- "dialog",
2760
- "modal",
2761
- "sheet",
2762
- "responsive",
2763
- "primitive"
3861
+ "form",
3862
+ "email",
3863
+ "resend",
3864
+ "convex"
2764
3865
  ],
2765
- "agentRecipe": "Run `npx rr add responsive-dialog`. 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)')."
3866
+ "agentRecipe": "Run `npx rr add contact-form-resend`. 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."
2766
3867
  },
2767
3868
  {
2768
- "slug": "dashboard-shell",
2769
- "title": "Dashboard Shell Responsive",
2770
- "category": "ui",
2771
- "kind": "ui",
2772
- "version": "0.1.0",
2773
- "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 slicepulls from template-base/frontend/slices/dashboard-shell.",
2774
- "source": "superspace",
2775
- "slicePath": "template-base/frontend/slices/dashboard-shell",
2776
- "convexPaths": [],
3869
+ "slug": "admin",
3870
+ "title": "AdminGeneric Shell",
3871
+ "category": "infra",
3872
+ "kind": "full",
3873
+ "version": "0.2.0",
3874
+ "description": "Per-instance admin landing scaffold + portable nav-from-registry factory. Consumer supplies a SliceRegistryAdapter (each slice declares its own admin.activity[]) + queryTable reader; the slice's buildAdminStats(opts) emits the { counts, unreadMessages, activity } shape Convex's admin.stats query returns. Pulled UP from rahmanef.com (Wave N+3.1, commit b542389) domain literals dropped at the kitab boundary. Gated by requireAdmin on Convex side; superadmin email gate via SUPER_ADMIN_EMAIL env.",
3875
+ "source": "rahmanef63/resource-site",
3876
+ "slicePath": "frontend/slices/admin",
3877
+ "convexPaths": [
3878
+ "convex/features/admin"
3879
+ ],
2777
3880
  "npm": [],
2778
3881
  "shadcn": [
2779
- "sheet",
2780
- "scroll-area",
2781
- "separator",
2782
- "tooltip"
3882
+ "card",
3883
+ "button"
3884
+ ],
3885
+ "env": [
3886
+ {
3887
+ "name": "SUPER_ADMIN_EMAIL",
3888
+ "scope": "convex",
3889
+ "required": false
3890
+ }
2783
3891
  ],
2784
- "env": [],
2785
3892
  "peers": [
2786
3893
  {
2787
- "slug": "full-width-toggle",
3894
+ "slug": "convex-auth",
2788
3895
  "range": "^0.1",
2789
- "reason": "Topbar surfaces the width toggle when this is mounted."
3896
+ "reason": "requireAdmin gate uses convex-auth user identity."
2790
3897
  }
2791
3898
  ],
2792
3899
  "providers": [],
2793
3900
  "tags": [
2794
- "ui",
2795
- "layout",
2796
- "dashboard",
2797
- "sidebar",
2798
- "topbar",
2799
- "responsive"
3901
+ "infra",
3902
+ "admin",
3903
+ "shell",
3904
+ "crud",
3905
+ "nav-from-registry"
2800
3906
  ],
2801
- "agentRecipe": "Run `npx rr add dashboard-shell`. 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."
3907
+ "agentRecipe": "Run `rr add admin`. Wire <AdminPage labels={...} /> at /admin and call buildAdminStats({ sliceRegistry, queryTable }) inside convex/features/admin/query.ts sliceRegistry.entries flat-maps each feature's admin.activity[] declarations. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address."
2802
3908
  },
2803
3909
  {
2804
- "slug": "broadcast-channel-sync",
2805
- "title": "BroadcastChannelCross-tab Sync",
2806
- "category": "realtime",
2807
- "kind": "ui",
3910
+ "slug": "platform-admin",
3911
+ "title": "Platform Admin Multi-Tenant Control Plane",
3912
+ "category": "infra",
3913
+ "kind": "full",
2808
3914
  "version": "0.1.0",
2809
- "description": "Same-origin cross-tab + cross-iframe state sync via BroadcastChannel API. Tiny, no backend, no install.",
2810
- "source": "Web Platform — BroadcastChannel API",
2811
- "slicePath": "frontend/slices/broadcast-channel-sync",
3915
+ "description": "Multi-tenant SaaS control plane. Workspace lifecycle ops (list/delete/cascade), per-tenant tier presets (gates + quota), KPI dashboard grid. Consumer-domain bits injected via adapter props (tenantTablesAdapter / tierPresets / kpiSources). Contract-only scaffold; canonical implementation lands via /rr-send from superspace. See docs/contract-negotiations-2026-05-15.md §4.",
3916
+ "source": "rahmanef63/resource-site",
3917
+ "slicePath": "frontend/slices/platform-admin",
2812
3918
  "convexPaths": [],
2813
3919
  "npm": [],
2814
3920
  "shadcn": [],
2815
- "env": [],
2816
- "peers": [],
3921
+ "env": [
3922
+ {
3923
+ "name": "PLATFORM_ADMIN_EMAILS",
3924
+ "scope": "convex",
3925
+ "required": true,
3926
+ "description": "Comma-separated list of platform admin email addresses."
3927
+ }
3928
+ ],
3929
+ "peers": [
3930
+ {
3931
+ "slug": "convex-auth",
3932
+ "range": "^0.1",
3933
+ "reason": "Actor identity for audit + tier-set ops."
3934
+ },
3935
+ {
3936
+ "slug": "audit-log",
3937
+ "range": "^0.2",
3938
+ "reason": "padmin_audit table feeds through audit-log TenantAdapter."
3939
+ }
3940
+ ],
2817
3941
  "providers": [],
2818
3942
  "tags": [
2819
- "realtime",
2820
- "cross-tab",
2821
- "broadcast-channel",
2822
- "demo-pattern"
3943
+ "infra",
3944
+ "admin",
3945
+ "multi-tenant",
3946
+ "saas",
3947
+ "platform"
2823
3948
  ],
2824
- "agentRecipe": "Run `npx rr add broadcast-channel-sync`. 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."
3949
+ "agentRecipe": "Run `npx rr add platform-admin`. Contract-only scaffold. Wait for superspace /rr-send platform-admin before adopting. Distinct from per-instance `admin` slug."
2825
3950
  },
2826
3951
  {
2827
- "slug": "rbac-roles",
2828
- "title": "RBACTiered System Roles",
2829
- "category": "auth",
3952
+ "slug": "audit-log",
3953
+ "title": "Audit Log Workspace Events",
3954
+ "category": "infra",
2830
3955
  "kind": "backend",
2831
- "version": "0.1.0",
2832
- "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).",
2833
- "source": "superspace",
2834
- "slicePath": "",
3956
+ "version": "0.2.0",
3957
+ "description": "Workspace-scoped audit event recorder. Canonical logAuditEvent helper for mutations + actions; supports entity tracking, before/after diff, IP/user-agent capture.",
3958
+ "source": "rahmanef63/resource-site",
3959
+ "slicePath": "frontend/slices/audit-log",
2835
3960
  "convexPaths": [
2836
- "template-base/convex/lib/rbac"
3961
+ "convex/features/audit-log"
2837
3962
  ],
2838
3963
  "npm": [],
2839
3964
  "shadcn": [],
2840
- "env": [
2841
- {
2842
- "name": "PLATFORM_ADMIN_EMAILS",
2843
- "scope": "convex",
2844
- "description": "Comma-separated emails granted cross-workspace admin."
2845
- }
2846
- ],
3965
+ "env": [],
2847
3966
  "peers": [
2848
3967
  {
2849
3968
  "slug": "convex-auth",
2850
3969
  "range": "^0.1",
2851
- "reason": "RBAC checks the authed user identity."
3970
+ "reason": "Event actor resolved via authenticated user."
2852
3971
  }
2853
3972
  ],
2854
3973
  "providers": [],
2855
3974
  "tags": [
2856
- "rbac",
2857
- "auth",
2858
- "permissions",
2859
- "roles",
2860
- "workspaces"
3975
+ "infra",
3976
+ "audit",
3977
+ "compliance",
3978
+ "logging"
2861
3979
  ],
2862
- "agentRecipe": "Run `npx rr add rbac-roles`. 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."
3980
+ "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? }."
2863
3981
  },
2864
3982
  {
2865
- "slug": "admin-panel",
2866
- "title": "Admin Panel Unified Product Admin",
2867
- "category": "infra",
3983
+ "slug": "comments",
3984
+ "title": "CommentsThreaded",
3985
+ "category": "content",
2868
3986
  "kind": "full",
2869
- "version": "0.1.0",
2870
- "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.",
2871
- "source": "superspace + spec",
2872
- "slicePath": "template-base/frontend/slices/admin-panel",
3987
+ "version": "0.2.0",
3988
+ "description": "Polymorphic-target threaded comments. Consumer picks `TargetRef = { kind, id, subId? }` (e.g. page+block, blog+slug, task+id). Renderless <CommentsThread> + <CommentsAnchor> wrappers. useComments(bindings, opts) hook returns items + openCount + CRUD + forbiddenWords guard. Adapter pattern see contract-negotiations §1.",
3989
+ "source": "rahmanef63/resource-site",
3990
+ "slicePath": "frontend/slices/comments",
2873
3991
  "convexPaths": [
2874
- "template-base/convex/features/admin-panel"
3992
+ "convex/features/comments"
2875
3993
  ],
2876
3994
  "npm": [],
2877
3995
  "shadcn": [
2878
- "card",
2879
- "badge",
2880
- "button"
3996
+ "button",
3997
+ "textarea",
3998
+ "avatar"
2881
3999
  ],
2882
4000
  "env": [],
2883
4001
  "peers": [
2884
4002
  {
2885
- "slug": "rbac-roles",
4003
+ "slug": "convex-auth",
2886
4004
  "range": "^0.1",
2887
- "reason": "Admin sections require RBAC perms — must seed roles first."
4005
+ "reason": "Comment author identity from convex-auth."
2888
4006
  }
2889
4007
  ],
2890
4008
  "providers": [],
2891
4009
  "tags": [
2892
- "admin",
2893
- "owner",
2894
- "platform",
2895
- "rbac",
2896
- "instrumentation",
2897
- "panel"
4010
+ "content",
4011
+ "social",
4012
+ "comments",
4013
+ "threaded",
4014
+ "annotations"
2898
4015
  ],
2899
- "agentRecipe": "Run `npx rr add admin-panel`. 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."
4016
+ "agentRecipe": "Run `rr add comments`. Wire Convex bindings ({ list, create, update, resolve, remove }) then use <CommentsThread target={{ kind, id, subId? }} bindings={bindings} forbiddenWords={[...]}>{render-prop}</CommentsThread> OR <CommentsAnchor target=... bindings=... pathMap={(t)=>...}>. v0.2.0 polymorphic pick `kind` literal per host domain."
2900
4017
  },
2901
4018
  {
2902
- "slug": "event-tracking",
2903
- "title": "Event Tracking P0 Instrumentation",
2904
- "category": "data",
4019
+ "slug": "seo",
4020
+ "title": "SEOAI Metadata Generator",
4021
+ "category": "content",
2905
4022
  "kind": "full",
2906
- "version": "0.1.0",
2907
- "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.",
2908
- "source": "spec + superspace analytics",
2909
- "slicePath": "template-base/frontend/slices/admin-panel/slices/events",
4023
+ "version": "0.2.0",
4024
+ "description": "Service slice for SEO metadata generation Anthropic-backed action with per-user 24h cost guard + portable persona prop. No public route. Backend exposes generate + generateAndApply mutations gated by requireAdmin; consumers inject brand voice via the personaContext arg (or buildSeoSystemPrompt factory).",
4025
+ "source": "rahmanef63/resource-site",
4026
+ "slicePath": "frontend/slices/seo",
2910
4027
  "convexPaths": [
2911
- "template-base/convex/features/admin-panel",
2912
- "template-base/convex/features/analytics"
4028
+ "convex/features/seo"
2913
4029
  ],
2914
4030
  "npm": [],
2915
4031
  "shadcn": [],
2916
- "env": [],
4032
+ "env": [
4033
+ {
4034
+ "name": "ANTHROPIC_API_KEY",
4035
+ "scope": "server",
4036
+ "required": true
4037
+ }
4038
+ ],
2917
4039
  "peers": [
2918
4040
  {
2919
- "slug": "admin-panel",
4041
+ "slug": "convex-auth",
2920
4042
  "range": "^0.1",
2921
- "reason": "Lives under admin slice events subfolder."
4043
+ "reason": "Cost guard + requireAdmin gates use convex-auth user identity."
2922
4044
  }
2923
4045
  ],
2924
4046
  "providers": [],
2925
4047
  "tags": [
2926
- "events",
2927
- "analytics",
2928
- "instrumentation",
2929
- "attribution",
2930
- "utm",
2931
- "p0"
4048
+ "content",
4049
+ "seo",
4050
+ "ai",
4051
+ "anthropic",
4052
+ "metadata-generator"
2932
4053
  ],
2933
- "agentRecipe": "Run `npx rr add event-tracking`. 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."
4054
+ "agentRecipe": "Run `rr add seo`. Call seo.generate from server actions or admin mutations with `personaContext` describing your brand voice (or rely on the generic default). Cost guard rate-limits per-user within 24h via callsInWindow query."
2934
4055
  },
2935
4056
  {
2936
- "slug": "theme-preset-switcher",
2937
- "title": "Theme Preset Switcher",
2938
- "category": "ui",
2939
- "kind": "ui",
4057
+ "slug": "document-checklist",
4058
+ "title": "Document Checklist — Job-Search Doc Tracker",
4059
+ "category": "content",
4060
+ "kind": "full",
2940
4061
  "version": "0.1.0",
2941
- "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.",
2942
- "source": "rahmanef.com",
2943
- "slicePath": "template-base/frontend/shared/theme",
2944
- "convexPaths": [],
2945
- "npm": [],
2946
- "shadcn": [],
2947
- "env": [],
2948
- "peers": [],
2949
- "providers": [],
2950
- "tags": [
2951
- "theme",
2952
- "presets",
2953
- "oklch",
2954
- "design-system"
4062
+ "description": "Track required job-search documents (CV, KTP, ijazah, etc.) with country-scoped seed templates and per-user completion state. Ships an Indonesian default checklist. Toggle completed + notes + expiry per item.",
4063
+ "source": "rahmanef63/CareerPack",
4064
+ "slicePath": "frontend/slices/document-checklist",
4065
+ "convexPaths": [
4066
+ "convex/features/document-checklist"
4067
+ ],
4068
+ "npm": [
4069
+ "lucide-react"
2955
4070
  ],
2956
- "agentRecipe": "Run `npx rr add theme-preset-switcher`. 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."
2957
- },
2958
- {
2959
- "slug": "icon-picker",
2960
- "title": "Icon Picker",
2961
- "category": "ui",
2962
- "kind": "ui",
2963
- "version": "0.2.0",
2964
- "description": "Emoji + lucide icon picker with search, 10-color palette, Twemoji/native toggle, recents tracking. One string stores emoji OR lucide:Name OR with ?c=hex tint — backwards-compat with raw-emoji fields. Two variants: Popover (compact trigger) and Inline (full sheet/dialog use). Lifted 2026-05-16 from notion-page-clone — full implementation (19 files) including emoji-keywords search index, twemoji renderer, lucide-catalog, recents store, style-pref hook.",
2965
- "source": "notion-page-clone",
2966
- "slicePath": "frontend/slices/icon-picker",
2967
- "convexPaths": [],
2968
- "npm": [],
2969
4071
  "shadcn": [
2970
- "popover",
4072
+ "badge",
2971
4073
  "button",
2972
- "input",
4074
+ "card",
4075
+ "dialog",
4076
+ "label",
4077
+ "popover",
4078
+ "calendar",
4079
+ "progress",
2973
4080
  "scroll-area",
2974
- "tabs"
4081
+ "skeleton",
4082
+ "tabs",
4083
+ "textarea"
2975
4084
  ],
2976
4085
  "env": [],
2977
- "peers": [],
4086
+ "peers": [
4087
+ {
4088
+ "slug": "convex-auth",
4089
+ "range": "^0.1",
4090
+ "reason": "Auth identity for user-scoped checklist state."
4091
+ }
4092
+ ],
2978
4093
  "providers": [],
2979
4094
  "tags": [
2980
- "icon",
2981
- "emoji",
2982
- "lucide",
2983
- "picker",
2984
- "twemoji",
2985
- "notion"
4095
+ "career",
4096
+ "documents",
4097
+ "checklist",
4098
+ "job-search",
4099
+ "indonesia"
2986
4100
  ],
2987
- "agentRecipe": "Run `npx rr add icon-picker`. parseIconValue() decodes; lucideValue()/withColor() build. Add 'icon: v.string()' to Convex table no migration needed for existing emoji fields. <IconPicker> wraps any trigger (Popover); <IconPickerInline> for sheets/dialogs. <DynamicIcon> renders from parsed value."
4101
+ "agentRecipe": "Run `rr add document-checklist`. Wire <DocumentChecklist bindings={{ current, seed, updateStatus }} countryTemplateSlot={<CountryTemplateCard bindings={{ templates, getTemplate, instantiate }} />} /> bindings sourced from api.features['document-checklist'].* queries/mutations."
2988
4102
  },
2989
4103
  {
2990
- "slug": "cta",
2991
- "title": "Call to Action",
4104
+ "slug": "pricing-page",
4105
+ "title": "Pricing Page",
2992
4106
  "category": "ui",
2993
4107
  "kind": "ui",
2994
4108
  "version": "0.1.0",
2995
- "description": "Brutalist call-to-action section — eyebrow label, serif headline, body, arrow CTA. Pair with CtaButton standalone for inline placements. Lifted 2026-05-16 from rahmanef.com; assumes Tailwind tracking-brutal / tracking-brutal-sm utilities OR drop them for the default tracking scale.",
2996
- "source": "rahmanef.com",
2997
- "slicePath": "frontend/slices/cta",
4109
+ "description": "Canonical pricing tier section — eyebrow + headline + 2/3/4 column tier grid with optional FAQ accordion below. Tiers fully data-driven (name/price/period/bullets/cta/featured/badge). Featured variant configurable (ring/scale/tint). Single SSOT every saas/marketing template consumes this slice for pricing pages so admin-edited tiers propagate without per-template rewriting.",
4110
+ "source": "rahman-resources",
4111
+ "slicePath": "frontend/slices/pricing-page",
2998
4112
  "convexPaths": [],
2999
4113
  "npm": [
3000
4114
  "lucide-react@^0.400.0"
3001
4115
  ],
3002
- "shadcn": [],
4116
+ "shadcn": [
4117
+ "button",
4118
+ "card",
4119
+ "accordion"
4120
+ ],
3003
4121
  "env": [],
3004
4122
  "peers": [],
3005
4123
  "providers": [],
3006
4124
  "tags": [
3007
4125
  "ui",
3008
- "marketing",
3009
- "cta",
4126
+ "pricing",
3010
4127
  "section",
3011
- "brutalist"
4128
+ "marketing",
4129
+ "saas",
4130
+ "tiers",
4131
+ "faq"
3012
4132
  ],
3013
- "agentRecipe": "Run `npx rr add cta`. <CtaView eyebrow title body href ctaLabel /> renders the full section; <CtaButton href label /> drops a standalone arrow button anywhere. Override tracking-brutal utilities in tailwind.config or swap for tracking-wide if your design system has no brutal preset."
4133
+ "agentRecipe": "Run `npx rr add pricing-page`. <PricingSection eyebrow title subtitle tiers columns faq faqTitle featuredVariant /> only `title` + `tiers` required. Each tier: `{ id, name, price, period?, blurb?, bullets[], cta?, featured?, badge? }`. Pass `featuredVariant=\"scale\"` for a popped-forward card or `\"tint\"` for a colored background. Wire admin CRUD via your store hook useTiers() pass array."
3014
4134
  },
3015
4135
  {
3016
- "slug": "hero",
3017
- "title": "Hero",
4136
+ "slug": "feature-grid",
4137
+ "title": "Feature Grid",
3018
4138
  "category": "ui",
3019
4139
  "kind": "ui",
3020
4140
  "version": "0.1.0",
3021
- "description": "Editorial split-grid landing hero — eyebrow pill + large serif H1 + italic pull-quote + 1-2 button CTA row + right-column portrait card with optional caption. Fully props-driven (title/quote/ctas/image). Sanitized from rahmanef.com on 2026-05-16: SITE_CONFIG hardcode dropped, custom Heading/Section primitives replaced with raw semantic elements + stock Tailwind tracking-widest so the slice ships without consumer preset utilities.",
3022
- "source": "rahmanef.com",
3023
- "slicePath": "frontend/slices/hero",
4141
+ "description": "Canonical features grid section — eyebrow + headline + 1/2/3/4 column item grid in three layout variants (cards, minimal, alternating). Items accept Lucide icon component OR string label, optional image (next/image), optional link CTA. Single SSOT every template consumes this slice for features pages so admin-edited items propagate without per-template duplication.",
4142
+ "source": "rahman-resources",
4143
+ "slicePath": "frontend/slices/feature-grid",
3024
4144
  "convexPaths": [],
3025
4145
  "npm": [
3026
4146
  "lucide-react@^0.400.0"
3027
4147
  ],
3028
- "shadcn": [],
4148
+ "shadcn": [
4149
+ "button",
4150
+ "card"
4151
+ ],
3029
4152
  "env": [],
3030
4153
  "peers": [],
3031
4154
  "providers": [],
3032
4155
  "tags": [
3033
4156
  "ui",
3034
- "hero",
3035
- "marketing",
3036
- "landing",
4157
+ "features",
3037
4158
  "section",
3038
- "editorial",
3039
- "brutalist"
4159
+ "marketing",
4160
+ "grid",
4161
+ "saas"
3040
4162
  ],
3041
- "agentRecipe": "Run `npx rr add hero`. <HeroView title eyebrow quote ctas image imageCaption /> — all props optional except title. Pass `image={undefined}` for text-only hero (auto-collapses to single 12-column row). Pairs visually with cta slice (same brutalist border + serif scale)."
4163
+ "agentRecipe": "Run `npx rr add feature-grid`. <FeatureGridSection eyebrow title subtitle items columns layout align /> — only `items` required. Each item: `{ id, title, body, icon?, image?, link? }`. `icon` can be a LucideIcon component (rendered as 5×5 inline) or a string (rendered as letter fallback). `layout=\"alternating\"` produces image+text rows that flip per index set `image` per item for that variant."
3042
4164
  },
3043
4165
  {
3044
- "slug": "rate-limit",
3045
- "title": "Rate Limit",
4166
+ "slug": "landing-sections",
4167
+ "title": "Landing Sections",
3046
4168
  "category": "infra",
3047
- "kind": "backend",
4169
+ "kind": "ui",
3048
4170
  "version": "0.1.0",
3049
- "description": "Convex-backed per-key request counter. Atomic check-and-increment via `consume` mutation; expired rows pruned by `_pruneExpired` internalMutation wired to a 5-min cron. Replaces single-replica in-memory Map so multi-replica Next deployments share buckets. Caller chooses key namespace (csp:<ip>, mcp:<ip>, oauth_token:<ip>). Lifted 2026-05-16 from rahmanef.com.",
3050
- "source": "rahmanef.com",
3051
- "slicePath": "frontend/slices/rate-limit",
3052
- "convexPaths": [
3053
- "convex/features/rate-limit"
4171
+ "description": "CRUD-driven admin editor for the public landing-page composition. Ships a pure reducer + LandingProvider store adapter + admin LandingView/LandingEditorView built on the shared CRUD primitives, plus a per-section LandingSectionShell that handles background image + custom Tailwind className overlay. Sections carry { kind, order, title, subtitle, enabled, imageUrl, imageRatio, bgImageUrl, className, config (JSON) } with up/down reorder arrows. Consumers map each `kind` (hero, features, pricing, blog, changelog, testimonials, portfolio, services, stats, newsletter, faq, cta, custom) to their own renderer wrapped in <LandingSectionShell>. Canonical pattern used by all 7 rr website templates.",
4172
+ "source": "rahman-resources",
4173
+ "slicePath": "frontend/slices/landing-sections",
4174
+ "convexPaths": [],
4175
+ "npm": [
4176
+ "lucide-react@^0.400.0"
4177
+ ],
4178
+ "shadcn": [
4179
+ "badge",
4180
+ "button",
4181
+ "dialog",
4182
+ "input",
4183
+ "label",
4184
+ "select",
4185
+ "switch",
4186
+ "table",
4187
+ "textarea"
3054
4188
  ],
3055
- "npm": [],
3056
- "shadcn": [],
3057
4189
  "env": [],
3058
4190
  "peers": [],
3059
4191
  "providers": [],
3060
4192
  "tags": [
3061
- "infra",
3062
- "rate-limit",
3063
- "convex",
3064
- "backend",
3065
- "throttle"
4193
+ "admin",
4194
+ "landing",
4195
+ "cms",
4196
+ "sections",
4197
+ "crud"
3066
4198
  ],
3067
- "agentRecipe": "Run `npx rr add rate-limit`. Compose `rateLimitTables` into root convex/schema.ts. Wire `internal.features.rate_limit.mutations._pruneExpired` into convex/crons.ts every 5 min. Call `api.features.rate_limit.mutations.consume({ key, limit, windowMs })` from server-side handlers keep a fail-open wrapper so a Convex outage doesn't 503 the route."
4199
+ "agentRecipe": "Run `npx rr add landing-sections`. Fold `landingReducer` into your root reducer (cases LANDING_UPSERT + LANDING_DELETE), seed State.landingSections with `defaultLandingSections()`, wrap your StoreProvider with `<LandingProvider value={adapter}/>` where adapter maps {items, publicBase, adminBase, create, update, remove} from your dispatch. Mount `<LandingView/>` at `/admin/landing` and `<LandingEditorView id={params.id}/>` at `/admin/landing/[id]`. In HomePage iterate `state.landingSections.filter(s => s.enabled).sort((a,b) => a.order - b.order)` and render each through `<LandingSectionShell section={s}>` wrapping your own per-`kind` renderer."
3068
4200
  },
3069
4201
  {
3070
- "slug": "subscribers",
3071
- "title": "Subscribers",
3072
- "category": "email",
3073
- "kind": "backend",
4202
+ "slug": "faq-section",
4203
+ "title": "FAQ Section",
4204
+ "category": "ui",
4205
+ "kind": "ui",
3074
4206
  "version": "0.1.0",
3075
- "description": "Newsletter list with honeypot + per-email rate-limit + token-based unsubscribe + admin remove. Public `subscribe` returns status strings (`created` / `already` / `resubscribed` / `honeypot`); admin `listAll` / `count` queries gated by `requireAdmin` (rr `_shared/auth`). Lifted 2026-05-16 from rahmanef.com; sanitized: token args dropped, sibling `analyticsEvents` insert removed wrap subscribe in a consumer action if you want funnel telemetry.",
3076
- "source": "rahmanef.com",
3077
- "slicePath": "frontend/slices/subscribers",
3078
- "convexPaths": [
3079
- "convex/features/subscribers"
3080
- ],
4207
+ "description": "Canonical FAQ accordion section eyebrow + headline + accordion item list. Three layouts (single column, two-column, grouped by category). Optional footer CTA (\"Still have questions?\"). Items fully data-driven. Single SSOT every template consumes this slice for FAQ blocks so admin-edited Q&A propagates without per-template rewrite.",
4208
+ "source": "rahman-resources",
4209
+ "slicePath": "frontend/slices/faq-section",
4210
+ "convexPaths": [],
3081
4211
  "npm": [],
3082
- "shadcn": [],
3083
- "env": [
3084
- {
3085
- "name": "SUPER_ADMIN_EMAIL",
3086
- "scope": "convex",
3087
- "required": false,
3088
- "description": "Optional super-admin gate for admin queries."
3089
- }
3090
- ],
3091
- "peers": [
3092
- {
3093
- "slug": "convex-auth",
3094
- "range": "^0.1",
3095
- "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
3096
- }
4212
+ "shadcn": [
4213
+ "accordion",
4214
+ "button"
3097
4215
  ],
4216
+ "env": [],
4217
+ "peers": [],
3098
4218
  "providers": [],
3099
4219
  "tags": [
3100
- "email",
3101
- "newsletter",
3102
- "subscribers",
3103
- "convex",
3104
- "backend"
4220
+ "ui",
4221
+ "faq",
4222
+ "section",
4223
+ "accordion",
4224
+ "marketing"
3105
4225
  ],
3106
- "agentRecipe": "Run `npx rr add subscribers`. Compose `subscribersTables` into root convex/schema.ts. Public form posts `api.features.subscribers.mutations.subscribe({ email, source, website })` `website` is the honeypot, leave it `\"\"` from the form. Render unsubscribe link `/unsubscribe?t=<token>` and call `unsubscribe({ token })`."
4226
+ "agentRecipe": "Run `npx rr add faq-section`. <FAQSection items title subtitle layout multiple defaultOpen footerCta /> only `items` required. Each item: `{ id, q, a, category? }`. `layout=\"grouped\"` buckets by `category`. `multiple` lets users open several at once. `footerCta={{ label, href }}` wires a contact link below the accordion."
3107
4227
  },
3108
4228
  {
3109
- "slug": "testimonials",
3110
- "title": "Testimonials",
3111
- "category": "content",
3112
- "kind": "backend",
4229
+ "slug": "testimonials-grid",
4230
+ "title": "Testimonials Grid",
4231
+ "category": "ui",
4232
+ "kind": "ui",
3113
4233
  "version": "0.1.0",
3114
- "description": "Quote/name/role rotator backend. Public `listAll` + `get` (no auth testimonials are public), admin CRUD via `requireAdmin`, internal `seed` for one-shot bootstrap. Indexed by `order` so carousel/grid keeps stable rotation. Lifted 2026-05-16 from rahmanef.com; token-based admin gate swapped for rr `_shared/auth`.",
3115
- "source": "rahmanef.com",
3116
- "slicePath": "frontend/slices/testimonials",
3117
- "convexPaths": [
3118
- "convex/features/testimonials"
4234
+ "description": "Canonical testimonials section quote + author + role/company + optional avatar + optional star rating. Three layouts (uniform cards grid, centered quote-stack, CSS masonry). `featured` testimonials get a ring accent. Pairs naturally with the `testimonials` backend slice (Convex queries) but has zero coupling — pass any item array.",
4235
+ "source": "rahman-resources",
4236
+ "slicePath": "frontend/slices/testimonials-grid",
4237
+ "convexPaths": [],
4238
+ "npm": [
4239
+ "lucide-react@^0.400.0"
3119
4240
  ],
3120
- "npm": [],
3121
- "shadcn": [],
3122
- "env": [
3123
- {
3124
- "name": "SUPER_ADMIN_EMAIL",
3125
- "scope": "convex",
3126
- "required": false
3127
- }
4241
+ "shadcn": [
4242
+ "avatar",
4243
+ "button",
4244
+ "card"
3128
4245
  ],
4246
+ "env": [],
3129
4247
  "peers": [
3130
4248
  {
3131
- "slug": "convex-auth",
4249
+ "slug": "testimonials",
3132
4250
  "range": "^0.1",
3133
- "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
4251
+ "reason": "Optional pair with backend testimonials slice for full admin CRUD + storage."
3134
4252
  }
3135
4253
  ],
3136
4254
  "providers": [],
3137
4255
  "tags": [
3138
- "content",
4256
+ "ui",
3139
4257
  "testimonials",
3140
- "convex",
3141
- "backend",
3142
- "marketing"
4258
+ "section",
4259
+ "marketing",
4260
+ "social-proof",
4261
+ "saas"
3143
4262
  ],
3144
- "agentRecipe": "Run `npx rr add testimonials`. Compose `testimonialsTables` into root schema. Bootstrap via `npx convex run internal.features.testimonials.mutations.seed '{\"items\":[{\"quote\":\"...\",\"name\":\"...\",\"role\":\"...\",\"order\":1}]}'`. Render with `useQuery(api.features.testimonials.queries.listAll)`."
4263
+ "agentRecipe": "Run `npx rr add testimonials-grid`. <TestimonialsGridSection items title subtitle columns layout align /> only `items` required. Each item: `{ id, quote, author, role?, company?, avatar?, rating?, featured? }`. `layout=\"quote-stack\"` renders a centered no-card scroll for editorial sites. `layout=\"masonry\"` uses CSS columns for variable-height quotes."
3145
4264
  },
3146
4265
  {
3147
- "slug": "services",
3148
- "title": "Services",
3149
- "category": "content",
3150
- "kind": "backend",
4266
+ "slug": "blog-section",
4267
+ "title": "Blog Section",
4268
+ "category": "ui",
4269
+ "kind": "ui",
3151
4270
  "version": "0.1.0",
3152
- "description": "Service offerings backend — title + summary + deliverables array + sort order. Public read, admin CRUD, internal seed. Pairs with a frontend services grid/list (consumer-side). Lifted 2026-05-16 from rahmanef.com; token-based admin gate swapped for rr `_shared/auth`.",
3153
- "source": "rahmanef.com",
3154
- "slicePath": "frontend/slices/services",
3155
- "convexPaths": [
3156
- "convex/features/services"
4271
+ "description": "Canonical blog list + detail section. <BlogListSection> renders 3 layouts (cards grid, minimal list, featured-split with hero + side rail). <BlogPostView> renders the single-post page with cover + meta + paragraph-split body. Both pass through `hrefFor`/`backHref` so each template controls routing — single SSOT for /blog and /blog/[slug] across all templates.",
4272
+ "source": "rahman-resources",
4273
+ "slicePath": "frontend/slices/blog-section",
4274
+ "convexPaths": [],
4275
+ "npm": [
4276
+ "lucide-react@^0.400.0"
3157
4277
  ],
3158
- "npm": [],
3159
- "shadcn": [],
3160
- "env": [
3161
- {
3162
- "name": "SUPER_ADMIN_EMAIL",
3163
- "scope": "convex",
3164
- "required": false
3165
- }
4278
+ "shadcn": [
4279
+ "badge",
4280
+ "button",
4281
+ "card",
4282
+ "separator"
3166
4283
  ],
4284
+ "env": [],
3167
4285
  "peers": [
3168
4286
  {
3169
- "slug": "convex-auth",
4287
+ "slug": "mdx-blog",
3170
4288
  "range": "^0.1",
3171
- "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
4289
+ "reason": "Optional pair with mdx-blog backend slice for MDX-rendered posts."
3172
4290
  }
3173
4291
  ],
3174
4292
  "providers": [],
3175
4293
  "tags": [
3176
- "content",
3177
- "services",
3178
- "convex",
3179
- "backend",
4294
+ "ui",
4295
+ "blog",
4296
+ "section",
3180
4297
  "marketing",
3181
- "agency"
4298
+ "content",
4299
+ "list",
4300
+ "detail"
3182
4301
  ],
3183
- "agentRecipe": "Run `npx rr add services`. Compose `servicesTables` into root schema. Use `useQuery(api.features.services.queries.listAll)` from a server component / route to render service cards. CRUD via admin UI calling `create` / `update` / `remove` after `requireAdmin` passes."
4302
+ "agentRecipe": "Run `npx rr add blog-section`. <BlogListSection posts hrefFor title columns layout limit /> for /blog — `hrefFor(post)` returns the per-post URL. <BlogPostView post backHref renderBody /> for /blog/[slug] `renderBody` defaults to paragraph-split on `\\n\\n` (swap for an MDX renderer if you use mdx-blog)."
3184
4303
  },
3185
4304
  {
3186
- "slug": "socials",
3187
- "title": "Socials",
3188
- "category": "content",
3189
- "kind": "backend",
4305
+ "slug": "changelog-feed",
4306
+ "title": "Changelog Feed",
4307
+ "category": "ui",
4308
+ "kind": "ui",
3190
4309
  "version": "0.1.0",
3191
- "description": "Single source of truth for profile/social links. Powers JSON-LD `Person.sameAs` (Google entity graph), IndieWeb `<link rel=\"me\">` tags, and footer/contact/about UI surfaces. URL-deduped, ordered, `visible` / `featured` / `relMe` / `sameAs` flags. Lifted 2026-05-16 from rahmanef.com; token-based admin gate swapped, baked-in 14-platform rahmanef seed dropped — `seed` now takes items via args so each adopter ships their own list.",
3192
- "source": "rahmanef.com",
3193
- "slicePath": "frontend/slices/socials",
3194
- "convexPaths": [
3195
- "convex/features/socials"
3196
- ],
4310
+ "description": "Canonical /changelog or /whats-new section. Entries support 5 kinds (feature/improvement/fix/chore/breaking) with color-coded badges. Three layouts (timeline with date-rail, large cards, minimal list). Optional `limit` for \"Recent updates\" excerpts on home pages. Optional `groups` per entry for sub-sectioned bullet lists.",
4311
+ "source": "rahman-resources",
4312
+ "slicePath": "frontend/slices/changelog-feed",
4313
+ "convexPaths": [],
3197
4314
  "npm": [],
3198
- "shadcn": [],
3199
- "env": [
3200
- {
3201
- "name": "SUPER_ADMIN_EMAIL",
3202
- "scope": "convex",
3203
- "required": false
3204
- }
3205
- ],
3206
- "peers": [
3207
- {
3208
- "slug": "convex-auth",
3209
- "range": "^0.1",
3210
- "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
3211
- }
4315
+ "shadcn": [
4316
+ "badge",
4317
+ "card",
4318
+ "separator"
3212
4319
  ],
4320
+ "env": [],
4321
+ "peers": [],
3213
4322
  "providers": [],
3214
4323
  "tags": [
3215
- "content",
3216
- "socials",
3217
- "seo",
3218
- "indieweb",
3219
- "convex",
3220
- "backend"
4324
+ "ui",
4325
+ "changelog",
4326
+ "section",
4327
+ "saas",
4328
+ "release-notes",
4329
+ "marketing"
3221
4330
  ],
3222
- "agentRecipe": "Run `npx rr add socials`. Compose `socialsTables` into root schema. Bootstrap with `npx convex run internal.features.socials.mutations.seed '{\"items\":[{\"platform\":\"github\",\"url\":\"https://github.com/<you>\",\"order\":1,\"visible\":true,\"featured\":true,\"sameAs\":true,\"relMe\":true}]}'`. Wire `useQuery(api.features.socials.queries.listVisible)` into footer for entity-graph SEO."
4331
+ "agentRecipe": "Run `npx rr add changelog-feed`. <ChangelogFeedSection entries title subtitle layout sortDescending limit /> only `entries` required. Each entry: `{ id, version, date, kind, title, body, bullets?, groups? }`. `layout=\"timeline\"` adds a left date-rail; `layout=\"list\"` is the most compact. Pass `limit={3}` on home pages to show recent releases."
3223
4332
  },
3224
4333
  {
3225
- "slug": "create-your-mcp",
3226
- "title": "Create Your MCP",
3227
- "category": "ai",
3228
- "kind": "full",
4334
+ "slug": "portfolio-section",
4335
+ "title": "Portfolio Section",
4336
+ "category": "ui",
4337
+ "kind": "ui",
3229
4338
  "version": "0.1.0",
3230
- "description": "Turn any rr-based app into an MCP server that ChatGPT custom apps, Claude.ai connectors, Cursor MCP, and other AI clients authenticate to. OAuth 2.1 + PKCE flow with code bearer exchange, env-configured vendor-host allowlist, single-use codes, 1-year bearer tokens, scope-tagged tools, opaque error collapsing, constant-time token compare. Static MCP_API_KEY fallback for service-account / CI scripts. Sanitized 2026-05-16 from rahmanef.com's production MCP integration — vendor literals (chatgpt.com / OpenAI paths) replaced with MCP_OAUTH_ALLOWED_HOSTS + MCP_OAUTH_ALLOWED_PATH_PREFIXES env vars so the slice ships portable.",
3231
- "source": "rahmanef.com",
3232
- "slicePath": "frontend/slices/create-your-mcp",
3233
- "convexPaths": [
3234
- "convex/features/create-your-mcp"
3235
- ],
3236
- "npm": [],
3237
- "shadcn": [],
3238
- "env": [
3239
- {
3240
- "name": "MCP_API_KEY",
3241
- "scope": "server",
3242
- "required": false,
3243
- "description": "Static bearer for service-account / CI access. Min 32 chars. Must match Convex env."
3244
- },
3245
- {
3246
- "name": "MCP_OAUTH_ALLOWED_HOSTS",
3247
- "scope": "convex",
3248
- "required": false,
3249
- "description": "CSV vendor domains for redirect_uri (chatgpt.com,claude.ai,cursor.sh)."
3250
- },
3251
- {
3252
- "name": "MCP_OAUTH_ALLOWED_PATH_PREFIXES",
3253
- "scope": "convex",
3254
- "required": false,
3255
- "description": "CSV path prefixes under allowed hosts (/aip/,/connector/,/oauth/)."
3256
- },
3257
- {
3258
- "name": "NEXT_PUBLIC_SITE_URL",
3259
- "scope": "next-public",
3260
- "required": true,
3261
- "description": "Public site origin for WWW-Authenticate challenge."
3262
- }
4339
+ "description": "Canonical portfolio list + detail section. <PortfolioListSection> renders 3 layouts (uniform 16:9 grid, CSS masonry, asymmetric with featured hero). <PortfolioDetailView> renders title + meta + cover + body + gallery + external link + related items. Both pass through `hrefFor`/`backHref` so each template controls routing single SSOT for /portfolio and /portfolio/[slug] across agency-studio and personal-brand.",
4340
+ "source": "rahman-resources",
4341
+ "slicePath": "frontend/slices/portfolio-section",
4342
+ "convexPaths": [],
4343
+ "npm": [
4344
+ "lucide-react@^0.400.0"
3263
4345
  ],
3264
- "peers": [
3265
- {
3266
- "slug": "convex-auth",
3267
- "range": "^0.1",
3268
- "reason": "requireAdmin uses getAuthUserId from @convex-dev/auth."
3269
- }
4346
+ "shadcn": [
4347
+ "badge",
4348
+ "button",
4349
+ "card",
4350
+ "separator"
3270
4351
  ],
4352
+ "env": [],
4353
+ "peers": [],
3271
4354
  "providers": [],
3272
4355
  "tags": [
3273
- "ai",
3274
- "mcp",
3275
- "oauth",
3276
- "pkce",
3277
- "chatgpt",
3278
- "claude",
3279
- "cursor",
3280
- "convex",
3281
- "integration"
4356
+ "ui",
4357
+ "portfolio",
4358
+ "section",
4359
+ "marketing",
4360
+ "case-study",
4361
+ "list",
4362
+ "detail"
3282
4363
  ],
3283
- "agentRecipe": "Run `npx rr add create-your-mcp`. Compose `createYourMcpTables` into root schema. Move `slices/create-your-mcp/routes/mcp.route.ts` `app/api/mcp/route.ts` and `oauth-token.route.ts` `app/api/oauth/token/route.ts`. Set MCP_OAUTH_ALLOWED_HOSTS (CSV vendor domains). Mount `<McpAdminView />` at /admin/mcp. Connect ChatGPT/Claude/Cursor via the setup form rendered by the admin view."
4364
+ "agentRecipe": "Run `npx rr add portfolio-section`. <PortfolioListSection items hrefFor title columns layout limit /> for /portfolio each item `{ id, slug, title, summary?, year?, client?, role?, tags?, cover: {src,alt}, gallery?, link? }`. <PortfolioDetailView item backHref renderBody related hrefForRelated /> for /portfolio/[slug] `renderBody` defaults to paragraph split; override for project-specific layouts (problem/approach/result, brief/outcome, etc)."
3284
4365
  },
3285
4366
  {
3286
- "slug": "contact-form-resend",
3287
- "title": "Contact Form + Resend",
3288
- "category": "email",
3289
- "kind": "full",
3290
- "version": "0.1.0",
3291
- "description": "Contact form posting to Resend email API. Server Action + Zod input validation. Convex mutation for storage + Resend send.",
3292
- "source": "cescadesigns",
3293
- "slicePath": "template-base/frontend/slices/contact-form-resend",
4367
+ "slug": "theme-presets",
4368
+ "title": "Theme Presets unified switcher with bundled tweakcn registry",
4369
+ "category": "ui",
4370
+ "kind": "ui",
4371
+ "version": "0.2.0",
4372
+ "description": "Single unified theme controller for next-themes apps. ThemePresetSwitcher ships a Palette-icon Popover trigger with three stacked sections: (1) sticky light/dark/system mode tabs, (2) sticky preset-count row with a Default reset button, (3) scrollable color-preset list grouped by mood (Profesional / Bold / Hangat / Artistik / Gelap + Lainnya). Hover-to-preview + click-to-commit + restore-on-close semantics. ThemePresetProvider context wraps state so deeply-nested consumers read via useThemePreset() instead of mounting the switcher directly. ThemeColorSync wrapper enables live tweakcn-CSS-variable preview on routes that need it. Tweakcn registry (~30 curated presets after HIDDEN_PRESETS filter drops Doom 64 / Cyberpunk / Neo Brutalism / Bubblegum / Candyland / Pastel Dreams) ships inside the slice as registry-data.json and loads lazily via dynamic import — code-splits into its own chunk, zero consumer public/ setup, no network roundtrip to a hosted URL. localStorage key `host:theme-preset` (rename via slice fork). CK-1F (2026-05-23) — collapsed prior TweakcnSwitcher + ThemePicker + phantom `theme-preset-switcher` catalog entry into this single component.",
4373
+ "source": "CareerPack + notion-page-clone",
4374
+ "slicePath": "frontend/slices/theme-presets",
3294
4375
  "convexPaths": [],
3295
4376
  "npm": [
3296
- "resend@^4.0.0",
3297
- "framer-motion@^11.0.0"
4377
+ "next-themes@^0.4.6"
3298
4378
  ],
3299
4379
  "shadcn": [
3300
- "card",
3301
4380
  "button",
3302
- "input",
3303
- "label",
3304
- "textarea"
4381
+ "popover"
3305
4382
  ],
3306
- "env": [
3307
- {
3308
- "name": "RESEND_API_KEY",
3309
- "scope": "convex",
3310
- "required": true
3311
- }
4383
+ "env": [],
4384
+ "peers": [],
4385
+ "providers": [],
4386
+ "tags": [
4387
+ "ui",
4388
+ "theme",
4389
+ "tweakcn",
4390
+ "color",
4391
+ "preset",
4392
+ "switcher",
4393
+ "popover",
4394
+ "next-themes",
4395
+ "notion-like"
3312
4396
  ],
3313
- "peers": [
3314
- {
3315
- "slug": "convex-auth",
3316
- "range": "^0.1",
3317
- "reason": "Optionalanonymous submission works without auth."
3318
- }
4397
+ "agentRecipe": "Run `npx rr add theme-presets` (registry-data.json ships inside the slice — no separate public/ copy step). Wrap your tree once with `<ThemePresetProvider>` (inside next-themes' ThemeProvider). Mount `<ThemePresetSwitcher />` anywhere in your header / sidebar / settings — one component handles light/dark/system + preset palette. Wrap dashboard with `<ThemeColorSync>` if you need live tweakcn variable preview on inner routes. Deeply-nested consumers read state via `useThemePreset()` (returns `{ presetName, registry, setPreset, preview, restore, isReady }`). For lower-level access: `applyTweakcnPreset(name)`, `previewTweakcnPreset(name)`, `restoreTweakcnPreset()`, `groupTweakcnPresets(items)`, `tweakcnSwatches(preset)` all exported from `@/features/theme-presets`. To rename localStorage key, fork `STORAGE_KEY` in `lib/tweakcn/types.ts`."
4398
+ },
4399
+ {
4400
+ "slug": "files",
4401
+ "title": "Filespluggable upload + URL resolver with storage-adapter contract",
4402
+ "category": "data",
4403
+ "kind": "ui",
4404
+ "version": "0.2.0",
4405
+ "description": "Host-pluggable file upload + URL resolution. Ships <FileUploadButton>, <FileChip>, useFileUpload(), useFileUrl() — all reading from a FilesAdapter the host wires via <FilesAdapterProvider>. Bundled localStorage demo adapter stores blobs as data URLs (small files only). Drop in your own adapter for Convex / S3 / GCS / R2. The slice itself has zero backend coupling, proving the storage-adapter pattern for the rest of the open-silong blocked-pending-adapter wave (cover, workspace-io, templates, …).",
4406
+ "source": "notion-page-clone",
4407
+ "slicePath": "frontend/slices/files",
4408
+ "convexPaths": [],
4409
+ "npm": [],
4410
+ "shadcn": [
4411
+ "button"
4412
+ ],
4413
+ "env": [],
4414
+ "peers": [],
4415
+ "providers": [],
4416
+ "tags": [
4417
+ "data",
4418
+ "upload",
4419
+ "files",
4420
+ "storage",
4421
+ "adapter",
4422
+ "portable",
4423
+ "notion-like"
4424
+ ],
4425
+ "agentRecipe": "Run `npx rr add files`. Wrap your tree with `<FilesAdapterProvider adapter={...}>` — pass `useLocalStorageFilesAdapter()` for a quick demo or implement `FilesAdapter` (upload + remove + useUrl) against your backend. Then drop `<FileUploadButton onUploaded={...}>` anywhere; pair with `<FileChip fileRef={...}>` for rendered chips. Hooks: `useFileUpload()` returns `{upload, uploading, progress, removeFromStorage}`; `useFileUrl(storageId)` resolves to a fetchable URL (Convex adapter uses useQuery for live invalidation; demo reads localStorage synchronously). To wire S3: implement the FilesAdapter interface with presigned URLs + DELETE; the slice doesn't care which backend you pick."
4426
+ },
4427
+ {
4428
+ "slug": "equation",
4429
+ "title": "Equation — Notion-style KaTeX block primitive",
4430
+ "category": "ui",
4431
+ "kind": "ui",
4432
+ "version": "0.1.0",
4433
+ "description": "Inline-or-display LaTeX equation block — Notion-inspired primitive. KaTeX-rendered with edit/preview toggle, raw-text fallback when KaTeX fails to parse. Pure UI primitive (zero Convex tables, zero global state). Lifted from notion-page-clone (Nosion). Use standalone OR bundled via the notion-blocks bundle. Drop into any React surface — docs, marketing landing, editor.",
4434
+ "source": "notion-page-clone",
4435
+ "slicePath": "frontend/slices/equation",
4436
+ "convexPaths": [],
4437
+ "npm": [
4438
+ "katex@^0.16.45"
4439
+ ],
4440
+ "shadcn": [
4441
+ "button"
3319
4442
  ],
4443
+ "env": [],
4444
+ "peers": [],
3320
4445
  "providers": [],
3321
4446
  "tags": [
3322
- "form",
3323
- "email",
3324
- "resend",
3325
- "convex"
4447
+ "ui",
4448
+ "notion",
4449
+ "notion-like",
4450
+ "equation",
4451
+ "katex",
4452
+ "latex",
4453
+ "math",
4454
+ "block",
4455
+ "primitive",
4456
+ "editor"
3326
4457
  ],
3327
- "agentRecipe": "Run `npx rr add contact-form-resend`. 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."
4458
+ "agentRecipe": "Run `npx rr add equation`. Single npm dep: katex. Import `import { EquationBlock } from \"@/features/equation\"`. Props-driven: pass `value` (LaTeX string) + `onChange`. For display-mode (block-level) pass `displayMode`. Renders raw text if KaTeX parse fails. Bundled inside notion-blocks if you also want code/notify/drag-fill."
3328
4459
  },
3329
4460
  {
3330
- "slug": "admin",
3331
- "title": "AdminGeneric Shell",
3332
- "category": "infra",
3333
- "kind": "full",
3334
- "version": "0.2.0",
3335
- "description": "Per-instance admin landing scaffold + portable nav-from-registry factory. Consumer supplies a SliceRegistryAdapter (each slice declares its own admin.activity[]) + queryTable reader; the slice's buildAdminStats(opts) emits the { counts, unreadMessages, activity } shape Convex's admin.stats query returns. Pulled UP from rahmanef.com (Wave N+3.1, commit b542389) — domain literals dropped at the kitab boundary. Gated by requireAdmin on Convex side; superadmin email gate via SUPER_ADMIN_EMAIL env.",
3336
- "source": "rahmanef63/resource-site",
3337
- "slicePath": "frontend/slices/admin",
3338
- "convexPaths": [
3339
- "convex/features/admin"
4461
+ "slug": "code-block",
4462
+ "title": "Code Block Notion-style syntax-highlighted code primitive",
4463
+ "category": "ui",
4464
+ "kind": "ui",
4465
+ "version": "0.1.0",
4466
+ "description": "Highlight.js-powered code block Notion-inspired primitive. Language selector dropdown (auto-detect + 50+ language packs), copy-to-clipboard button, line-wrap toggle. Pure-UI primitive no Convex tables. Lifted from notion-page-clone (Nosion). Use standalone OR bundled via notion-blocks.",
4467
+ "source": "notion-page-clone",
4468
+ "slicePath": "frontend/slices/code-block",
4469
+ "convexPaths": [],
4470
+ "npm": [
4471
+ "highlight.js@^11.11.1"
3340
4472
  ],
3341
- "npm": [],
3342
4473
  "shadcn": [
3343
- "card",
3344
- "button"
4474
+ "button",
4475
+ "dropdown-menu"
3345
4476
  ],
3346
- "env": [
3347
- {
3348
- "name": "SUPER_ADMIN_EMAIL",
3349
- "scope": "convex",
3350
- "required": false
3351
- }
4477
+ "env": [],
4478
+ "peers": [],
4479
+ "providers": [],
4480
+ "tags": [
4481
+ "ui",
4482
+ "notion",
4483
+ "notion-like",
4484
+ "code",
4485
+ "syntax",
4486
+ "highlight",
4487
+ "highlight.js",
4488
+ "block",
4489
+ "primitive",
4490
+ "editor"
3352
4491
  ],
3353
- "peers": [
3354
- {
3355
- "slug": "convex-auth",
3356
- "range": "^0.1",
3357
- "reason": "requireAdmin gate uses convex-auth user identity."
3358
- }
4492
+ "agentRecipe": "Run `npx rr add code-block`. Single npm dep: highlight.js. Import `import { CodeBlock, languageLabel } from \"@/features/code-block\"`. Props: `value` + `onChange` + `language` + `onLanguageChange`. Bundled inside notion-blocks if you also want equation/notify/drag-fill."
4493
+ },
4494
+ {
4495
+ "slug": "notifications",
4496
+ "title": "Notifications Notion-style per-page Notify Me",
4497
+ "category": "ui",
4498
+ "kind": "ui",
4499
+ "version": "0.1.0",
4500
+ "description": "Pure-client per-page subscription primitive — Notion-inspired bell button + popover. State stored in localStorage (no backend needed). Shipped as a `NotifyMePopover` toggled from a page-action bell. Frequency choices: instant / daily digest / weekly digest. Lifted from notion-page-clone (Nosion). Use standalone OR bundled via notion-blocks.",
4501
+ "source": "notion-page-clone",
4502
+ "slicePath": "frontend/slices/notifications",
4503
+ "convexPaths": [],
4504
+ "npm": [],
4505
+ "shadcn": [
4506
+ "button",
4507
+ "popover"
3359
4508
  ],
4509
+ "env": [],
4510
+ "peers": [],
3360
4511
  "providers": [],
3361
4512
  "tags": [
3362
- "infra",
3363
- "admin",
3364
- "shell",
3365
- "crud",
3366
- "nav-from-registry"
4513
+ "ui",
4514
+ "notion",
4515
+ "notion-like",
4516
+ "notifications",
4517
+ "subscribe",
4518
+ "notify",
4519
+ "bell",
4520
+ "popover",
4521
+ "localstorage",
4522
+ "primitive"
3367
4523
  ],
3368
- "agentRecipe": "Run `rr add admin`. Wire <AdminPage labels={...} /> at /admin and call buildAdminStats({ sliceRegistry, queryTable }) inside convex/features/admin/queries.ts sliceRegistry.entries flat-maps each feature's admin.activity[] declarations. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address."
4524
+ "agentRecipe": "Run `npx rr add notifications`. Zero npm deps (only shadcn button + popover). Import `import { NotifyMePopover, useSubscription } from \"@/features/notifications\"`. Drop the popover anywhere; useSubscription(pageId) hook returns `{ isSubscribed, frequency, subscribe, unsubscribe, setFrequency }` reading from localStorage. To wire a real backend, swap the localStorage hook for your own."
3369
4525
  },
3370
4526
  {
3371
- "slug": "platform-admin",
3372
- "title": "Platform AdminMulti-Tenant Control Plane",
3373
- "category": "infra",
3374
- "kind": "full",
4527
+ "slug": "database-cell-selection",
4528
+ "title": "Database Cell Selection Notion-style drag-fill + multi-select",
4529
+ "category": "ui",
4530
+ "kind": "ui",
3375
4531
  "version": "0.1.0",
3376
- "description": "Multi-tenant SaaS control plane. Workspace lifecycle ops (list/delete/cascade), per-tenant tier presets (gates + quota), KPI dashboard grid. Consumer-domain bits injected via adapter props (tenantTablesAdapter / tierPresets / kpiSources). Contract-only scaffold; canonical implementation lands via /rr-send from superspace. See docs/contract-negotiations-2026-05-15.md §4.",
3377
- "source": "rahmanef63/resource-site",
3378
- "slicePath": "frontend/slices/platform-admin",
4532
+ "description": "Notion-style grid cell interaction primitives: drag-fill (Sheets/Excel-style range fill), multi-cell selection with shift-click + arrow-key extension, paste-from-clipboard column adapter. Pure-UI hooks + components, no Convex tables. Lifted from notion-page-clone (Nosion). Pair with any tabular UI (notion-shell databases, ag-grid, custom React table, etc.).",
4533
+ "source": "notion-page-clone",
4534
+ "slicePath": "frontend/slices/database-cell-selection",
3379
4535
  "convexPaths": [],
3380
4536
  "npm": [],
3381
4537
  "shadcn": [],
3382
- "env": [
3383
- {
3384
- "name": "PLATFORM_ADMIN_EMAILS",
3385
- "scope": "convex",
3386
- "required": true,
3387
- "description": "Comma-separated list of platform admin email addresses."
3388
- }
3389
- ],
3390
- "peers": [
3391
- {
3392
- "slug": "convex-auth",
3393
- "range": "^0.1",
3394
- "reason": "Actor identity for audit + tier-set ops."
3395
- },
3396
- {
3397
- "slug": "audit-log",
3398
- "range": "^0.2",
3399
- "reason": "padmin_audit table feeds through audit-log TenantAdapter."
3400
- }
3401
- ],
4538
+ "env": [],
4539
+ "peers": [],
3402
4540
  "providers": [],
3403
4541
  "tags": [
3404
- "infra",
3405
- "admin",
3406
- "multi-tenant",
3407
- "saas",
3408
- "platform"
4542
+ "ui",
4543
+ "notion",
4544
+ "notion-like",
4545
+ "database",
4546
+ "grid",
4547
+ "cell",
4548
+ "selection",
4549
+ "drag-fill",
4550
+ "spreadsheet",
4551
+ "primitive",
4552
+ "table"
3409
4553
  ],
3410
- "agentRecipe": "Run `npx rr add platform-admin`. Contract-only scaffold. Wait for superspace /rr-send platform-admin before adopting. Distinct from per-instance `admin` slug."
4554
+ "agentRecipe": "Run `npx rr add database-cell-selection`. Zero deps. Import `import { useDragFill, SelectableCell, useCellSelection } from \"@/features/database-cell-selection\"`. Wrap your grid container with the selection hook; per-cell `<SelectableCell row col>` provides the click-and-drag affordance. Drag handles supplied by useDragFill. Composable with notion-shell's NotionDatabase or any custom grid."
3411
4555
  },
3412
4556
  {
3413
- "slug": "audit-log",
3414
- "title": "Audit LogWorkspace Events",
3415
- "category": "infra",
3416
- "kind": "backend",
3417
- "version": "0.2.0",
3418
- "description": "Workspace-scoped audit event recorder. Canonical logAuditEvent helper for mutations + actions; supports entity tracking, before/after diff, IP/user-agent capture.",
3419
- "source": "rahmanef63/resource-site",
3420
- "slicePath": "frontend/slices/audit-log",
4557
+ "slug": "notion-database",
4558
+ "title": "Notion-like Database Table full table with import/export (11 views · 16 cells · CSV + JSON)",
4559
+ "category": "ui",
4560
+ "kind": "ui",
4561
+ "version": "0.6.0",
4562
+ "description": "Portable Notion-style database table surface — full capability in one slice. Optional companion to notion-shell — install shell alone for pages + sidebar + block editor, add notion-database when you want embedded databases with full table capability. Ships NotionDatabase (full DB UI w/ ViewTabs + ViewOptions + per-column menu + FilterBuilder/SortBuilder popovers), NotionProperty (value + schema editor), 16 property-cell types (text / number / checkbox / select / multi_select / status / date / url / email / phone / files / person / formula / created_time / last_edited_time / unique_id), 11 built-in views: Table / Board / List / Gallery / Calendar / Feed PLUS Chart (recharts bar/line/area/pie/donut + inline kind/X/agg/Y pickers) / Dashboard (KPI strip + group breakdowns + recent updates) / Form (public-facing submit-to-create — title + per-property inputs, optional required-field validation, configurable show/hide + success message via inline Settings panel) / Map (SVG world + lat/lng pins, no leaflet) / Timeline (Gantt-style with drag-to-shift / drag-to-resize). FilterBuilder + SortBuilder exported standalone for toolbar embedding. Formula cells use a pure expression engine ({{title}}/{{prop}} interpolation + concat/upper/lower/round/if/etc fns + `=expr` math). Files cells store URL refs (paste-URL workflow; host can plug `files` slice adapter for upload). Person cells are simplified vs upstream — no user directory lookup, just initials chips. Created_time / last_edited_time read row.createdAt / row.updatedAt directly. unique_id auto-derives from row position + optional prefix. Pure helpers: applyView, groupBy, bucketByDate. Domain types live in notion-shell (single source of truth — Page.rowOfDatabaseId + rowProps reference them) and re-exported here. Relation + rollup property types deferred to upstream open-silong mega-bundle (need cross-DB context). v0.5 added drop-in Convex backend templates (dual-mode: minimal single-user OR full multi-workspace) from open-silong's template-base/. v0.6 (Phase 7.10) merges former database-io slice in-tree: DatabaseIOActions toolbar (Export CSV/JSON · Import CSV/JSON · Download dynamic CSV/JSON templates), CsvImportDialog (auto-map columns + create-new-of-type picker), JsonImportDialog (schema diff + import), exportDatabase / exportDatabaseToCsv / parseExport / parseCsv / buildCsvTemplate / buildJsonTemplate helpers — all from `@/features/notion-database`. CsvNewProperty + JsonImportResult.newProperties now expose `tempId` so host can remap rowProps keys when persisting (single import handler serves both formats). Cell editor UX consolidated v0.5.3 — SelectCell + MultiSelectCell share OptionPicker (shared/identical popover: search-as-create + per-option rename/color/delete). Property-type lists single-source via PROPERTY_TYPE_META registry (v0.5.2).",
4563
+ "source": "open-silong",
4564
+ "slicePath": "frontend/slices/notion-database",
3421
4565
  "convexPaths": [
3422
- "convex/features/audit-log"
4566
+ "template-base/database-silong/convex/handlers/databases.ts",
4567
+ "template-base/database-silong/convex/handlers/pages.ts",
4568
+ "template-base/database-silong/convex/schema.database-silong.ts"
4569
+ ],
4570
+ "npm": [
4571
+ "recharts@^2.13.0"
4572
+ ],
4573
+ "shadcn": [
4574
+ "button",
4575
+ "input",
4576
+ "checkbox",
4577
+ "dropdown-menu",
4578
+ "popover",
4579
+ "select",
4580
+ "dialog"
3423
4581
  ],
3424
- "npm": [],
3425
- "shadcn": [],
3426
4582
  "env": [],
3427
4583
  "peers": [
3428
4584
  {
3429
- "slug": "convex-auth",
3430
- "range": "^0.1",
3431
- "reason": "Event actor resolved via authenticated user."
4585
+ "slug": "notion-shell",
4586
+ "range": "^0.4",
4587
+ "reason": "Domain types (Database, Property, PropertyValue, DbView, etc.) live in notion-shell."
3432
4588
  }
3433
4589
  ],
3434
4590
  "providers": [],
3435
4591
  "tags": [
3436
- "infra",
3437
- "audit",
3438
- "compliance",
3439
- "logging"
4592
+ "ui",
4593
+ "notion",
4594
+ "notion-like",
4595
+ "database",
4596
+ "table",
4597
+ "board",
4598
+ "list",
4599
+ "gallery",
4600
+ "calendar",
4601
+ "feed",
4602
+ "chart",
4603
+ "dashboard",
4604
+ "form",
4605
+ "map",
4606
+ "timeline",
4607
+ "gantt",
4608
+ "kanban",
4609
+ "views",
4610
+ "filter",
4611
+ "sort",
4612
+ "property",
4613
+ "files",
4614
+ "person",
4615
+ "formula",
4616
+ "timestamp",
4617
+ "unique-id",
4618
+ "csv",
4619
+ "json",
4620
+ "import",
4621
+ "export",
4622
+ "template",
4623
+ "data",
4624
+ "backup",
4625
+ "primitive",
4626
+ "optional",
4627
+ "embeddable"
3440
4628
  ],
3441
- "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? }."
4629
+ "agentRecipe": "Run `npx rr add notion-database` (cascades notion-shell as peer). Import: `import { NotionDatabase, NotionProperty, VIEW_REGISTRY, DatabaseIOActions } from \"@/features/notion-database\"`. NotionDatabase ships full props-driven DB UI — host owns rows + dispatches CRUD callbacks. For just one view in isolation, import the specific view component (TableView / BoardView / etc.). Property cells auto-render via renderPropertyCell helper. Pure helpers: applyView / groupBy / bucketByDate. For import/export, mount `<DatabaseIOActions db={db} rows={rows} onImport={async ({ newProperties, rows }) => { const tempToReal: Record<string, string> = {}; for (const np of newProperties) { const realId = await dispatchAddProperty(np); tempToReal[np.tempId] = realId; } for (const r of rows) { const rowId = await dispatchAddRow(r.title); for (const [propKey, v] of Object.entries(r.rowProps)) { await dispatchSetValue(rowId, tempToReal[propKey] ?? propKey, v); } } }} />` next to your DB toolbar — exports CSV/JSON + imports w/ schema diff + downloads dynamic templates from live db.properties. tempId on each new property lets host remap rowProps keys to its real backend ids. For backend persistence, copy template-base/database-silong/convex/ from the open-silong repo: handlers go to convex/, schema fragment merges into convex/schema.ts. Pick _shared/minimal/ (single-user, noop authz) or _shared/full/ (requires @convex-dev/auth + workspaces tables). See CONVEX-BACKEND.md."
3442
4630
  },
3443
4631
  {
3444
- "slug": "comments",
3445
- "title": "CommentsThreaded",
3446
- "category": "content",
3447
- "kind": "full",
4632
+ "slug": "database-io",
4633
+ "title": "[DEPRECATED] Database IO merged into notion-database v0.6",
4634
+ "category": "ui",
4635
+ "kind": "ui",
3448
4636
  "version": "0.2.0",
3449
- "description": "Polymorphic-target threaded comments. Consumer picks `TargetRef = { kind, id, subId? }` (e.g. page+block, blog+slug, task+id). Renderless <CommentsThread> + <CommentsAnchor> wrappers. useComments(bindings, opts) hook returns items + openCount + CRUD + forbiddenWords guard. Adapter pattern — see contract-negotiations §1.",
3450
- "source": "rahmanef63/resource-site",
3451
- "slicePath": "frontend/slices/comments",
3452
- "convexPaths": [
3453
- "convex/features/comments"
3454
- ],
4637
+ "description": "DEPRECATED — all functionality merged into `notion-database` v0.6 (Phase 7.10, 2026-05-22). This slice is now a thin re-export shim from `@/features/notion-database` to keep existing consumers compiling. New code should `npx rr add notion-database` (now bundles CSV + JSON import/export + dynamic templates) instead of installing this separately. Slice will be removed in v1.0. Original surface (DatabaseIOActions / CsvImportDialog / JsonImportDialog / exportDatabase / buildCsvTemplate / buildJsonTemplate) remains exported from notion-database — see its catalog entry. Merge rationale: 100% peer coupling to notion-database (every file imported Database/Page/Property types from it) + zero independent install path (always installed alongside notion-database in practice) = no modularity benefit from separation.",
4638
+ "source": "notion-page-clone",
4639
+ "slicePath": "frontend/slices/database-io",
4640
+ "convexPaths": [],
3455
4641
  "npm": [],
3456
4642
  "shadcn": [
3457
4643
  "button",
3458
- "textarea",
3459
- "avatar"
4644
+ "dialog",
4645
+ "dropdown-menu"
3460
4646
  ],
3461
4647
  "env": [],
3462
4648
  "peers": [
3463
4649
  {
3464
- "slug": "convex-auth",
3465
- "range": "^0.1",
3466
- "reason": "Comment author identity from convex-auth."
4650
+ "slug": "notion-database",
4651
+ "range": "^0.3",
4652
+ "reason": "Reuses Database / Page / Property / PropertyValue / PropertyType / SelectOption / DatabaseViewConfig types."
3467
4653
  }
3468
4654
  ],
3469
4655
  "providers": [],
3470
4656
  "tags": [
3471
- "content",
3472
- "social",
3473
- "comments",
3474
- "threaded",
3475
- "annotations"
4657
+ "ui",
4658
+ "notion",
4659
+ "notion-like",
4660
+ "database",
4661
+ "csv",
4662
+ "json",
4663
+ "import",
4664
+ "export",
4665
+ "template",
4666
+ "data",
4667
+ "backup",
4668
+ "spreadsheet",
4669
+ "wire-format",
4670
+ "primitive",
4671
+ "optional"
3476
4672
  ],
3477
- "agentRecipe": "Run `rr add comments`. Wire Convex bindings ({ list, create, update, resolve, remove }) then use <CommentsThread target={{ kind, id, subId? }} bindings={bindings} forbiddenWords={[...]}>{render-prop}</CommentsThread> OR <CommentsAnchor target=... bindings=... pathMap={(t)=>...}>. v0.2.0 polymorphic pick `kind` literal per host domain."
4673
+ "agentRecipe": "⚠️ DEPRECATED — use `npx rr add notion-database` (now bundles import/export). This slice is a thin re-export shim from `@/features/notion-database` for back-compat. New code: `import { DatabaseIOActions } from \"@/features/notion-database\"`. Remove when migration complete; slice scheduled for removal in v1.0."
3478
4674
  },
3479
4675
  {
3480
- "slug": "seo",
3481
- "title": "SEOAI Metadata Generator",
3482
- "category": "content",
3483
- "kind": "full",
3484
- "version": "0.2.0",
3485
- "description": "Service slice for SEO metadata generationAnthropic-backed action with per-user 24h cost guard + portable persona prop. No public route. Backend exposes generate + generateAndApply mutations gated by requireAdmin; consumers inject brand voice via the personaContext arg (or buildSeoSystemPrompt factory).",
3486
- "source": "rahmanef63/resource-site",
3487
- "slicePath": "frontend/slices/seo",
3488
- "convexPaths": [
3489
- "convex/features/seo"
3490
- ],
3491
- "npm": [],
3492
- "shadcn": [],
3493
- "env": [
3494
- {
3495
- "name": "ANTHROPIC_API_KEY",
3496
- "scope": "server",
3497
- "required": true
3498
- }
4676
+ "slug": "notion-shell",
4677
+ "title": "Notion Shell page + sidebar + block editor primitives (pure, no database)",
4678
+ "category": "ui",
4679
+ "kind": "ui",
4680
+ "version": "0.4.0",
4681
+ "description": "Portable Notion-style PAGE + SIDEBAR + BLOCK editor primitives. CI-wave (2026-05-21) split the database surface out install the optional `notion-database` peer for embedded TableView / BoardView / ListView / GalleryView / CalendarView / FeedView, NotionDatabase, NotionProperty, ViewTabs, ViewOptions, ColumnHeaderMenu, property-cells. notion-shell alone gives you Notion-clone pages + sidebar + editor without the database weight. Domain types (Database, Property, PropertyValue, DbView, DatabaseViewConfig, DatabaseFilter, DatabaseSort) remain in notion-shell as the single source of truth (Page.rowOfDatabaseId + rowProps reference them). FULL OLD DESC BELOW: Portable Notion-style wrapper primitives. PAGE EDITOR: NotionPage (optional cover image band + header + body), NotionHeader / NotionSidebar / NotionBlock (live inline-markdown decorator, hover actions menu, optional dragHandle slot), SlashMenu (searchable block-type picker w/ keyboard nav), BlockActionsMenu (turn-into / duplicate / delete), InsertBlockButton (`+` trigger w/ SlashMenu), SortableBlockList (@dnd-kit render-prop wrapper for block reorder), PageActionsMenu (header dropdown: cover/favorite/duplicate/export/trash). DATABASE: NotionDatabase (full DB surface w/ tabs + options + per-column menu), NotionProperty (10 property-cell types), 6 built-in views (Table/Board/List/Gallery/Calendar/Feed), ViewTabs, ViewOptions (sort + filter + search popover), ColumnHeaderMenu. SPECIALISED BLOCK RENDERERS: ImageRenderer (URL + caption + preview), EmbedRenderer (YouTube/Vimeo/Loom/Figma/CodePen/Spotify auto-detect + iframe fallback). Pure helpers: applyView, groupBy, bucketByDate. Pure / props-driven — host owns data + change handlers.",
4682
+ "source": "notion-page-clone",
4683
+ "slicePath": "frontend/slices/notion-shell",
4684
+ "convexPaths": [],
4685
+ "npm": [
4686
+ "@dnd-kit/core",
4687
+ "@dnd-kit/sortable",
4688
+ "@dnd-kit/utilities"
3499
4689
  ],
3500
- "peers": [
3501
- {
3502
- "slug": "convex-auth",
3503
- "range": "^0.1",
3504
- "reason": "Cost guard + requireAdmin gates use convex-auth user identity."
3505
- }
4690
+ "shadcn": [
4691
+ "button",
4692
+ "input",
4693
+ "checkbox",
4694
+ "dropdown-menu",
4695
+ "popover"
3506
4696
  ],
4697
+ "env": [],
4698
+ "peers": [],
3507
4699
  "providers": [],
3508
4700
  "tags": [
3509
- "content",
3510
- "seo",
3511
- "ai",
3512
- "anthropic",
3513
- "metadata-generator"
4701
+ "ui",
4702
+ "notion",
4703
+ "shell",
4704
+ "wrapper",
4705
+ "sidebar",
4706
+ "page",
4707
+ "database",
4708
+ "primitive",
4709
+ "portable",
4710
+ "slash-menu",
4711
+ "decorator",
4712
+ "wysiwyg",
4713
+ "views",
4714
+ "kanban",
4715
+ "calendar",
4716
+ "gallery",
4717
+ "drag",
4718
+ "cover",
4719
+ "embed",
4720
+ "image",
4721
+ "notion-like"
3514
4722
  ],
3515
- "agentRecipe": "Run `rr add seo`. Call seo.generate from server actions or admin mutations with `personaContext` describing your brand voice (or rely on the generic default). Cost guard rate-limits per-user within 24h via callsInWindow query."
4723
+ "agentRecipe": "Run `npx rr add notion-shell` for the portable UI wrappers ONLY (no backend). NPM deps: @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/utilities. Import: `import { NotionPage, NotionSidebar, NotionBlock, NotionDatabase, SortableBlockList, PageActionsMenu, InsertBlockButton, ViewTabs, ImageRenderer, EmbedRenderer } from \"@/features/notion-shell\"`. NotionBlock ships slash menu + decorator + actions menu + dragHandle slot. NotionPage ships optional cover prop. SortableBlockList wraps a render-prop callback `(id, dragProps) => <NotionBlock dragHandle={...} />`. NotionDatabase ships 6 views via VIEW_REGISTRY. Property cells: text/number/checkbox/select/multi-select/status/date/url/email/phone all built in. For rich icon UX wire `renderIcon` + `renderIconPicker` to `@/features/icon-picker`. **PRODUCT POINTER: the full Convex-backed Notion-clone OS (multi-workspace + auth + sharing + comments + snapshots + MCP) lives at https://github.com/rahmanef63/open-silong — clone that repo for the production stack; use this slice when you only need to embed the Notion-style UI in another project.**"
3516
4724
  },
3517
4725
  {
3518
- "slug": "document-checklist",
3519
- "title": "Document ChecklistJob-Search Doc Tracker",
3520
- "category": "content",
4726
+ "slug": "workspace-shell",
4727
+ "title": "Workspace Shellatomic (workspace × menuSet) NavContext",
4728
+ "category": "ui",
3521
4729
  "kind": "full",
3522
- "version": "0.1.0",
3523
- "description": "Track required job-search documents (CV, KTP, ijazah, etc.) with country-scoped seed templates and per-user completion state. Ships an Indonesian default checklist. Toggle completed + notes + expiry per item.",
3524
- "source": "rahmanef63/CareerPack",
3525
- "slicePath": "frontend/slices/document-checklist",
4730
+ "version": "1.0.0",
4731
+ "description": "Unified workspace + menu navigation primitive. NavContext = (workspaceId, menuSetId) atomic pair. 2-tier dropdown switcher (workspace radio + menuSet picker), ContextBadge header chip, full editor with tabs (menus / workspace tree / settings), tiered RBAC (admin menus.manage, user menus.fork). Replaces silo'd menu-store + workspace-store slices in superspace. Resolver chain: user nav-context cache > user assignment > workspace default > system. Source: superspace.",
4732
+ "source": "superspace",
4733
+ "slicePath": "template-base/frontend/slices/workspace-shell",
3526
4734
  "convexPaths": [
3527
- "convex/features/document-checklist"
3528
- ],
3529
- "npm": [
3530
- "lucide-react"
4735
+ "template-base/convex/features/workspaceShell"
3531
4736
  ],
4737
+ "npm": [],
3532
4738
  "shadcn": [
3533
- "badge",
3534
- "button",
3535
- "card",
3536
- "dialog",
3537
- "label",
4739
+ "dropdown-menu",
3538
4740
  "popover",
3539
- "calendar",
3540
- "progress",
3541
- "scroll-area",
3542
- "skeleton",
4741
+ "command",
3543
4742
  "tabs",
3544
- "textarea"
4743
+ "switch"
3545
4744
  ],
3546
4745
  "env": [],
3547
4746
  "peers": [
3548
4747
  {
3549
4748
  "slug": "convex-auth",
3550
4749
  "range": "^0.1",
3551
- "reason": "Auth identity for user-scoped checklist state."
4750
+ "reason": "User session required for menuSet assignment + nav-context cache."
3552
4751
  }
3553
4752
  ],
3554
4753
  "providers": [],
3555
4754
  "tags": [
3556
- "career",
3557
- "documents",
3558
- "checklist",
3559
- "job-search",
3560
- "indonesia"
4755
+ "ui",
4756
+ "navigation",
4757
+ "workspace",
4758
+ "menu",
4759
+ "shell",
4760
+ "convex",
4761
+ "rbac"
3561
4762
  ],
3562
- "agentRecipe": "Run `rr add document-checklist`. Wire <DocumentChecklist bindings={{ current, seed, updateStatus }} countryTemplateSlot={<CountryTemplateCard bindings={{ templates, getTemplate, instantiate }} />} /> bindings sourced from api.features['document-checklist'].* queries/mutations."
4763
+ "agentRecipe": "Run `npx rr add workspace-shell`. Tables prefixed `workspaceShell_*` (menuSets, menuItems, itemComponents, wsAssignments, userAssignments, rolePerms, navContext). Mount `<NavContextProvider workspaceId={wsId}>` inside your auth provider; use `useNavContext(wsId)` to read `{workspace, menuSet, source, effectiveMenuItems, setMenuSet, forkMenuSet}`. Drop-in `<WorkspaceSwitcher canFork />` in sidebar header. Tiered RBAC: `menus.manage` for workspace-default editing, `menus.fork` for user-personal copy. Resolver chain: user cache → user assignment → workspace default → none. Pair with audit-log slice for context-switch / fork events (graceful try/catch if absent). Effective items query applies role filter via workspaceShell_rolePerms (no rolePerms → show all, pre-RBAC compat)."
3563
4764
  }
3564
4765
  ]
3565
4766
  }