Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Bulk reformats. `git config blame.ignoreRevsFile .git-blame-ignore-revs`
f9d0169a66cb9e4a17aed150087aebaf17e9be61 # prettier, 15 files
4 changes: 2 additions & 2 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
directory: '/'
schedule:
interval: weekly
open-pull-requests-limit: 5
Expand All @@ -20,7 +20,7 @@ updates:
update-types: [minor, patch]

- package-ecosystem: github-actions
directory: "/"
directory: '/'
schedule:
interval: weekly
open-pull-requests-limit: 3
31 changes: 31 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Build output and vendored trees — formatting these is noise.
node_modules
.next
dist
build
out
coverage
.turbo
.vercel
*.min.js
*.min.css

# Generated during a build, so it is absent locally and present in CI — which
# makes a clean local --check no evidence at all. Contentlayer's output also
# uses import assertions, which prettier's parser rejects outright.
.contentlayer
.astro
.svelte-kit
storybook-static
test-results
playwright-report

# Lockfiles are generated; prettier would rewrite them wholesale.
package-lock.json
pnpm-lock.yaml
yarn.lock

# Markdown is deliberately out of scope for now. Prettier rewraps prose, which
# is where it is most opinionated and least useful, and it would bury the real
# diff. Remove this line when you want docs formatted too.
*.md
9 changes: 9 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"semi": true,
"singleQuote": true,
"printWidth": 100,
"tabWidth": 2,
"trailingComma": "all",
"arrowParens": "always",
"endOfLine": "lf"
}
10 changes: 5 additions & 5 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
// package is ~1k lines of library code, and a bespoke rule set would be a
// second opinion to maintain for no benefit. The floor is "lint runs and can
// fail", not "lint encodes taste".
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import tseslint from 'typescript-eslint'
import js from '@eslint/js';
import globals from 'globals';
import reactHooks from 'eslint-plugin-react-hooks';
import tseslint from 'typescript-eslint';

export default tseslint.config(
{
Expand Down Expand Up @@ -47,4 +47,4 @@ export default tseslint.config(
files: ['test/**/*.js', 'scripts/**/*.{js,mjs}'],
languageOptions: { globals: { ...globals.node, ...globals.nodeBuiltin } },
},
)
);
223 changes: 180 additions & 43 deletions examples/next/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
--radius-card: 14px;
--radius-control: 8px;
--shadow-card: 0 1px 3px rgb(0 0 0 / 0.07);
--font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
--font-mono: ui-monospace, SFMono-Regular, "JetBrains Mono", monospace;
--font-sans: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
--font-mono: ui-monospace, SFMono-Regular, 'JetBrains Mono', monospace;
}

@media (prefers-color-scheme: dark) {
Expand All @@ -30,54 +30,191 @@
}
}

* { box-sizing: border-box; }
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--color-bg);
color: var(--color-text);
font-family: var(--font-sans);
line-height: 1.5;
}
.wrap { max-width: 60rem; margin: 0 auto; padding: 2rem 1rem 4rem; }
h1 { margin: 0 0 .25rem; font-size: 1.9rem; letter-spacing: -0.02em; }
.lede { margin: 0 0 .75rem; color: var(--color-text-muted); max-width: 44rem; }
.engine { font-size: .85rem; padding: .55rem .75rem; border-radius: var(--radius-control); border: 1px solid var(--color-border); }
.engine-live { color: var(--color-brand); }
.engine-offline { color: var(--color-text-muted); }
.wrap {
max-width: 60rem;
margin: 0 auto;
padding: 2rem 1rem 4rem;
}
h1 {
margin: 0 0 0.25rem;
font-size: 1.9rem;
letter-spacing: -0.02em;
}
.lede {
margin: 0 0 0.75rem;
color: var(--color-text-muted);
max-width: 44rem;
}
.engine {
font-size: 0.85rem;
padding: 0.55rem 0.75rem;
border-radius: var(--radius-control);
border: 1px solid var(--color-border);
}
.engine-live {
color: var(--color-brand);
}
.engine-offline {
color: var(--color-text-muted);
}

.bar { margin: 1.5rem 0; padding: 1rem; background: var(--color-surface);
border: 1px solid var(--color-border); border-radius: var(--radius-card); box-shadow: var(--shadow-card); }
.bar textarea { width: 100%; font: inherit; padding: .6rem; resize: vertical;
border: 1px solid var(--color-border); border-radius: var(--radius-control);
background: var(--color-bg); color: var(--color-text); }
.bar-actions { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-top: .6rem; }
.intent { font-size: .8rem; color: var(--color-text-muted); margin-left: auto; }
button { font: inherit; cursor: pointer; padding: .5rem .9rem; border-radius: var(--radius-control);
border: 1px solid transparent; background: var(--color-action); color: #fff; min-height: 44px; }
button:disabled { opacity: .5; cursor: not-allowed; }
button.ghost { background: transparent; color: var(--color-text); border-color: var(--color-border); }
.chips { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: .7rem; }
.chip { background: transparent; border: 1px dashed var(--color-border); color: var(--color-text-muted);
font-size: .82rem; text-align: left; min-height: 0; padding: .35rem .6rem; }
.error { color: var(--color-danger); margin: .6rem 0 0; font-size: .9rem; }
.bar {
margin: 1.5rem 0;
padding: 1rem;
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-card);
box-shadow: var(--shadow-card);
}
.bar textarea {
width: 100%;
font: inherit;
padding: 0.6rem;
resize: vertical;
border: 1px solid var(--color-border);
border-radius: var(--radius-control);
background: var(--color-bg);
color: var(--color-text);
}
.bar-actions {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
align-items: center;
margin-top: 0.6rem;
}
.intent {
font-size: 0.8rem;
color: var(--color-text-muted);
margin-left: auto;
}
button {
font: inherit;
cursor: pointer;
padding: 0.5rem 0.9rem;
border-radius: var(--radius-control);
border: 1px solid transparent;
background: var(--color-action);
color: #fff;
min-height: 44px;
}
button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
button.ghost {
background: transparent;
color: var(--color-text);
border-color: var(--color-border);
}
.chips {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
margin-top: 0.7rem;
}
.chip {
background: transparent;
border: 1px dashed var(--color-border);
color: var(--color-text-muted);
font-size: 0.82rem;
text-align: left;
min-height: 0;
padding: 0.35rem 0.6rem;
}
.error {
color: var(--color-danger);
margin: 0.6rem 0 0;
font-size: 0.9rem;
}

.grid { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); }
.field { display: flex; flex-direction: column; gap: .3rem; padding: .75rem;
border: 1px solid var(--color-border); border-radius: var(--radius-card); background: var(--color-surface); }
.field.just-changed { background: var(--color-changed); border-color: var(--color-action); }
.label { font-size: .85rem; font-weight: 600; display: flex; align-items: center; gap: .4rem; }
.tag { font-style: normal; font-size: .65rem; text-transform: uppercase; letter-spacing: .06em;
color: var(--color-action); border: 1px solid currentColor; border-radius: 999px; padding: 0 .35rem; }
.field input, .field select, .field textarea { font: inherit; padding: .45rem;
border: 1px solid var(--color-border); border-radius: var(--radius-control);
background: var(--color-bg); color: var(--color-text); width: 100%; }
.field input[type='checkbox'] { width: auto; min-height: 24px; }
.field small { color: var(--color-text-muted); font-size: .75rem; }
.grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
}
.field {
display: flex;
flex-direction: column;
gap: 0.3rem;
padding: 0.75rem;
border: 1px solid var(--color-border);
border-radius: var(--radius-card);
background: var(--color-surface);
}
.field.just-changed {
background: var(--color-changed);
border-color: var(--color-action);
}
.label {
font-size: 0.85rem;
font-weight: 600;
display: flex;
align-items: center;
gap: 0.4rem;
}
.tag {
font-style: normal;
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--color-action);
border: 1px solid currentColor;
border-radius: 999px;
padding: 0 0.35rem;
}
.field input,
.field select,
.field textarea {
font: inherit;
padding: 0.45rem;
border: 1px solid var(--color-border);
border-radius: var(--radius-control);
background: var(--color-bg);
color: var(--color-text);
width: 100%;
}
.field input[type='checkbox'] {
width: auto;
min-height: 24px;
}
.field small {
color: var(--color-text-muted);
font-size: 0.75rem;
}

.transcript { margin-top: 1.5rem; }
.transcript p { margin: .3rem 0; font-size: .9rem; }
.transcript .assistant { color: var(--color-text-muted); }
.values { margin-top: 1.5rem; }
.values pre { overflow-x: auto; background: var(--color-surface); padding: .8rem;
border: 1px solid var(--color-border); border-radius: var(--radius-card); font-family: var(--font-mono); font-size: .8rem; }
code { font-family: var(--font-mono); }
.transcript {
margin-top: 1.5rem;
}
.transcript p {
margin: 0.3rem 0;
font-size: 0.9rem;
}
.transcript .assistant {
color: var(--color-text-muted);
}
.values {
margin-top: 1.5rem;
}
.values pre {
overflow-x: auto;
background: var(--color-surface);
padding: 0.8rem;
border: 1px solid var(--color-border);
border-radius: var(--radius-card);
font-family: var(--font-mono);
font-size: 0.8rem;
}
code {
font-family: var(--font-mono);
}
Loading