rahman-resources 0.13.0 → 1.2.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-16T12:03:28.553Z",
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
  {
@@ -1172,12 +1623,12 @@
1172
1623
  "slug": "icon-picker",
1173
1624
  "title": "Notion-Style Icon Picker",
1174
1625
  "category": "ui",
1175
- "description": "Emoji + lucide icon picker with search, 10-color Notion palette, Twemoji/native toggle. One string stores emoji OR lucide:Name OR with ?c=hex tint — backwards-compat with raw-emoji fields. Single icon field stores emoji or 'lucide:Name' plus optional '?c=hex'.",
1626
+ "description": "Emoji + lucide icon picker with search, 10-color Notion 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.",
1176
1627
  "source": "notion-page-clone",
1177
1628
  "install": "npx rahman-resources add icon-picker",
1178
1629
  "npmPackages": [],
1179
1630
  "exampleCode": "",
1180
- "agentRecipe": "parseIconValue() decodes; lucideValue()/withColor() build. Add 'icon: v.string()' to Convex table — no migration needed for existing emoji fields. Popover variant for inline UI, Inline for sheets/dialogs.",
1631
+ "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.",
1181
1632
  "tags": [
1182
1633
  "icon",
1183
1634
  "emoji",
@@ -1187,6 +1638,42 @@
1187
1638
  "notion"
1188
1639
  ]
1189
1640
  },
1641
+ {
1642
+ "slug": "cta",
1643
+ "title": "Call to Action",
1644
+ "category": "ui",
1645
+ "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.",
1646
+ "source": "rahmanef.com",
1647
+ "install": "npx rahman-resources add cta",
1648
+ "npmPackages": [],
1649
+ "exampleCode": "",
1650
+ "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.",
1651
+ "tags": [
1652
+ "ui",
1653
+ "marketing",
1654
+ "cta",
1655
+ "section",
1656
+ "brutalist"
1657
+ ]
1658
+ },
1659
+ {
1660
+ "slug": "rate-limit",
1661
+ "title": "Rate Limit",
1662
+ "category": "infra",
1663
+ "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.",
1664
+ "source": "rahmanef.com",
1665
+ "install": "npx rahman-resources add rate-limit",
1666
+ "npmPackages": [],
1667
+ "exampleCode": "",
1668
+ "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.",
1669
+ "tags": [
1670
+ "infra",
1671
+ "rate-limit",
1672
+ "convex",
1673
+ "backend",
1674
+ "throttle"
1675
+ ]
1676
+ },
1190
1677
  {
1191
1678
  "slug": "contact-form-resend",
1192
1679
  "title": "Contact Form + Resend",
@@ -1208,17 +1695,36 @@
1208
1695
  "slug": "admin",
1209
1696
  "title": "Admin — Generic Shell",
1210
1697
  "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.",
1698
+ "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
1699
  "source": "rahmanef63/resource-site",
1213
1700
  "install": "npx rahman-resources add admin",
1214
1701
  "npmPackages": [],
1215
1702
  "exampleCode": "",
1216
- "agentRecipe": "Run `rr add admin`. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address.",
1703
+ "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
1704
  "tags": [
1218
1705
  "infra",
1219
1706
  "admin",
1220
1707
  "shell",
1221
- "crud"
1708
+ "crud",
1709
+ "nav-from-registry"
1710
+ ]
1711
+ },
1712
+ {
1713
+ "slug": "platform-admin",
1714
+ "title": "Platform Admin — Multi-Tenant Control Plane",
1715
+ "category": "infra",
1716
+ "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.",
1717
+ "source": "rahmanef63/resource-site",
1718
+ "install": "npx rahman-resources add platform-admin",
1719
+ "npmPackages": [],
1720
+ "exampleCode": "",
1721
+ "agentRecipe": "Contract-only scaffold. Wait for superspace /rr-send platform-admin before adopting. Distinct from per-instance `admin` slug.",
1722
+ "tags": [
1723
+ "infra",
1724
+ "admin",
1725
+ "multi-tenant",
1726
+ "saas",
1727
+ "platform"
1222
1728
  ]
1223
1729
  },
1224
1730
  {
@@ -1242,12 +1748,12 @@
1242
1748
  "slug": "comments",
1243
1749
  "title": "Comments — Threaded",
1244
1750
  "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.",
1751
+ "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
1752
  "source": "rahmanef63/resource-site",
1247
1753
  "install": "npx rahman-resources add comments",
1248
1754
  "npmPackages": [],
1249
1755
  "exampleCode": "",
1250
- "agentRecipe": "Run `rr add comments`. Use useComments({ pageId } | { blockId }) returns items, openCount, addComment, editComment, resolveComment, deleteComment. resolvedAt!=null = thread closed but visible.",
1756
+ "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
1757
  "tags": [
1252
1758
  "content",
1253
1759
  "social",
@@ -1260,12 +1766,12 @@
1260
1766
  "slug": "seo",
1261
1767
  "title": "SEO — AI Metadata Generator",
1262
1768
  "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.",
1769
+ "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
1770
  "source": "rahmanef63/resource-site",
1265
1771
  "install": "npx rahman-resources add seo",
1266
1772
  "npmPackages": [],
1267
1773
  "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.",
1774
+ "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
1775
  "tags": [
1270
1776
  "content",
1271
1777
  "seo",
@@ -1589,8 +2095,8 @@
1589
2095
  "title": "MDX Blog",
1590
2096
  "category": "content",
1591
2097
  "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.",
2098
+ "version": "0.2.0",
2099
+ "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
2100
  "source": "rahmanef63/resource-site",
1595
2101
  "slicePath": "frontend/slices/mdx-blog",
1596
2102
  "convexPaths": [],
@@ -1681,13 +2187,13 @@
1681
2187
  },
1682
2188
  {
1683
2189
  "slug": "command-menu",
1684
- "title": "Command Menu (⌘K)",
2190
+ "title": "Command Menu",
1685
2191
  "category": "ui",
1686
2192
  "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",
2193
+ "version": "0.2.0",
2194
+ "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.",
2195
+ "source": "notion-page-clone (consumerVersion 0.3.0) + earlier superspace facade",
2196
+ "slicePath": "frontend/slices/command-menu",
1691
2197
  "convexPaths": [],
1692
2198
  "npm": [
1693
2199
  "cmdk@^1.0.0"
@@ -1704,9 +2210,10 @@
1704
2210
  "palette",
1705
2211
  "cmd-k",
1706
2212
  "navigation",
1707
- "keyboard"
2213
+ "keyboard",
2214
+ "search"
1708
2215
  ],
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."
2216
+ "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
2217
  },
1711
2218
  {
1712
2219
  "slug": "motion-primitives",
@@ -1958,16 +2465,18 @@
1958
2465
  "title": "Notion-Style Icon Picker",
1959
2466
  "category": "ui",
1960
2467
  "kind": "ui",
1961
- "version": "0.1.0",
1962
- "description": "Emoji + lucide icon picker with search, 10-color Notion palette, Twemoji/native toggle. One string stores emoji OR lucide:Name OR with ?c=hex tint — backwards-compat with raw-emoji fields. Single icon field stores emoji or 'lucide:Name' plus optional '?c=hex'.",
2468
+ "version": "0.2.0",
2469
+ "description": "Emoji + lucide icon picker with search, 10-color Notion 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.",
1963
2470
  "source": "notion-page-clone",
1964
- "slicePath": "template-base/frontend/slices/notion/slices/icon-picker",
2471
+ "slicePath": "frontend/slices/icon-picker",
1965
2472
  "convexPaths": [],
1966
2473
  "npm": [],
1967
2474
  "shadcn": [
1968
2475
  "popover",
1969
2476
  "button",
1970
- "input"
2477
+ "input",
2478
+ "scroll-area",
2479
+ "tabs"
1971
2480
  ],
1972
2481
  "env": [],
1973
2482
  "peers": [],
@@ -1980,7 +2489,59 @@
1980
2489
  "twemoji",
1981
2490
  "notion"
1982
2491
  ],
1983
- "agentRecipe": "parseIconValue() decodes; lucideValue()/withColor() build. Add 'icon: v.string()' to Convex table — no migration needed for existing emoji fields. Popover variant for inline UI, Inline for sheets/dialogs."
2492
+ "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."
2493
+ },
2494
+ {
2495
+ "slug": "cta",
2496
+ "title": "Call to Action",
2497
+ "category": "ui",
2498
+ "kind": "ui",
2499
+ "version": "0.1.0",
2500
+ "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.",
2501
+ "source": "rahmanef.com",
2502
+ "slicePath": "frontend/slices/cta",
2503
+ "convexPaths": [],
2504
+ "npm": [
2505
+ "lucide-react@^0.400.0"
2506
+ ],
2507
+ "shadcn": [],
2508
+ "env": [],
2509
+ "peers": [],
2510
+ "providers": [],
2511
+ "tags": [
2512
+ "ui",
2513
+ "marketing",
2514
+ "cta",
2515
+ "section",
2516
+ "brutalist"
2517
+ ],
2518
+ "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."
2519
+ },
2520
+ {
2521
+ "slug": "rate-limit",
2522
+ "title": "Rate Limit",
2523
+ "category": "infra",
2524
+ "kind": "backend",
2525
+ "version": "0.1.0",
2526
+ "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.",
2527
+ "source": "rahmanef.com",
2528
+ "slicePath": "frontend/slices/rate-limit",
2529
+ "convexPaths": [
2530
+ "convex/features/rate-limit"
2531
+ ],
2532
+ "npm": [],
2533
+ "shadcn": [],
2534
+ "env": [],
2535
+ "peers": [],
2536
+ "providers": [],
2537
+ "tags": [
2538
+ "infra",
2539
+ "rate-limit",
2540
+ "convex",
2541
+ "backend",
2542
+ "throttle"
2543
+ ],
2544
+ "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."
1984
2545
  },
1985
2546
  {
1986
2547
  "slug": "contact-form-resend",
@@ -2031,8 +2592,8 @@
2031
2592
  "title": "Admin — Generic Shell",
2032
2593
  "category": "infra",
2033
2594
  "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.",
2595
+ "version": "0.2.0",
2596
+ "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
2597
  "source": "rahmanef63/resource-site",
2037
2598
  "slicePath": "frontend/slices/admin",
2038
2599
  "convexPaths": [
@@ -2062,16 +2623,61 @@
2062
2623
  "infra",
2063
2624
  "admin",
2064
2625
  "shell",
2065
- "crud"
2626
+ "crud",
2627
+ "nav-from-registry"
2066
2628
  ],
2067
- "agentRecipe": "Run `rr add admin`. Set SUPER_ADMIN_EMAIL via `npx convex env set` to lock down /admin to one address."
2629
+ "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."
2630
+ },
2631
+ {
2632
+ "slug": "platform-admin",
2633
+ "title": "Platform Admin — Multi-Tenant Control Plane",
2634
+ "category": "infra",
2635
+ "kind": "full",
2636
+ "version": "0.1.0",
2637
+ "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.",
2638
+ "source": "rahmanef63/resource-site",
2639
+ "slicePath": "frontend/slices/platform-admin",
2640
+ "convexPaths": [
2641
+ "convex/features/platform-admin"
2642
+ ],
2643
+ "npm": [],
2644
+ "shadcn": [],
2645
+ "env": [
2646
+ {
2647
+ "name": "PLATFORM_ADMIN_EMAILS",
2648
+ "scope": "convex",
2649
+ "required": true,
2650
+ "description": "Comma-separated list of platform admin email addresses."
2651
+ }
2652
+ ],
2653
+ "peers": [
2654
+ {
2655
+ "slug": "convex-auth",
2656
+ "range": "^0.1",
2657
+ "reason": "Actor identity for audit + tier-set ops."
2658
+ },
2659
+ {
2660
+ "slug": "audit-log",
2661
+ "range": "^0.2",
2662
+ "reason": "padmin_audit table feeds through audit-log TenantAdapter."
2663
+ }
2664
+ ],
2665
+ "providers": [],
2666
+ "tags": [
2667
+ "infra",
2668
+ "admin",
2669
+ "multi-tenant",
2670
+ "saas",
2671
+ "platform"
2672
+ ],
2673
+ "agentRecipe": "Contract-only scaffold. Wait for superspace /rr-send platform-admin before adopting. Distinct from per-instance `admin` slug."
2068
2674
  },
2069
2675
  {
2070
2676
  "slug": "audit-log",
2071
2677
  "title": "Audit Log — Workspace Events",
2072
2678
  "category": "infra",
2073
2679
  "kind": "backend",
2074
- "version": "0.1.0",
2680
+ "version": "0.2.0",
2075
2681
  "description": "Workspace-scoped audit event recorder. Canonical logAuditEvent helper for mutations + actions; supports entity tracking, before/after diff, IP/user-agent capture.",
2076
2682
  "source": "rahmanef63/resource-site",
2077
2683
  "slicePath": "frontend/slices/audit-log",
@@ -2102,8 +2708,8 @@
2102
2708
  "title": "Comments — Threaded",
2103
2709
  "category": "content",
2104
2710
  "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.",
2711
+ "version": "0.2.0",
2712
+ "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
2713
  "source": "rahmanef63/resource-site",
2108
2714
  "slicePath": "frontend/slices/comments",
2109
2715
  "convexPaths": [
@@ -2131,15 +2737,15 @@
2131
2737
  "threaded",
2132
2738
  "annotations"
2133
2739
  ],
2134
- "agentRecipe": "Run `rr add comments`. Use useComments({ pageId } | { blockId }) returns items, openCount, addComment, editComment, resolveComment, deleteComment. resolvedAt!=null = thread closed but visible."
2740
+ "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
2741
  },
2136
2742
  {
2137
2743
  "slug": "seo",
2138
2744
  "title": "SEO — AI Metadata Generator",
2139
2745
  "category": "content",
2140
2746
  "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.",
2747
+ "version": "0.2.0",
2748
+ "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
2749
  "source": "rahmanef63/resource-site",
2144
2750
  "slicePath": "frontend/slices/seo",
2145
2751
  "convexPaths": [
@@ -2169,7 +2775,7 @@
2169
2775
  "anthropic",
2170
2776
  "metadata-generator"
2171
2777
  ],
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."
2778
+ "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
2779
  },
2174
2780
  {
2175
2781
  "slug": "document-checklist",