rahman-resources 0.13.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 2,
3
- "generatedAt": "2026-05-15T05:11:02.213Z",
3
+ "generatedAt": "2026-05-16T08:10:45.510Z",
4
4
  "repo": "rahmanef63/resource-site",
5
5
  "branch": "main",
6
6
  "layouts": [
@@ -802,6 +802,456 @@
802
802
  "indonesia"
803
803
  ],
804
804
  "primaryFile": "app/preview/riset-kit/public/page.tsx"
805
+ },
806
+ {
807
+ "slug": "hero-centered",
808
+ "title": "Hero — Centered",
809
+ "category": "marketing",
810
+ "description": "Single-column centered hero with eyebrow pill, headline, sub-copy, and dual CTA. Radial gradient backdrop.",
811
+ "source": "kitab",
812
+ "repoPath": "app/preview/hero-centered",
813
+ "pullPaths": [
814
+ "app/preview/hero-centered"
815
+ ],
816
+ "files": [],
817
+ "dependencies": [],
818
+ "shadcnComponents": [],
819
+ "agentRecipe": "Pure layout. Drop into landing pages where the product needs minimum framing. Replace the eyebrow pill with a status badge or release tag. Two CTAs is the sweet spot.",
820
+ "tags": [
821
+ "block",
822
+ "hero",
823
+ "centered",
824
+ "marketing"
825
+ ],
826
+ "primaryFile": "app/preview/hero-centered/page.tsx"
827
+ },
828
+ {
829
+ "slug": "hero-split",
830
+ "title": "Hero — Split (Text + Visual)",
831
+ "category": "marketing",
832
+ "description": "Two-column hero: left copy + feature list + CTAs, right visual slot. 9-cell mock grid placeholder for product shot.",
833
+ "source": "kitab",
834
+ "repoPath": "app/preview/hero-split",
835
+ "pullPaths": [
836
+ "app/preview/hero-split"
837
+ ],
838
+ "files": [],
839
+ "dependencies": [],
840
+ "shadcnComponents": [],
841
+ "agentRecipe": "Right column accepts any visual — screenshot, product mock, illustration, or live demo iframe. Feature list pairs Lucide icons with one-line value props.",
842
+ "tags": [
843
+ "block",
844
+ "hero",
845
+ "split",
846
+ "marketing",
847
+ "product"
848
+ ],
849
+ "primaryFile": "app/preview/hero-split/page.tsx"
850
+ },
851
+ {
852
+ "slug": "hero-bento-bg",
853
+ "title": "Hero — Bento Background",
854
+ "category": "marketing",
855
+ "description": "Bento mini-grid behind a centered headline. Radial mask focuses the eye on the copy while the grid hints at features.",
856
+ "source": "kitab",
857
+ "repoPath": "app/preview/hero-bento-bg",
858
+ "pullPaths": [
859
+ "app/preview/hero-bento-bg"
860
+ ],
861
+ "files": [],
862
+ "dependencies": [],
863
+ "shadcnComponents": [],
864
+ "agentRecipe": "Background tiles get a radial mask so the center stays readable. Use 6-8 tiles with asymmetric spans (col-span-2 row-span-2 for one, others 1x1). Lucide icon in each tile.",
865
+ "tags": [
866
+ "block",
867
+ "hero",
868
+ "bento",
869
+ "marketing",
870
+ "decorative"
871
+ ],
872
+ "primaryFile": "app/preview/hero-bento-bg/page.tsx"
873
+ },
874
+ {
875
+ "slug": "hero-video-loop",
876
+ "title": "Hero — Video Loop (dark)",
877
+ "category": "marketing",
878
+ "description": "Dark-mode hero with conic-gradient animated backdrop (stand-in for video). Play CTA, headline, dual CTA.",
879
+ "source": "kitab",
880
+ "repoPath": "app/preview/hero-video-loop",
881
+ "pullPaths": [
882
+ "app/preview/hero-video-loop"
883
+ ],
884
+ "files": [],
885
+ "dependencies": [],
886
+ "shadcnComponents": [],
887
+ "agentRecipe": "Replace the conic-gradient backdrop with a muted <video autoplay loop>. Keep the dark theme — light text on motion only reads when the contrast is hard.",
888
+ "tags": [
889
+ "block",
890
+ "hero",
891
+ "video",
892
+ "marketing",
893
+ "dark"
894
+ ],
895
+ "primaryFile": "app/preview/hero-video-loop/page.tsx"
896
+ },
897
+ {
898
+ "slug": "hero-animated-text",
899
+ "title": "Hero — Animated Text",
900
+ "category": "marketing",
901
+ "description": "Rotating word inside the headline cycles every 2s with gradient text + fade-slide transition. Lightweight, no extra deps.",
902
+ "source": "kitab",
903
+ "repoPath": "app/preview/hero-animated-text",
904
+ "pullPaths": [
905
+ "app/preview/hero-animated-text"
906
+ ],
907
+ "files": [],
908
+ "dependencies": [],
909
+ "shadcnComponents": [],
910
+ "agentRecipe": "Use absolute-positioned word slots with translate-y + opacity transitions. The invisible placeholder word keeps the bounding box stable.",
911
+ "tags": [
912
+ "block",
913
+ "hero",
914
+ "motion",
915
+ "marketing",
916
+ "kinetic"
917
+ ],
918
+ "primaryFile": "app/preview/hero-animated-text/page.tsx"
919
+ },
920
+ {
921
+ "slug": "pricing-three",
922
+ "title": "Pricing — Three Tier",
923
+ "category": "marketing",
924
+ "description": "Classic 3-tier card layout. Middle tier highlighted with Most Popular badge + soft shadow.",
925
+ "source": "kitab",
926
+ "repoPath": "app/preview/pricing-three",
927
+ "pullPaths": [
928
+ "app/preview/pricing-three"
929
+ ],
930
+ "files": [],
931
+ "dependencies": [],
932
+ "shadcnComponents": [],
933
+ "agentRecipe": "Three is the magic number for SaaS pricing — fewer feels limited, more triggers analysis paralysis. Middle tier should be the one you actually want to sell.",
934
+ "tags": [
935
+ "block",
936
+ "pricing",
937
+ "marketing",
938
+ "saas"
939
+ ],
940
+ "primaryFile": "app/preview/pricing-three/page.tsx"
941
+ },
942
+ {
943
+ "slug": "pricing-four",
944
+ "title": "Pricing — Four Tier",
945
+ "category": "marketing",
946
+ "description": "Four-tier with Best Value badge on tier 3. Compact card chrome, 4-column grid that collapses gracefully.",
947
+ "source": "kitab",
948
+ "repoPath": "app/preview/pricing-four",
949
+ "pullPaths": [
950
+ "app/preview/pricing-four"
951
+ ],
952
+ "files": [],
953
+ "dependencies": [],
954
+ "shadcnComponents": [],
955
+ "agentRecipe": "Use when you genuinely have four distinct tiers (free / solo / team / enterprise). Don't pad to four — use the three-tier variant if the fourth is forced.",
956
+ "tags": [
957
+ "block",
958
+ "pricing",
959
+ "marketing",
960
+ "saas"
961
+ ],
962
+ "primaryFile": "app/preview/pricing-four/page.tsx"
963
+ },
964
+ {
965
+ "slug": "pricing-toggle",
966
+ "title": "Pricing — Monthly/Yearly Toggle",
967
+ "category": "marketing",
968
+ "description": "3-tier with a monthly/yearly pill toggle. Yearly price strikethroughs the monthly, -20% savings badge inside the toggle.",
969
+ "source": "kitab",
970
+ "repoPath": "app/preview/pricing-toggle",
971
+ "pullPaths": [
972
+ "app/preview/pricing-toggle"
973
+ ],
974
+ "files": [],
975
+ "dependencies": [],
976
+ "shadcnComponents": [],
977
+ "agentRecipe": "Default to yearly — that's the conversion-optimized choice. Show the monthly strikethrough so the savings feel real, not implied.",
978
+ "tags": [
979
+ "block",
980
+ "pricing",
981
+ "marketing",
982
+ "interactive"
983
+ ],
984
+ "primaryFile": "app/preview/pricing-toggle/page.tsx"
985
+ },
986
+ {
987
+ "slug": "pricing-compare",
988
+ "title": "Pricing — Feature Comparison",
989
+ "category": "marketing",
990
+ "description": "Single comparison table: feature rows × plan columns. Check/Minus icons, header row with prices, sticky CTA row.",
991
+ "source": "kitab",
992
+ "repoPath": "app/preview/pricing-compare",
993
+ "pullPaths": [
994
+ "app/preview/pricing-compare"
995
+ ],
996
+ "files": [],
997
+ "dependencies": [],
998
+ "shadcnComponents": [],
999
+ "agentRecipe": "Use for complex products where buyers actually compare. Mix boolean rows (Check/Minus) with string-value rows (\"1\", \"10\", \"Unlimited\") for clarity.",
1000
+ "tags": [
1001
+ "block",
1002
+ "pricing",
1003
+ "marketing",
1004
+ "comparison",
1005
+ "table"
1006
+ ],
1007
+ "primaryFile": "app/preview/pricing-compare/page.tsx"
1008
+ },
1009
+ {
1010
+ "slug": "pricing-slider",
1011
+ "title": "Pricing — Usage Slider",
1012
+ "category": "marketing",
1013
+ "description": "Range slider drives the price. Tier name and per-seat cost update live. Single-card layout, focus on the math.",
1014
+ "source": "kitab",
1015
+ "repoPath": "app/preview/pricing-slider",
1016
+ "pullPaths": [
1017
+ "app/preview/pricing-slider"
1018
+ ],
1019
+ "files": [],
1020
+ "dependencies": [],
1021
+ "shadcnComponents": [],
1022
+ "agentRecipe": "Use for usage-based or seat-based products. Make the breakpoints transparent — buyers should be able to predict the next price without surprises.",
1023
+ "tags": [
1024
+ "block",
1025
+ "pricing",
1026
+ "marketing",
1027
+ "interactive",
1028
+ "usage"
1029
+ ],
1030
+ "primaryFile": "app/preview/pricing-slider/page.tsx"
1031
+ },
1032
+ {
1033
+ "slug": "accordion-faq",
1034
+ "title": "Accordion — Classic FAQ",
1035
+ "category": "marketing",
1036
+ "description": "Single-open FAQ accordion. ChevronDown rotates, content reveals below. Clean, compact, perfect for support pages.",
1037
+ "source": "kitab",
1038
+ "repoPath": "app/preview/accordion-faq",
1039
+ "pullPaths": [
1040
+ "app/preview/accordion-faq"
1041
+ ],
1042
+ "files": [],
1043
+ "dependencies": [],
1044
+ "shadcnComponents": [],
1045
+ "agentRecipe": "Single-open keeps the page short. Use when answers are independent. Switch to multi-open if buyers tend to scan multiple answers at once.",
1046
+ "tags": [
1047
+ "block",
1048
+ "accordion",
1049
+ "faq",
1050
+ "marketing"
1051
+ ],
1052
+ "primaryFile": "app/preview/accordion-faq/page.tsx"
1053
+ },
1054
+ {
1055
+ "slug": "accordion-grouped",
1056
+ "title": "Accordion — Grouped Sections",
1057
+ "category": "marketing",
1058
+ "description": "FAQ split into themed groups (Getting Started / Slices / Billing). Each group is its own card. Independent open state per item.",
1059
+ "source": "kitab",
1060
+ "repoPath": "app/preview/accordion-grouped",
1061
+ "pullPaths": [
1062
+ "app/preview/accordion-grouped"
1063
+ ],
1064
+ "files": [],
1065
+ "dependencies": [],
1066
+ "shadcnComponents": [],
1067
+ "agentRecipe": "Use when the FAQ is long (>10 items) and questions cluster naturally. Each group's Item owns its open state for predictable UX.",
1068
+ "tags": [
1069
+ "block",
1070
+ "accordion",
1071
+ "faq",
1072
+ "marketing",
1073
+ "grouped"
1074
+ ],
1075
+ "primaryFile": "app/preview/accordion-grouped/page.tsx"
1076
+ },
1077
+ {
1078
+ "slug": "accordion-sidebar",
1079
+ "title": "Accordion — Sidebar Navigation",
1080
+ "category": "marketing",
1081
+ "description": "Docs-style: left nav switches sections, right pane shows the section's accordion. Two-axis navigation in one layout.",
1082
+ "source": "kitab",
1083
+ "repoPath": "app/preview/accordion-sidebar",
1084
+ "pullPaths": [
1085
+ "app/preview/accordion-sidebar"
1086
+ ],
1087
+ "files": [],
1088
+ "dependencies": [],
1089
+ "shadcnComponents": [],
1090
+ "agentRecipe": "Use for help/docs pages with section breadth. Keep section count ≤ 5 — beyond that, the sidebar gets noisy. Reset accordion state on section change.",
1091
+ "tags": [
1092
+ "block",
1093
+ "accordion",
1094
+ "docs",
1095
+ "sidebar",
1096
+ "navigation"
1097
+ ],
1098
+ "primaryFile": "app/preview/accordion-sidebar/page.tsx"
1099
+ },
1100
+ {
1101
+ "slug": "accordion-animated",
1102
+ "title": "Accordion — Smooth Animated",
1103
+ "category": "marketing",
1104
+ "description": "Grid-row transition for true height animation, no janky calc. Each item is a rounded card with rotating plus → primary close icon.",
1105
+ "source": "kitab",
1106
+ "repoPath": "app/preview/accordion-animated",
1107
+ "pullPaths": [
1108
+ "app/preview/accordion-animated"
1109
+ ],
1110
+ "files": [],
1111
+ "dependencies": [],
1112
+ "shadcnComponents": [],
1113
+ "agentRecipe": "The grid-template-rows trick lets CSS animate to-auto-height natively. No JS measurement, no jank. Pair with rounded card chrome for premium feel.",
1114
+ "tags": [
1115
+ "block",
1116
+ "accordion",
1117
+ "marketing",
1118
+ "motion"
1119
+ ],
1120
+ "primaryFile": "app/preview/accordion-animated/page.tsx"
1121
+ },
1122
+ {
1123
+ "slug": "accordion-multi",
1124
+ "title": "Accordion — Multi-open",
1125
+ "category": "marketing",
1126
+ "description": "All items can be open at once. Expand-all / Collapse-all toggle in header. Best for compare-style reading.",
1127
+ "source": "kitab",
1128
+ "repoPath": "app/preview/accordion-multi",
1129
+ "pullPaths": [
1130
+ "app/preview/accordion-multi"
1131
+ ],
1132
+ "files": [],
1133
+ "dependencies": [],
1134
+ "shadcnComponents": [],
1135
+ "agentRecipe": "Use when answers reference each other or buyers want to keep multiple sections visible (changelogs, release notes, feature comparison FAQs).",
1136
+ "tags": [
1137
+ "block",
1138
+ "accordion",
1139
+ "marketing",
1140
+ "multi-open"
1141
+ ],
1142
+ "primaryFile": "app/preview/accordion-multi/page.tsx"
1143
+ },
1144
+ {
1145
+ "slug": "blog-grid",
1146
+ "title": "Blog — Card Grid",
1147
+ "category": "cms",
1148
+ "description": "3-column responsive card grid. Cover thumbnail (HSL gradient), title, excerpt, author·date·read meta. Default blog index shape.",
1149
+ "source": "kitab",
1150
+ "repoPath": "app/preview/blog-grid",
1151
+ "pullPaths": [
1152
+ "app/preview/blog-grid"
1153
+ ],
1154
+ "files": [],
1155
+ "dependencies": [],
1156
+ "shadcnComponents": [],
1157
+ "agentRecipe": "Default to 3 columns at lg. Use the Thumb helper for cover generation when posts don't ship an image yet — HSL gradient by post.hue keeps each card distinct.",
1158
+ "tags": [
1159
+ "block",
1160
+ "blog",
1161
+ "cms",
1162
+ "grid"
1163
+ ],
1164
+ "primaryFile": "app/preview/blog-grid/page.tsx"
1165
+ },
1166
+ {
1167
+ "slug": "blog-list",
1168
+ "title": "Blog — Dense List",
1169
+ "category": "cms",
1170
+ "description": "Single-column scannable list. Thumbnail left, meta + title + excerpt right. High density, low scroll.",
1171
+ "source": "kitab",
1172
+ "repoPath": "app/preview/blog-list",
1173
+ "pullPaths": [
1174
+ "app/preview/blog-list"
1175
+ ],
1176
+ "files": [],
1177
+ "dependencies": [],
1178
+ "shadcnComponents": [],
1179
+ "agentRecipe": "Use for archives or category pages where the reader is hunting a specific post. Compact thumbnail keeps the line height tight.",
1180
+ "tags": [
1181
+ "block",
1182
+ "blog",
1183
+ "cms",
1184
+ "list"
1185
+ ],
1186
+ "primaryFile": "app/preview/blog-list/page.tsx"
1187
+ },
1188
+ {
1189
+ "slug": "blog-magazine",
1190
+ "title": "Blog — Magazine Layout",
1191
+ "category": "cms",
1192
+ "description": "Editorial spread: large hero post (2/3 width) + secondary featured + tail of headlines. Issue-number header gives quarterly feel.",
1193
+ "source": "kitab",
1194
+ "repoPath": "app/preview/blog-magazine",
1195
+ "pullPaths": [
1196
+ "app/preview/blog-magazine"
1197
+ ],
1198
+ "files": [],
1199
+ "dependencies": [],
1200
+ "shadcnComponents": [],
1201
+ "agentRecipe": "Use for content-heavy publications. Hero post earns the visual real estate; the sidebar carries breadth. Mix typography sizes for editorial rhythm.",
1202
+ "tags": [
1203
+ "block",
1204
+ "blog",
1205
+ "cms",
1206
+ "editorial",
1207
+ "magazine"
1208
+ ],
1209
+ "primaryFile": "app/preview/blog-magazine/page.tsx"
1210
+ },
1211
+ {
1212
+ "slug": "blog-masonry",
1213
+ "title": "Blog — Masonry",
1214
+ "category": "cms",
1215
+ "description": "CSS columns-based masonry with varying card heights for organic rhythm. break-inside-avoid keeps each card intact.",
1216
+ "source": "kitab",
1217
+ "repoPath": "app/preview/blog-masonry",
1218
+ "pullPaths": [
1219
+ "app/preview/blog-masonry"
1220
+ ],
1221
+ "files": [],
1222
+ "dependencies": [],
1223
+ "shadcnComponents": [],
1224
+ "agentRecipe": "CSS columns are the cheap masonry — no JS, no layout shift. Vary the thumbnail height via a HEIGHTS array (h-44 to h-80). DOM order ≠ visual order — design around it.",
1225
+ "tags": [
1226
+ "block",
1227
+ "blog",
1228
+ "cms",
1229
+ "masonry"
1230
+ ],
1231
+ "primaryFile": "app/preview/blog-masonry/page.tsx"
1232
+ },
1233
+ {
1234
+ "slug": "blog-featured",
1235
+ "title": "Blog — Featured Hero + Tail",
1236
+ "category": "cms",
1237
+ "description": "Full-bleed cover hero on the first post, then a tight 2-column grid for the rest. Cinematic open, fast scroll for the tail.",
1238
+ "source": "kitab",
1239
+ "repoPath": "app/preview/blog-featured",
1240
+ "pullPaths": [
1241
+ "app/preview/blog-featured"
1242
+ ],
1243
+ "files": [],
1244
+ "dependencies": [],
1245
+ "shadcnComponents": [],
1246
+ "agentRecipe": "Use for marketing-driven content sites (newsletter, podcast, brand journal) where the lead story carries the visit. Tail grid keeps the index scrollable without losing the hero impact.",
1247
+ "tags": [
1248
+ "block",
1249
+ "blog",
1250
+ "cms",
1251
+ "featured",
1252
+ "hero"
1253
+ ],
1254
+ "primaryFile": "app/preview/blog-featured/page.tsx"
805
1255
  }
806
1256
  ],
807
1257
  "recipes": [],
@@ -937,7 +1387,7 @@
937
1387
  "slug": "mdx-blog",
938
1388
  "title": "MDX Blog",
939
1389
  "category": "content",
940
- "description": "Markdown-with-JSX untuk blog post. File-based under content/blog/*.mdx. Auto-generate ToC, reading-time, syntax highlight, plus embed React components inline.",
1390
+ "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.",
941
1391
  "source": "rahmanef63/resource-site",
942
1392
  "docsUrl": "https://github.com/hashicorp/next-mdx-remote",
943
1393
  "install": "npm i next-mdx-remote rehype-pretty-code remark-gfm reading-time",
@@ -997,23 +1447,24 @@
997
1447
  },
998
1448
  {
999
1449
  "slug": "command-menu",
1000
- "title": "Command Menu (⌘K)",
1450
+ "title": "Command Menu",
1001
1451
  "category": "ui",
1002
- "description": "Global ⌘K command palette. Auto-builds entries from your feature registry (defineFeature) + custom actions. Fuzzy search via cmdk. Mount once at app shell; listens globally. Facade slice — pulls from template-base/frontend/slices/command-menu which re-exports shared/foundation/utils/system/command-menu.",
1003
- "source": "superspace + kitab-core",
1452
+ "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.",
1453
+ "source": "notion-page-clone (consumerVersion 0.3.0) + earlier superspace facade",
1004
1454
  "docsUrl": "https://cmdk.paco.me",
1005
1455
  "install": "npm i cmdk",
1006
1456
  "npmPackages": [
1007
1457
  "cmdk"
1008
1458
  ],
1009
1459
  "exampleCode": "",
1010
- "agentRecipe": "Mount <CommandMenu actions={...} /> once at the dashboard shell level. Listens for Cmd+K globally. Actions auto-build from feature registry + workspace + theme/sign-out. Add custom commands via actions prop or by registering in command-registry.ts.",
1460
+ "agentRecipe": "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.",
1011
1461
  "tags": [
1012
1462
  "ui",
1013
1463
  "palette",
1014
1464
  "cmd-k",
1015
1465
  "navigation",
1016
- "keyboard"
1466
+ "keyboard",
1467
+ "search"
1017
1468
  ]
1018
1469
  },
1019
1470
  {
@@ -1208,17 +1659,36 @@
1208
1659
  "slug": "admin",
1209
1660
  "title": "Admin — Generic Shell",
1210
1661
  "category": "infra",
1211
- "description": "Landing page scaffold + Convex admin probe (isAdmin / counts). Consumer composes feature panels into the grid. Gated by requireAdmin on Convex side; superadmin email gate via SUPER_ADMIN_EMAIL env.",
1662
+ "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.",
1212
1663
  "source": "rahmanef63/resource-site",
1213
1664
  "install": "npx rahman-resources add admin",
1214
1665
  "npmPackages": [],
1215
1666
  "exampleCode": "",
1216
- "agentRecipe": "Run `rr add admin`. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address.",
1667
+ "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.",
1217
1668
  "tags": [
1218
1669
  "infra",
1219
1670
  "admin",
1220
1671
  "shell",
1221
- "crud"
1672
+ "crud",
1673
+ "nav-from-registry"
1674
+ ]
1675
+ },
1676
+ {
1677
+ "slug": "platform-admin",
1678
+ "title": "Platform Admin — Multi-Tenant Control Plane",
1679
+ "category": "infra",
1680
+ "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.",
1681
+ "source": "rahmanef63/resource-site",
1682
+ "install": "npx rahman-resources add platform-admin",
1683
+ "npmPackages": [],
1684
+ "exampleCode": "",
1685
+ "agentRecipe": "Contract-only scaffold. Wait for superspace /rr-send platform-admin before adopting. Distinct from per-instance `admin` slug.",
1686
+ "tags": [
1687
+ "infra",
1688
+ "admin",
1689
+ "multi-tenant",
1690
+ "saas",
1691
+ "platform"
1222
1692
  ]
1223
1693
  },
1224
1694
  {
@@ -1242,12 +1712,12 @@
1242
1712
  "slug": "comments",
1243
1713
  "title": "Comments — Threaded",
1244
1714
  "category": "content",
1245
- "description": "Workspace-scoped threaded comments anchored to pages or blocks. Soft-delete + resolve semantics. useComments(opts) hook returns items + openCount + CRUD mutations.",
1715
+ "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.",
1246
1716
  "source": "rahmanef63/resource-site",
1247
1717
  "install": "npx rahman-resources add comments",
1248
1718
  "npmPackages": [],
1249
1719
  "exampleCode": "",
1250
- "agentRecipe": "Run `rr add comments`. Use useComments({ pageId } | { blockId }) returns items, openCount, addComment, editComment, resolveComment, deleteComment. resolvedAt!=null = thread closed but visible.",
1720
+ "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.",
1251
1721
  "tags": [
1252
1722
  "content",
1253
1723
  "social",
@@ -1260,12 +1730,12 @@
1260
1730
  "slug": "seo",
1261
1731
  "title": "SEO — AI Metadata Generator",
1262
1732
  "category": "content",
1263
- "description": "Service slice for SEO metadata generation — Anthropic-backed action with per-user 24h cost guard. No public route. Backend exposes generate + generateAndApply mutations gated by requireAdmin.",
1733
+ "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).",
1264
1734
  "source": "rahmanef63/resource-site",
1265
1735
  "install": "npx rahman-resources add seo",
1266
1736
  "npmPackages": [],
1267
1737
  "exampleCode": "",
1268
- "agentRecipe": "Run `rr add seo`. Call seo.generate from server actions or admin mutations. Cost guard rate-limits per-user within 24h via callsInWindow query.",
1738
+ "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.",
1269
1739
  "tags": [
1270
1740
  "content",
1271
1741
  "seo",
@@ -1589,8 +2059,8 @@
1589
2059
  "title": "MDX Blog",
1590
2060
  "category": "content",
1591
2061
  "kind": "ui",
1592
- "version": "0.1.0",
1593
- "description": "Markdown-with-JSX untuk blog post. File-based under content/blog/*.mdx. Auto-generate ToC, reading-time, syntax highlight, plus embed React components inline.",
2062
+ "version": "0.2.0",
2063
+ "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.",
1594
2064
  "source": "rahmanef63/resource-site",
1595
2065
  "slicePath": "frontend/slices/mdx-blog",
1596
2066
  "convexPaths": [],
@@ -1681,13 +2151,13 @@
1681
2151
  },
1682
2152
  {
1683
2153
  "slug": "command-menu",
1684
- "title": "Command Menu (⌘K)",
2154
+ "title": "Command Menu",
1685
2155
  "category": "ui",
1686
2156
  "kind": "ui",
1687
- "version": "0.1.0",
1688
- "description": "Global ⌘K command palette. Auto-builds entries from your feature registry (defineFeature) + custom actions. Fuzzy search via cmdk. Mount once at app shell; listens globally. Facade slice — pulls from template-base/frontend/slices/command-menu which re-exports shared/foundation/utils/system/command-menu.",
1689
- "source": "superspace + kitab-core",
1690
- "slicePath": "template-base/frontend/slices/command-menu",
2157
+ "version": "0.2.0",
2158
+ "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.",
2159
+ "source": "notion-page-clone (consumerVersion 0.3.0) + earlier superspace facade",
2160
+ "slicePath": "frontend/slices/command-menu",
1691
2161
  "convexPaths": [],
1692
2162
  "npm": [
1693
2163
  "cmdk@^1.0.0"
@@ -1704,9 +2174,10 @@
1704
2174
  "palette",
1705
2175
  "cmd-k",
1706
2176
  "navigation",
1707
- "keyboard"
2177
+ "keyboard",
2178
+ "search"
1708
2179
  ],
1709
- "agentRecipe": "Mount <CommandMenu actions={...} /> once at the dashboard shell level. Listens for Cmd+K globally. Actions auto-build from feature registry + workspace + theme/sign-out. Add custom commands via actions prop or by registering in command-registry.ts."
2180
+ "agentRecipe": "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."
1710
2181
  },
1711
2182
  {
1712
2183
  "slug": "motion-primitives",
@@ -2031,8 +2502,8 @@
2031
2502
  "title": "Admin — Generic Shell",
2032
2503
  "category": "infra",
2033
2504
  "kind": "full",
2034
- "version": "0.1.0",
2035
- "description": "Landing page scaffold + Convex admin probe (isAdmin / counts). Consumer composes feature panels into the grid. Gated by requireAdmin on Convex side; superadmin email gate via SUPER_ADMIN_EMAIL env.",
2505
+ "version": "0.2.0",
2506
+ "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.",
2036
2507
  "source": "rahmanef63/resource-site",
2037
2508
  "slicePath": "frontend/slices/admin",
2038
2509
  "convexPaths": [
@@ -2062,16 +2533,61 @@
2062
2533
  "infra",
2063
2534
  "admin",
2064
2535
  "shell",
2065
- "crud"
2536
+ "crud",
2537
+ "nav-from-registry"
2538
+ ],
2539
+ "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."
2540
+ },
2541
+ {
2542
+ "slug": "platform-admin",
2543
+ "title": "Platform Admin — Multi-Tenant Control Plane",
2544
+ "category": "infra",
2545
+ "kind": "full",
2546
+ "version": "0.1.0",
2547
+ "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.",
2548
+ "source": "rahmanef63/resource-site",
2549
+ "slicePath": "frontend/slices/platform-admin",
2550
+ "convexPaths": [
2551
+ "convex/features/platform-admin"
2552
+ ],
2553
+ "npm": [],
2554
+ "shadcn": [],
2555
+ "env": [
2556
+ {
2557
+ "name": "PLATFORM_ADMIN_EMAILS",
2558
+ "scope": "convex",
2559
+ "required": true,
2560
+ "description": "Comma-separated list of platform admin email addresses."
2561
+ }
2066
2562
  ],
2067
- "agentRecipe": "Run `rr add admin`. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address."
2563
+ "peers": [
2564
+ {
2565
+ "slug": "convex-auth",
2566
+ "range": "^0.1",
2567
+ "reason": "Actor identity for audit + tier-set ops."
2568
+ },
2569
+ {
2570
+ "slug": "audit-log",
2571
+ "range": "^0.2",
2572
+ "reason": "padmin_audit table feeds through audit-log TenantAdapter."
2573
+ }
2574
+ ],
2575
+ "providers": [],
2576
+ "tags": [
2577
+ "infra",
2578
+ "admin",
2579
+ "multi-tenant",
2580
+ "saas",
2581
+ "platform"
2582
+ ],
2583
+ "agentRecipe": "Contract-only scaffold. Wait for superspace /rr-send platform-admin before adopting. Distinct from per-instance `admin` slug."
2068
2584
  },
2069
2585
  {
2070
2586
  "slug": "audit-log",
2071
2587
  "title": "Audit Log — Workspace Events",
2072
2588
  "category": "infra",
2073
2589
  "kind": "backend",
2074
- "version": "0.1.0",
2590
+ "version": "0.2.0",
2075
2591
  "description": "Workspace-scoped audit event recorder. Canonical logAuditEvent helper for mutations + actions; supports entity tracking, before/after diff, IP/user-agent capture.",
2076
2592
  "source": "rahmanef63/resource-site",
2077
2593
  "slicePath": "frontend/slices/audit-log",
@@ -2102,8 +2618,8 @@
2102
2618
  "title": "Comments — Threaded",
2103
2619
  "category": "content",
2104
2620
  "kind": "full",
2105
- "version": "0.1.0",
2106
- "description": "Workspace-scoped threaded comments anchored to pages or blocks. Soft-delete + resolve semantics. useComments(opts) hook returns items + openCount + CRUD mutations.",
2621
+ "version": "0.2.0",
2622
+ "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.",
2107
2623
  "source": "rahmanef63/resource-site",
2108
2624
  "slicePath": "frontend/slices/comments",
2109
2625
  "convexPaths": [
@@ -2131,15 +2647,15 @@
2131
2647
  "threaded",
2132
2648
  "annotations"
2133
2649
  ],
2134
- "agentRecipe": "Run `rr add comments`. Use useComments({ pageId } | { blockId }) returns items, openCount, addComment, editComment, resolveComment, deleteComment. resolvedAt!=null = thread closed but visible."
2650
+ "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."
2135
2651
  },
2136
2652
  {
2137
2653
  "slug": "seo",
2138
2654
  "title": "SEO — AI Metadata Generator",
2139
2655
  "category": "content",
2140
2656
  "kind": "full",
2141
- "version": "0.1.0",
2142
- "description": "Service slice for SEO metadata generation — Anthropic-backed action with per-user 24h cost guard. No public route. Backend exposes generate + generateAndApply mutations gated by requireAdmin.",
2657
+ "version": "0.2.0",
2658
+ "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).",
2143
2659
  "source": "rahmanef63/resource-site",
2144
2660
  "slicePath": "frontend/slices/seo",
2145
2661
  "convexPaths": [
@@ -2169,7 +2685,7 @@
2169
2685
  "anthropic",
2170
2686
  "metadata-generator"
2171
2687
  ],
2172
- "agentRecipe": "Run `rr add seo`. Call seo.generate from server actions or admin mutations. Cost guard rate-limits per-user within 24h via callsInWindow query."
2688
+ "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."
2173
2689
  },
2174
2690
  {
2175
2691
  "slug": "document-checklist",