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.
Files changed (32) hide show
  1. package/AGENTS.md +86 -0
  2. package/README.md +60 -7
  3. package/assets/preview-host.ts +130 -0
  4. package/bin/_run.mjs +11 -2
  5. package/package.json +9 -4
  6. package/src/check.ts +46 -0
  7. package/src/cli.test.ts +154 -0
  8. package/src/cli.ts +12 -1
  9. package/src/client-build.ts +50 -0
  10. package/src/dev.ts +6 -5
  11. package/src/preview-capture.ts +101 -0
  12. package/src/preview.ts +189 -0
  13. package/src/push.ts +8 -47
  14. package/src/scaffold.ts +6 -0
  15. package/templates/backendless/.agents/skills/coline-app-development/SKILL.md +36 -0
  16. package/templates/backendless/.agents/skills/coline-app-development/references/live-records.md +53 -0
  17. package/templates/backendless/.agents/skills/coline-ui-design/SKILL.md +67 -0
  18. package/templates/backendless/.agents/skills/coline-ui-design/assets/board.png +0 -0
  19. package/templates/backendless/.agents/skills/coline-ui-design/assets/settings.png +0 -0
  20. package/templates/backendless/.agents/skills/coline-ui-design/assets/triage.png +0 -0
  21. package/templates/backendless/.agents/skills/coline-ui-review/SKILL.md +39 -0
  22. package/templates/backendless/AGENTS.md +79 -194
  23. package/templates/backendless/CLAUDE.md +1 -5
  24. package/templates/backendless/README.md +22 -27
  25. package/templates/backendless/app.config.ts +19 -11
  26. package/templates/backendless/app.css +84 -0
  27. package/templates/backendless/examples/board.tsx +173 -0
  28. package/templates/backendless/examples/settings.tsx +117 -0
  29. package/templates/backendless/examples/triage.tsx +253 -0
  30. package/templates/backendless/main.tsx +232 -0
  31. package/templates/backendless/package.json +16 -6
  32. package/templates/backendless/preview.seed.ts +26 -0
@@ -1,196 +1,81 @@
1
- # AGENTS.md — building __APP_NAME__ (a Coline App)
2
-
3
- You are working on a Coline App. Everything an agent needs is in this file —
4
- no URLs required. The scaffold compiles, tests, and runs as-is; evolve it
5
- rather than starting from a blank page.
6
-
7
- ## What a Coline App is
8
-
9
- A Coline App runs INSIDE a Coline workspace on Coline's hosted runtime.
10
- There are no servers, no database, no auth, no deploys — the platform
11
- provides all of it through the `coline.*` capability API:
12
-
13
- - `app.config.ts` the ENTIRE backend: manifest + tools + file types +
14
- UI handlers, bundled and executed server-side by Coline.
15
- - `main.tsx` (optional) — a React UI running in a locked sandbox iframe.
16
- Create it only if the manifest declares a `react` tier surface.
17
- - `app.test.ts` tests against an in-memory fake workspace.
18
-
19
- ## Commands
20
-
21
- - `npm test` — run tests (in-memory workspace; no Coline instance needed)
22
- - `npm run typecheck` — strict TS; keep it clean
23
- - `npx coline-app dev --internal` — watch mode; every save pushes a
24
- `0.0.0-dev` version that hot-swaps the live app (reload the app page)
25
- - `npx coline-app push --internal` — one-off push as a workspace-internal
26
- app (auto-approved, private to the workspace)
27
- - Needs `COLINE_API_KEY` (workspace API key with `apps.write` scope) and
28
- `COLINE_BASE_URL` (the Coline instance) in the environment.
29
-
30
- ## The manifest (`defineApp`)
31
-
32
- ```ts
33
- export default defineApp({
34
- key: "__APP_KEY__", // immutable, lowercase, hyphens
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
- Sandbox rules (enforced, not conventions):
151
- - NO network (`fetch` is blocked by CSP), no localStorage, no cookies.
152
- ALL data flows through the `coline.*` client over the capability bridge.
153
- - Theme tokens follow the host automatically (dark mode included) — use
154
- the CSS variables / `@colineapp/ui` components, never hardcoded colors.
155
- - One bundle per app: switch on `useColineContext().surface` if you have
156
- multiple react surfaces.
157
-
158
- ## Rate limits & budgets
159
-
160
- 120 capability calls burst / 20 per second per install · `net.fetch`
161
- 20 burst / 2 per second · `ai.generate` 200/day · 10,000 executions/day.
162
- Exceeding any returns a named error visible in the execution log.
163
-
164
- ## Testing (`app.test.ts` pattern)
165
-
166
- ```ts
167
- import { describe, expect, it } from "vitest";
168
- import { createTestWorkspace } from "@colineapp/sdk/testing";
169
- import app from "./app.config";
170
-
171
- it("logs a decision", async () => {
172
- const workspace = createTestWorkspace(app);
173
- const result = await workspace.invokeTool("__APP_KEY__.log_decision", {
174
- title: "Use Postgres",
175
- });
176
- expect(result.card).not.toBeNull(); // result: { output, card }
177
- // Also available: workspace.renderHome(), workspace.files.byType(...),
178
- // workspace.renderFileSurface(...), workspace.fireSchedule(...)
179
- });
180
- ```
181
-
182
- ## Debugging
183
-
184
- - Tool throws the error lands in the app's execution log (developer
185
- console → your app → Executions) with the message redacted of secrets.
186
- - Permission denied the manifest doesn't declare it, the user didn't
187
- grant it, or the tool's `effect` is too low for the operation.
188
- - UI blank check the browser console for the sandbox frame; the
189
- capability bridge logs denials with reason codes.
190
-
191
- ## Style rules for the UI
192
-
193
- - No eyebrow labels / kicker pills above headings. No monospace accent
194
- fonts. Solid font weights (500–600).
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
- # Claude Instructions
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 backendless Coline App. The logic in `app.config.ts` runs on Coline's
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 # runs against the in-memory test workspace
7
+ npm test
8
+ npm run check
9
+ npm run preview
11
10
  ```
12
11
 
13
- ## Push to Coline
14
-
15
- Create a workspace API key with the `apps.write` scope in
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
- ```sh
19
- export COLINE_API_KEY=col_ws_...
20
- npm run push
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
- Versions land in your developer console in draft state. Use
24
- `npm run dev` to watch the project and push on every change.
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
- ## Grow the app
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
- - Add Kairo tools with `defineTool` declare the honest `effect`
29
- (`read` / `write` / `destructive` / `external`); the runtime enforces
30
- it as a capability ceiling.
31
- - Add file types with `defineFileType` — tree previews render everywhere
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: { tier: "tree" },
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 starter home screen replace this with your app's real UI.
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.text("Edit app.config.ts and save — dev mode hot-swaps this screen instantly.", {
77
- tone: "muted",
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
+ }