diff --git a/packages/cta-engine/templates/react/add-on/legend-state/assets/src/lib/demo-legend-state.ts b/packages/cta-engine/templates/react/add-on/legend-state/assets/src/lib/demo-legend-state.ts new file mode 100644 index 00000000..02bd146b --- /dev/null +++ b/packages/cta-engine/templates/react/add-on/legend-state/assets/src/lib/demo-legend-state.ts @@ -0,0 +1,19 @@ +import { observable } from "@legendapp/state"; +import { ObservablePersistLocalStorage } from "@legendapp/state/persist-plugins/local-storage"; +import { syncObservable } from "@legendapp/state/sync"; + +type Todo = { + id: number; + text: string; + completed: boolean; +}; +// Create an observable +export const todos$ = observable([]); + +// Persist the observable +syncObservable(todos$, { + persist: { + name: "demo-legend-state-todos", + plugin: ObservablePersistLocalStorage, + }, +}); diff --git a/packages/cta-engine/templates/react/add-on/legend-state/assets/src/routes/demo.legend-state.tsx.ejs b/packages/cta-engine/templates/react/add-on/legend-state/assets/src/routes/demo.legend-state.tsx.ejs new file mode 100644 index 00000000..3580e635 --- /dev/null +++ b/packages/cta-engine/templates/react/add-on/legend-state/assets/src/routes/demo.legend-state.tsx.ejs @@ -0,0 +1,95 @@ +import { <% if (fileRouter) { %>createFileRoute<% } else { %>createRoute<% } %> } from '@tanstack/react-router' +import { todos$ } from "@/lib/demo-legend-state"; +import { For, useObservable } from "@legendapp/state/react"; +import { $React } from "@legendapp/state/react-web"; +<% if (codeRouter) { %> +import type { RootRoute } from '@tanstack/react-router' +<% } else { %> +export const Route = createFileRoute('/demo/legend-state')({ + component: LegendStateDemo, +}) +<% } %> + +function TodoForm() { + const todoText$ = useObservable(""); + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (todoText$.peek().trim() === "") return; + todos$.push({ id: Date.now(), text: todoText$.peek().trim(), completed: false }); + todoText$.set(""); + }; + return ( +
+ <$React.input + placeholder="Add a todo" + type="text" + $value={todoText$} + className="bg-white/10 rounded-lg px-4 py-2 outline-none border border-white/20 hover:border-white/40 focus:border-white/60 transition-colors duration-200 placeholder-white/40 w-full" + /> +
+ ); +} +function TodoList() { + return ( + + ); +} + +function LegendStateDemo() { + return ( +
+
+

Legend State Example

+ + +
+
+ ); +} + + +<% if (codeRouter) { %> +export default (parentRoute: RootRoute) => createRoute({ + path: '/demo/legend-state', + component: LegendStateDemo, + getParentRoute: () => parentRoute, +}) +<% } %> diff --git a/packages/cta-engine/templates/react/add-on/legend-state/info.json b/packages/cta-engine/templates/react/add-on/legend-state/info.json new file mode 100644 index 00000000..e1175191 --- /dev/null +++ b/packages/cta-engine/templates/react/add-on/legend-state/info.json @@ -0,0 +1,13 @@ +{ + "name": "Legend State", + "description": "A state manager with built-in sync engine to persist state locally or remotely", + "phase": "add-on", + "templates": ["file-router", "code-router"], + "link": "https://legendapp.com/open-source/state/v3/", + "routes": [ + { + "url": "/demo/legend-state", + "name": "Legend State" + } + ] +} diff --git a/packages/cta-engine/templates/react/add-on/legend-state/package.json b/packages/cta-engine/templates/react/add-on/legend-state/package.json new file mode 100644 index 00000000..7924b00c --- /dev/null +++ b/packages/cta-engine/templates/react/add-on/legend-state/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@legendapp/state": "3.0.0-beta.30" + } +}