rahman-resources 1.14.2 → 1.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +65 -15
- package/lib/manifest.json +780 -682
- package/lib/rr-schema.json +1 -0
- package/lib/rr.mjs +2 -1
- package/lib/slice-schema.json +36 -0
- package/package.json +1 -1
package/lib/manifest.json
CHANGED
|
@@ -3,13 +3,33 @@
|
|
|
3
3
|
"repo": "rahmanef63/resource-site",
|
|
4
4
|
"branch": "main",
|
|
5
5
|
"aliases": {
|
|
6
|
-
"blog-section": "
|
|
7
|
-
"faq-section": "
|
|
8
|
-
"portfolio-section": "
|
|
9
|
-
"changelog-feed": "
|
|
10
|
-
"feature-grid": "
|
|
11
|
-
"testimonials-grid": "
|
|
12
|
-
"pricing-page": "
|
|
6
|
+
"blog-section": "sections",
|
|
7
|
+
"faq-section": "sections",
|
|
8
|
+
"portfolio-section": "sections",
|
|
9
|
+
"changelog-feed": "sections",
|
|
10
|
+
"feature-grid": "sections",
|
|
11
|
+
"testimonials-grid": "sections",
|
|
12
|
+
"pricing-page": "sections",
|
|
13
|
+
"files": "file-upload",
|
|
14
|
+
"onboarding-wizard": "site-setup-wizard",
|
|
15
|
+
"media-studio": "design-studio",
|
|
16
|
+
"loading-states": "feedback-states",
|
|
17
|
+
"empty-states": "feedback-states",
|
|
18
|
+
"resume": "profile",
|
|
19
|
+
"about-profile": "profile",
|
|
20
|
+
"settings-page": "settings",
|
|
21
|
+
"shell-settings": "settings",
|
|
22
|
+
"doku-payment": "payment",
|
|
23
|
+
"midtrans-payment": "payment",
|
|
24
|
+
"landing-sections": "sections",
|
|
25
|
+
"notion-shell": "notion-ui",
|
|
26
|
+
"notion-database": "notion-ui",
|
|
27
|
+
"notion-sidebar": "notion-ui",
|
|
28
|
+
"notion": "notion-app",
|
|
29
|
+
"admin-console": "admin",
|
|
30
|
+
"ai-chat": "ai-workspace",
|
|
31
|
+
"ai-studio": "ai-workspace",
|
|
32
|
+
"ai-agents": "ai-workspace"
|
|
13
33
|
},
|
|
14
34
|
"layouts": [],
|
|
15
35
|
"recipes": [],
|
|
@@ -121,6 +141,112 @@
|
|
|
121
141
|
"ui"
|
|
122
142
|
]
|
|
123
143
|
},
|
|
144
|
+
{
|
|
145
|
+
"slug": "booking",
|
|
146
|
+
"title": "Booking — session request form + owner inbox",
|
|
147
|
+
"category": "os",
|
|
148
|
+
"description": "One app that is BOTH a public 'book a session' request form AND the owner's triage inbox — it flips to show the inbox when the viewer can manage. Visitors submit name/email/topic (+ optional preferred time / note); the owner sees pending requests with Confirm / Decline. The backend is INJECTED via a small BookingAdapter (submit/list/setStatus/canManage): point configureBooking at your store, or keep the bundled in-memory mock so it renders fully interactive — form + inbox — with zero backend.",
|
|
149
|
+
"source": "rahmanef63/os-vps",
|
|
150
|
+
"install": "npx rahman-resources add booking",
|
|
151
|
+
"npmPackages": [],
|
|
152
|
+
"exampleCode": "\"use client\";\nimport { Booking } from \"@/features/booking\";\n\nexport default function BookingDemo() {\n // Unwired -> in-memory mock; configureBooking for a real backend.\n return <div className=\"h-dvh w-full\"><Booking /></div>;\n}",
|
|
153
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. A booking request form + owner inbox. Fully client-side; backend optional.\n\nSTEP 1 — Install. `npx rr add booking`. Ensure `@/features/booking` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button input textarea scroll-area`.\n\nSTEP 3 — Mount. `<Booking />` in a height-bearing box — unwired it runs on an in-memory mock store (form + inbox both live). Or register `bookingApp` in an appshell manifest.\n\nSTEP 4 — Real backend. `configureBooking({ mode:\"live\", submit, list, setStatus, canManage })` — submit takes { name, email, topic, preferredTime?, note? }; list returns rows with { id, status, createdAt }; omit list/canManage for a write-only public form.",
|
|
154
|
+
"tags": [
|
|
155
|
+
"booking",
|
|
156
|
+
"contact",
|
|
157
|
+
"form",
|
|
158
|
+
"inbox",
|
|
159
|
+
"lead",
|
|
160
|
+
"scheduling",
|
|
161
|
+
"ui"
|
|
162
|
+
]
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"slug": "html-studio",
|
|
166
|
+
"title": "HTML Studio — sandboxed HTML/CSS/JS editor with live preview",
|
|
167
|
+
"category": "os",
|
|
168
|
+
"description": "A tiny web-page studio: write HTML / CSS / JS and see it render LIVE in a sandboxed iframe (srcdoc + sandbox=allow-scripts WITHOUT allow-same-origin, so user code runs in an opaque origin and cannot read the host) — then Save to a shareable /p/<slug>. Code / Split / Preview view toggle, a device-width preview (responsive / tablet / phone), a saved-pages rail, and public/private visibility. The backend is INJECTED via a small HtmlStudioAdapter (save/load/list/remove): point configureHtmlStudio at your store, or keep the bundled in-memory mock so the editor + live preview + saved list are fully interactive with zero backend.",
|
|
169
|
+
"source": "rahmanef63/os-vps",
|
|
170
|
+
"install": "npx rahman-resources add html-studio",
|
|
171
|
+
"npmPackages": [],
|
|
172
|
+
"exampleCode": "\"use client\";\nimport { HtmlStudio } from \"@/features/html-studio\";\n\nexport default function HtmlStudioDemo() {\n // Unwired -> in-memory mock; configureHtmlStudio for a real backend.\n return <div className=\"h-dvh w-full\"><HtmlStudio /></div>;\n}",
|
|
173
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. A sandboxed HTML/CSS/JS studio: editor + live iframe preview + saved pages. Fully client-side; backend optional.\n\nSTEP 1 — Install. `npx rr add html-studio`. Ensure `@/features/html-studio` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button input textarea scroll-area`.\n\nSTEP 3 — Mount. `<HtmlStudio />` in a height-bearing box — unwired it runs on an in-memory mock (editor + live sandboxed preview + saved list all live). Pass `payload={{ slug }}` to open a page, or register `htmlStudioApp` in an appshell manifest.\n\nSTEP 4 — Real backend. `configureHtmlStudio({ mode:\"live\", save, load, list, remove })` — save takes { slug?, title, html, visibility } and returns { slug }; load(slug) -> SavedPage | null; omit save for a read-only sandbox or list to hide the saved rail. KEEP the iframe sandbox without allow-same-origin — it is the security boundary.",
|
|
174
|
+
"tags": [
|
|
175
|
+
"html",
|
|
176
|
+
"editor",
|
|
177
|
+
"sandbox",
|
|
178
|
+
"iframe",
|
|
179
|
+
"preview",
|
|
180
|
+
"playground",
|
|
181
|
+
"code",
|
|
182
|
+
"ui"
|
|
183
|
+
]
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"slug": "resources-launcher-admin",
|
|
187
|
+
"title": "Resources Admin — curated icon-launcher CRUD",
|
|
188
|
+
"category": "os",
|
|
189
|
+
"description": "An owner-gated admin app for a curated icon-launcher: add / edit / remove / reorder links (label, lucide icon NAME, url, group, order) that open in a new tab. The backend is INJECTED via a small ResourcesAdapter (list/upsert/remove/canManage): point configureResources at your store, or keep the bundled in-memory mock so the whole CRUD — including reorder — is interactive with zero backend. Icons are stored as lucide NAME strings and resolved client-side, so the same data drives a public launcher surface.",
|
|
190
|
+
"source": "rahmanef63/os-vps",
|
|
191
|
+
"install": "npx rahman-resources add resources-launcher-admin",
|
|
192
|
+
"npmPackages": [],
|
|
193
|
+
"exampleCode": "\"use client\";\nimport { ResourcesAdmin } from \"@/features/resources-launcher-admin\";\n\nexport default function ResourcesAdminDemo() {\n // Unwired -> in-memory mock; configureResources for a real backend.\n return <div className=\"h-dvh w-full\"><ResourcesAdmin /></div>;\n}",
|
|
194
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. A curated icon-launcher admin (CRUD + reorder). Fully client-side; backend optional.\n\nSTEP 1 — Install. `npx rr add resources-launcher-admin`. Ensure `@/features/resources-launcher-admin` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button input label scroll-area native-select`.\n\nSTEP 3 — Mount. `<ResourcesAdmin />` in a height-bearing box — unwired it runs on an in-memory mock store (add / edit / remove / reorder all live). Or register `resourcesAdminApp` in an appshell manifest.\n\nSTEP 4 — Real backend. `configureResources({ mode:\"live\", list, upsert, remove, canManage })` — list returns rows { id, label, icon, url, group, order }; upsert takes the same minus id to insert (pass id to patch); canManage gates the editor + reorder. Icons are lucide NAME strings resolved via resolveIcon.",
|
|
195
|
+
"tags": [
|
|
196
|
+
"launcher",
|
|
197
|
+
"links",
|
|
198
|
+
"bookmarks",
|
|
199
|
+
"admin",
|
|
200
|
+
"crud",
|
|
201
|
+
"icons",
|
|
202
|
+
"ui"
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"slug": "profile",
|
|
207
|
+
"title": "Profile — CV + identity card",
|
|
208
|
+
"category": "os",
|
|
209
|
+
"description": "One owner's identity in two co-located variants, behind one slug. resume: a clean one-column résumé / CV — name, roles, location, contacts, summary, skills, experience (role · org · period + bullets), projects — rendered by <Resume /> off a configureResume() seam, with a Print / PDF button. card: an \"About This Mac\"-style identity card — avatar / monogram, name, roles, outbound links, FAQ accordion — rendered by <AboutProfile /> off a configureAbout() seam. Both render a populated placeholder unwired (zero backend). Install one surface with `npx rr add profile resume|card`, or both with `npx rr add profile`.",
|
|
210
|
+
"source": "rahmanef63/os-vps",
|
|
211
|
+
"install": "npx rahman-resources add profile",
|
|
212
|
+
"npmPackages": [],
|
|
213
|
+
"exampleCode": "\"use client\";\nimport { Resume, AboutProfile } from \"@/features/profile\";\n\nexport default function ProfileDemo() {\n // Unwired -> generic placeholders; configureResume(cv) / configureAbout(card) for real data.\n return (\n <div className=\"grid h-dvh grid-cols-2 gap-4\">\n <Resume />\n <AboutProfile />\n </div>\n );\n}",
|
|
214
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Two identity renderers driven by injected data. Fully client-side; no backend required.\n\nSTEP 1 — Install. `npx rr add profile` for both, or `npx rr add profile resume` / `card` for one. Ensure `@/features/profile` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button scroll-area avatar`.\n\nSTEP 3 — Mount. `<Resume />` (CV) or `<AboutProfile />` (card) in a height-bearing box — unwired each renders a generic placeholder. Or register `resumeApp` / `aboutProfileApp` in an appshell manifest.\n\nSTEP 4 — Real data. `configureResume(profile)` with a ResumeProfile { name, roles[], location, summary, contacts[], skills[], experience[], projects[] }, and/or `configureAbout(card)` with { name, roles[], description, links[], faq[] }, once at boot from Convex / a CMS / a JSON file. Resume's \"Print / PDF\" button calls window.print() against a print-friendly layout.",
|
|
215
|
+
"tags": [
|
|
216
|
+
"resume",
|
|
217
|
+
"cv",
|
|
218
|
+
"profile",
|
|
219
|
+
"portfolio",
|
|
220
|
+
"about",
|
|
221
|
+
"identity",
|
|
222
|
+
"bio",
|
|
223
|
+
"card",
|
|
224
|
+
"links",
|
|
225
|
+
"faq",
|
|
226
|
+
"print",
|
|
227
|
+
"ui"
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"slug": "start-here",
|
|
232
|
+
"title": "Start Here — guided OS onboarding tour",
|
|
233
|
+
"category": "os",
|
|
234
|
+
"description": "A guided 'Start Here' tour that lays the OS out as a path of stages, each stage opening real apps from the LIVE registry — drift-proof, it reads the injected app catalog instead of a hardcoded list, so adding an app surfaces it automatically (in a stage if listed, else a final 'Everything else' bucket). The catalog, the open(id) callback, and the stage journey are INJECTED via a small StartHereAdapter (apps / open / stages): point configureStartHere at your live app registry + window opener, or keep the bundled in-memory mock (a few generic apps + 3 stages) so the welcome tour renders fully alive with zero host.",
|
|
235
|
+
"source": "rahmanef63/os-vps",
|
|
236
|
+
"install": "npx rahman-resources add start-here",
|
|
237
|
+
"npmPackages": [],
|
|
238
|
+
"exampleCode": "\"use client\";\nimport { StartHere } from \"@/features/start-here\";\n\nexport default function StartHereDemo() {\n // Unwired -> in-memory mock catalog; configureStartHere for the live registry.\n return <div className=\"h-dvh w-full\"><StartHere /></div>;\n}",
|
|
239
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. A guided onboarding tour that renders your live app catalog as a path of stages. Fully client-side; the catalog is injected.\n\nSTEP 1 — Install. `npx rr add start-here`. Ensure `@/features/start-here` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button scroll-area`.\n\nSTEP 3 — Mount. `<StartHere />` in a height-bearing box — unwired it reads an in-memory mock catalog (generic apps + 3 stages) so the tour is fully alive. Or register `startHereApp` in an appshell manifest.\n\nSTEP 4 — Real catalog. `configureStartHere({ mode:\"live\", apps, open, stages })` — apps is your live registry as [{ id, title, icon, description? }]; open(id) launches the real app/window; stages is [{ title, blurb, appIds }] (apps not placed fall into a final \"Everything else\" stage). Drift-proof: read the registry, never hardcode the list.",
|
|
240
|
+
"tags": [
|
|
241
|
+
"onboarding",
|
|
242
|
+
"tour",
|
|
243
|
+
"welcome",
|
|
244
|
+
"launcher",
|
|
245
|
+
"guide",
|
|
246
|
+
"os",
|
|
247
|
+
"ui"
|
|
248
|
+
]
|
|
249
|
+
},
|
|
124
250
|
{
|
|
125
251
|
"slug": "os-terminal",
|
|
126
252
|
"title": "Terminal — shell emulator with live passthrough + PTY seam",
|
|
@@ -267,45 +393,27 @@
|
|
|
267
393
|
]
|
|
268
394
|
},
|
|
269
395
|
{
|
|
270
|
-
"slug": "
|
|
271
|
-
"title": "
|
|
396
|
+
"slug": "payment",
|
|
397
|
+
"title": "Payment — Indonesia PSP (DOKU · Midtrans)",
|
|
272
398
|
"category": "integrations",
|
|
273
|
-
"description": "
|
|
399
|
+
"description": "Indonesia payment providers behind one slug + ONE shared Convex backend (convex/features/payment discriminates on a provider column: paymentOrders + paymentWebhookEvents, unprefixed). Two frontend variants: doku — DOKU Hosted Checkout + Direct (VA / QRIS / e-Wallet / PayLater), HMAC-SHA256 signed REST, signature-verified webhook, idempotent retries, dependency-free, server-side env only. midtrans — Snap hosted-modal checkout + orders history (needs npm midtrans-client + a NEXT_PUBLIC_MIDTRANS_CLIENT_KEY). Install one with `npx rr add payment doku|midtrans`, or both. A future stripe variant is reserved in the schema's provider union.",
|
|
274
400
|
"source": "rahmanef63/resource-site",
|
|
275
401
|
"docsUrl": "https://sandbox.doku.com/integration",
|
|
276
402
|
"install": "",
|
|
277
403
|
"npmPackages": [],
|
|
278
404
|
"exampleCode": "",
|
|
279
|
-
"agentRecipe": "Run `npx rr add doku
|
|
405
|
+
"agentRecipe": "Run `npx rr add payment` for both providers, or `npx rr add payment doku` / `midtrans`. Either variant copies the shared convex/features/payment backend. doku: Checkout (hosted) or Direct (single channel → VA/QRIS/deeplink); webhook /webhooks/doku verifies HMAC-SHA256; server-only, no NEXT_PUBLIC_*. midtrans: Snap.js + window.snap.pay(token); webhook verifies signature_key; needs NEXT_PUBLIC_MIDTRANS_CLIENT_KEY. Both patch paymentOrders by orderId; sandbox by default.",
|
|
280
406
|
"tags": [
|
|
281
407
|
"payment",
|
|
282
|
-
"
|
|
408
|
+
"checkout",
|
|
283
409
|
"indonesia",
|
|
410
|
+
"doku",
|
|
411
|
+
"midtrans",
|
|
412
|
+
"snap",
|
|
284
413
|
"qris",
|
|
285
414
|
"virtual-account",
|
|
286
415
|
"ewallet",
|
|
287
|
-
"
|
|
288
|
-
]
|
|
289
|
-
},
|
|
290
|
-
{
|
|
291
|
-
"slug": "midtrans-payment",
|
|
292
|
-
"title": "Midtrans — Indonesia Payment",
|
|
293
|
-
"category": "integrations",
|
|
294
|
-
"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.",
|
|
295
|
-
"source": "rahmanef63/resource-site",
|
|
296
|
-
"docsUrl": "https://docs.midtrans.com",
|
|
297
|
-
"install": "npm i midtrans-client",
|
|
298
|
-
"npmPackages": [
|
|
299
|
-
"midtrans-client"
|
|
300
|
-
],
|
|
301
|
-
"exampleCode": "",
|
|
302
|
-
"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.",
|
|
303
|
-
"tags": [
|
|
304
|
-
"payment",
|
|
305
|
-
"midtrans",
|
|
306
|
-
"indonesia",
|
|
307
|
-
"qris",
|
|
308
|
-
"snap"
|
|
416
|
+
"psp"
|
|
309
417
|
]
|
|
310
418
|
},
|
|
311
419
|
{
|
|
@@ -330,10 +438,10 @@
|
|
|
330
438
|
]
|
|
331
439
|
},
|
|
332
440
|
{
|
|
333
|
-
"slug": "ai-
|
|
334
|
-
"title": "AI
|
|
441
|
+
"slug": "ai-workspace",
|
|
442
|
+
"title": "AI Workspace — chat · studio · agents",
|
|
335
443
|
"category": "ai",
|
|
336
|
-
"description": "
|
|
444
|
+
"description": "Three AI surfaces as shadcn-style variants — `npx rr add ai-workspace <variant>` for one, or `npx rr add ai-workspace` for all + a switcher. Only the chat variant pulls a Convex backend (per-variant convex gating).\n\n • chat — floating <AiChatFab /> + createAgenticChatSend: real function-calling over any ToolHost (@/shared/agentic), key-guarded, over convex/features/aiChat.\n • studio — <AiStudioPage /> single-prompt generation canvas (variation grid + version tree, Suno / Midjourney / Lovable pattern) + aiStudioTools so a shared agent can drive generations.\n • agents — <AiAgentsPage /> autonomous-worker run dashboard + createAgentRunner(host) which drives the shared function-calling loop and records each tool_use as a RunStep trace.\n\nUse cases: support chatbot in a marketing site, AI generation product (image / code / text / audio), background workers (nightly audits, scheduled crawls, moderation). studio + agents are frontend-only — wire your own persistence.",
|
|
337
445
|
"source": "rahmanef63/resource-site",
|
|
338
446
|
"docsUrl": "https://sdk.vercel.ai/docs",
|
|
339
447
|
"install": "npm i ai @ai-sdk/anthropic @ai-sdk/openai",
|
|
@@ -343,58 +451,19 @@
|
|
|
343
451
|
"@ai-sdk/openai"
|
|
344
452
|
],
|
|
345
453
|
"exampleCode": "",
|
|
346
|
-
"agentRecipe": "Run `npx rr add ai-chat
|
|
347
|
-
"tags": [
|
|
348
|
-
"ai",
|
|
349
|
-
"ai:chat",
|
|
350
|
-
"streaming",
|
|
351
|
-
"multimodal",
|
|
352
|
-
"tool-calls",
|
|
353
|
-
"agent-mode",
|
|
354
|
-
"rag",
|
|
355
|
-
"citations",
|
|
356
|
-
"branching",
|
|
357
|
-
"history"
|
|
358
|
-
]
|
|
359
|
-
},
|
|
360
|
-
{
|
|
361
|
-
"slug": "ai-studio",
|
|
362
|
-
"title": "AI Studio — Generation Canvas",
|
|
363
|
-
"category": "ai",
|
|
364
|
-
"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.",
|
|
365
|
-
"source": "rahmanef63/resource-site",
|
|
366
|
-
"install": "",
|
|
367
|
-
"npmPackages": [],
|
|
368
|
-
"exampleCode": "",
|
|
369
|
-
"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.",
|
|
454
|
+
"agentRecipe": "Run `npx rr add ai-workspace <chat|studio|agents>` for one surface, or `npx rr add ai-workspace` for all. chat: mount <AiChatFab chat={useAction(api.features.aiChat.action.chat)} />. studio: mount <AiStudioPage /> + drive via aiStudioTools. agents: mount <AiAgentsPage /> + trigger via createAgentRunner(host).",
|
|
370
455
|
"tags": [
|
|
371
456
|
"ai",
|
|
457
|
+
"ai:chatbot",
|
|
372
458
|
"ai:studio",
|
|
373
|
-
"
|
|
374
|
-
"streaming",
|
|
375
|
-
"history",
|
|
376
|
-
"branching",
|
|
377
|
-
"image-gen"
|
|
378
|
-
]
|
|
379
|
-
},
|
|
380
|
-
{
|
|
381
|
-
"slug": "ai-agents",
|
|
382
|
-
"title": "AI Agents — Autonomous Workers",
|
|
383
|
-
"category": "ai",
|
|
384
|
-
"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.",
|
|
385
|
-
"source": "rahmanef63/resource-site",
|
|
386
|
-
"install": "",
|
|
387
|
-
"npmPackages": [],
|
|
388
|
-
"exampleCode": "",
|
|
389
|
-
"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.",
|
|
390
|
-
"tags": [
|
|
391
|
-
"ai",
|
|
392
|
-
"ai:agents",
|
|
459
|
+
"ai:agent",
|
|
393
460
|
"agent-mode",
|
|
394
461
|
"tool-calls",
|
|
462
|
+
"streaming",
|
|
463
|
+
"generation",
|
|
395
464
|
"async",
|
|
396
|
-
"
|
|
397
|
-
"
|
|
465
|
+
"traces",
|
|
466
|
+
"multimodal"
|
|
398
467
|
]
|
|
399
468
|
},
|
|
400
469
|
{
|
|
@@ -424,7 +493,7 @@
|
|
|
424
493
|
"slug": "ai-router",
|
|
425
494
|
"title": "AI Router — Backend Provider Proxy",
|
|
426
495
|
"category": "ai",
|
|
427
|
-
"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-
|
|
496
|
+
"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-workspace.",
|
|
428
497
|
"source": "rahmanef63/resource-site",
|
|
429
498
|
"docsUrl": "https://sdk.vercel.ai/docs",
|
|
430
499
|
"install": "npm i ai @openrouter/ai-sdk-provider",
|
|
@@ -824,20 +893,24 @@
|
|
|
824
893
|
},
|
|
825
894
|
{
|
|
826
895
|
"slug": "admin",
|
|
827
|
-
"title": "Admin —
|
|
896
|
+
"title": "Admin — generic shell + composed console",
|
|
828
897
|
"category": "infra",
|
|
829
|
-
"description": "
|
|
898
|
+
"description": "Access-gated admin surfaces behind one slug, in two variants — each pulls ONLY its own convex backend (per-variant convex gating). shell: a HEADLESS minimal generic admin shell — a titled landing region + a portable buildAdminStats(opts) nav-from-registry factory (consumer supplies a SliceRegistryAdapter + queryTable reader) over convex/features/admin; superadmin gate via SUPER_ADMIN_EMAIL. console: the composed admin panel distilled from ~15 project admin panels — a gated two-column shell (AdminConsole) over a 26-section registry (ADMIN_CONSOLE_SECTIONS: observability / identity / ai / content / commerce / config) that mounts OTHER rr slices via a consumer-supplied `components` map (users→user-management, roles→rbac-roles, ai→ai-admin, tenants→platform-admin) plus 5 owned gap sections (Analytics, Audit-log, Nav config, SEO health, Leads/CRM) over convex/features/admin_console (ac_leads + ac_nav_items); gate injected, PLATFORM_ADMIN_EMAILS allowlist. Install one with `npx rr add admin shell|console`, or both with `npx rr add admin`. NOT the multi-tenant control plane — that's the separate `platform-admin` slice (the console's `tenants` section provider).",
|
|
830
899
|
"source": "rahmanef63/resource-site",
|
|
831
900
|
"install": "npx rahman-resources add admin",
|
|
832
901
|
"npmPackages": [],
|
|
833
902
|
"exampleCode": "",
|
|
834
|
-
"agentRecipe": "Run `rr add admin
|
|
903
|
+
"agentRecipe": "Run `npx rr add admin` for both, or `npx rr add admin shell` / `console` for one — each variant pulls only its own convex backend. shell: mount <AdminPage labels={...} /> + call buildAdminStats({ sliceRegistry, queryTable }) in convex/features/admin/query.ts; lock down with SUPER_ADMIN_EMAIL. console: mount <AdminConsole access={useAdminAccess()} components={{ users: <UsersPanel/>, ... }} /> — owned sections (analytics/audit-log/nav-config/seo-health/leads) render as-is, map each reuse section id to the panel from the peer slice you installed; compose adminConsoleTables into convex/schema.ts and front ac_leads.create with rate-limit; gate via PLATFORM_ADMIN_EMAILS.",
|
|
835
904
|
"tags": [
|
|
836
905
|
"infra",
|
|
837
906
|
"admin",
|
|
907
|
+
"console",
|
|
838
908
|
"shell",
|
|
839
|
-
"
|
|
840
|
-
"
|
|
909
|
+
"dashboard",
|
|
910
|
+
"composition",
|
|
911
|
+
"rbac",
|
|
912
|
+
"access-gate",
|
|
913
|
+
"registry"
|
|
841
914
|
]
|
|
842
915
|
},
|
|
843
916
|
{
|
|
@@ -911,6 +984,47 @@
|
|
|
911
984
|
"metadata-generator"
|
|
912
985
|
]
|
|
913
986
|
},
|
|
987
|
+
{
|
|
988
|
+
"slug": "publisher-clean-html",
|
|
989
|
+
"title": "Publisher — clean HTML",
|
|
990
|
+
"category": "content",
|
|
991
|
+
"description": "A pure render-to-clean-HTML engine harvested from the Instatic CMS publisher, decoupled from its host caching / loops / visual-components / Layer-C islands. publishPage(tree, registry, options) walks a generic node tree bottom-up: render children, escape every prop by its schema-declared control type (url -> safe-URL, richtext -> DOMPurify, svg -> SVG profile, else HTML-escape), dedup CSS by moduleId (~60-80% shrink), splice author classes + inline styles onto each rendered root, then assemble <!DOCTYPE> + reset + framework + module CSS + a deterministic (sorted) CSP plan. Bring your own ModuleRegistry (each module is a pure render(props, children) -> { html, css? }). Security spine: HTML escape + safe-URL, CSS-value guard (expression()/{}/</), </style RAWTEXT neutraliser, and an injectable DOMPurify seam (configureRichtextSanitizer) that fails closed — without a runtime, richtext strips all tags and SVG returns empty. Stateless, env-free, ZERO npm deps, no Convex. Ships a PublishPreview iframe-srcdoc pane. A Wave-1 leaf of the feature-harvest ULTRAPLAN; a dependency of the planned visual-page-canvas.",
|
|
992
|
+
"source": "rahman-resources",
|
|
993
|
+
"install": "npx rahman-resources add publisher-clean-html",
|
|
994
|
+
"npmPackages": [],
|
|
995
|
+
"exampleCode": "",
|
|
996
|
+
"agentRecipe": "Run `npx rr add publisher-clean-html`. Build a registry: createModuleRegistry([{ id: 'base.body', render: (_p, kids) => ({ html: kids.join('') }) }, { id: 'demo.h', schema: { text: { type: 'text' } }, render: (p) => ({ html: `<h1>${p.text}</h1>`, css: 'h1{font-size:1.5rem}' }) }]). Tree = { rootNodeId, nodes: { [id]: { id, moduleId, props?, children?, classIds?, inlineStyles?, hidden? } } }. const { html } = publishPage(tree, registry, { title, cssEmission: 'inline' }). Preview: <PublishPreview html={html} />. Enable rich HTML/SVG by calling configureRichtextSanitizer(DOMPurify) once — without it, richtext/svg props fail closed (strip/empty). Props escape by schema control type, not key name.",
|
|
997
|
+
"tags": [
|
|
998
|
+
"content",
|
|
999
|
+
"publisher",
|
|
1000
|
+
"html",
|
|
1001
|
+
"static-export",
|
|
1002
|
+
"sanitization",
|
|
1003
|
+
"csp",
|
|
1004
|
+
"css-dedup",
|
|
1005
|
+
"render"
|
|
1006
|
+
]
|
|
1007
|
+
},
|
|
1008
|
+
{
|
|
1009
|
+
"slug": "content-loops",
|
|
1010
|
+
"title": "Content Loops",
|
|
1011
|
+
"category": "content",
|
|
1012
|
+
"description": "A data-source-driven repeater harvested from the Instatic CMS base.loop engine, decoupled from its publisher / page-tree / entryStack machinery into a plain React slice. Register pluggable LoopEntitySource backends (each declares display fields + an async fetch returning { items, totalItems }); drop <ContentLoop source|sourceId filters orderBy variants={[A, B]} /> to render one component per item, round-robining items across variants so alternating / featured layouts need no per-item branching. Ships a namespaced source registry (ids must be 'ns.name', so consumer sources can't shadow each other), createMockLoopSource for env-free previews + tests, and none/infinite pagination via useLoopPagination (a shadcn Load more button accumulates pageSize chunks). LoopItem.fields is a generic resolved-value bag — variants read item.fields.title directly, no second lookup. UI-only: no Convex tables shipped; point a source's fetch at Convex/REST when you have a backend. First slice of the feature-harvest ULTRAPLAN (docs/feature-harvest) and a dependency of the planned site-templates-engine + visual-page-canvas.",
|
|
1013
|
+
"source": "rahman-resources",
|
|
1014
|
+
"install": "npx rahman-resources add content-loops",
|
|
1015
|
+
"npmPackages": [],
|
|
1016
|
+
"exampleCode": "",
|
|
1017
|
+
"agentRecipe": "Run `npx rr add content-loops`. Env-free demo: createMockLoopSource() then <ContentLoop source={s} pagination='infinite' pageSize={6} variants={[CardA, CardB]} /> — variants round-robin (item i -> variants[i % n]). Real source: implement LoopEntitySource { id: 'blog.posts' (namespaced 'ns.name'), fields, async fetch({ filters, orderBy, direction, limit, offset }) returns { items, totalItems } }, call loopSourceRegistry.registerOrReplace(source), then <ContentLoop sourceId='blog.posts' variants={[...]} />. item.fields holds RESOLVED values — resolve media/author inside fetch.",
|
|
1018
|
+
"tags": [
|
|
1019
|
+
"content",
|
|
1020
|
+
"loop",
|
|
1021
|
+
"repeater",
|
|
1022
|
+
"list",
|
|
1023
|
+
"data-source",
|
|
1024
|
+
"pagination",
|
|
1025
|
+
"variants"
|
|
1026
|
+
]
|
|
1027
|
+
},
|
|
914
1028
|
{
|
|
915
1029
|
"slug": "markdown",
|
|
916
1030
|
"title": "Markdown — page container with CRUD tabs + diagrams",
|
|
@@ -936,15 +1050,15 @@
|
|
|
936
1050
|
]
|
|
937
1051
|
},
|
|
938
1052
|
{
|
|
939
|
-
"slug": "notion",
|
|
940
|
-
"title": "Notion — Block Editor",
|
|
1053
|
+
"slug": "notion-app",
|
|
1054
|
+
"title": "Notion App — Block Editor",
|
|
941
1055
|
"category": "content",
|
|
942
1056
|
"description": "Nested vertical slice (slice-of-slices) housing the full notion-page-clone block editor. Mount <PageEditor pageId/> inside <EditorAdapterProvider adapter/> — with `{}` it is a working plain-text/markdown block editor (slash menu, markdown triggers `# - > [] etc.`, dnd-kit drag with column layouts, per-block toolbar with turn-into/color/duplicate, per-block undo, paste-markdown import); host capabilities light up per optional adapter: data (block+page CRUD), selection (multi-select), comments (per-block popover), ai (Ask-AI panel), database (render + picker), mention (@-typeahead), page (nav/uploads/covers). Cluster-private shared layer under @notion/* — vendored block/page/database model, uid, inline markdown, page→md/html export. Pure convex block helpers (_blocks/_blockOps, unit-tested) ship in convex/features/notion. Same markdown grammar as the standalone `markdown` slice (blocksToMarkdown/markdownToBlocks bridge).",
|
|
943
1057
|
"source": "notion-page-clone",
|
|
944
|
-
"install": "npx rahman-resources add notion",
|
|
1058
|
+
"install": "npx rahman-resources add notion-app",
|
|
945
1059
|
"npmPackages": [],
|
|
946
1060
|
"exampleCode": "",
|
|
947
|
-
"agentRecipe": "Run `npx rr add notion`. Wire the `@notion/*` path alias to `./slices/notion/*` in tsconfig. Minimal mount: `<EditorAdapterProvider adapter={{ data }}><PageEditor pageId={id}/></EditorAdapterProvider>` where `data` implements EditorDataAdapter (block+page CRUD over your store — see lib/dataAdapter.ts; a localStorage reference impl lives in the rr preview). Add capabilities incrementally: `selection` for multi-select, `comments` for per-block threads, `database.renderDatabase` to mount your database renderer inside database blocks, `mention.search` for @-typeahead, `page.navigateToPage`/`uploadFile` for nav + media. Convex hosts: copy convex/features/notion (_blocks/_blockOps are pure, unit-tested array ops) and keep handlers thin.",
|
|
1061
|
+
"agentRecipe": "Run `npx rr add notion-app`. Wire the `@notion/*` path alias to `./slices/notion-app/*` in tsconfig. Minimal mount: `<EditorAdapterProvider adapter={{ data }}><PageEditor pageId={id}/></EditorAdapterProvider>` where `data` implements EditorDataAdapter (block+page CRUD over your store — see lib/dataAdapter.ts; a localStorage reference impl lives in the rr preview). Add capabilities incrementally: `selection` for multi-select, `comments` for per-block threads, `database.renderDatabase` to mount your database renderer inside database blocks, `mention.search` for @-typeahead, `page.navigateToPage`/`uploadFile` for nav + media. Convex hosts: copy convex/features/notion (_blocks/_blockOps are pure, unit-tested array ops) and keep handlers thin.",
|
|
948
1062
|
"tags": [
|
|
949
1063
|
"content",
|
|
950
1064
|
"notion",
|
|
@@ -957,15 +1071,15 @@
|
|
|
957
1071
|
]
|
|
958
1072
|
},
|
|
959
1073
|
{
|
|
960
|
-
"slug": "
|
|
961
|
-
"title": "
|
|
1074
|
+
"slug": "sections",
|
|
1075
|
+
"title": "Sections — composable marketing/landing sections",
|
|
962
1076
|
"category": "content",
|
|
963
1077
|
"description": "Canonical landing-page composition slice — replaces the former standalone hero / cta / pricing-page / faq-section / feature-grid / testimonials-grid / blog-section / portfolio-section / changelog-feed slices (all merged here as `kind` variants in v0.2.0). Ships a pure reducer (v0.4.0: LANDING_UPSERT auto-shifts sibling `order` to keep positions unique; LANDING_DELETE closes the gap) + LandingProvider store adapter + admin LandingView/LandingEditorView built on the shared CRUD primitives, plus a per-section LandingSectionShell (background image + custom Tailwind className overlay + scroll-reveal). NEW in v0.4.0: a `sections/` library of config-driven public renderers (StatsSection, TestimonialsSection, FaqSection, PricingSection, NewsletterSection, CustomSection) that read `LandingSection.config` JSON merged over template defaults — content stays dashboard-controlled without per-template renderer code; plus `parse-config` helpers (parseConfigBadge/parseConfigField) and `sections/config` guards (parseConfigObject, cfg*). Sections carry { kind, order, title, subtitle, enabled, imageUrl, imageRatio, bgImageUrl, className, config (JSON) } with up/down reorder arrows. Lifted from the _templates fleet `_shared/landing` (2026-06-11) — the 8 standalone templates ship a byte-similar copy; this rr slice is the SSOT. Used by all 7 rr website templates.",
|
|
964
1078
|
"source": "rahman-resources (lifted from _templates fleet)",
|
|
965
|
-
"install": "npx rahman-resources add
|
|
1079
|
+
"install": "npx rahman-resources add sections",
|
|
966
1080
|
"npmPackages": [],
|
|
967
1081
|
"exampleCode": "",
|
|
968
|
-
"agentRecipe": "Run `npx rr add
|
|
1082
|
+
"agentRecipe": "Run `npx rr add 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 inside `<LandingSectionShell section={s}>`; for stats/testimonials/pricing/faq/newsletter/custom kinds drop in the shipped `<StatsSection/>` etc. (they read `section.config` JSON over your template defaults), or map the remaining kinds (hero/features/blog/etc.) to your own renderer. Use `parseConfigBadge(section.config)` for a section badge. Requires the template-base shared surface that ships in every rr website template: `@/components/templates/_shared/motion` (Reveal/Stagger/CountUp/Marquee/useInView — the motion-kit primitives), `@/components/templates/_shared/ui/section-head`, and `@/components/templates/_shared/crud/*`. Sections also use shadcn accordion/card/carousel + embla-carousel-autoplay.",
|
|
969
1083
|
"tags": [
|
|
970
1084
|
"admin",
|
|
971
1085
|
"landing",
|
|
@@ -1042,15 +1156,15 @@
|
|
|
1042
1156
|
]
|
|
1043
1157
|
},
|
|
1044
1158
|
{
|
|
1045
|
-
"slug": "
|
|
1046
|
-
"title": "
|
|
1159
|
+
"slug": "site-setup-wizard",
|
|
1160
|
+
"title": "Site Setup Wizard — first-run site setup",
|
|
1047
1161
|
"category": "ui",
|
|
1048
1162
|
"description": "Post-claim onboarding wizard for clone-to-own templates, graduated from the headless template surface (2026-06-06). Multi-step card flow (Identitas / Branding / Konten / Selesai) that stores ALL site config in the host backend via a props-driven save callback — a non-coder configures their site with zero code. Branding step ships a readable shadcn Select theme-preset picker (color swatches per preset + grouped headers + live preview callback — replaces the white-on-white native select), brand color quick-chips, light/dark/system default mode, logo/favicon upload via injected ImageField, and optional Analytics ID. Identity step hints invalid email format. 'Lewati setup' marks onboarded without fields and reverts any browsed-but-unsaved preset. Props-driven (R3): no convex/react import — host wires settings.upsert / seed.seedSample / setup.status into props; pairs naturally with the theme-presets slice (registry + tweakcnSwatches + previewTweakcnPreset) but works with any theme system or none.",
|
|
1049
1163
|
"source": "personal-brand-os",
|
|
1050
|
-
"install": "npx rahman-resources add
|
|
1164
|
+
"install": "npx rahman-resources add site-setup-wizard",
|
|
1051
1165
|
"npmPackages": [],
|
|
1052
1166
|
"exampleCode": "",
|
|
1053
|
-
"agentRecipe": "Run `npx rr add
|
|
1167
|
+
"agentRecipe": "Run `npx rr add site-setup-wizard`. Show from your admin gate when `setup.status().onboarded === false`: `<OnboardingWizard onDone={...} save={(f) => settingsUpsert(f)} seedSample={() => seedSample({})} seeded={status?.seeded} ImageField={ImageField} presetOptions={presets} onPresetPreview={(n) => preview(n)} />`. `save` receives Partial<OnboardingFields> + `markOnboarded: true` — back it with a `settings.upsert` mutation that patches only provided fields. Theme bridge (optional): with the theme-presets slice installed build `presetOptions` from `groupTweakcnPresets(registry.items)` + `tweakcnSwatches(p)` and pass `useThemePreset().preview` as `onPresetPreview` — the picker then live-previews while the user browses and `Lewati setup` reverts via `onPresetPreview(null)`. Omit `presetOptions` to hide the picker entirely; omit `ImageField` to hide logo/favicon upload. Full wiring recipe in the slice's HOST-SETUP.md.",
|
|
1054
1168
|
"tags": [
|
|
1055
1169
|
"ui",
|
|
1056
1170
|
"onboarding",
|
|
@@ -1064,15 +1178,15 @@
|
|
|
1064
1178
|
]
|
|
1065
1179
|
},
|
|
1066
1180
|
{
|
|
1067
|
-
"slug": "
|
|
1068
|
-
"title": "
|
|
1181
|
+
"slug": "file-upload",
|
|
1182
|
+
"title": "File Upload — pluggable upload + URL resolver with storage-adapter contract",
|
|
1069
1183
|
"category": "data",
|
|
1070
1184
|
"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, …).",
|
|
1071
1185
|
"source": "notion-page-clone",
|
|
1072
|
-
"install": "npx rahman-resources add
|
|
1186
|
+
"install": "npx rahman-resources add file-upload",
|
|
1073
1187
|
"npmPackages": [],
|
|
1074
1188
|
"exampleCode": "",
|
|
1075
|
-
"agentRecipe": "Run `npx rr add
|
|
1189
|
+
"agentRecipe": "Run `npx rr add file-upload`. 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.",
|
|
1076
1190
|
"tags": [
|
|
1077
1191
|
"data",
|
|
1078
1192
|
"upload",
|
|
@@ -1106,15 +1220,15 @@
|
|
|
1106
1220
|
]
|
|
1107
1221
|
},
|
|
1108
1222
|
{
|
|
1109
|
-
"slug": "notion-
|
|
1110
|
-
"title": "Notion
|
|
1223
|
+
"slug": "notion-ui",
|
|
1224
|
+
"title": "Notion UI — page editor · database · sidebar primitives",
|
|
1111
1225
|
"category": "ui",
|
|
1112
|
-
"description": "
|
|
1113
|
-
"source": "
|
|
1114
|
-
"install": "npx rahman-resources add notion-
|
|
1226
|
+
"description": "The pure, props-driven Notion-clone primitives suite behind one slug, over one shared domain-type model (Block / Page / Property / Database / DbView …). page: the page + block editor (NotionPage / NotionHeader / NotionBlock, SlashMenu, block renderers, inline-markdown decorator, built-in code (highlight.js) + equation (KaTeX)). database: a drop-in 11-view database (table/board/list/gallery/calendar/feed/chart/dashboard/form/map/timeline, 18 property/cell types, per-type column config, filter/sort/group/calculate, row peek + multi-select, cell drag-fill, formula engine, CSV/JSON import-export). sidebar: a standalone tree-nav sidebar (dnd reorder + reparent with depth projection, inline rename, per-row icon picker). All stateless + callback-CRUD — the host owns the data. Install one surface with `npx rr add notion-ui page|database|sidebar`, or all with `npx rr add notion-ui`; the shared/ domain type model is copied for every variant. NOT the full Notion app — that's the separate `notion` slice (adapter + Convex backed).",
|
|
1227
|
+
"source": "notion-page-clone",
|
|
1228
|
+
"install": "npx rahman-resources add notion-ui",
|
|
1115
1229
|
"npmPackages": [],
|
|
1116
1230
|
"exampleCode": "",
|
|
1117
|
-
"agentRecipe": "**Controlled component.** `<NotionDatabase />` renders the whole surface — 11 views (table, board, list, gallery, calendar, feed, chart, dashboard, form, map, timeline), 18 cell types, filter / sort / group / calculate, row peek + multi-select, table cell drag-fill, CSV / JSON import-export. It is 100% props-driven: it owns NO data state — you hold `db` + `rows` and persist every change callback. The view tab strip scrolls horizontally and the card clips to its border, so it stays inside any container width.\n\n**1. Install** — `npx rr add notion-database`. Cascades the `notion-shell` peer (the domain types live there). Components import from `@/features/notion-
|
|
1231
|
+
"agentRecipe": "**Controlled component.** `<NotionDatabase />` renders the whole surface — 11 views (table, board, list, gallery, calendar, feed, chart, dashboard, form, map, timeline), 18 cell types, filter / sort / group / calculate, row peek + multi-select, table cell drag-fill, CSV / JSON import-export. It is 100% props-driven: it owns NO data state — you hold `db` + `rows` and persist every change callback. The view tab strip scrolls horizontally and the card clips to its border, so it stays inside any container width.\n\n**1. Install** — `npx rr add notion-ui database`. Cascades the `notion-shell` peer (the domain types live there). Components import from `@/features/notion-ui`; types from `@/features/notion-ui`.\n\n**2. Minimal wire-up** — keep `db: Database` + `rows: Page[]` in your store (a Convex query result or `useState`) and pass change handlers:\n```tsx\nimport { NotionDatabase } from '@/features/notion-ui';\n\n<NotionDatabase\n db={db}\n rows={rows}\n onRowAdd={addRow}\n onRowUpdate={(rowId, propId, value) => setValue(rowId, propId, value)}\n onRowRemove={removeRow}\n onPropertyAdd={addProperty}\n onViewActivate={setActiveView}\n onViewAdd={addView}\n onViewConfigChange={(viewId, patch) => patchView(viewId, patch)}\n/>\n```\nOmit any callback and that affordance goes read-only; pass `readOnly` to freeze everything at once.\n\n**3. Data shape** — `Database = { id, name, properties: Property[], views: DatabaseViewConfig[], activeViewId }`; each row `Page = { id, title, rowProps: Record<propId, PropertyValue> }`. For `relation` / `rollup` cells also pass `pages` + `databases`; for `person` / `created_by` cells pass `userLookup(id)`.\n\n**4. Import / export** — mount `<DatabaseIOActions db={db} rows={rows} onImport={handleImport} />` in your toolbar: CSV/JSON in (with schema-diff), CSV/JSON + live-schema templates out. New columns arrive with a `tempId` — map it to your real backend id before writing their `rowProps`.\n\n**5. Backend (optional)** — the UI is store-agnostic. For Convex persistence copy `template-base/database-silong/convex/` (handlers → `convex/`, schema fragment merges into `convex/schema.ts`). Pick `_shared/minimal/` (single-user, noop authz) or `_shared/full/` (`@convex-dev/auth` + workspaces). See CONVEX-BACKEND.md.\n\n**Just one view?** Import it directly — `import { TableView } from '@/features/notion-ui'` — and feed it `rows` + `renderCell` + `renderColumnHeader`.",
|
|
1118
1232
|
"tags": [
|
|
1119
1233
|
"ui",
|
|
1120
1234
|
"notion",
|
|
@@ -1180,67 +1294,6 @@
|
|
|
1180
1294
|
"dialog"
|
|
1181
1295
|
]
|
|
1182
1296
|
},
|
|
1183
|
-
{
|
|
1184
|
-
"slug": "notion-sidebar",
|
|
1185
|
-
"title": "Notion Sidebar — tree nav + page CRUD (rename · drag · icon picker)",
|
|
1186
|
-
"category": "ui",
|
|
1187
|
-
"description": "Standalone Notion-style tree-nav sidebar with full page CRUD, lifted out of notion-shell so it is reusable on its own. Props-driven + fully decoupled — owns its own lightweight NotionSidebarPage type (id / title / icon / parentId), imports no other slice. Capabilities: click a row to open; DOUBLE-CLICK a title to rename inline; drag the grip to reorder AND reparent (a @dnd-kit sortable tree with horizontal-offset depth projection); collapse/expand subtrees; hover a row for +subpage / delete. Optional per-row icon PICKER — wire `renderIconPicker` + `onIconChange` (e.g. @/features/icon-picker's IconPickerPopover) so clicking a row icon opens the picker. The host owns the data and dispatches onSelect / onCreate / onRename / onDelete / onMove / onIconChange. Compose with notion-shell (page editor) + notion-database (embedded DBs) for the full Notion-clone OS — see the notion-page-clone-os template.",
|
|
1188
|
-
"source": "notion-page-clone",
|
|
1189
|
-
"install": "npx rahman-resources add notion-sidebar",
|
|
1190
|
-
"npmPackages": [],
|
|
1191
|
-
"exampleCode": "",
|
|
1192
|
-
"agentRecipe": "Run `npx rr add notion-sidebar`. Import `import { NotionSidebar, type NotionSidebarPage } from \"@/features/notion-sidebar\"`. Feed it a flat `pages: NotionSidebarPage[]` ({ id, title, icon, parentId }) — the sidebar builds the tree. Wire callbacks: onSelect(id), onCreate(parentId|null), onRename(id, title) [double-click a title to trigger], onDelete(id), onMove(id, parentId, beforeId) [drag the grip — reorders + reparents], onIconChange(id, icon). For rich icons pass `renderIcon` (display) + `renderIconPicker` (click-to-pick) wired to `@/features/icon-picker` (DynamicIcon + IconPickerPopover). npm: @dnd-kit/core + sortable + utilities. Pair with notion-shell (page editor) + notion-database (embedded DBs) — the notion-page-clone-os template shows the full reducer wiring.",
|
|
1193
|
-
"tags": [
|
|
1194
|
-
"ui",
|
|
1195
|
-
"notion",
|
|
1196
|
-
"sidebar",
|
|
1197
|
-
"tree",
|
|
1198
|
-
"nav",
|
|
1199
|
-
"page",
|
|
1200
|
-
"crud",
|
|
1201
|
-
"rename",
|
|
1202
|
-
"drag",
|
|
1203
|
-
"dnd",
|
|
1204
|
-
"reorder",
|
|
1205
|
-
"reparent",
|
|
1206
|
-
"icon-picker",
|
|
1207
|
-
"primitive",
|
|
1208
|
-
"portable",
|
|
1209
|
-
"notion-like"
|
|
1210
|
-
]
|
|
1211
|
-
},
|
|
1212
|
-
{
|
|
1213
|
-
"slug": "notion-shell",
|
|
1214
|
-
"title": "Notion Shell — page + block editor primitives (pure, no sidebar/database)",
|
|
1215
|
-
"category": "ui",
|
|
1216
|
-
"description": "Portable Notion-style PAGE EDITOR primitives. v0.22 split the tree-nav SIDEBAR out into the standalone `notion-sidebar` slice (so the page editor and the sidebar are independently reusable); embedded DATABASES already live in the `notion-database` peer. notion-shell ships: NotionPage (optional cover image band + header + body), NotionHeader, NotionBlock (live inline-markdown decorator, hover actions menu, optional dragHandle slot, BUILT-IN code (highlight.js) + equation (KaTeX) blocks), 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), InlineFormatToolbar + BlockColorPicker (colour) + MentionTypeahead + PageLayoutSection (layout). SPECIALISED BLOCK RENDERERS: ImageRenderer, EmbedRenderer (YouTube/Vimeo/Loom/Figma/CodePen/Spotify auto-detect). Domain types (Database, Property, PropertyValue, DbView, DatabaseViewConfig, DatabaseFilter, DatabaseSort) remain in notion-shell as the single source of truth (Page.rowOfDatabaseId + rowProps reference them). Pure / props-driven — host owns data + change handlers. Compose notion-sidebar + notion-shell + notion-database for the full Notion-clone OS.",
|
|
1217
|
-
"source": "notion-page-clone",
|
|
1218
|
-
"install": "npx rahman-resources add notion-shell",
|
|
1219
|
-
"npmPackages": [],
|
|
1220
|
-
"exampleCode": "",
|
|
1221
|
-
"agentRecipe": "Run `npx rr add notion-shell` for the portable PAGE EDITOR wrappers ONLY (no backend; the tree-nav sidebar is the separate `notion-sidebar` slice). NPM deps: @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/utilities. Import: `import { NotionPage, NotionBlock, SortableBlockList, PageActionsMenu, InsertBlockButton, InlineFormatToolbar, ImageRenderer, EmbedRenderer } from \"@/features/notion-shell\"`. NotionBlock ships slash menu + decorator + actions menu + dragHandle slot. **`createDefaultBlockRenderers()` returns the block-renderer registry — pass it to `<NotionBlock blockRenderers={…}>` so callout (icon+kind picker), table (editable grid), divider, image, embed, code (highlight.js) + equation (KaTeX) all render. code + equation are now BUILT-IN to notion-shell (npm: katex + highlight.js) — no adapter needed. Only `database` + `toc` are injected at the app level (they depend on host data + the sibling notion-database slice).** 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`. **v0.17 — Notion-canonical editing keys (`blockKeyHandler.ts`): Enter splits at the caret into a new block (lists continue their type; an empty list item exits to paragraph); Backspace on an empty non-paragraph downgrades it to a plain paragraph (re-triggerable with `/`); a second Backspace on an empty paragraph merges into the previous block; Arrow up/down at a line edge hops blocks. Wire the host callbacks on `<NotionBlock>`: `onInsertAfter(type, init) => newId`, `onMergeBack()`, `onFocusSibling(dir)` — plus `focusBlock(id, offset?)` exported to move the caret after a host state change. The preview `page-demo.tsx` and the notion-clone template `DocView` show full array- and reducer-based wirings.** 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.**",
|
|
1222
|
-
"tags": [
|
|
1223
|
-
"ui",
|
|
1224
|
-
"notion",
|
|
1225
|
-
"shell",
|
|
1226
|
-
"wrapper",
|
|
1227
|
-
"page",
|
|
1228
|
-
"block",
|
|
1229
|
-
"editor",
|
|
1230
|
-
"primitive",
|
|
1231
|
-
"portable",
|
|
1232
|
-
"slash-menu",
|
|
1233
|
-
"decorator",
|
|
1234
|
-
"wysiwyg",
|
|
1235
|
-
"drag",
|
|
1236
|
-
"cover",
|
|
1237
|
-
"embed",
|
|
1238
|
-
"image",
|
|
1239
|
-
"code",
|
|
1240
|
-
"equation",
|
|
1241
|
-
"notion-like"
|
|
1242
|
-
]
|
|
1243
|
-
},
|
|
1244
1297
|
{
|
|
1245
1298
|
"slug": "workspace-shell",
|
|
1246
1299
|
"title": "Workspace Shell — atomic (workspace × menuSet) NavContext",
|
|
@@ -1327,41 +1380,24 @@
|
|
|
1327
1380
|
]
|
|
1328
1381
|
},
|
|
1329
1382
|
{
|
|
1330
|
-
"slug": "
|
|
1331
|
-
"title": "
|
|
1383
|
+
"slug": "feedback-states",
|
|
1384
|
+
"title": "Feedback States — loading skeletons + empty/error states",
|
|
1332
1385
|
"category": "ui",
|
|
1333
|
-
"description": "
|
|
1386
|
+
"description": "Two co-located placeholder surfaces behind one slug. loading: a configurable LoadingSkeleton over the shadcn Skeleton (kind presets text / card / list / table / form / page / block, overridable count + columns) plus a spinner LoadingState (inline / block / overlay) for in-flight work. empty: a configurable EmptyState over the shadcn Empty (404 / 500 / 403 / no-results / empty-list / first-use, overridable icon/title/copy/actions) plus an ErrorPage full-page wrapper for app/not-found.tsx and app/error.tsx. Install one surface with `npx rr add feedback-states loading|empty`, or both with `npx rr add feedback-states`. Replaces ad-hoc animate-pulse divs, hand-rolled Loader2 spans, and one-off error pages.",
|
|
1334
1387
|
"source": "rr original",
|
|
1335
|
-
"install": "npx rahman-resources add
|
|
1388
|
+
"install": "npx rahman-resources add feedback-states",
|
|
1336
1389
|
"npmPackages": [],
|
|
1337
1390
|
"exampleCode": "",
|
|
1338
|
-
"agentRecipe": "Run `npx rr add
|
|
1391
|
+
"agentRecipe": "Run `npx rr add feedback-states` for both, or `npx rr add feedback-states loading` / `empty` for one surface. loading: <LoadingSkeleton kind=\"table\" count={8} /> mirrors streamed content, kind=\"page\" drops into route loading.tsx, <LoadingState variant=\"inline|block|overlay\" /> for in-flight work. empty: <EmptyState kind=\"no-results\" /> in zero-data spots, <ErrorPage kind=\"404\" /> in app/not-found.tsx and kind=\"500\" in app/error.tsx. Every preset overridable per use.",
|
|
1339
1392
|
"tags": [
|
|
1393
|
+
"loading",
|
|
1394
|
+
"skeleton",
|
|
1395
|
+
"spinner",
|
|
1340
1396
|
"empty-state",
|
|
1341
1397
|
"404",
|
|
1342
1398
|
"500",
|
|
1343
1399
|
"403",
|
|
1344
1400
|
"error-page",
|
|
1345
|
-
"no-results",
|
|
1346
|
-
"onboarding",
|
|
1347
|
-
"basics"
|
|
1348
|
-
]
|
|
1349
|
-
},
|
|
1350
|
-
{
|
|
1351
|
-
"slug": "loading-states",
|
|
1352
|
-
"title": "Loading States — skeletons + spinners SSOT",
|
|
1353
|
-
"category": "ui",
|
|
1354
|
-
"description": "Configurable LoadingSkeleton composing the shadcn Skeleton primitive: kind presets text / card / list / table / form / page / block with overridable count + columns. Spinner-based LoadingState (inline / block / overlay) covers in-flight work where a skeleton would be wrong. The page kind drops straight into a route loading.tsx (recipe in README).",
|
|
1355
|
-
"source": "rr original",
|
|
1356
|
-
"install": "npx rahman-resources add loading-states",
|
|
1357
|
-
"npmPackages": [],
|
|
1358
|
-
"exampleCode": "",
|
|
1359
|
-
"agentRecipe": "Run `npx rr add loading-states`. Pick the LoadingSkeleton kind that mirrors the streamed content (<LoadingSkeleton kind=\"table\" count={8} />); use kind=\"page\" inside route loading.tsx. For in-flight work (submits, refetches) use <LoadingState variant=\"inline|block|overlay\" /> instead of a skeleton.",
|
|
1360
|
-
"tags": [
|
|
1361
|
-
"loading",
|
|
1362
|
-
"skeleton",
|
|
1363
|
-
"spinner",
|
|
1364
|
-
"suspense",
|
|
1365
1401
|
"fallback",
|
|
1366
1402
|
"placeholder",
|
|
1367
1403
|
"basics"
|
|
@@ -1388,22 +1424,25 @@
|
|
|
1388
1424
|
]
|
|
1389
1425
|
},
|
|
1390
1426
|
{
|
|
1391
|
-
"slug": "settings
|
|
1392
|
-
"title": "Settings
|
|
1427
|
+
"slug": "settings",
|
|
1428
|
+
"title": "Settings — account + appearance shells",
|
|
1393
1429
|
"category": "ui",
|
|
1394
|
-
"description": "SettingsShell two-column
|
|
1430
|
+
"description": "Two settings surfaces behind one slug, each adapter-driven so the slice owns no data. account: SettingsShell two-column surface (nav collapses to a Select on mobile) — Profile (avatar/name/email/bio), Preferences (theme/language/density), Notifications (switch rows), Danger zone (AlertDialog-confirmed delete) over an ASYNC SettingsAdapter { load, save(patch) } with optimistic save + rollback; createMemoryAdapter ships for demos. appearance: AppearancePanel (style/mode/accent/wallpaper/reduce-transparency/display) over a SYNC per-setting AppearanceAdapter, plus the generic SettingsSection / SettingsRow / Segmented / AccentSwatches primitives you compose custom panels from. Install one surface with `npx rr add settings account|appearance`, or both with `npx rr add settings`.",
|
|
1395
1431
|
"source": "rr original",
|
|
1396
|
-
"install": "npx rahman-resources add settings
|
|
1432
|
+
"install": "npx rahman-resources add settings",
|
|
1397
1433
|
"npmPackages": [],
|
|
1398
1434
|
"exampleCode": "",
|
|
1399
|
-
"agentRecipe": "Run `npx rr add settings
|
|
1435
|
+
"agentRecipe": "Run `npx rr add settings` for both, or `npx rr add settings account` / `appearance` for one. account: implement SettingsAdapter { load, save } over your backend (Convex query + mutation), pass to <SettingsShell adapter>; save gets per-section partial patches (shallow-merge server-side); onDeleteAccount wires the danger zone. appearance: build an AppearanceAdapter (per-setting SegSetting values) from your appearance store, pass to <AppearancePanel appearance>; or compose custom panels from <SettingsSection>/<SettingsRow>/<Segmented>/<AccentSwatches>.",
|
|
1400
1436
|
"tags": [
|
|
1401
1437
|
"settings",
|
|
1402
|
-
"account",
|
|
1403
|
-
"profile",
|
|
1404
1438
|
"preferences",
|
|
1405
|
-
"
|
|
1406
|
-
"
|
|
1439
|
+
"account",
|
|
1440
|
+
"appearance",
|
|
1441
|
+
"theme",
|
|
1442
|
+
"adapter",
|
|
1443
|
+
"shell",
|
|
1444
|
+
"primitives",
|
|
1445
|
+
"ui",
|
|
1407
1446
|
"basics"
|
|
1408
1447
|
]
|
|
1409
1448
|
},
|
|
@@ -1427,15 +1466,15 @@
|
|
|
1427
1466
|
]
|
|
1428
1467
|
},
|
|
1429
1468
|
{
|
|
1430
|
-
"slug": "
|
|
1431
|
-
"title": "
|
|
1469
|
+
"slug": "design-studio",
|
|
1470
|
+
"title": "Design Studio — photo / social design canvas",
|
|
1432
1471
|
"category": "os",
|
|
1433
1472
|
"description": "A layered canvas studio: image/text/shape layers with filters, masks, transforms, safe-area guides and aspect presets (1:1/4:5/9:16/16:9), plus an export modal (download / copy / import JSON). Runs fully offline on bundled gradient-SVG samples. Host wiring is one call: configureMediaStudio({ saveDoc, imageSources }) lights up Save-to-host and feeds real image sources. Self-contained: inspector hooks are inert seams in lib/host.ts.",
|
|
1434
1473
|
"source": "rahmanef63/os-vps",
|
|
1435
|
-
"install": "npx rahman-resources add
|
|
1474
|
+
"install": "npx rahman-resources add design-studio",
|
|
1436
1475
|
"npmPackages": [],
|
|
1437
|
-
"exampleCode": "\"use client\";\nimport { MediaStudio } from \"@/features/
|
|
1438
|
-
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Layered canvas editor. Fully client-side; no backend required.\n\nSTEP 1 — Install. `npx rr add
|
|
1476
|
+
"exampleCode": "\"use client\";\nimport { MediaStudio } from \"@/features/design-studio\";\n\nexport default function StudioDemo() {\n return <div className=\"h-dvh w-full\"><MediaStudio /></div>;\n}",
|
|
1477
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Layered canvas editor. Fully client-side; no backend required.\n\nSTEP 1 — Install. `npx rr add design-studio`. Ensure `@/features/design-studio` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: button, dialog, badge, tooltip, scroll-area.\n\nSTEP 3 — Mount. `<MediaStudio />` in a height-bearing box — unwired it edits bundled sample layers. Or register `mediaStudioApp` in an appshell manifest.\n\nSTEP 4 — Host wiring. `configureMediaStudio({ saveDoc, imageSources })` — saveDoc persists the serialized document (enables Save-to-host in the export modal); imageSources supplies image URLs for new layers.",
|
|
1439
1478
|
"tags": [
|
|
1440
1479
|
"canvas",
|
|
1441
1480
|
"editor",
|
|
@@ -1463,24 +1502,6 @@
|
|
|
1463
1502
|
"launcher",
|
|
1464
1503
|
"ui"
|
|
1465
1504
|
]
|
|
1466
|
-
},
|
|
1467
|
-
{
|
|
1468
|
-
"slug": "shell-settings",
|
|
1469
|
-
"title": "Shell Settings — settings-app UI primitives",
|
|
1470
|
-
"category": "ui",
|
|
1471
|
-
"description": "The settings-app building blocks: SettingsSection, Row, AccentSwatches, a slice-local Segmented control, and a ready AppearancePanel (style/mode/accent/wallpaper/device/transparency groups — every group optional). Pure presentation: the injected AppearanceAdapter IS the contract, so it binds to any appearance store (appshell capabilities, zustand, plain useState) with zero slice edits.",
|
|
1472
|
-
"source": "rahmanef63/os-vps",
|
|
1473
|
-
"install": "npx rahman-resources add shell-settings",
|
|
1474
|
-
"npmPackages": [],
|
|
1475
|
-
"exampleCode": "\"use client\";\nimport { useState } from \"react\";\nimport { AppearancePanel } from \"@/features/shell-settings\";\n\nexport default function SettingsDemo() {\n const [mode, setMode] = useState<\"light\" | \"dark\">(\"light\");\n return <AppearancePanel adapter={{ mode: { value: mode, set: setMode } }} />;\n}",
|
|
1476
|
-
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Settings UI primitives. Pure presentation; state injected.\n\nSTEP 1 — Install. `npx rr add shell-settings`. Ensure `@/features/shell-settings` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: button, switch, toggle-group, separator.\n\nSTEP 3 — Mount. `<AppearancePanel adapter={adapter} />` with an AppearanceAdapter (all groups optional — omit a group to hide it), or compose SettingsSection/Row/AccentSwatches/Segmented directly for custom panels.\n\nSTEP 4 — Bind. Wire the adapter to your appearance store (theme mode, accent, wallpaper, device, transparency) — the panel re-renders from the values you pass; no internal state.",
|
|
1477
|
-
"tags": [
|
|
1478
|
-
"settings",
|
|
1479
|
-
"preferences",
|
|
1480
|
-
"appearance",
|
|
1481
|
-
"primitives",
|
|
1482
|
-
"ui"
|
|
1483
|
-
]
|
|
1484
1505
|
}
|
|
1485
1506
|
],
|
|
1486
1507
|
"slices": [
|
|
@@ -1675,6 +1696,190 @@
|
|
|
1675
1696
|
],
|
|
1676
1697
|
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Host telemetry dashboard. Fully client-side; no backend required.\n\nSTEP 1 — Install. `npx rr add system-monitor`. Ensure `@/features/system-monitor` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add scroll-area`.\n\nSTEP 3 — Mount. `<SystemMonitor />` in a height-bearing box — unwired it runs a wavy in-browser telemetry mock. Or register `systemMonitorApp` in an appshell manifest.\n\nSTEP 4 — Real telemetry. `configureSysmon({ mode:\"live\", stats, processes })` — stats returns { cpu:{pct,cores}, mem:{used,total}, disk:{used,total}, net?:{rx,tx}, uptime }; processes returns [{ pid, name, status, cpu, mem }]."
|
|
1677
1698
|
},
|
|
1699
|
+
{
|
|
1700
|
+
"slug": "booking",
|
|
1701
|
+
"title": "Booking — session request form + owner inbox",
|
|
1702
|
+
"category": "os",
|
|
1703
|
+
"kind": "ui",
|
|
1704
|
+
"version": "1.0.0",
|
|
1705
|
+
"description": "One app that is BOTH a public 'book a session' request form AND the owner's triage inbox — it flips to show the inbox when the viewer can manage. Visitors submit name/email/topic (+ optional preferred time / note); the owner sees pending requests with Confirm / Decline. The backend is INJECTED via a small BookingAdapter (submit/list/setStatus/canManage): point configureBooking at your store, or keep the bundled in-memory mock so it renders fully interactive — form + inbox — with zero backend.",
|
|
1706
|
+
"source": "rahmanef63/os-vps",
|
|
1707
|
+
"slicePath": "frontend/slices/booking",
|
|
1708
|
+
"convexPaths": [],
|
|
1709
|
+
"npm": [
|
|
1710
|
+
"lucide-react"
|
|
1711
|
+
],
|
|
1712
|
+
"shadcn": [
|
|
1713
|
+
"button",
|
|
1714
|
+
"input",
|
|
1715
|
+
"textarea",
|
|
1716
|
+
"scroll-area"
|
|
1717
|
+
],
|
|
1718
|
+
"env": [],
|
|
1719
|
+
"peers": [],
|
|
1720
|
+
"providers": [],
|
|
1721
|
+
"tags": [
|
|
1722
|
+
"booking",
|
|
1723
|
+
"contact",
|
|
1724
|
+
"form",
|
|
1725
|
+
"inbox",
|
|
1726
|
+
"lead",
|
|
1727
|
+
"scheduling",
|
|
1728
|
+
"ui"
|
|
1729
|
+
],
|
|
1730
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. A booking request form + owner inbox. Fully client-side; backend optional.\n\nSTEP 1 — Install. `npx rr add booking`. Ensure `@/features/booking` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button input textarea scroll-area`.\n\nSTEP 3 — Mount. `<Booking />` in a height-bearing box — unwired it runs on an in-memory mock store (form + inbox both live). Or register `bookingApp` in an appshell manifest.\n\nSTEP 4 — Real backend. `configureBooking({ mode:\"live\", submit, list, setStatus, canManage })` — submit takes { name, email, topic, preferredTime?, note? }; list returns rows with { id, status, createdAt }; omit list/canManage for a write-only public form."
|
|
1731
|
+
},
|
|
1732
|
+
{
|
|
1733
|
+
"slug": "html-studio",
|
|
1734
|
+
"title": "HTML Studio — sandboxed HTML/CSS/JS editor with live preview",
|
|
1735
|
+
"category": "os",
|
|
1736
|
+
"kind": "ui",
|
|
1737
|
+
"version": "1.0.0",
|
|
1738
|
+
"description": "A tiny web-page studio: write HTML / CSS / JS and see it render LIVE in a sandboxed iframe (srcdoc + sandbox=allow-scripts WITHOUT allow-same-origin, so user code runs in an opaque origin and cannot read the host) — then Save to a shareable /p/<slug>. Code / Split / Preview view toggle, a device-width preview (responsive / tablet / phone), a saved-pages rail, and public/private visibility. The backend is INJECTED via a small HtmlStudioAdapter (save/load/list/remove): point configureHtmlStudio at your store, or keep the bundled in-memory mock so the editor + live preview + saved list are fully interactive with zero backend.",
|
|
1739
|
+
"source": "rahmanef63/os-vps",
|
|
1740
|
+
"slicePath": "frontend/slices/html-studio",
|
|
1741
|
+
"convexPaths": [],
|
|
1742
|
+
"npm": [
|
|
1743
|
+
"lucide-react"
|
|
1744
|
+
],
|
|
1745
|
+
"shadcn": [
|
|
1746
|
+
"button",
|
|
1747
|
+
"input",
|
|
1748
|
+
"textarea",
|
|
1749
|
+
"scroll-area"
|
|
1750
|
+
],
|
|
1751
|
+
"env": [],
|
|
1752
|
+
"peers": [],
|
|
1753
|
+
"providers": [],
|
|
1754
|
+
"tags": [
|
|
1755
|
+
"html",
|
|
1756
|
+
"editor",
|
|
1757
|
+
"sandbox",
|
|
1758
|
+
"iframe",
|
|
1759
|
+
"preview",
|
|
1760
|
+
"playground",
|
|
1761
|
+
"code",
|
|
1762
|
+
"ui"
|
|
1763
|
+
],
|
|
1764
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. A sandboxed HTML/CSS/JS studio: editor + live iframe preview + saved pages. Fully client-side; backend optional.\n\nSTEP 1 — Install. `npx rr add html-studio`. Ensure `@/features/html-studio` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button input textarea scroll-area`.\n\nSTEP 3 — Mount. `<HtmlStudio />` in a height-bearing box — unwired it runs on an in-memory mock (editor + live sandboxed preview + saved list all live). Pass `payload={{ slug }}` to open a page, or register `htmlStudioApp` in an appshell manifest.\n\nSTEP 4 — Real backend. `configureHtmlStudio({ mode:\"live\", save, load, list, remove })` — save takes { slug?, title, html, visibility } and returns { slug }; load(slug) -> SavedPage | null; omit save for a read-only sandbox or list to hide the saved rail. KEEP the iframe sandbox without allow-same-origin — it is the security boundary."
|
|
1765
|
+
},
|
|
1766
|
+
{
|
|
1767
|
+
"slug": "resources-launcher-admin",
|
|
1768
|
+
"title": "Resources Admin — curated icon-launcher CRUD",
|
|
1769
|
+
"category": "os",
|
|
1770
|
+
"kind": "ui",
|
|
1771
|
+
"version": "1.0.0",
|
|
1772
|
+
"description": "An owner-gated admin app for a curated icon-launcher: add / edit / remove / reorder links (label, lucide icon NAME, url, group, order) that open in a new tab. The backend is INJECTED via a small ResourcesAdapter (list/upsert/remove/canManage): point configureResources at your store, or keep the bundled in-memory mock so the whole CRUD — including reorder — is interactive with zero backend. Icons are stored as lucide NAME strings and resolved client-side, so the same data drives a public launcher surface.",
|
|
1773
|
+
"source": "rahmanef63/os-vps",
|
|
1774
|
+
"slicePath": "frontend/slices/resources-launcher-admin",
|
|
1775
|
+
"convexPaths": [],
|
|
1776
|
+
"npm": [
|
|
1777
|
+
"lucide-react"
|
|
1778
|
+
],
|
|
1779
|
+
"shadcn": [
|
|
1780
|
+
"button",
|
|
1781
|
+
"input",
|
|
1782
|
+
"label",
|
|
1783
|
+
"scroll-area",
|
|
1784
|
+
"native-select"
|
|
1785
|
+
],
|
|
1786
|
+
"env": [],
|
|
1787
|
+
"peers": [],
|
|
1788
|
+
"providers": [],
|
|
1789
|
+
"tags": [
|
|
1790
|
+
"launcher",
|
|
1791
|
+
"links",
|
|
1792
|
+
"bookmarks",
|
|
1793
|
+
"admin",
|
|
1794
|
+
"crud",
|
|
1795
|
+
"icons",
|
|
1796
|
+
"ui"
|
|
1797
|
+
],
|
|
1798
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. A curated icon-launcher admin (CRUD + reorder). Fully client-side; backend optional.\n\nSTEP 1 — Install. `npx rr add resources-launcher-admin`. Ensure `@/features/resources-launcher-admin` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button input label scroll-area native-select`.\n\nSTEP 3 — Mount. `<ResourcesAdmin />` in a height-bearing box — unwired it runs on an in-memory mock store (add / edit / remove / reorder all live). Or register `resourcesAdminApp` in an appshell manifest.\n\nSTEP 4 — Real backend. `configureResources({ mode:\"live\", list, upsert, remove, canManage })` — list returns rows { id, label, icon, url, group, order }; upsert takes the same minus id to insert (pass id to patch); canManage gates the editor + reorder. Icons are lucide NAME strings resolved via resolveIcon."
|
|
1799
|
+
},
|
|
1800
|
+
{
|
|
1801
|
+
"slug": "profile",
|
|
1802
|
+
"title": "Profile — CV + identity card",
|
|
1803
|
+
"category": "os",
|
|
1804
|
+
"kind": "ui",
|
|
1805
|
+
"version": "1.0.0",
|
|
1806
|
+
"description": "One owner's identity in two co-located variants, behind one slug. resume: a clean one-column résumé / CV — name, roles, location, contacts, summary, skills, experience (role · org · period + bullets), projects — rendered by <Resume /> off a configureResume() seam, with a Print / PDF button. card: an \"About This Mac\"-style identity card — avatar / monogram, name, roles, outbound links, FAQ accordion — rendered by <AboutProfile /> off a configureAbout() seam. Both render a populated placeholder unwired (zero backend). Install one surface with `npx rr add profile resume|card`, or both with `npx rr add profile`.",
|
|
1807
|
+
"source": "rahmanef63/os-vps",
|
|
1808
|
+
"slicePath": "frontend/slices/profile",
|
|
1809
|
+
"convexPaths": [],
|
|
1810
|
+
"npm": [
|
|
1811
|
+
"lucide-react"
|
|
1812
|
+
],
|
|
1813
|
+
"shadcn": [
|
|
1814
|
+
"button",
|
|
1815
|
+
"scroll-area",
|
|
1816
|
+
"avatar"
|
|
1817
|
+
],
|
|
1818
|
+
"env": [],
|
|
1819
|
+
"peers": [],
|
|
1820
|
+
"providers": [],
|
|
1821
|
+
"tags": [
|
|
1822
|
+
"resume",
|
|
1823
|
+
"cv",
|
|
1824
|
+
"profile",
|
|
1825
|
+
"portfolio",
|
|
1826
|
+
"about",
|
|
1827
|
+
"identity",
|
|
1828
|
+
"bio",
|
|
1829
|
+
"card",
|
|
1830
|
+
"links",
|
|
1831
|
+
"faq",
|
|
1832
|
+
"print",
|
|
1833
|
+
"ui"
|
|
1834
|
+
],
|
|
1835
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Two identity renderers driven by injected data. Fully client-side; no backend required.\n\nSTEP 1 — Install. `npx rr add profile` for both, or `npx rr add profile resume` / `card` for one. Ensure `@/features/profile` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button scroll-area avatar`.\n\nSTEP 3 — Mount. `<Resume />` (CV) or `<AboutProfile />` (card) in a height-bearing box — unwired each renders a generic placeholder. Or register `resumeApp` / `aboutProfileApp` in an appshell manifest.\n\nSTEP 4 — Real data. `configureResume(profile)` with a ResumeProfile { name, roles[], location, summary, contacts[], skills[], experience[], projects[] }, and/or `configureAbout(card)` with { name, roles[], description, links[], faq[] }, once at boot from Convex / a CMS / a JSON file. Resume's \"Print / PDF\" button calls window.print() against a print-friendly layout.",
|
|
1836
|
+
"variants": {
|
|
1837
|
+
"default": "resume",
|
|
1838
|
+
"items": [
|
|
1839
|
+
{
|
|
1840
|
+
"id": "resume",
|
|
1841
|
+
"title": "Resume",
|
|
1842
|
+
"description": "Formal one-column printable CV (Resume + configureResume)."
|
|
1843
|
+
},
|
|
1844
|
+
{
|
|
1845
|
+
"id": "card",
|
|
1846
|
+
"title": "Card",
|
|
1847
|
+
"description": "Compact avatar + links + FAQ identity card (AboutProfile + configureAbout)."
|
|
1848
|
+
}
|
|
1849
|
+
]
|
|
1850
|
+
}
|
|
1851
|
+
},
|
|
1852
|
+
{
|
|
1853
|
+
"slug": "start-here",
|
|
1854
|
+
"title": "Start Here — guided OS onboarding tour",
|
|
1855
|
+
"category": "os",
|
|
1856
|
+
"kind": "ui",
|
|
1857
|
+
"version": "1.0.0",
|
|
1858
|
+
"description": "A guided 'Start Here' tour that lays the OS out as a path of stages, each stage opening real apps from the LIVE registry — drift-proof, it reads the injected app catalog instead of a hardcoded list, so adding an app surfaces it automatically (in a stage if listed, else a final 'Everything else' bucket). The catalog, the open(id) callback, and the stage journey are INJECTED via a small StartHereAdapter (apps / open / stages): point configureStartHere at your live app registry + window opener, or keep the bundled in-memory mock (a few generic apps + 3 stages) so the welcome tour renders fully alive with zero host.",
|
|
1859
|
+
"source": "rahmanef63/os-vps",
|
|
1860
|
+
"slicePath": "frontend/slices/start-here",
|
|
1861
|
+
"convexPaths": [],
|
|
1862
|
+
"npm": [
|
|
1863
|
+
"lucide-react"
|
|
1864
|
+
],
|
|
1865
|
+
"shadcn": [
|
|
1866
|
+
"button",
|
|
1867
|
+
"scroll-area"
|
|
1868
|
+
],
|
|
1869
|
+
"env": [],
|
|
1870
|
+
"peers": [],
|
|
1871
|
+
"providers": [],
|
|
1872
|
+
"tags": [
|
|
1873
|
+
"onboarding",
|
|
1874
|
+
"tour",
|
|
1875
|
+
"welcome",
|
|
1876
|
+
"launcher",
|
|
1877
|
+
"guide",
|
|
1878
|
+
"os",
|
|
1879
|
+
"ui"
|
|
1880
|
+
],
|
|
1881
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. A guided onboarding tour that renders your live app catalog as a path of stages. Fully client-side; the catalog is injected.\n\nSTEP 1 — Install. `npx rr add start-here`. Ensure `@/features/start-here` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: `npx shadcn@latest add button scroll-area`.\n\nSTEP 3 — Mount. `<StartHere />` in a height-bearing box — unwired it reads an in-memory mock catalog (generic apps + 3 stages) so the tour is fully alive. Or register `startHereApp` in an appshell manifest.\n\nSTEP 4 — Real catalog. `configureStartHere({ mode:\"live\", apps, open, stages })` — apps is your live registry as [{ id, title, icon, description? }]; open(id) launches the real app/window; stages is [{ title, blurb, appIds }] (apps not placed fall into a final \"Everything else\" stage). Drift-proof: read the registry, never hardcode the list."
|
|
1882
|
+
},
|
|
1678
1883
|
{
|
|
1679
1884
|
"slug": "os-terminal",
|
|
1680
1885
|
"title": "Terminal — shell emulator with live passthrough + PTY seam",
|
|
@@ -1955,101 +2160,50 @@
|
|
|
1955
2160
|
"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."
|
|
1956
2161
|
},
|
|
1957
2162
|
{
|
|
1958
|
-
"slug": "
|
|
1959
|
-
"title": "
|
|
2163
|
+
"slug": "payment",
|
|
2164
|
+
"title": "Payment — Indonesia PSP (DOKU · Midtrans)",
|
|
1960
2165
|
"category": "integrations",
|
|
1961
2166
|
"kind": "full",
|
|
1962
2167
|
"version": "0.4.0",
|
|
1963
|
-
"description": "
|
|
2168
|
+
"description": "Indonesia payment providers behind one slug + ONE shared Convex backend (convex/features/payment discriminates on a provider column: paymentOrders + paymentWebhookEvents, unprefixed). Two frontend variants: doku — DOKU Hosted Checkout + Direct (VA / QRIS / e-Wallet / PayLater), HMAC-SHA256 signed REST, signature-verified webhook, idempotent retries, dependency-free, server-side env only. midtrans — Snap hosted-modal checkout + orders history (needs npm midtrans-client + a NEXT_PUBLIC_MIDTRANS_CLIENT_KEY). Install one with `npx rr add payment doku|midtrans`, or both. A future stripe variant is reserved in the schema's provider union.",
|
|
1964
2169
|
"source": "rahmanef63/resource-site",
|
|
1965
|
-
"slicePath": "frontend/slices/
|
|
2170
|
+
"slicePath": "frontend/slices/payment",
|
|
1966
2171
|
"convexPaths": [
|
|
1967
2172
|
"convex/features/payment"
|
|
1968
2173
|
],
|
|
1969
|
-
"npm": [
|
|
2174
|
+
"npm": [
|
|
2175
|
+
"midtrans-client@^1.4.2"
|
|
2176
|
+
],
|
|
1970
2177
|
"shadcn": [
|
|
1971
|
-
"
|
|
2178
|
+
"badge",
|
|
1972
2179
|
"button",
|
|
2180
|
+
"card",
|
|
1973
2181
|
"dialog",
|
|
1974
2182
|
"input",
|
|
1975
2183
|
"label",
|
|
1976
2184
|
"select",
|
|
1977
|
-
"badge",
|
|
1978
2185
|
"skeleton"
|
|
1979
2186
|
],
|
|
1980
2187
|
"env": [
|
|
1981
2188
|
{
|
|
1982
2189
|
"name": "DOKU_CLIENT_ID",
|
|
1983
|
-
"scope": "convex"
|
|
1984
|
-
"required": true
|
|
2190
|
+
"scope": "convex"
|
|
1985
2191
|
},
|
|
1986
2192
|
{
|
|
1987
2193
|
"name": "DOKU_SECRET_KEY",
|
|
1988
|
-
"scope": "convex"
|
|
1989
|
-
"required": true
|
|
2194
|
+
"scope": "convex"
|
|
1990
2195
|
},
|
|
1991
2196
|
{
|
|
1992
2197
|
"name": "DOKU_IS_PRODUCTION",
|
|
1993
2198
|
"scope": "convex"
|
|
1994
2199
|
},
|
|
1995
|
-
{
|
|
1996
|
-
"name": "DOKU_NOTIFY_PATH",
|
|
1997
|
-
"scope": "convex"
|
|
1998
|
-
}
|
|
1999
|
-
],
|
|
2000
|
-
"peers": [
|
|
2001
|
-
{
|
|
2002
|
-
"slug": "convex-auth",
|
|
2003
|
-
"range": "^0.1",
|
|
2004
|
-
"reason": "Order ownership requires authenticated user."
|
|
2005
|
-
}
|
|
2006
|
-
],
|
|
2007
|
-
"providers": [
|
|
2008
|
-
"doku"
|
|
2009
|
-
],
|
|
2010
|
-
"tags": [
|
|
2011
|
-
"payment",
|
|
2012
|
-
"doku",
|
|
2013
|
-
"indonesia",
|
|
2014
|
-
"qris",
|
|
2015
|
-
"virtual-account",
|
|
2016
|
-
"ewallet",
|
|
2017
|
-
"checkout"
|
|
2018
|
-
],
|
|
2019
|
-
"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."
|
|
2020
|
-
},
|
|
2021
|
-
{
|
|
2022
|
-
"slug": "midtrans-payment",
|
|
2023
|
-
"title": "Midtrans — Indonesia Payment",
|
|
2024
|
-
"category": "integrations",
|
|
2025
|
-
"kind": "full",
|
|
2026
|
-
"version": "0.2.0",
|
|
2027
|
-
"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.",
|
|
2028
|
-
"source": "rahmanef63/resource-site",
|
|
2029
|
-
"slicePath": "frontend/slices/midtrans-payment",
|
|
2030
|
-
"convexPaths": [
|
|
2031
|
-
"convex/features/payment"
|
|
2032
|
-
],
|
|
2033
|
-
"npm": [
|
|
2034
|
-
"midtrans-client@^1.4.2"
|
|
2035
|
-
],
|
|
2036
|
-
"shadcn": [
|
|
2037
|
-
"card",
|
|
2038
|
-
"button",
|
|
2039
|
-
"dialog",
|
|
2040
|
-
"input",
|
|
2041
|
-
"label"
|
|
2042
|
-
],
|
|
2043
|
-
"env": [
|
|
2044
2200
|
{
|
|
2045
2201
|
"name": "MIDTRANS_SERVER_KEY",
|
|
2046
|
-
"scope": "convex"
|
|
2047
|
-
"required": true
|
|
2202
|
+
"scope": "convex"
|
|
2048
2203
|
},
|
|
2049
2204
|
{
|
|
2050
2205
|
"name": "MIDTRANS_CLIENT_KEY",
|
|
2051
|
-
"scope": "next-public"
|
|
2052
|
-
"required": true
|
|
2206
|
+
"scope": "next-public"
|
|
2053
2207
|
},
|
|
2054
2208
|
{
|
|
2055
2209
|
"name": "MIDTRANS_IS_PRODUCTION",
|
|
@@ -2060,20 +2214,41 @@
|
|
|
2060
2214
|
{
|
|
2061
2215
|
"slug": "convex-auth",
|
|
2062
2216
|
"range": "^0.1",
|
|
2063
|
-
"reason": "Order ownership requires authenticated user."
|
|
2217
|
+
"reason": "Order ownership requires authenticated user (guest checkout works without)."
|
|
2064
2218
|
}
|
|
2065
2219
|
],
|
|
2066
2220
|
"providers": [
|
|
2221
|
+
"doku",
|
|
2067
2222
|
"midtrans"
|
|
2068
2223
|
],
|
|
2069
2224
|
"tags": [
|
|
2070
2225
|
"payment",
|
|
2071
|
-
"
|
|
2226
|
+
"checkout",
|
|
2072
2227
|
"indonesia",
|
|
2228
|
+
"doku",
|
|
2229
|
+
"midtrans",
|
|
2230
|
+
"snap",
|
|
2073
2231
|
"qris",
|
|
2074
|
-
"
|
|
2075
|
-
|
|
2076
|
-
|
|
2232
|
+
"virtual-account",
|
|
2233
|
+
"ewallet",
|
|
2234
|
+
"psp"
|
|
2235
|
+
],
|
|
2236
|
+
"agentRecipe": "Run `npx rr add payment` for both providers, or `npx rr add payment doku` / `midtrans`. Either variant copies the shared convex/features/payment backend. doku: Checkout (hosted) or Direct (single channel → VA/QRIS/deeplink); webhook /webhooks/doku verifies HMAC-SHA256; server-only, no NEXT_PUBLIC_*. midtrans: Snap.js + window.snap.pay(token); webhook verifies signature_key; needs NEXT_PUBLIC_MIDTRANS_CLIENT_KEY. Both patch paymentOrders by orderId; sandbox by default.",
|
|
2237
|
+
"variants": {
|
|
2238
|
+
"default": "doku",
|
|
2239
|
+
"items": [
|
|
2240
|
+
{
|
|
2241
|
+
"id": "doku",
|
|
2242
|
+
"title": "DOKU",
|
|
2243
|
+
"description": "Hosted Checkout + Direct channel picker, HMAC REST, dependency-free."
|
|
2244
|
+
},
|
|
2245
|
+
{
|
|
2246
|
+
"id": "midtrans",
|
|
2247
|
+
"title": "Midtrans",
|
|
2248
|
+
"description": "Snap hosted-checkout button + orders history (needs midtrans-client + next-public key)."
|
|
2249
|
+
}
|
|
2250
|
+
]
|
|
2251
|
+
}
|
|
2077
2252
|
},
|
|
2078
2253
|
{
|
|
2079
2254
|
"slug": "resend-newsletter",
|
|
@@ -2120,16 +2295,16 @@
|
|
|
2120
2295
|
"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'."
|
|
2121
2296
|
},
|
|
2122
2297
|
{
|
|
2123
|
-
"slug": "ai-
|
|
2124
|
-
"title": "AI
|
|
2298
|
+
"slug": "ai-workspace",
|
|
2299
|
+
"title": "AI Workspace — chat · studio · agents",
|
|
2125
2300
|
"category": "ai",
|
|
2126
2301
|
"kind": "full",
|
|
2127
2302
|
"version": "0.3.0",
|
|
2128
|
-
"description": "
|
|
2303
|
+
"description": "Three AI surfaces as shadcn-style variants — `npx rr add ai-workspace <variant>` for one, or `npx rr add ai-workspace` for all + a switcher. Only the chat variant pulls a Convex backend (per-variant convex gating).\n\n • chat — floating <AiChatFab /> + createAgenticChatSend: real function-calling over any ToolHost (@/shared/agentic), key-guarded, over convex/features/aiChat.\n • studio — <AiStudioPage /> single-prompt generation canvas (variation grid + version tree, Suno / Midjourney / Lovable pattern) + aiStudioTools so a shared agent can drive generations.\n • agents — <AiAgentsPage /> autonomous-worker run dashboard + createAgentRunner(host) which drives the shared function-calling loop and records each tool_use as a RunStep trace.\n\nUse cases: support chatbot in a marketing site, AI generation product (image / code / text / audio), background workers (nightly audits, scheduled crawls, moderation). studio + agents are frontend-only — wire your own persistence.",
|
|
2129
2304
|
"source": "rahmanef63/resource-site",
|
|
2130
|
-
"slicePath": "frontend/slices/ai-
|
|
2305
|
+
"slicePath": "frontend/slices/ai-workspace",
|
|
2131
2306
|
"convexPaths": [
|
|
2132
|
-
"convex/features/
|
|
2307
|
+
"convex/features/aiChat"
|
|
2133
2308
|
],
|
|
2134
2309
|
"npm": [
|
|
2135
2310
|
"ai@^4.0.0",
|
|
@@ -2137,187 +2312,100 @@
|
|
|
2137
2312
|
"@ai-sdk/openai@^0.0.60"
|
|
2138
2313
|
],
|
|
2139
2314
|
"shadcn": [
|
|
2315
|
+
"avatar",
|
|
2316
|
+
"badge",
|
|
2140
2317
|
"button",
|
|
2141
2318
|
"card",
|
|
2142
|
-
"
|
|
2143
|
-
"avatar",
|
|
2319
|
+
"progress",
|
|
2144
2320
|
"scroll-area",
|
|
2145
2321
|
"select",
|
|
2146
2322
|
"separator",
|
|
2147
2323
|
"slider",
|
|
2148
2324
|
"switch",
|
|
2149
|
-
"textarea",
|
|
2150
|
-
"tabs",
|
|
2151
|
-
"command",
|
|
2152
|
-
"sheet"
|
|
2153
|
-
],
|
|
2154
|
-
"env": [
|
|
2155
|
-
{
|
|
2156
|
-
"name": "ANTHROPIC_API_KEY",
|
|
2157
|
-
"scope": "convex",
|
|
2158
|
-
"required": false
|
|
2159
|
-
},
|
|
2160
|
-
{
|
|
2161
|
-
"name": "OPENAI_API_KEY",
|
|
2162
|
-
"scope": "convex",
|
|
2163
|
-
"required": false
|
|
2164
|
-
},
|
|
2165
|
-
{
|
|
2166
|
-
"name": "GOOGLE_GENERATIVE_AI_API_KEY",
|
|
2167
|
-
"scope": "convex",
|
|
2168
|
-
"required": false
|
|
2169
|
-
}
|
|
2170
|
-
],
|
|
2171
|
-
"peers": [
|
|
2172
|
-
{
|
|
2173
|
-
"slug": "convex-auth",
|
|
2174
|
-
"range": "^0.1",
|
|
2175
|
-
"reason": "Thread ownership requires authenticated user."
|
|
2176
|
-
},
|
|
2177
|
-
{
|
|
2178
|
-
"slug": "ai-router",
|
|
2179
|
-
"range": "^0.1",
|
|
2180
|
-
"reason": "Routes provider calls through tiered proxy."
|
|
2181
|
-
},
|
|
2182
|
-
{
|
|
2183
|
-
"slug": "ai-admin",
|
|
2184
|
-
"range": "^0.1",
|
|
2185
|
-
"reason": "Reads instructions / skills / tools / models from ai-admin registry."
|
|
2186
|
-
},
|
|
2187
|
-
{
|
|
2188
|
-
"slug": "vector-search",
|
|
2189
|
-
"range": "^0.1",
|
|
2190
|
-
"reason": "Optional — RAG / search modes pull workspace embeddings."
|
|
2191
|
-
}
|
|
2192
|
-
],
|
|
2193
|
-
"providers": [],
|
|
2194
|
-
"tags": [
|
|
2195
|
-
"ai",
|
|
2196
|
-
"ai:chat",
|
|
2197
|
-
"streaming",
|
|
2198
|
-
"multimodal",
|
|
2199
|
-
"tool-calls",
|
|
2200
|
-
"agent-mode",
|
|
2201
|
-
"rag",
|
|
2202
|
-
"citations",
|
|
2203
|
-
"branching",
|
|
2204
|
-
"history"
|
|
2205
|
-
],
|
|
2206
|
-
"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."
|
|
2207
|
-
},
|
|
2208
|
-
{
|
|
2209
|
-
"slug": "ai-studio",
|
|
2210
|
-
"title": "AI Studio — Generation Canvas",
|
|
2211
|
-
"category": "ai",
|
|
2212
|
-
"kind": "full",
|
|
2213
|
-
"version": "0.2.0",
|
|
2214
|
-
"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.",
|
|
2215
|
-
"source": "rahmanef63/resource-site",
|
|
2216
|
-
"slicePath": "frontend/slices/ai-studio",
|
|
2217
|
-
"convexPaths": [
|
|
2218
|
-
"convex/features/ai"
|
|
2219
|
-
],
|
|
2220
|
-
"npm": [
|
|
2221
|
-
"ai@^4.0.0"
|
|
2222
|
-
],
|
|
2223
|
-
"shadcn": [
|
|
2224
|
-
"button",
|
|
2225
|
-
"card",
|
|
2226
|
-
"badge",
|
|
2227
|
-
"textarea",
|
|
2228
|
-
"tabs",
|
|
2229
|
-
"tooltip",
|
|
2230
|
-
"scroll-area",
|
|
2231
|
-
"select"
|
|
2232
|
-
],
|
|
2233
|
-
"env": [],
|
|
2234
|
-
"peers": [
|
|
2235
|
-
{
|
|
2236
|
-
"slug": "convex-auth",
|
|
2237
|
-
"range": "^0.1",
|
|
2238
|
-
"reason": "Generation history per user."
|
|
2239
|
-
},
|
|
2240
|
-
{
|
|
2241
|
-
"slug": "ai-router",
|
|
2242
|
-
"range": "^0.1",
|
|
2243
|
-
"reason": "All generation calls flow through router."
|
|
2244
|
-
},
|
|
2245
|
-
{
|
|
2246
|
-
"slug": "ai-admin",
|
|
2247
|
-
"range": "^0.1",
|
|
2248
|
-
"reason": "Templates + few-shot library + moderation rules live in ai-admin."
|
|
2249
|
-
}
|
|
2250
|
-
],
|
|
2251
|
-
"providers": [],
|
|
2252
|
-
"tags": [
|
|
2253
|
-
"ai",
|
|
2254
|
-
"ai:studio",
|
|
2255
|
-
"generation",
|
|
2256
|
-
"streaming",
|
|
2257
|
-
"history",
|
|
2258
|
-
"branching",
|
|
2259
|
-
"image-gen"
|
|
2260
|
-
],
|
|
2261
|
-
"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."
|
|
2262
|
-
},
|
|
2263
|
-
{
|
|
2264
|
-
"slug": "ai-agents",
|
|
2265
|
-
"title": "AI Agents — Autonomous Workers",
|
|
2266
|
-
"category": "ai",
|
|
2267
|
-
"kind": "full",
|
|
2268
|
-
"version": "0.2.0",
|
|
2269
|
-
"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.",
|
|
2270
|
-
"source": "rahmanef63/resource-site",
|
|
2271
|
-
"slicePath": "frontend/slices/ai-agents",
|
|
2272
|
-
"convexPaths": [
|
|
2273
|
-
"convex/features/ai"
|
|
2274
|
-
],
|
|
2275
|
-
"npm": [
|
|
2276
|
-
"ai@^4.0.0"
|
|
2277
|
-
],
|
|
2278
|
-
"shadcn": [
|
|
2279
|
-
"button",
|
|
2280
|
-
"card",
|
|
2281
|
-
"badge",
|
|
2282
2325
|
"table",
|
|
2283
2326
|
"tabs",
|
|
2284
|
-
"
|
|
2285
|
-
"
|
|
2327
|
+
"textarea",
|
|
2328
|
+
"tooltip"
|
|
2329
|
+
],
|
|
2330
|
+
"env": [
|
|
2331
|
+
{
|
|
2332
|
+
"name": "ANTHROPIC_API_KEY",
|
|
2333
|
+
"scope": "convex",
|
|
2334
|
+
"required": false
|
|
2335
|
+
},
|
|
2336
|
+
{
|
|
2337
|
+
"name": "OPENAI_API_KEY",
|
|
2338
|
+
"scope": "convex",
|
|
2339
|
+
"required": false
|
|
2340
|
+
},
|
|
2341
|
+
{
|
|
2342
|
+
"name": "GOOGLE_GENERATIVE_AI_API_KEY",
|
|
2343
|
+
"scope": "convex",
|
|
2344
|
+
"required": false
|
|
2345
|
+
}
|
|
2286
2346
|
],
|
|
2287
|
-
"env": [],
|
|
2288
2347
|
"peers": [
|
|
2289
2348
|
{
|
|
2290
2349
|
"slug": "convex-auth",
|
|
2291
2350
|
"range": "^0.1",
|
|
2292
|
-
"reason": "
|
|
2351
|
+
"reason": "chat/studio/agents ownership requires an authenticated user."
|
|
2293
2352
|
},
|
|
2294
2353
|
{
|
|
2295
2354
|
"slug": "ai-router",
|
|
2296
2355
|
"range": "^0.1",
|
|
2297
|
-
"reason": "
|
|
2356
|
+
"reason": "Routes provider calls through the tiered proxy."
|
|
2298
2357
|
},
|
|
2299
2358
|
{
|
|
2300
2359
|
"slug": "ai-admin",
|
|
2301
2360
|
"range": "^0.1",
|
|
2302
|
-
"reason": "
|
|
2361
|
+
"reason": "Reads instructions / skills / tools / models / agent defs from the ai-admin registry."
|
|
2303
2362
|
},
|
|
2304
2363
|
{
|
|
2305
|
-
"slug": "
|
|
2364
|
+
"slug": "vector-search",
|
|
2306
2365
|
"range": "^0.1",
|
|
2307
|
-
"reason": "
|
|
2366
|
+
"reason": "Optional — chat RAG mode pulls workspace embeddings."
|
|
2308
2367
|
}
|
|
2309
2368
|
],
|
|
2310
2369
|
"providers": [],
|
|
2311
2370
|
"tags": [
|
|
2312
2371
|
"ai",
|
|
2313
|
-
"ai:
|
|
2372
|
+
"ai:chatbot",
|
|
2373
|
+
"ai:studio",
|
|
2374
|
+
"ai:agent",
|
|
2314
2375
|
"agent-mode",
|
|
2315
2376
|
"tool-calls",
|
|
2377
|
+
"streaming",
|
|
2378
|
+
"generation",
|
|
2316
2379
|
"async",
|
|
2317
|
-
"
|
|
2318
|
-
"
|
|
2319
|
-
],
|
|
2320
|
-
"agentRecipe": "Run `npx rr add ai-agents
|
|
2380
|
+
"traces",
|
|
2381
|
+
"multimodal"
|
|
2382
|
+
],
|
|
2383
|
+
"agentRecipe": "Run `npx rr add ai-workspace <chat|studio|agents>` for one surface, or `npx rr add ai-workspace` for all. chat: mount <AiChatFab chat={useAction(api.features.aiChat.action.chat)} />. studio: mount <AiStudioPage /> + drive via aiStudioTools. agents: mount <AiAgentsPage /> + trigger via createAgentRunner(host).",
|
|
2384
|
+
"variants": {
|
|
2385
|
+
"default": "chat",
|
|
2386
|
+
"items": [
|
|
2387
|
+
{
|
|
2388
|
+
"id": "chat",
|
|
2389
|
+
"title": "Chat",
|
|
2390
|
+
"description": "Floating assistant FAB with real function-calling over any ToolHost.",
|
|
2391
|
+
"convex": [
|
|
2392
|
+
"convex/features/aiChat"
|
|
2393
|
+
]
|
|
2394
|
+
},
|
|
2395
|
+
{
|
|
2396
|
+
"id": "studio",
|
|
2397
|
+
"title": "Studio",
|
|
2398
|
+
"description": "Single-prompt generation canvas + agentic generate tool.",
|
|
2399
|
+
"convex": []
|
|
2400
|
+
},
|
|
2401
|
+
{
|
|
2402
|
+
"id": "agents",
|
|
2403
|
+
"title": "Agents",
|
|
2404
|
+
"description": "Autonomous-worker run dashboard + createAgentRunner loop.",
|
|
2405
|
+
"convex": []
|
|
2406
|
+
}
|
|
2407
|
+
]
|
|
2408
|
+
}
|
|
2321
2409
|
},
|
|
2322
2410
|
{
|
|
2323
2411
|
"slug": "ai-admin",
|
|
@@ -2397,7 +2485,7 @@
|
|
|
2397
2485
|
"category": "ai",
|
|
2398
2486
|
"kind": "backend",
|
|
2399
2487
|
"version": "0.5.0",
|
|
2400
|
-
"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-
|
|
2488
|
+
"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-workspace.",
|
|
2401
2489
|
"source": "rahmanef63/resource-site",
|
|
2402
2490
|
"slicePath": "frontend/slices/ai-router",
|
|
2403
2491
|
"convexPaths": [
|
|
@@ -3129,44 +3217,90 @@
|
|
|
3129
3217
|
},
|
|
3130
3218
|
{
|
|
3131
3219
|
"slug": "admin",
|
|
3132
|
-
"title": "Admin —
|
|
3220
|
+
"title": "Admin — generic shell + composed console",
|
|
3133
3221
|
"category": "infra",
|
|
3134
3222
|
"kind": "full",
|
|
3135
3223
|
"version": "0.2.1",
|
|
3136
|
-
"description": "
|
|
3224
|
+
"description": "Access-gated admin surfaces behind one slug, in two variants — each pulls ONLY its own convex backend (per-variant convex gating). shell: a HEADLESS minimal generic admin shell — a titled landing region + a portable buildAdminStats(opts) nav-from-registry factory (consumer supplies a SliceRegistryAdapter + queryTable reader) over convex/features/admin; superadmin gate via SUPER_ADMIN_EMAIL. console: the composed admin panel distilled from ~15 project admin panels — a gated two-column shell (AdminConsole) over a 26-section registry (ADMIN_CONSOLE_SECTIONS: observability / identity / ai / content / commerce / config) that mounts OTHER rr slices via a consumer-supplied `components` map (users→user-management, roles→rbac-roles, ai→ai-admin, tenants→platform-admin) plus 5 owned gap sections (Analytics, Audit-log, Nav config, SEO health, Leads/CRM) over convex/features/admin_console (ac_leads + ac_nav_items); gate injected, PLATFORM_ADMIN_EMAILS allowlist. Install one with `npx rr add admin shell|console`, or both with `npx rr add admin`. NOT the multi-tenant control plane — that's the separate `platform-admin` slice (the console's `tenants` section provider).",
|
|
3137
3225
|
"source": "rahmanef63/resource-site",
|
|
3138
3226
|
"slicePath": "frontend/slices/admin",
|
|
3139
3227
|
"convexPaths": [
|
|
3140
|
-
"convex/features/admin"
|
|
3228
|
+
"convex/features/admin",
|
|
3229
|
+
"convex/features/admin_console"
|
|
3141
3230
|
],
|
|
3142
3231
|
"npm": [],
|
|
3143
3232
|
"shadcn": [
|
|
3233
|
+
"badge",
|
|
3234
|
+
"button",
|
|
3144
3235
|
"card",
|
|
3145
|
-
"
|
|
3236
|
+
"input",
|
|
3237
|
+
"progress",
|
|
3238
|
+
"scroll-area",
|
|
3239
|
+
"select",
|
|
3240
|
+
"sheet",
|
|
3241
|
+
"table",
|
|
3242
|
+
"textarea"
|
|
3146
3243
|
],
|
|
3147
3244
|
"env": [
|
|
3148
3245
|
{
|
|
3149
3246
|
"name": "SUPER_ADMIN_EMAIL",
|
|
3150
3247
|
"scope": "convex",
|
|
3151
|
-
"required": false
|
|
3248
|
+
"required": false,
|
|
3249
|
+
"description": "shell variant — single super-admin gate."
|
|
3250
|
+
},
|
|
3251
|
+
{
|
|
3252
|
+
"name": "PLATFORM_ADMIN_EMAILS",
|
|
3253
|
+
"scope": "convex",
|
|
3254
|
+
"required": false,
|
|
3255
|
+
"description": "console variant — comma-separated platform-admin allowlist."
|
|
3152
3256
|
}
|
|
3153
3257
|
],
|
|
3154
3258
|
"peers": [
|
|
3155
3259
|
{
|
|
3156
3260
|
"slug": "convex-auth",
|
|
3157
3261
|
"range": "^0.1",
|
|
3158
|
-
"reason": "requireAdmin gate uses convex-auth
|
|
3262
|
+
"reason": "requireAdmin gate uses convex-auth identity."
|
|
3263
|
+
},
|
|
3264
|
+
{
|
|
3265
|
+
"slug": "rbac-roles",
|
|
3266
|
+
"range": "^0.1",
|
|
3267
|
+
"reason": "console section gates are permission tokens resolved by rbac-roles."
|
|
3159
3268
|
}
|
|
3160
3269
|
],
|
|
3161
3270
|
"providers": [],
|
|
3162
3271
|
"tags": [
|
|
3163
3272
|
"infra",
|
|
3164
3273
|
"admin",
|
|
3274
|
+
"console",
|
|
3165
3275
|
"shell",
|
|
3166
|
-
"
|
|
3167
|
-
"
|
|
3168
|
-
|
|
3169
|
-
|
|
3276
|
+
"dashboard",
|
|
3277
|
+
"composition",
|
|
3278
|
+
"rbac",
|
|
3279
|
+
"access-gate",
|
|
3280
|
+
"registry"
|
|
3281
|
+
],
|
|
3282
|
+
"agentRecipe": "Run `npx rr add admin` for both, or `npx rr add admin shell` / `console` for one — each variant pulls only its own convex backend. shell: mount <AdminPage labels={...} /> + call buildAdminStats({ sliceRegistry, queryTable }) in convex/features/admin/query.ts; lock down with SUPER_ADMIN_EMAIL. console: mount <AdminConsole access={useAdminAccess()} components={{ users: <UsersPanel/>, ... }} /> — owned sections (analytics/audit-log/nav-config/seo-health/leads) render as-is, map each reuse section id to the panel from the peer slice you installed; compose adminConsoleTables into convex/schema.ts and front ac_leads.create with rate-limit; gate via PLATFORM_ADMIN_EMAILS.",
|
|
3283
|
+
"variants": {
|
|
3284
|
+
"default": "console",
|
|
3285
|
+
"items": [
|
|
3286
|
+
{
|
|
3287
|
+
"id": "shell",
|
|
3288
|
+
"title": "Shell",
|
|
3289
|
+
"description": "Minimal generic admin shell (titled card + buildAdminStats).",
|
|
3290
|
+
"convex": [
|
|
3291
|
+
"convex/features/admin"
|
|
3292
|
+
]
|
|
3293
|
+
},
|
|
3294
|
+
{
|
|
3295
|
+
"id": "console",
|
|
3296
|
+
"title": "Console",
|
|
3297
|
+
"description": "Composed access-gated 26-section console mounting other rr slices.",
|
|
3298
|
+
"convex": [
|
|
3299
|
+
"convex/features/admin_console"
|
|
3300
|
+
]
|
|
3301
|
+
}
|
|
3302
|
+
]
|
|
3303
|
+
}
|
|
3170
3304
|
},
|
|
3171
3305
|
{
|
|
3172
3306
|
"slug": "platform-admin",
|
|
@@ -3320,6 +3454,61 @@
|
|
|
3320
3454
|
],
|
|
3321
3455
|
"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."
|
|
3322
3456
|
},
|
|
3457
|
+
{
|
|
3458
|
+
"slug": "publisher-clean-html",
|
|
3459
|
+
"title": "Publisher — clean HTML",
|
|
3460
|
+
"category": "content",
|
|
3461
|
+
"kind": "ui",
|
|
3462
|
+
"version": "0.1.0",
|
|
3463
|
+
"description": "A pure render-to-clean-HTML engine harvested from the Instatic CMS publisher, decoupled from its host caching / loops / visual-components / Layer-C islands. publishPage(tree, registry, options) walks a generic node tree bottom-up: render children, escape every prop by its schema-declared control type (url -> safe-URL, richtext -> DOMPurify, svg -> SVG profile, else HTML-escape), dedup CSS by moduleId (~60-80% shrink), splice author classes + inline styles onto each rendered root, then assemble <!DOCTYPE> + reset + framework + module CSS + a deterministic (sorted) CSP plan. Bring your own ModuleRegistry (each module is a pure render(props, children) -> { html, css? }). Security spine: HTML escape + safe-URL, CSS-value guard (expression()/{}/</), </style RAWTEXT neutraliser, and an injectable DOMPurify seam (configureRichtextSanitizer) that fails closed — without a runtime, richtext strips all tags and SVG returns empty. Stateless, env-free, ZERO npm deps, no Convex. Ships a PublishPreview iframe-srcdoc pane. A Wave-1 leaf of the feature-harvest ULTRAPLAN; a dependency of the planned visual-page-canvas.",
|
|
3464
|
+
"source": "rahman-resources",
|
|
3465
|
+
"slicePath": "frontend/slices/publisher-clean-html",
|
|
3466
|
+
"convexPaths": [],
|
|
3467
|
+
"npm": [],
|
|
3468
|
+
"shadcn": [],
|
|
3469
|
+
"env": [],
|
|
3470
|
+
"peers": [],
|
|
3471
|
+
"providers": [],
|
|
3472
|
+
"tags": [
|
|
3473
|
+
"content",
|
|
3474
|
+
"publisher",
|
|
3475
|
+
"html",
|
|
3476
|
+
"static-export",
|
|
3477
|
+
"sanitization",
|
|
3478
|
+
"csp",
|
|
3479
|
+
"css-dedup",
|
|
3480
|
+
"render"
|
|
3481
|
+
],
|
|
3482
|
+
"agentRecipe": "Run `npx rr add publisher-clean-html`. Build a registry: createModuleRegistry([{ id: 'base.body', render: (_p, kids) => ({ html: kids.join('') }) }, { id: 'demo.h', schema: { text: { type: 'text' } }, render: (p) => ({ html: `<h1>${p.text}</h1>`, css: 'h1{font-size:1.5rem}' }) }]). Tree = { rootNodeId, nodes: { [id]: { id, moduleId, props?, children?, classIds?, inlineStyles?, hidden? } } }. const { html } = publishPage(tree, registry, { title, cssEmission: 'inline' }). Preview: <PublishPreview html={html} />. Enable rich HTML/SVG by calling configureRichtextSanitizer(DOMPurify) once — without it, richtext/svg props fail closed (strip/empty). Props escape by schema control type, not key name."
|
|
3483
|
+
},
|
|
3484
|
+
{
|
|
3485
|
+
"slug": "content-loops",
|
|
3486
|
+
"title": "Content Loops",
|
|
3487
|
+
"category": "content",
|
|
3488
|
+
"kind": "ui",
|
|
3489
|
+
"version": "0.1.0",
|
|
3490
|
+
"description": "A data-source-driven repeater harvested from the Instatic CMS base.loop engine, decoupled from its publisher / page-tree / entryStack machinery into a plain React slice. Register pluggable LoopEntitySource backends (each declares display fields + an async fetch returning { items, totalItems }); drop <ContentLoop source|sourceId filters orderBy variants={[A, B]} /> to render one component per item, round-robining items across variants so alternating / featured layouts need no per-item branching. Ships a namespaced source registry (ids must be 'ns.name', so consumer sources can't shadow each other), createMockLoopSource for env-free previews + tests, and none/infinite pagination via useLoopPagination (a shadcn Load more button accumulates pageSize chunks). LoopItem.fields is a generic resolved-value bag — variants read item.fields.title directly, no second lookup. UI-only: no Convex tables shipped; point a source's fetch at Convex/REST when you have a backend. First slice of the feature-harvest ULTRAPLAN (docs/feature-harvest) and a dependency of the planned site-templates-engine + visual-page-canvas.",
|
|
3491
|
+
"source": "rahman-resources",
|
|
3492
|
+
"slicePath": "frontend/slices/content-loops",
|
|
3493
|
+
"convexPaths": [],
|
|
3494
|
+
"npm": [],
|
|
3495
|
+
"shadcn": [
|
|
3496
|
+
"button"
|
|
3497
|
+
],
|
|
3498
|
+
"env": [],
|
|
3499
|
+
"peers": [],
|
|
3500
|
+
"providers": [],
|
|
3501
|
+
"tags": [
|
|
3502
|
+
"content",
|
|
3503
|
+
"loop",
|
|
3504
|
+
"repeater",
|
|
3505
|
+
"list",
|
|
3506
|
+
"data-source",
|
|
3507
|
+
"pagination",
|
|
3508
|
+
"variants"
|
|
3509
|
+
],
|
|
3510
|
+
"agentRecipe": "Run `npx rr add content-loops`. Env-free demo: createMockLoopSource() then <ContentLoop source={s} pagination='infinite' pageSize={6} variants={[CardA, CardB]} /> — variants round-robin (item i -> variants[i % n]). Real source: implement LoopEntitySource { id: 'blog.posts' (namespaced 'ns.name'), fields, async fetch({ filters, orderBy, direction, limit, offset }) returns { items, totalItems } }, call loopSourceRegistry.registerOrReplace(source), then <ContentLoop sourceId='blog.posts' variants={[...]} />. item.fields holds RESOLVED values — resolve media/author inside fetch."
|
|
3511
|
+
},
|
|
3323
3512
|
{
|
|
3324
3513
|
"slug": "markdown",
|
|
3325
3514
|
"title": "Markdown — page container with CRUD tabs + diagrams",
|
|
@@ -3360,14 +3549,14 @@
|
|
|
3360
3549
|
"agentRecipe": "Run `npx rr add markdown`. Read-only: `<MarkdownReader content={md}/>`. Full surface: `<MarkdownPage content={md} tabs={['read','write','review']} onContentChange={save} comments={list} onAddComment={add} onResolveComment={resolve}/>` (omit callbacks for internal-state demo mode). Diagrams: fence ```mermaid; charts: fence ```chart with { type: bar|line|area|pie, data: [...] }. To bridge from the notion editor call `blocksToMarkdown(page.blocks)` from `@notion/shared/lib/markdown`; reverse with `markdownToBlocks(md)`."
|
|
3361
3550
|
},
|
|
3362
3551
|
{
|
|
3363
|
-
"slug": "notion",
|
|
3364
|
-
"title": "Notion — Block Editor",
|
|
3552
|
+
"slug": "notion-app",
|
|
3553
|
+
"title": "Notion App — Block Editor",
|
|
3365
3554
|
"category": "content",
|
|
3366
3555
|
"kind": "full",
|
|
3367
3556
|
"version": "1.1.1",
|
|
3368
3557
|
"description": "Nested vertical slice (slice-of-slices) housing the full notion-page-clone block editor. Mount <PageEditor pageId/> inside <EditorAdapterProvider adapter/> — with `{}` it is a working plain-text/markdown block editor (slash menu, markdown triggers `# - > [] etc.`, dnd-kit drag with column layouts, per-block toolbar with turn-into/color/duplicate, per-block undo, paste-markdown import); host capabilities light up per optional adapter: data (block+page CRUD), selection (multi-select), comments (per-block popover), ai (Ask-AI panel), database (render + picker), mention (@-typeahead), page (nav/uploads/covers). Cluster-private shared layer under @notion/* — vendored block/page/database model, uid, inline markdown, page→md/html export. Pure convex block helpers (_blocks/_blockOps, unit-tested) ship in convex/features/notion. Same markdown grammar as the standalone `markdown` slice (blocksToMarkdown/markdownToBlocks bridge).",
|
|
3369
3558
|
"source": "notion-page-clone",
|
|
3370
|
-
"slicePath": "frontend/slices/notion",
|
|
3559
|
+
"slicePath": "frontend/slices/notion-app",
|
|
3371
3560
|
"convexPaths": [
|
|
3372
3561
|
"convex/features/notion"
|
|
3373
3562
|
],
|
|
@@ -3401,17 +3590,17 @@
|
|
|
3401
3590
|
"drag-drop",
|
|
3402
3591
|
"adapter-seam"
|
|
3403
3592
|
],
|
|
3404
|
-
"agentRecipe": "Run `npx rr add notion`. Wire the `@notion/*` path alias to `./slices/notion/*` in tsconfig. Minimal mount: `<EditorAdapterProvider adapter={{ data }}><PageEditor pageId={id}/></EditorAdapterProvider>` where `data` implements EditorDataAdapter (block+page CRUD over your store — see lib/dataAdapter.ts; a localStorage reference impl lives in the rr preview). Add capabilities incrementally: `selection` for multi-select, `comments` for per-block threads, `database.renderDatabase` to mount your database renderer inside database blocks, `mention.search` for @-typeahead, `page.navigateToPage`/`uploadFile` for nav + media. Convex hosts: copy convex/features/notion (_blocks/_blockOps are pure, unit-tested array ops) and keep handlers thin."
|
|
3593
|
+
"agentRecipe": "Run `npx rr add notion-app`. Wire the `@notion/*` path alias to `./slices/notion-app/*` in tsconfig. Minimal mount: `<EditorAdapterProvider adapter={{ data }}><PageEditor pageId={id}/></EditorAdapterProvider>` where `data` implements EditorDataAdapter (block+page CRUD over your store — see lib/dataAdapter.ts; a localStorage reference impl lives in the rr preview). Add capabilities incrementally: `selection` for multi-select, `comments` for per-block threads, `database.renderDatabase` to mount your database renderer inside database blocks, `mention.search` for @-typeahead, `page.navigateToPage`/`uploadFile` for nav + media. Convex hosts: copy convex/features/notion (_blocks/_blockOps are pure, unit-tested array ops) and keep handlers thin."
|
|
3405
3594
|
},
|
|
3406
3595
|
{
|
|
3407
|
-
"slug": "
|
|
3408
|
-
"title": "
|
|
3596
|
+
"slug": "sections",
|
|
3597
|
+
"title": "Sections — composable marketing/landing sections",
|
|
3409
3598
|
"category": "content",
|
|
3410
3599
|
"kind": "ui",
|
|
3411
3600
|
"version": "0.4.0",
|
|
3412
3601
|
"description": "Canonical landing-page composition slice — replaces the former standalone hero / cta / pricing-page / faq-section / feature-grid / testimonials-grid / blog-section / portfolio-section / changelog-feed slices (all merged here as `kind` variants in v0.2.0). Ships a pure reducer (v0.4.0: LANDING_UPSERT auto-shifts sibling `order` to keep positions unique; LANDING_DELETE closes the gap) + LandingProvider store adapter + admin LandingView/LandingEditorView built on the shared CRUD primitives, plus a per-section LandingSectionShell (background image + custom Tailwind className overlay + scroll-reveal). NEW in v0.4.0: a `sections/` library of config-driven public renderers (StatsSection, TestimonialsSection, FaqSection, PricingSection, NewsletterSection, CustomSection) that read `LandingSection.config` JSON merged over template defaults — content stays dashboard-controlled without per-template renderer code; plus `parse-config` helpers (parseConfigBadge/parseConfigField) and `sections/config` guards (parseConfigObject, cfg*). Sections carry { kind, order, title, subtitle, enabled, imageUrl, imageRatio, bgImageUrl, className, config (JSON) } with up/down reorder arrows. Lifted from the _templates fleet `_shared/landing` (2026-06-11) — the 8 standalone templates ship a byte-similar copy; this rr slice is the SSOT. Used by all 7 rr website templates.",
|
|
3413
3602
|
"source": "rahman-resources (lifted from _templates fleet)",
|
|
3414
|
-
"slicePath": "frontend/slices/
|
|
3603
|
+
"slicePath": "frontend/slices/sections",
|
|
3415
3604
|
"convexPaths": [],
|
|
3416
3605
|
"npm": [
|
|
3417
3606
|
"lucide-react@^0.400.0",
|
|
@@ -3443,7 +3632,7 @@
|
|
|
3443
3632
|
"crud",
|
|
3444
3633
|
"renderer"
|
|
3445
3634
|
],
|
|
3446
|
-
"agentRecipe": "Run `npx rr add
|
|
3635
|
+
"agentRecipe": "Run `npx rr add 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 inside `<LandingSectionShell section={s}>`; for stats/testimonials/pricing/faq/newsletter/custom kinds drop in the shipped `<StatsSection/>` etc. (they read `section.config` JSON over your template defaults), or map the remaining kinds (hero/features/blog/etc.) to your own renderer. Use `parseConfigBadge(section.config)` for a section badge. Requires the template-base shared surface that ships in every rr website template: `@/components/templates/_shared/motion` (Reveal/Stagger/CountUp/Marquee/useInView — the motion-kit primitives), `@/components/templates/_shared/ui/section-head`, and `@/components/templates/_shared/crud/*`. Sections also use shadcn accordion/card/carousel + embla-carousel-autoplay."
|
|
3447
3636
|
},
|
|
3448
3637
|
{
|
|
3449
3638
|
"slug": "motion-kit",
|
|
@@ -3502,8 +3691,8 @@
|
|
|
3502
3691
|
"env": [],
|
|
3503
3692
|
"peers": [
|
|
3504
3693
|
{
|
|
3505
|
-
"slug": "
|
|
3506
|
-
"range": "^0.
|
|
3694
|
+
"slug": "payment",
|
|
3695
|
+
"range": "^0.4",
|
|
3507
3696
|
"reason": "Optional payment step — checkout page composes DokuDirectForm + DokuPaymentInstructions (or swap midtrans-payment)."
|
|
3508
3697
|
}
|
|
3509
3698
|
],
|
|
@@ -3554,14 +3743,14 @@
|
|
|
3554
3743
|
"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`."
|
|
3555
3744
|
},
|
|
3556
3745
|
{
|
|
3557
|
-
"slug": "
|
|
3558
|
-
"title": "
|
|
3746
|
+
"slug": "site-setup-wizard",
|
|
3747
|
+
"title": "Site Setup Wizard — first-run site setup",
|
|
3559
3748
|
"category": "ui",
|
|
3560
3749
|
"kind": "ui",
|
|
3561
3750
|
"version": "0.2.0",
|
|
3562
3751
|
"description": "Post-claim onboarding wizard for clone-to-own templates, graduated from the headless template surface (2026-06-06). Multi-step card flow (Identitas / Branding / Konten / Selesai) that stores ALL site config in the host backend via a props-driven save callback — a non-coder configures their site with zero code. Branding step ships a readable shadcn Select theme-preset picker (color swatches per preset + grouped headers + live preview callback — replaces the white-on-white native select), brand color quick-chips, light/dark/system default mode, logo/favicon upload via injected ImageField, and optional Analytics ID. Identity step hints invalid email format. 'Lewati setup' marks onboarded without fields and reverts any browsed-but-unsaved preset. Props-driven (R3): no convex/react import — host wires settings.upsert / seed.seedSample / setup.status into props; pairs naturally with the theme-presets slice (registry + tweakcnSwatches + previewTweakcnPreset) but works with any theme system or none.",
|
|
3563
3752
|
"source": "personal-brand-os",
|
|
3564
|
-
"slicePath": "frontend/slices/
|
|
3753
|
+
"slicePath": "frontend/slices/site-setup-wizard",
|
|
3565
3754
|
"convexPaths": [],
|
|
3566
3755
|
"npm": [],
|
|
3567
3756
|
"shadcn": [
|
|
@@ -3586,17 +3775,17 @@
|
|
|
3586
3775
|
"clone-to-own",
|
|
3587
3776
|
"templates"
|
|
3588
3777
|
],
|
|
3589
|
-
"agentRecipe": "Run `npx rr add
|
|
3778
|
+
"agentRecipe": "Run `npx rr add site-setup-wizard`. Show from your admin gate when `setup.status().onboarded === false`: `<OnboardingWizard onDone={...} save={(f) => settingsUpsert(f)} seedSample={() => seedSample({})} seeded={status?.seeded} ImageField={ImageField} presetOptions={presets} onPresetPreview={(n) => preview(n)} />`. `save` receives Partial<OnboardingFields> + `markOnboarded: true` — back it with a `settings.upsert` mutation that patches only provided fields. Theme bridge (optional): with the theme-presets slice installed build `presetOptions` from `groupTweakcnPresets(registry.items)` + `tweakcnSwatches(p)` and pass `useThemePreset().preview` as `onPresetPreview` — the picker then live-previews while the user browses and `Lewati setup` reverts via `onPresetPreview(null)`. Omit `presetOptions` to hide the picker entirely; omit `ImageField` to hide logo/favicon upload. Full wiring recipe in the slice's HOST-SETUP.md."
|
|
3590
3779
|
},
|
|
3591
3780
|
{
|
|
3592
|
-
"slug": "
|
|
3593
|
-
"title": "
|
|
3781
|
+
"slug": "file-upload",
|
|
3782
|
+
"title": "File Upload — pluggable upload + URL resolver with storage-adapter contract",
|
|
3594
3783
|
"category": "data",
|
|
3595
3784
|
"kind": "ui",
|
|
3596
3785
|
"version": "0.3.0",
|
|
3597
3786
|
"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, …).",
|
|
3598
3787
|
"source": "notion-page-clone",
|
|
3599
|
-
"slicePath": "frontend/slices/
|
|
3788
|
+
"slicePath": "frontend/slices/file-upload",
|
|
3600
3789
|
"convexPaths": [],
|
|
3601
3790
|
"npm": [],
|
|
3602
3791
|
"shadcn": [
|
|
@@ -3614,7 +3803,7 @@
|
|
|
3614
3803
|
"portable",
|
|
3615
3804
|
"notion-like"
|
|
3616
3805
|
],
|
|
3617
|
-
"agentRecipe": "Run `npx rr add
|
|
3806
|
+
"agentRecipe": "Run `npx rr add file-upload`. 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."
|
|
3618
3807
|
},
|
|
3619
3808
|
{
|
|
3620
3809
|
"slug": "selection",
|
|
@@ -3645,43 +3834,40 @@
|
|
|
3645
3834
|
"agentRecipe": "Run `npx rr add selection`. Zero deps (react-dom only). Wrap your list area in `<SelectionProvider onBulkDelete={(ids) => removeMany(ids)}>`, give the surface a `position: relative` div with a ref, drop `<SelectionMarquee containerRef={ref} />` inside it, and wrap each item in `<SelectableBlock id={item.id} orderedIds={allIds}>…</SelectableBlock>`. Hold-drag on empty space to rubber-band: drag RIGHT = window (only fully-enclosed, solid ring), drag LEFT = crossing (anything touched, dashed green). Edge-click an item to pick it (Shift = range, Cmd/Ctrl = toggle). Backspace/Delete bulk-deletes (focus outside a contentEditable), Escape + click-outside clear, floating `N selected · Delete · Clear` toolbar. Read state anywhere via `useSelection()`. The slice owns ONLY the id set — you own the data + the delete. Works on table rows / cards too, not just notion blocks."
|
|
3646
3835
|
},
|
|
3647
3836
|
{
|
|
3648
|
-
"slug": "notion-
|
|
3649
|
-
"title": "Notion
|
|
3837
|
+
"slug": "notion-ui",
|
|
3838
|
+
"title": "Notion UI — page editor · database · sidebar primitives",
|
|
3650
3839
|
"category": "ui",
|
|
3651
3840
|
"kind": "ui",
|
|
3652
|
-
"version": "0.
|
|
3653
|
-
"description": "
|
|
3654
|
-
"source": "
|
|
3655
|
-
"slicePath": "frontend/slices/notion-
|
|
3656
|
-
"convexPaths": [
|
|
3657
|
-
"template-base/database-silong/convex/handlers/databases.ts",
|
|
3658
|
-
"template-base/database-silong/convex/handlers/pages.ts",
|
|
3659
|
-
"template-base/database-silong/convex/schema.database-silong.ts"
|
|
3660
|
-
],
|
|
3841
|
+
"version": "0.24.0",
|
|
3842
|
+
"description": "The pure, props-driven Notion-clone primitives suite behind one slug, over one shared domain-type model (Block / Page / Property / Database / DbView …). page: the page + block editor (NotionPage / NotionHeader / NotionBlock, SlashMenu, block renderers, inline-markdown decorator, built-in code (highlight.js) + equation (KaTeX)). database: a drop-in 11-view database (table/board/list/gallery/calendar/feed/chart/dashboard/form/map/timeline, 18 property/cell types, per-type column config, filter/sort/group/calculate, row peek + multi-select, cell drag-fill, formula engine, CSV/JSON import-export). sidebar: a standalone tree-nav sidebar (dnd reorder + reparent with depth projection, inline rename, per-row icon picker). All stateless + callback-CRUD — the host owns the data. Install one surface with `npx rr add notion-ui page|database|sidebar`, or all with `npx rr add notion-ui`; the shared/ domain type model is copied for every variant. NOT the full Notion app — that's the separate `notion` slice (adapter + Convex backed).",
|
|
3843
|
+
"source": "notion-page-clone",
|
|
3844
|
+
"slicePath": "frontend/slices/notion-ui",
|
|
3845
|
+
"convexPaths": [],
|
|
3661
3846
|
"npm": [
|
|
3662
|
-
"
|
|
3847
|
+
"@dnd-kit/core@^6",
|
|
3848
|
+
"@dnd-kit/sortable",
|
|
3849
|
+
"@dnd-kit/utilities",
|
|
3850
|
+
"katex@^0.16.45",
|
|
3851
|
+
"highlight.js@^11.11.1",
|
|
3852
|
+
"recharts@^3",
|
|
3853
|
+
"lucide-react"
|
|
3663
3854
|
],
|
|
3664
3855
|
"shadcn": [
|
|
3665
3856
|
"button",
|
|
3666
|
-
"input",
|
|
3667
3857
|
"checkbox",
|
|
3858
|
+
"dialog",
|
|
3668
3859
|
"dropdown-menu",
|
|
3860
|
+
"input",
|
|
3669
3861
|
"popover",
|
|
3670
3862
|
"select",
|
|
3671
|
-
"
|
|
3863
|
+
"separator",
|
|
3672
3864
|
"sheet",
|
|
3865
|
+
"switch",
|
|
3673
3866
|
"toggle-group",
|
|
3674
|
-
"tooltip"
|
|
3675
|
-
"separator"
|
|
3867
|
+
"tooltip"
|
|
3676
3868
|
],
|
|
3677
3869
|
"env": [],
|
|
3678
|
-
"peers": [
|
|
3679
|
-
{
|
|
3680
|
-
"slug": "notion-shell",
|
|
3681
|
-
"range": "^0.7",
|
|
3682
|
-
"reason": "Domain types live in notion-shell. v0.7 extends Database with `locked` flag for the DatabaseMenu lock-toggle action."
|
|
3683
|
-
}
|
|
3684
|
-
],
|
|
3870
|
+
"peers": [],
|
|
3685
3871
|
"providers": [],
|
|
3686
3872
|
"tags": [
|
|
3687
3873
|
"ui",
|
|
@@ -3721,7 +3907,28 @@
|
|
|
3721
3907
|
"optional",
|
|
3722
3908
|
"embeddable"
|
|
3723
3909
|
],
|
|
3724
|
-
"agentRecipe": "**Controlled component.** `<NotionDatabase />` renders the whole surface — 11 views (table, board, list, gallery, calendar, feed, chart, dashboard, form, map, timeline), 18 cell types, filter / sort / group / calculate, row peek + multi-select, table cell drag-fill, CSV / JSON import-export. It is 100% props-driven: it owns NO data state — you hold `db` + `rows` and persist every change callback. The view tab strip scrolls horizontally and the card clips to its border, so it stays inside any container width.\n\n**1. Install** — `npx rr add notion-database`. Cascades the `notion-shell` peer (the domain types live there). Components import from `@/features/notion-
|
|
3910
|
+
"agentRecipe": "**Controlled component.** `<NotionDatabase />` renders the whole surface — 11 views (table, board, list, gallery, calendar, feed, chart, dashboard, form, map, timeline), 18 cell types, filter / sort / group / calculate, row peek + multi-select, table cell drag-fill, CSV / JSON import-export. It is 100% props-driven: it owns NO data state — you hold `db` + `rows` and persist every change callback. The view tab strip scrolls horizontally and the card clips to its border, so it stays inside any container width.\n\n**1. Install** — `npx rr add notion-ui database`. Cascades the `notion-shell` peer (the domain types live there). Components import from `@/features/notion-ui`; types from `@/features/notion-ui`.\n\n**2. Minimal wire-up** — keep `db: Database` + `rows: Page[]` in your store (a Convex query result or `useState`) and pass change handlers:\n```tsx\nimport { NotionDatabase } from '@/features/notion-ui';\n\n<NotionDatabase\n db={db}\n rows={rows}\n onRowAdd={addRow}\n onRowUpdate={(rowId, propId, value) => setValue(rowId, propId, value)}\n onRowRemove={removeRow}\n onPropertyAdd={addProperty}\n onViewActivate={setActiveView}\n onViewAdd={addView}\n onViewConfigChange={(viewId, patch) => patchView(viewId, patch)}\n/>\n```\nOmit any callback and that affordance goes read-only; pass `readOnly` to freeze everything at once.\n\n**3. Data shape** — `Database = { id, name, properties: Property[], views: DatabaseViewConfig[], activeViewId }`; each row `Page = { id, title, rowProps: Record<propId, PropertyValue> }`. For `relation` / `rollup` cells also pass `pages` + `databases`; for `person` / `created_by` cells pass `userLookup(id)`.\n\n**4. Import / export** — mount `<DatabaseIOActions db={db} rows={rows} onImport={handleImport} />` in your toolbar: CSV/JSON in (with schema-diff), CSV/JSON + live-schema templates out. New columns arrive with a `tempId` — map it to your real backend id before writing their `rowProps`.\n\n**5. Backend (optional)** — the UI is store-agnostic. For Convex persistence copy `template-base/database-silong/convex/` (handlers → `convex/`, schema fragment merges into `convex/schema.ts`). Pick `_shared/minimal/` (single-user, noop authz) or `_shared/full/` (`@convex-dev/auth` + workspaces). See CONVEX-BACKEND.md.\n\n**Just one view?** Import it directly — `import { TableView } from '@/features/notion-ui'` — and feed it `rows` + `renderCell` + `renderColumnHeader`.",
|
|
3911
|
+
"variants": {
|
|
3912
|
+
"default": "page",
|
|
3913
|
+
"shared": "shared",
|
|
3914
|
+
"items": [
|
|
3915
|
+
{
|
|
3916
|
+
"id": "page",
|
|
3917
|
+
"title": "Page",
|
|
3918
|
+
"description": "Page + block editor primitives (NotionPage / NotionBlock, SlashMenu, renderers)."
|
|
3919
|
+
},
|
|
3920
|
+
{
|
|
3921
|
+
"id": "database",
|
|
3922
|
+
"title": "Database",
|
|
3923
|
+
"description": "11-view database (NotionDatabase, filter/sort/group, formula, CSV/JSON I/O)."
|
|
3924
|
+
},
|
|
3925
|
+
{
|
|
3926
|
+
"id": "sidebar",
|
|
3927
|
+
"title": "Sidebar",
|
|
3928
|
+
"description": "Tree-nav sidebar (NotionSidebar, dnd reorder + reparent, inline rename)."
|
|
3929
|
+
}
|
|
3930
|
+
]
|
|
3931
|
+
}
|
|
3725
3932
|
},
|
|
3726
3933
|
{
|
|
3727
3934
|
"slug": "image-picker",
|
|
@@ -3766,98 +3973,6 @@
|
|
|
3766
3973
|
],
|
|
3767
3974
|
"agentRecipe": "Run `npx rr add image-picker`. The headline component is `<ImagePickerButton label=\"Change image\" onChange={(img)=>save(img)} onUpload={…} searchUnsplash={…} />` — ONE button that opens the 4-tab dialog (gallery / upload / link / Unsplash). For a reposition-able cover/hero band use `<ImageBanner image={value} onChange={save} resolvedUrl={…} onUpload={…} searchUnsplash={…} />` (also passable to notion-shell's `<NotionPage coverSlot={…} />`). Inject the backend: `onUpload` = the `files` slice's useFileUpload().upload (returns a FileRef); resolve upload images for display with `resolvedUrl` = files useFileUrl(parseFileRef(imageRef(parseImage(value))).storageId). `searchUnsplash` = `unsplashSearchVia('/api/unsplash')` — add a server route that proxies api.unsplash.com with UNSPLASH_ACCESS_KEY (never expose the key client-side). Ships a curated Unsplash + gallery fallback so it works with zero wiring. ImageValue = { type, value, positionY?, metadata? }; parseImage handles legacy string values."
|
|
3768
3975
|
},
|
|
3769
|
-
{
|
|
3770
|
-
"slug": "notion-sidebar",
|
|
3771
|
-
"title": "Notion Sidebar — tree nav + page CRUD (rename · drag · icon picker)",
|
|
3772
|
-
"category": "ui",
|
|
3773
|
-
"kind": "ui",
|
|
3774
|
-
"version": "0.1.0",
|
|
3775
|
-
"description": "Standalone Notion-style tree-nav sidebar with full page CRUD, lifted out of notion-shell so it is reusable on its own. Props-driven + fully decoupled — owns its own lightweight NotionSidebarPage type (id / title / icon / parentId), imports no other slice. Capabilities: click a row to open; DOUBLE-CLICK a title to rename inline; drag the grip to reorder AND reparent (a @dnd-kit sortable tree with horizontal-offset depth projection); collapse/expand subtrees; hover a row for +subpage / delete. Optional per-row icon PICKER — wire `renderIconPicker` + `onIconChange` (e.g. @/features/icon-picker's IconPickerPopover) so clicking a row icon opens the picker. The host owns the data and dispatches onSelect / onCreate / onRename / onDelete / onMove / onIconChange. Compose with notion-shell (page editor) + notion-database (embedded DBs) for the full Notion-clone OS — see the notion-page-clone-os template.",
|
|
3776
|
-
"source": "notion-page-clone",
|
|
3777
|
-
"slicePath": "frontend/slices/notion-sidebar",
|
|
3778
|
-
"convexPaths": [],
|
|
3779
|
-
"npm": [
|
|
3780
|
-
"@dnd-kit/core",
|
|
3781
|
-
"@dnd-kit/sortable",
|
|
3782
|
-
"@dnd-kit/utilities"
|
|
3783
|
-
],
|
|
3784
|
-
"shadcn": [
|
|
3785
|
-
"button",
|
|
3786
|
-
"input"
|
|
3787
|
-
],
|
|
3788
|
-
"env": [],
|
|
3789
|
-
"peers": [],
|
|
3790
|
-
"providers": [],
|
|
3791
|
-
"tags": [
|
|
3792
|
-
"ui",
|
|
3793
|
-
"notion",
|
|
3794
|
-
"sidebar",
|
|
3795
|
-
"tree",
|
|
3796
|
-
"nav",
|
|
3797
|
-
"page",
|
|
3798
|
-
"crud",
|
|
3799
|
-
"rename",
|
|
3800
|
-
"drag",
|
|
3801
|
-
"dnd",
|
|
3802
|
-
"reorder",
|
|
3803
|
-
"reparent",
|
|
3804
|
-
"icon-picker",
|
|
3805
|
-
"primitive",
|
|
3806
|
-
"portable",
|
|
3807
|
-
"notion-like"
|
|
3808
|
-
],
|
|
3809
|
-
"agentRecipe": "Run `npx rr add notion-sidebar`. Import `import { NotionSidebar, type NotionSidebarPage } from \"@/features/notion-sidebar\"`. Feed it a flat `pages: NotionSidebarPage[]` ({ id, title, icon, parentId }) — the sidebar builds the tree. Wire callbacks: onSelect(id), onCreate(parentId|null), onRename(id, title) [double-click a title to trigger], onDelete(id), onMove(id, parentId, beforeId) [drag the grip — reorders + reparents], onIconChange(id, icon). For rich icons pass `renderIcon` (display) + `renderIconPicker` (click-to-pick) wired to `@/features/icon-picker` (DynamicIcon + IconPickerPopover). npm: @dnd-kit/core + sortable + utilities. Pair with notion-shell (page editor) + notion-database (embedded DBs) — the notion-page-clone-os template shows the full reducer wiring."
|
|
3810
|
-
},
|
|
3811
|
-
{
|
|
3812
|
-
"slug": "notion-shell",
|
|
3813
|
-
"title": "Notion Shell — page + block editor primitives (pure, no sidebar/database)",
|
|
3814
|
-
"category": "ui",
|
|
3815
|
-
"kind": "ui",
|
|
3816
|
-
"version": "0.24.0",
|
|
3817
|
-
"description": "Portable Notion-style PAGE EDITOR primitives. v0.22 split the tree-nav SIDEBAR out into the standalone `notion-sidebar` slice (so the page editor and the sidebar are independently reusable); embedded DATABASES already live in the `notion-database` peer. notion-shell ships: NotionPage (optional cover image band + header + body), NotionHeader, NotionBlock (live inline-markdown decorator, hover actions menu, optional dragHandle slot, BUILT-IN code (highlight.js) + equation (KaTeX) blocks), 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), InlineFormatToolbar + BlockColorPicker (colour) + MentionTypeahead + PageLayoutSection (layout). SPECIALISED BLOCK RENDERERS: ImageRenderer, EmbedRenderer (YouTube/Vimeo/Loom/Figma/CodePen/Spotify auto-detect). Domain types (Database, Property, PropertyValue, DbView, DatabaseViewConfig, DatabaseFilter, DatabaseSort) remain in notion-shell as the single source of truth (Page.rowOfDatabaseId + rowProps reference them). Pure / props-driven — host owns data + change handlers. Compose notion-sidebar + notion-shell + notion-database for the full Notion-clone OS.",
|
|
3818
|
-
"source": "notion-page-clone",
|
|
3819
|
-
"slicePath": "frontend/slices/notion-shell",
|
|
3820
|
-
"convexPaths": [],
|
|
3821
|
-
"npm": [
|
|
3822
|
-
"@dnd-kit/core",
|
|
3823
|
-
"@dnd-kit/sortable",
|
|
3824
|
-
"@dnd-kit/utilities",
|
|
3825
|
-
"katex@^0.16.45",
|
|
3826
|
-
"highlight.js@^11.11.1"
|
|
3827
|
-
],
|
|
3828
|
-
"shadcn": [
|
|
3829
|
-
"button",
|
|
3830
|
-
"input",
|
|
3831
|
-
"checkbox",
|
|
3832
|
-
"dropdown-menu",
|
|
3833
|
-
"popover"
|
|
3834
|
-
],
|
|
3835
|
-
"env": [],
|
|
3836
|
-
"peers": [],
|
|
3837
|
-
"providers": [],
|
|
3838
|
-
"tags": [
|
|
3839
|
-
"ui",
|
|
3840
|
-
"notion",
|
|
3841
|
-
"shell",
|
|
3842
|
-
"wrapper",
|
|
3843
|
-
"page",
|
|
3844
|
-
"block",
|
|
3845
|
-
"editor",
|
|
3846
|
-
"primitive",
|
|
3847
|
-
"portable",
|
|
3848
|
-
"slash-menu",
|
|
3849
|
-
"decorator",
|
|
3850
|
-
"wysiwyg",
|
|
3851
|
-
"drag",
|
|
3852
|
-
"cover",
|
|
3853
|
-
"embed",
|
|
3854
|
-
"image",
|
|
3855
|
-
"code",
|
|
3856
|
-
"equation",
|
|
3857
|
-
"notion-like"
|
|
3858
|
-
],
|
|
3859
|
-
"agentRecipe": "Run `npx rr add notion-shell` for the portable PAGE EDITOR wrappers ONLY (no backend; the tree-nav sidebar is the separate `notion-sidebar` slice). NPM deps: @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/utilities. Import: `import { NotionPage, NotionBlock, SortableBlockList, PageActionsMenu, InsertBlockButton, InlineFormatToolbar, ImageRenderer, EmbedRenderer } from \"@/features/notion-shell\"`. NotionBlock ships slash menu + decorator + actions menu + dragHandle slot. **`createDefaultBlockRenderers()` returns the block-renderer registry — pass it to `<NotionBlock blockRenderers={…}>` so callout (icon+kind picker), table (editable grid), divider, image, embed, code (highlight.js) + equation (KaTeX) all render. code + equation are now BUILT-IN to notion-shell (npm: katex + highlight.js) — no adapter needed. Only `database` + `toc` are injected at the app level (they depend on host data + the sibling notion-database slice).** 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`. **v0.17 — Notion-canonical editing keys (`blockKeyHandler.ts`): Enter splits at the caret into a new block (lists continue their type; an empty list item exits to paragraph); Backspace on an empty non-paragraph downgrades it to a plain paragraph (re-triggerable with `/`); a second Backspace on an empty paragraph merges into the previous block; Arrow up/down at a line edge hops blocks. Wire the host callbacks on `<NotionBlock>`: `onInsertAfter(type, init) => newId`, `onMergeBack()`, `onFocusSibling(dir)` — plus `focusBlock(id, offset?)` exported to move the caret after a host state change. The preview `page-demo.tsx` and the notion-clone template `DocView` show full array- and reducer-based wirings.** 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.**"
|
|
3860
|
-
},
|
|
3861
3976
|
{
|
|
3862
3977
|
"slug": "workspace-shell",
|
|
3863
3978
|
"title": "Workspace Shell — atomic (workspace × menuSet) NavContext",
|
|
@@ -4015,17 +4130,21 @@
|
|
|
4015
4130
|
"agentRecipe": "Run `npx rr add pages-cms`. Wrap your admin surface in <LocalPagesProvider seed={defaultPages()}> (localStorage, zero backend) or supply your own PagesStore via <PagesProvider>. Render <PagesView publicBase adminBase> for the list and <PageEditorView id publicBase adminBase> for the editor route. Public catch-all looks up the page by slug and renders <BlocksRenderer blocks={page.blocks} />. Add block kinds by extending the PageBlock union + emptyBlock + the renderer/editor switches."
|
|
4016
4131
|
},
|
|
4017
4132
|
{
|
|
4018
|
-
"slug": "
|
|
4019
|
-
"title": "
|
|
4133
|
+
"slug": "feedback-states",
|
|
4134
|
+
"title": "Feedback States — loading skeletons + empty/error states",
|
|
4020
4135
|
"category": "ui",
|
|
4021
4136
|
"kind": "ui",
|
|
4022
4137
|
"version": "0.2.0",
|
|
4023
|
-
"description": "
|
|
4138
|
+
"description": "Two co-located placeholder surfaces behind one slug. loading: a configurable LoadingSkeleton over the shadcn Skeleton (kind presets text / card / list / table / form / page / block, overridable count + columns) plus a spinner LoadingState (inline / block / overlay) for in-flight work. empty: a configurable EmptyState over the shadcn Empty (404 / 500 / 403 / no-results / empty-list / first-use, overridable icon/title/copy/actions) plus an ErrorPage full-page wrapper for app/not-found.tsx and app/error.tsx. Install one surface with `npx rr add feedback-states loading|empty`, or both with `npx rr add feedback-states`. Replaces ad-hoc animate-pulse divs, hand-rolled Loader2 spans, and one-off error pages.",
|
|
4024
4139
|
"source": "rr original",
|
|
4025
|
-
"slicePath": "frontend/slices/
|
|
4140
|
+
"slicePath": "frontend/slices/feedback-states",
|
|
4026
4141
|
"convexPaths": [],
|
|
4027
|
-
"npm": [
|
|
4142
|
+
"npm": [
|
|
4143
|
+
"lucide-react@^0.400.0"
|
|
4144
|
+
],
|
|
4028
4145
|
"shadcn": [
|
|
4146
|
+
"skeleton",
|
|
4147
|
+
"spinner",
|
|
4029
4148
|
"empty",
|
|
4030
4149
|
"button"
|
|
4031
4150
|
],
|
|
@@ -4033,45 +4152,34 @@
|
|
|
4033
4152
|
"peers": [],
|
|
4034
4153
|
"providers": [],
|
|
4035
4154
|
"tags": [
|
|
4155
|
+
"loading",
|
|
4156
|
+
"skeleton",
|
|
4157
|
+
"spinner",
|
|
4036
4158
|
"empty-state",
|
|
4037
4159
|
"404",
|
|
4038
4160
|
"500",
|
|
4039
4161
|
"403",
|
|
4040
4162
|
"error-page",
|
|
4041
|
-
"no-results",
|
|
4042
|
-
"onboarding",
|
|
4043
|
-
"basics"
|
|
4044
|
-
],
|
|
4045
|
-
"agentRecipe": "Run `npx rr add empty-states`. Drop <EmptyState kind=\"no-results\" /> into zero-data spots; wrap with <ErrorPage kind=\"404\" /> in app/not-found.tsx and kind=\"500\" in app/error.tsx. Every preset's icon/title/description/action overridable per use."
|
|
4046
|
-
},
|
|
4047
|
-
{
|
|
4048
|
-
"slug": "loading-states",
|
|
4049
|
-
"title": "Loading States — skeletons + spinners SSOT",
|
|
4050
|
-
"category": "ui",
|
|
4051
|
-
"kind": "ui",
|
|
4052
|
-
"version": "0.2.0",
|
|
4053
|
-
"description": "Configurable LoadingSkeleton composing the shadcn Skeleton primitive: kind presets text / card / list / table / form / page / block with overridable count + columns. Spinner-based LoadingState (inline / block / overlay) covers in-flight work where a skeleton would be wrong. The page kind drops straight into a route loading.tsx (recipe in README).",
|
|
4054
|
-
"source": "rr original",
|
|
4055
|
-
"slicePath": "frontend/slices/loading-states",
|
|
4056
|
-
"convexPaths": [],
|
|
4057
|
-
"npm": [],
|
|
4058
|
-
"shadcn": [
|
|
4059
|
-
"skeleton",
|
|
4060
|
-
"spinner"
|
|
4061
|
-
],
|
|
4062
|
-
"env": [],
|
|
4063
|
-
"peers": [],
|
|
4064
|
-
"providers": [],
|
|
4065
|
-
"tags": [
|
|
4066
|
-
"loading",
|
|
4067
|
-
"skeleton",
|
|
4068
|
-
"spinner",
|
|
4069
|
-
"suspense",
|
|
4070
4163
|
"fallback",
|
|
4071
4164
|
"placeholder",
|
|
4072
4165
|
"basics"
|
|
4073
4166
|
],
|
|
4074
|
-
"agentRecipe": "Run `npx rr add
|
|
4167
|
+
"agentRecipe": "Run `npx rr add feedback-states` for both, or `npx rr add feedback-states loading` / `empty` for one surface. loading: <LoadingSkeleton kind=\"table\" count={8} /> mirrors streamed content, kind=\"page\" drops into route loading.tsx, <LoadingState variant=\"inline|block|overlay\" /> for in-flight work. empty: <EmptyState kind=\"no-results\" /> in zero-data spots, <ErrorPage kind=\"404\" /> in app/not-found.tsx and kind=\"500\" in app/error.tsx. Every preset overridable per use.",
|
|
4168
|
+
"variants": {
|
|
4169
|
+
"default": "loading",
|
|
4170
|
+
"items": [
|
|
4171
|
+
{
|
|
4172
|
+
"id": "loading",
|
|
4173
|
+
"title": "Loading",
|
|
4174
|
+
"description": "Skeletons + spinners for in-flight UI (LoadingSkeleton, LoadingState)."
|
|
4175
|
+
},
|
|
4176
|
+
{
|
|
4177
|
+
"id": "empty",
|
|
4178
|
+
"title": "Empty",
|
|
4179
|
+
"description": "404/500/403 + zero-data placeholders (EmptyState, ErrorPage)."
|
|
4180
|
+
}
|
|
4181
|
+
]
|
|
4182
|
+
}
|
|
4075
4183
|
},
|
|
4076
4184
|
{
|
|
4077
4185
|
"slug": "marketing-chrome",
|
|
@@ -4104,42 +4212,63 @@
|
|
|
4104
4212
|
"agentRecipe": "Run `npx rr add marketing-chrome`. Feed MarketingHeader { brand, nav[], cta, layout } and MarketingFooter { brand, columns[], social[], legal[], layout }. Header layout split is the default marketing pattern; footer columns for full sites, slim for single-pagers."
|
|
4105
4213
|
},
|
|
4106
4214
|
{
|
|
4107
|
-
"slug": "settings
|
|
4108
|
-
"title": "Settings
|
|
4215
|
+
"slug": "settings",
|
|
4216
|
+
"title": "Settings — account + appearance shells",
|
|
4109
4217
|
"category": "ui",
|
|
4110
4218
|
"kind": "ui",
|
|
4111
|
-
"version": "0.
|
|
4112
|
-
"description": "SettingsShell two-column
|
|
4219
|
+
"version": "1.0.0",
|
|
4220
|
+
"description": "Two settings surfaces behind one slug, each adapter-driven so the slice owns no data. account: SettingsShell two-column surface (nav collapses to a Select on mobile) — Profile (avatar/name/email/bio), Preferences (theme/language/density), Notifications (switch rows), Danger zone (AlertDialog-confirmed delete) over an ASYNC SettingsAdapter { load, save(patch) } with optimistic save + rollback; createMemoryAdapter ships for demos. appearance: AppearancePanel (style/mode/accent/wallpaper/reduce-transparency/display) over a SYNC per-setting AppearanceAdapter, plus the generic SettingsSection / SettingsRow / Segmented / AccentSwatches primitives you compose custom panels from. Install one surface with `npx rr add settings account|appearance`, or both with `npx rr add settings`.",
|
|
4113
4221
|
"source": "rr original",
|
|
4114
|
-
"slicePath": "frontend/slices/settings
|
|
4222
|
+
"slicePath": "frontend/slices/settings",
|
|
4115
4223
|
"convexPaths": [],
|
|
4116
|
-
"npm": [
|
|
4224
|
+
"npm": [
|
|
4225
|
+
"lucide-react@^0.400.0"
|
|
4226
|
+
],
|
|
4117
4227
|
"shadcn": [
|
|
4118
|
-
"
|
|
4228
|
+
"alert-dialog",
|
|
4229
|
+
"avatar",
|
|
4119
4230
|
"button",
|
|
4231
|
+
"card",
|
|
4120
4232
|
"input",
|
|
4121
4233
|
"label",
|
|
4122
|
-
"switch",
|
|
4123
4234
|
"select",
|
|
4124
4235
|
"separator",
|
|
4125
|
-
"
|
|
4126
|
-
"
|
|
4236
|
+
"skeleton",
|
|
4237
|
+
"switch",
|
|
4127
4238
|
"textarea",
|
|
4128
|
-
"
|
|
4239
|
+
"toggle-group"
|
|
4129
4240
|
],
|
|
4130
4241
|
"env": [],
|
|
4131
4242
|
"peers": [],
|
|
4132
4243
|
"providers": [],
|
|
4133
4244
|
"tags": [
|
|
4134
4245
|
"settings",
|
|
4135
|
-
"account",
|
|
4136
|
-
"profile",
|
|
4137
4246
|
"preferences",
|
|
4138
|
-
"
|
|
4139
|
-
"
|
|
4247
|
+
"account",
|
|
4248
|
+
"appearance",
|
|
4249
|
+
"theme",
|
|
4250
|
+
"adapter",
|
|
4251
|
+
"shell",
|
|
4252
|
+
"primitives",
|
|
4253
|
+
"ui",
|
|
4140
4254
|
"basics"
|
|
4141
4255
|
],
|
|
4142
|
-
"agentRecipe": "Run `npx rr add settings
|
|
4256
|
+
"agentRecipe": "Run `npx rr add settings` for both, or `npx rr add settings account` / `appearance` for one. account: implement SettingsAdapter { load, save } over your backend (Convex query + mutation), pass to <SettingsShell adapter>; save gets per-section partial patches (shallow-merge server-side); onDeleteAccount wires the danger zone. appearance: build an AppearanceAdapter (per-setting SegSetting values) from your appearance store, pass to <AppearancePanel appearance>; or compose custom panels from <SettingsSection>/<SettingsRow>/<Segmented>/<AccentSwatches>.",
|
|
4257
|
+
"variants": {
|
|
4258
|
+
"default": "account",
|
|
4259
|
+
"items": [
|
|
4260
|
+
{
|
|
4261
|
+
"id": "account",
|
|
4262
|
+
"title": "Account",
|
|
4263
|
+
"description": "Profile/preferences/notifications/danger-zone shell over an async load+save adapter."
|
|
4264
|
+
},
|
|
4265
|
+
{
|
|
4266
|
+
"id": "appearance",
|
|
4267
|
+
"title": "Appearance",
|
|
4268
|
+
"description": "Style/mode/accent/wallpaper/display shell over a sync per-setting adapter + the shared Section/Row/Segmented primitives."
|
|
4269
|
+
}
|
|
4270
|
+
]
|
|
4271
|
+
}
|
|
4143
4272
|
},
|
|
4144
4273
|
{
|
|
4145
4274
|
"slug": "notifications-center",
|
|
@@ -4176,14 +4305,14 @@
|
|
|
4176
4305
|
"agentRecipe": "Run `npx rr add notifications-center`. Mount <NotificationBell adapter> in your topbar. Implement NotificationsAdapter over your feed (Convex query + mutations) or start with createMemoryNotificationsAdapter(seed). surface=\"sheet\" for mobile-heavy apps."
|
|
4177
4306
|
},
|
|
4178
4307
|
{
|
|
4179
|
-
"slug": "
|
|
4180
|
-
"title": "
|
|
4308
|
+
"slug": "design-studio",
|
|
4309
|
+
"title": "Design Studio — photo / social design canvas",
|
|
4181
4310
|
"category": "os",
|
|
4182
4311
|
"kind": "ui",
|
|
4183
4312
|
"version": "1.0.0",
|
|
4184
4313
|
"description": "A layered canvas studio: image/text/shape layers with filters, masks, transforms, safe-area guides and aspect presets (1:1/4:5/9:16/16:9), plus an export modal (download / copy / import JSON). Runs fully offline on bundled gradient-SVG samples. Host wiring is one call: configureMediaStudio({ saveDoc, imageSources }) lights up Save-to-host and feeds real image sources. Self-contained: inspector hooks are inert seams in lib/host.ts.",
|
|
4185
4314
|
"source": "rahmanef63/os-vps",
|
|
4186
|
-
"slicePath": "frontend/slices/
|
|
4315
|
+
"slicePath": "frontend/slices/design-studio",
|
|
4187
4316
|
"convexPaths": [],
|
|
4188
4317
|
"npm": [
|
|
4189
4318
|
"lucide-react"
|
|
@@ -4207,7 +4336,7 @@
|
|
|
4207
4336
|
"design",
|
|
4208
4337
|
"ui"
|
|
4209
4338
|
],
|
|
4210
|
-
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Layered canvas editor. Fully client-side; no backend required.\n\nSTEP 1 — Install. `npx rr add
|
|
4339
|
+
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Layered canvas editor. Fully client-side; no backend required.\n\nSTEP 1 — Install. `npx rr add design-studio`. Ensure `@/features/design-studio` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: button, dialog, badge, tooltip, scroll-area.\n\nSTEP 3 — Mount. `<MediaStudio />` in a height-bearing box — unwired it edits bundled sample layers. Or register `mediaStudioApp` in an appshell manifest.\n\nSTEP 4 — Host wiring. `configureMediaStudio({ saveDoc, imageSources })` — saveDoc persists the serialized document (enables Save-to-host in the export modal); imageSources supplies image URLs for new layers."
|
|
4211
4340
|
},
|
|
4212
4341
|
{
|
|
4213
4342
|
"slug": "quicklinks",
|
|
@@ -4236,37 +4365,6 @@
|
|
|
4236
4365
|
"ui"
|
|
4237
4366
|
],
|
|
4238
4367
|
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Website shortcut grid. Fully client-side; no backend required.\n\nSTEP 1 — Install. `npx rr add quicklinks`. Ensure `@/features/quicklinks` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: button.\n\nSTEP 3 — Mount. `<Quicklinks />` — unwired it persists to localStorage (\"rr:quicklinks\") with 4 demo seeds. Or register `quicklinksApp` in an appshell manifest.\n\nSTEP 4 — Host store. `configureQuicklinks(store)` with { get, subscribe, add, remove, hydrate? } — or feed appshell's useQuickLinks capability from the same store so dock shortcuts stay in sync."
|
|
4239
|
-
},
|
|
4240
|
-
{
|
|
4241
|
-
"slug": "shell-settings",
|
|
4242
|
-
"title": "Shell Settings — settings-app UI primitives",
|
|
4243
|
-
"category": "ui",
|
|
4244
|
-
"kind": "ui",
|
|
4245
|
-
"version": "1.0.0",
|
|
4246
|
-
"description": "The settings-app building blocks: SettingsSection, Row, AccentSwatches, a slice-local Segmented control, and a ready AppearancePanel (style/mode/accent/wallpaper/device/transparency groups — every group optional). Pure presentation: the injected AppearanceAdapter IS the contract, so it binds to any appearance store (appshell capabilities, zustand, plain useState) with zero slice edits.",
|
|
4247
|
-
"source": "rahmanef63/os-vps",
|
|
4248
|
-
"slicePath": "frontend/slices/shell-settings",
|
|
4249
|
-
"convexPaths": [],
|
|
4250
|
-
"npm": [
|
|
4251
|
-
"lucide-react"
|
|
4252
|
-
],
|
|
4253
|
-
"shadcn": [
|
|
4254
|
-
"button",
|
|
4255
|
-
"switch",
|
|
4256
|
-
"toggle-group",
|
|
4257
|
-
"separator"
|
|
4258
|
-
],
|
|
4259
|
-
"env": [],
|
|
4260
|
-
"peers": [],
|
|
4261
|
-
"providers": [],
|
|
4262
|
-
"tags": [
|
|
4263
|
-
"settings",
|
|
4264
|
-
"preferences",
|
|
4265
|
-
"appearance",
|
|
4266
|
-
"primitives",
|
|
4267
|
-
"ui"
|
|
4268
|
-
],
|
|
4269
|
-
"agentRecipe": "Stack: Next 16 + React 19 + Tailwind 4 + shadcn/ui. Settings UI primitives. Pure presentation; state injected.\n\nSTEP 1 — Install. `npx rr add shell-settings`. Ensure `@/features/shell-settings` resolves and Tailwind scans the slice folder.\n\nSTEP 2 — Deps. npm: `lucide-react`. shadcn: button, switch, toggle-group, separator.\n\nSTEP 3 — Mount. `<AppearancePanel adapter={adapter} />` with an AppearanceAdapter (all groups optional — omit a group to hide it), or compose SettingsSection/Row/AccentSwatches/Segmented directly for custom panels.\n\nSTEP 4 — Bind. Wire the adapter to your appearance store (theme mode, accent, wallpaper, device, transparency) — the panel re-renders from the values you pass; no internal state."
|
|
4270
4368
|
}
|
|
4271
4369
|
]
|
|
4272
4370
|
}
|