create-coline-app 2.2.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +86 -0
- package/README.md +60 -7
- package/assets/preview-host.ts +130 -0
- package/bin/_run.mjs +11 -2
- package/package.json +9 -4
- package/src/check.ts +46 -0
- package/src/cli.test.ts +154 -0
- package/src/cli.ts +12 -1
- package/src/client-build.ts +50 -0
- package/src/dev.ts +6 -5
- package/src/preview-capture.ts +101 -0
- package/src/preview.ts +189 -0
- package/src/push.ts +8 -47
- package/src/scaffold.ts +6 -0
- package/templates/backendless/.agents/skills/coline-app-development/SKILL.md +36 -0
- package/templates/backendless/.agents/skills/coline-app-development/references/live-records.md +53 -0
- package/templates/backendless/.agents/skills/coline-ui-design/SKILL.md +67 -0
- package/templates/backendless/.agents/skills/coline-ui-design/assets/board.png +0 -0
- package/templates/backendless/.agents/skills/coline-ui-design/assets/settings.png +0 -0
- package/templates/backendless/.agents/skills/coline-ui-design/assets/triage.png +0 -0
- package/templates/backendless/.agents/skills/coline-ui-review/SKILL.md +39 -0
- package/templates/backendless/AGENTS.md +79 -194
- package/templates/backendless/CLAUDE.md +1 -5
- package/templates/backendless/README.md +22 -27
- package/templates/backendless/app.config.ts +19 -11
- package/templates/backendless/app.css +84 -0
- package/templates/backendless/examples/board.tsx +173 -0
- package/templates/backendless/examples/settings.tsx +117 -0
- package/templates/backendless/examples/triage.tsx +253 -0
- package/templates/backendless/main.tsx +232 -0
- package/templates/backendless/package.json +16 -6
- package/templates/backendless/preview.seed.ts +26 -0
|
@@ -1,196 +1,81 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- `
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
name: "__APP_NAME__",
|
|
36
|
-
description: "…",
|
|
37
|
-
permissions: [...], // ONLY what you use — users see this list
|
|
38
|
-
hosting: { default: "coline" },// hosted runtime (no external server)
|
|
39
|
-
surfaces: { home: { tier: "tree" } }, // or { tier: "react" } with main.tsx
|
|
40
|
-
files: [...], // custom file types (optional)
|
|
41
|
-
tools: [...], // Kairo tools (optional)
|
|
42
|
-
handlers: { renderHome: async (context) => uiNode },
|
|
43
|
-
});
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### Permissions (request the minimum)
|
|
47
|
-
|
|
48
|
-
| key | grants |
|
|
49
|
-
| --- | --- |
|
|
50
|
-
| `storage.app` | app key-value + record collections |
|
|
51
|
-
| `files.read` / `files.write` | read / create workspace files |
|
|
52
|
-
| `drives.app` | a private drive owned by the app |
|
|
53
|
-
| `members.read` | list workspace members |
|
|
54
|
-
| `search.index` / `search.query` | add to / query workspace search |
|
|
55
|
-
| `notifications.write` | send notifications |
|
|
56
|
-
| `ai.generate` | call Coline's AI model (200/day) |
|
|
57
|
-
| `ai.tools` | expose tools to Kairo (the workspace AI) |
|
|
58
|
-
| `events.emit` | publish app events |
|
|
59
|
-
| `commands.register` | add command-palette commands |
|
|
60
|
-
| `realtime.subscribe` | live updates in the UI |
|
|
61
|
-
| `network.external` | HTTPS fetch to allowlisted hosts only |
|
|
62
|
-
|
|
63
|
-
## Tools (`defineTool`) — how Kairo operates your app
|
|
64
|
-
|
|
65
|
-
```ts
|
|
66
|
-
const logDecision = defineTool({
|
|
67
|
-
name: "__APP_KEY__.log_decision", // MUST be prefixed with the app key
|
|
68
|
-
description: "…", // what Kairo reads to pick the tool
|
|
69
|
-
input: z.object({ title: z.string().min(1) }), // zod schema
|
|
70
|
-
effect: "write", // read | write | destructive | external
|
|
71
|
-
execute: async (input, context) => {
|
|
72
|
-
// context.coline — the capability client
|
|
73
|
-
// context.workspace — { id, slug, name }
|
|
74
|
-
// context.actor — who invoked it
|
|
75
|
-
return {
|
|
76
|
-
output: { id: "…" }, // structured result for the model
|
|
77
|
-
card: ui.stack([...]), // optional rich card shown in chat
|
|
78
|
-
};
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
`effect` is ENFORCED by the runtime, not a hint: a `read` tool cannot
|
|
84
|
-
write. Reads auto-approve; `write` follows the session's permission mode;
|
|
85
|
-
`destructive`/`external` always prompt the user. Be honest.
|
|
86
|
-
|
|
87
|
-
## Storage — `coline.storage`
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
// Key-value
|
|
91
|
-
await context.coline.storage.kv.set("settings", { theme: "auto" });
|
|
92
|
-
const settings = await context.coline.storage.kv.get("settings");
|
|
93
|
-
|
|
94
|
-
// Typed record collections (the main data store)
|
|
95
|
-
interface Decision { title: string; status: "proposed" | "decided"; tags: string[] }
|
|
96
|
-
const decisions = context.coline.storage.collection<Decision>("decisions");
|
|
97
|
-
|
|
98
|
-
const rec = await decisions.insert({ title: "Use Postgres", status: "decided", tags: ["infra"] });
|
|
99
|
-
await decisions.update(rec.id, { status: "proposed" });
|
|
100
|
-
await decisions.get(rec.id); // envelope | null
|
|
101
|
-
await decisions.delete(rec.id);
|
|
102
|
-
const { records, nextCursor } = await decisions.query({
|
|
103
|
-
where: { status: "decided" }, // exact-match on top-level fields
|
|
104
|
-
orderBy: "title", order: "asc", // or omit for newest-first
|
|
105
|
-
limit: 50, cursor: undefined,
|
|
106
|
-
});
|
|
107
|
-
// Every record comes wrapped: { id, createdBy, createdAt, updatedAt, data }
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Limits: 5,000 kv keys · 200,000 records per collection · 200 kB per value.
|
|
111
|
-
`query.where` is exact-match only — filter/search in memory after querying
|
|
112
|
-
when you need contains/ranges (keep result sets bounded with `limit`).
|
|
113
|
-
|
|
114
|
-
## UI — two tiers
|
|
115
|
-
|
|
116
|
-
### Tree tier (`ui.*` builders) — renders everywhere incl. mobile & chat cards
|
|
117
|
-
|
|
118
|
-
`ui.stack(children, { direction?, gap? })` · `ui.row(children)` ·
|
|
119
|
-
`ui.heading(text, { level? 1-4 })` · `ui.text(text, { tone? })` ·
|
|
120
|
-
`ui.badge(text, { tone? })` · `ui.card({ title?, description?, children?, footer? })` ·
|
|
121
|
-
`ui.button({ label, action, variant? })` · `ui.divider()` ·
|
|
122
|
-
`ui.emptyState({ title, description? })` · `ui.fileCard({ title, fileId, action? })` ·
|
|
123
|
-
`ui.table({ columns, rows })` · `ui.link({ label, href })` · `ui.image({ src, alt })`
|
|
124
|
-
|
|
125
|
-
Tones: `default | muted | positive | warning | danger`.
|
|
126
|
-
Actions: `actions.openFile(fileId)`, `actions.openAppHome()`,
|
|
127
|
-
`actions.navigate(path)`, `actions.createFile(...)`, `actions.custom(name, payload)`.
|
|
128
|
-
Chat cards (tool results) allow a validated subset — keep them simple
|
|
129
|
-
(stack/heading/text/badge/table/fileCard are all safe). Max 120 nodes.
|
|
130
|
-
|
|
131
|
-
### React tier (`main.tsx` + `@colineapp/ui`) — full React in a sandbox
|
|
132
|
-
|
|
133
|
-
Set `surfaces: { home: { tier: "react" } }` and create `main.tsx`:
|
|
134
|
-
|
|
135
|
-
```tsx
|
|
136
|
-
import { createRoot } from "react-dom/client";
|
|
137
|
-
import { ColineAppProvider, useColine, useColineQuery, useColineContext } from "@colineapp/ui";
|
|
138
|
-
|
|
139
|
-
function Home() {
|
|
140
|
-
const coline = useColine(); // capability client
|
|
141
|
-
const { data, isLoading, error, refetch } = // simple async hook
|
|
142
|
-
useColineQuery(() => coline.storage.collection("decisions").query({ limit: 100 }), []);
|
|
143
|
-
// …render
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const root = document.getElementById("root");
|
|
147
|
-
if (root) createRoot(root).render(<ColineAppProvider><Home /></ColineAppProvider>);
|
|
1
|
+
# Building __APP_NAME__
|
|
2
|
+
|
|
3
|
+
Use the installed public packages, this project, and its examples. Do not inspect
|
|
4
|
+
the private Coline product repository to discover app APIs. User instructions
|
|
5
|
+
and the product's existing design take precedence over starter preferences.
|
|
6
|
+
|
|
7
|
+
## Start here
|
|
8
|
+
|
|
9
|
+
- `app.config.ts`: hosted manifest, permissions, tools, file types, tree fallbacks.
|
|
10
|
+
- `main.tsx`: sandboxed React home/editor inside `ColineAppProvider`.
|
|
11
|
+
- `app.css`: app styling. Tailwind v4 and ordinary CSS compile automatically.
|
|
12
|
+
- `preview.seed.ts`: disposable local fixtures; never imported by production entries.
|
|
13
|
+
- `examples/`: working UI references with local state, not persistent business data.
|
|
14
|
+
- `app.test.ts`: logic tests using the public in-memory workspace.
|
|
15
|
+
|
|
16
|
+
For UI work, read `.agents/skills/coline-ui-design/SKILL.md`, choose the closest
|
|
17
|
+
example, then use `.agents/skills/coline-ui-review/SKILL.md` to finish. These
|
|
18
|
+
experimental skills are plain Markdown: follow them even if your agent has no
|
|
19
|
+
skill loader. Development details: `.agents/skills/coline-app-development/SKILL.md`.
|
|
20
|
+
|
|
21
|
+
## Working loop
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
npm install
|
|
25
|
+
npm test
|
|
26
|
+
npm run check
|
|
27
|
+
npm run preview
|
|
28
|
+
# Other working screen references:
|
|
29
|
+
npm run preview -- --pattern triage
|
|
30
|
+
npm run preview -- --pattern board
|
|
31
|
+
npm run preview -- --pattern settings
|
|
32
|
+
# Install Chromium once for captures:
|
|
33
|
+
npx playwright install chromium
|
|
34
|
+
npm run screenshots
|
|
148
35
|
```
|
|
149
36
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
import
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
- Explicit loading, empty, and error states for every async view.
|
|
196
|
-
- Dark mode must work — it's automatic if you use theme tokens.
|
|
37
|
+
Preview uses simulated data, requires no credentials, resets on reload, and
|
|
38
|
+
reloads when source changes. Theme and state selectors expose ready, empty,
|
|
39
|
+
error, loading, and permission-denied states. Screenshots and a mechanical
|
|
40
|
+
browser report go in `.coline/screenshots`. Inspect the pictures and exercise
|
|
41
|
+
controls: passing checks cannot prove that a UI looks good.
|
|
42
|
+
Stop only the preview terminal session/PID you started; never kill processes by
|
|
43
|
+
a shared name. The screenshot command cleans up its own server.
|
|
44
|
+
|
|
45
|
+
`npm run dev -- --internal` and `npm run push -- --internal` upload to Coline.
|
|
46
|
+
They need `COLINE_API_KEY` with `apps.write`; `COLINE_BASE_URL` selects the host.
|
|
47
|
+
Use these when publishing is in the user's scope. Local preview is not proof of
|
|
48
|
+
hosted authorization, persistence, multiplayer, delivery, or performance.
|
|
49
|
+
|
|
50
|
+
## Build with the public contract
|
|
51
|
+
|
|
52
|
+
Use `@colineapp/sdk/v2`, `@colineapp/sdk/testing`, and `@colineapp/ui`.
|
|
53
|
+
Import UI styles, then `./app.css`. Use complete utility class strings;
|
|
54
|
+
`bg-${tone}` cannot be discovered by Tailwind. Use a fixed class map instead.
|
|
55
|
+
The CLI bundles installed browser-compatible dependencies, CSS, and inline
|
|
56
|
+
assets; there is no separate CSS command. Do not import preview fixtures into
|
|
57
|
+
`main.tsx` or `app.config.ts`.
|
|
58
|
+
|
|
59
|
+
Use `useColine()` for capabilities. `useColineQuery(loader, deps)` provides
|
|
60
|
+
bounded loading/error/refetch for files and other reads. For collaborative
|
|
61
|
+
records use `useLiveCollection`; it owns optimistic updates, version checks,
|
|
62
|
+
reconciliation, and subscriptions. Catch mutation rejections, show recovery,
|
|
63
|
+
and never retry a conflicting write blindly. Check installed declarations for
|
|
64
|
+
query operators and method arguments; do not guess APIs.
|
|
65
|
+
|
|
66
|
+
Store documents as files and structured app data in install-private collections.
|
|
67
|
+
Use `expectedVersion` when saving a document. Record access policies enforce
|
|
68
|
+
workspace/readers/writers on the server; hiding a button is not authorization.
|
|
69
|
+
Native tasks/calendar/messages/references and shared files require explicit
|
|
70
|
+
permissions and retain the invoking user's access. Render handlers/previews are
|
|
71
|
+
read-only; interactive home/editor capabilities can write within grants.
|
|
72
|
+
|
|
73
|
+
Prefix tools with the app key, validate input with `zod/v4`, and declare honest
|
|
74
|
+
effects. UI can call `coline.tools.invoke` to share a tool with Kairo. Tree
|
|
75
|
+
handlers use `ui.*`; chat cards use the restricted chat subset. Use tree mobile
|
|
76
|
+
fallbacks where declared; a narrow browser preview does not prove native mobile.
|
|
77
|
+
|
|
78
|
+
No direct API routes, credentials, cookies, or localStorage in the sandbox.
|
|
79
|
+
External calls use `coline.net.fetch` and declared allowlists. Keep React state
|
|
80
|
+
for transient UI, not as a substitute for saved records. Do not imply CRDT text
|
|
81
|
+
editing, durable offline queues, presence, or public hosting from live records.
|
|
@@ -1,5 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Read and follow [`AGENTS.md`](./AGENTS.md) — it contains the complete
|
|
4
|
-
Coline App contract: capabilities, tools, storage, UI builders, sandbox
|
|
5
|
-
rules, limits, and testing patterns.
|
|
1
|
+
Read AGENTS.md before working. It contains the public SDK contract, local preview commands, and links to the bundled experimental UI skills.
|
|
@@ -1,38 +1,33 @@
|
|
|
1
1
|
# __APP_NAME__
|
|
2
2
|
|
|
3
|
-
A
|
|
4
|
-
hosted runtime — no servers to deploy.
|
|
5
|
-
|
|
6
|
-
## Develop
|
|
3
|
+
A Coline App with a working notes home, editor, tool, and tree fallback.
|
|
7
4
|
|
|
8
5
|
```sh
|
|
9
6
|
npm install
|
|
10
|
-
npm test
|
|
7
|
+
npm test
|
|
8
|
+
npm run check
|
|
9
|
+
npm run preview
|
|
11
10
|
```
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
**Workspace Settings → API**, then:
|
|
12
|
+
Preview runs locally with disposable fixtures, no account or API key. Try its
|
|
13
|
+
light/dark themes and ready/empty/error/loading/permission states. Source edits
|
|
14
|
+
reload the preview. `preview.seed.ts` defines local fixtures.
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
For other layouts, run `npm run preview -- --pattern triage`, `board`, or
|
|
17
|
+
`settings`. Copy and adapt the examples to your product, then connect their local
|
|
18
|
+
state to SDK data. `app.css` supports ordinary CSS and automatically compiled
|
|
19
|
+
Tailwind utilities.
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
For browser captures, install Chromium once with `npx playwright install chromium`,
|
|
22
|
+
then run `npm run screenshots`. Inspect `.coline/screenshots` and its report.
|
|
23
|
+
This catches browser errors, overflow, and missing form labels; visual quality
|
|
24
|
+
and interactions still need review.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Read [AGENTS.md](AGENTS.md) for the SDK contract and bundled experimental design,
|
|
27
|
+
development, and review skills. They work as plain instructions with any agent;
|
|
28
|
+
models with limited visual or tool abilities may need human review.
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Coline shows files, including mobile and Kairo chat.
|
|
33
|
-
- Add a React editor by setting a file surface to
|
|
34
|
-
`{ tier: "react", entry: "main.tsx" }` and creating `main.tsx`.
|
|
35
|
-
- Store app-private data with `coline.storage.kv` and
|
|
36
|
-
`coline.storage.collection(name)`.
|
|
37
|
-
- Call external APIs with `coline.net.fetch` after declaring
|
|
38
|
-
`network.external` hosts in the manifest.
|
|
30
|
+
To upload, set `COLINE_API_KEY` (workspace key with `apps.write`) and optionally
|
|
31
|
+
`COLINE_BASE_URL`, then run `npm run push -- --internal`. `npm run dev -- --internal`
|
|
32
|
+
watches and updates a development version. Local preview does not test production
|
|
33
|
+
persistence, authorization, multiplayer, or deployment.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod/v4";
|
|
2
2
|
import { actions, defineApp, defineFileType, defineTool, ui } from "@colineapp/sdk/v2";
|
|
3
3
|
|
|
4
|
-
// __APP_NAME__ — a backendless Coline App. Everything here runs on
|
|
4
|
+
// __APP_NAME__ — a hosted, backendless Coline App. Everything here runs on
|
|
5
5
|
// Coline's hosted runtime: no servers, no deploys. `coline-app push`
|
|
6
6
|
// uploads this file as the logic bundle and main.tsx as client source.
|
|
7
7
|
|
|
@@ -11,16 +11,14 @@ const noteFileType = defineFileType({
|
|
|
11
11
|
name: "__APP_NAME__ Note",
|
|
12
12
|
indexable: true,
|
|
13
13
|
surfaces: {
|
|
14
|
+
editor: { tier: "react", entry: "main.tsx" },
|
|
14
15
|
preview: { tier: "tree" },
|
|
15
16
|
inline: { tier: "tree" },
|
|
16
17
|
},
|
|
17
18
|
},
|
|
18
19
|
runtime: {
|
|
19
20
|
renderPreview: (context) =>
|
|
20
|
-
ui.stack([
|
|
21
|
-
ui.heading(context.file.name),
|
|
22
|
-
ui.text(String(context.document.body ?? "")),
|
|
23
|
-
]),
|
|
21
|
+
ui.stack([ui.heading(context.file.name), ui.text(String(context.document.body ?? ""))]),
|
|
24
22
|
renderInline: (context) => ui.text(context.file.name),
|
|
25
23
|
index: {
|
|
26
24
|
title: (document) => String(document.title ?? "Untitled note"),
|
|
@@ -41,7 +39,7 @@ const createNote = defineTool({
|
|
|
41
39
|
const file = await context.coline.files.create({
|
|
42
40
|
typeKey: "__APP_KEY__.note",
|
|
43
41
|
name: input.title,
|
|
44
|
-
document: { body: input.body },
|
|
42
|
+
document: { title: input.title, body: input.body },
|
|
45
43
|
});
|
|
46
44
|
return {
|
|
47
45
|
output: { fileId: file.fileId },
|
|
@@ -57,15 +55,19 @@ export default defineApp({
|
|
|
57
55
|
key: "__APP_KEY__",
|
|
58
56
|
name: "__APP_NAME__",
|
|
59
57
|
description: "A starter Coline App.",
|
|
60
|
-
permissions: ["files.read", "files.write", "storage.app", "ai.tools"],
|
|
58
|
+
permissions: ["files.read", "files.write", "storage.app", "ai.tools", "drives.app"],
|
|
61
59
|
hosting: { default: "coline" },
|
|
62
60
|
surfaces: {
|
|
63
|
-
home: {
|
|
61
|
+
home: {
|
|
62
|
+
tier: "react",
|
|
63
|
+
entry: "main.tsx",
|
|
64
|
+
mobile: { tier: "tree" },
|
|
65
|
+
},
|
|
64
66
|
},
|
|
65
67
|
files: [noteFileType],
|
|
66
68
|
tools: [createNote],
|
|
67
69
|
handlers: {
|
|
68
|
-
// The
|
|
70
|
+
// The mobile/tree fallback. The React home lives in main.tsx.
|
|
69
71
|
renderHome: async (context) => {
|
|
70
72
|
const { files } = await context.coline.files.list({
|
|
71
73
|
typeKey: "__APP_KEY__.note",
|
|
@@ -73,9 +75,15 @@ export default defineApp({
|
|
|
73
75
|
return ui.stack(
|
|
74
76
|
[
|
|
75
77
|
ui.heading("__APP_NAME__ is running", { level: 1 }),
|
|
76
|
-
ui.
|
|
77
|
-
|
|
78
|
+
ui.button("New note", {
|
|
79
|
+
action: actions.invokeTool("__APP_KEY__.create_note", { title: "Untitled note" }),
|
|
78
80
|
}),
|
|
81
|
+
ui.text(
|
|
82
|
+
"Edit app.config.ts and save — dev mode updates this app; reload to see changes.",
|
|
83
|
+
{
|
|
84
|
+
tone: "muted",
|
|
85
|
+
},
|
|
86
|
+
),
|
|
79
87
|
ui.card({
|
|
80
88
|
title: "Try the example tool",
|
|
81
89
|
description:
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/* Compiled automatically by check, preview, dev, and push. Use complete class names. */
|
|
2
|
+
@import "tailwindcss";
|
|
3
|
+
@custom-variant dark (&:is(.dark *));
|
|
4
|
+
|
|
5
|
+
@theme inline {
|
|
6
|
+
--color-background: var(--background);
|
|
7
|
+
--color-foreground: var(--foreground);
|
|
8
|
+
--color-card: var(--card);
|
|
9
|
+
--color-card-foreground: var(--card-foreground);
|
|
10
|
+
--color-popover: var(--popover);
|
|
11
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
12
|
+
--color-primary: var(--primary);
|
|
13
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
14
|
+
--color-secondary: var(--secondary);
|
|
15
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
16
|
+
--color-muted: var(--muted);
|
|
17
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
18
|
+
--color-accent: var(--accent);
|
|
19
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
20
|
+
--color-destructive: var(--destructive);
|
|
21
|
+
--color-border: var(--border);
|
|
22
|
+
--color-input: var(--input);
|
|
23
|
+
--color-ring: var(--ring);
|
|
24
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
25
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
26
|
+
--radius-lg: var(--radius);
|
|
27
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
28
|
+
--radius-2xl: calc(var(--radius) + 8px);
|
|
29
|
+
--radius-3xl: calc(var(--radius) + 12px);
|
|
30
|
+
--radius-4xl: calc(var(--radius) + 16px);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
body {
|
|
34
|
+
margin: 0;
|
|
35
|
+
}
|
|
36
|
+
.note-editor {
|
|
37
|
+
display: grid;
|
|
38
|
+
gap: 24px;
|
|
39
|
+
}
|
|
40
|
+
.note-editor label {
|
|
41
|
+
display: grid;
|
|
42
|
+
gap: 8px;
|
|
43
|
+
font-size: 13px;
|
|
44
|
+
font-weight: 500;
|
|
45
|
+
}
|
|
46
|
+
.note-editor textarea {
|
|
47
|
+
min-height: 340px;
|
|
48
|
+
line-height: 1.7;
|
|
49
|
+
}
|
|
50
|
+
.example-meta {
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
gap: 8px;
|
|
54
|
+
color: var(--muted-foreground);
|
|
55
|
+
font-size: 12px;
|
|
56
|
+
}
|
|
57
|
+
.example-select {
|
|
58
|
+
border: 1px solid var(--border);
|
|
59
|
+
background: var(--background);
|
|
60
|
+
color: var(--foreground);
|
|
61
|
+
border-radius: 6px;
|
|
62
|
+
padding: 7px 9px;
|
|
63
|
+
font: inherit;
|
|
64
|
+
max-width: 100%;
|
|
65
|
+
}
|
|
66
|
+
.example-field {
|
|
67
|
+
display: grid;
|
|
68
|
+
gap: 8px;
|
|
69
|
+
font-size: 13px;
|
|
70
|
+
}
|
|
71
|
+
.example-description {
|
|
72
|
+
font-size: 13px;
|
|
73
|
+
line-height: 1.7;
|
|
74
|
+
color: var(--muted-foreground);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.coline-settings-fields .example-toggle {
|
|
78
|
+
display: flex;
|
|
79
|
+
align-items: center;
|
|
80
|
+
gap: 10px;
|
|
81
|
+
}
|
|
82
|
+
.example-description {
|
|
83
|
+
margin: 12px 0 18px;
|
|
84
|
+
}
|