api_binding_ui 2.0.1 → 3.0.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/dist/index.js.map CHANGED
@@ -1,14 +1,12 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/framework/expr.ts", "../src/framework/runner.ts", "../src/runtime/BindingScreen.tsx", "../src/runtime/screenStore.ts", "../src/runtime/hooks.ts"],
3
+ "sources": ["../src/framework/expr.ts", "../src/codegen/helpers.ts", "../src/codegen/generate.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Expression evaluator (FRAMEWORK.md §7). One grammar for every source:\n *\n * <bindId>.<slot>[.path] a produce slot on this screen\n * $item[.path] the current item (scoped slot or forEach)\n * $context.<id>[.path] a value the screen received\n * $steps.<stepId>[.path] an earlier call step's result ({ response })\n * $<provider>[.path] a registered context provider\n * <expr>[*].<path> every item of a list\n * <expr> | name(args) a registered transform\n *\n * Nothing outside this grammar is evaluated; unknown heads resolve to undefined.\n */\n\nexport type Transforms = Record<string, (value: unknown, ...args: unknown[]) => unknown>;\n\nexport interface Scope {\n /** Current value of a produce slot on the screen. */\n slot: (bindId: string, slotId: string) => unknown;\n item?: unknown;\n context?: Record<string, unknown>;\n providers?: Record<string, unknown>;\n steps?: Record<string, unknown>;\n transforms?: Transforms;\n}\n\ninterface Parsed { head: string[]; path: string[]; pipes: Array<{ name: string; args: unknown[] }> }\n\nconst PIPE = /^([A-Za-z_][\\w-]*)\\((.*)\\)$/;\nconst cache = new Map<string, Parsed>();\n\nfunction parseArg(raw: string): unknown {\n const t = raw.trim();\n if (!t) return undefined;\n try { return JSON.parse(t); } catch { return t; }\n}\n\n/** \"a.b[*].c\" → [\"a\", \"b\", \"*\", \"c\"] */\nfunction segments(path: string): string[] {\n return path.replace(/\\[(\\*|\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n}\n\nexport function parse(expr: string): Parsed {\n const hit = cache.get(expr);\n if (hit) return hit;\n const [main, ...rest] = expr.split(\"|\");\n const segs = segments(main.trim());\n if (!segs.length) throw new Error(`Empty expression: \"${expr}\"`);\n // Heads: $item / $context.<id> / $steps.<id> / $<provider> take one or two segments; a component slot takes two.\n const width = segs[0] === \"$item\" || (segs[0].startsWith(\"$\") && ![\"$context\", \"$steps\"].includes(segs[0])) ? 1 : 2;\n const pipes = rest.map(p => {\n const m = PIPE.exec(p.trim());\n if (!m) throw new Error(`Bad transform \"${p.trim()}\" in \"${expr}\"`);\n return { name: m[1], args: m[2] ? m[2].split(\",\").map(parseArg) : [] };\n });\n const parsed = { head: segs.slice(0, width), path: segs.slice(width), pipes };\n cache.set(expr, parsed);\n return parsed;\n}\n\nfunction walk(value: unknown, path: string[]): unknown {\n let v = value;\n for (let i = 0; i < path.length; i++) {\n if (v == null) return undefined;\n if (path[i] === \"*\") {\n if (!Array.isArray(v)) return undefined;\n const rest = path.slice(i + 1);\n return v.map(x => walk(x, rest));\n }\n v = (v as Record<string, unknown>)[path[i]];\n }\n return v;\n}\n\nexport function evaluate(expr: string, scope: Scope): unknown {\n const { head, path, pipes } = parse(expr);\n let root: unknown;\n if (head[0] === \"$item\") root = scope.item;\n else if (head[0] === \"$context\") root = scope.context?.[head[1]];\n else if (head[0] === \"$steps\") root = scope.steps?.[head[1]];\n else if (head[0].startsWith(\"$\")) root = scope.providers?.[head[0].slice(1)];\n else root = scope.slot(head[0], head[1]);\n let value = walk(root, path);\n for (const p of pipes) {\n const fn = scope.transforms?.[p.name];\n if (!fn) throw new Error(`Unknown transform \"${p.name}\" in \"${expr}\"`);\n value = fn(value, ...p.args);\n }\n return value;\n}\n\n",
6
- "/** Builds requests, reads responses and runs trigger steps. */\nimport type { CatalogOperation, OperationConsumeBinding, Step } from \"./contract\";\nimport { evaluate, type Scope } from \"./expr\";\n\nexport interface HttpRequest {\n method: string;\n /** Path with parameters filled in, e.g. \"/cls/v1/notes/42\". */\n path: string;\n query: Record<string, string>;\n headers: Record<string, string>;\n body?: unknown;\n}\n\n/** Sends a request. Supplied by the host (base URL, auth, errors). */\nexport type Fetcher = (request: HttpRequest, operation: CatalogOperation) => Promise<unknown>;\n\nexport class BindingError extends Error {\n constructor(message: string, readonly detail?: unknown) { super(message); this.name = \"BindingError\"; }\n}\n\nfunction setPointer(target: Record<string, unknown>, keys: string[], value: unknown) {\n let node = target;\n keys.slice(0, -1).forEach(k => { node = (node[k] ??= {}) as Record<string, unknown>; });\n node[keys[keys.length - 1]] = value;\n}\n\nconst decode = (k: string) => k.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n\nexport function buildRequest(op: CatalogOperation, request: Record<string, string>, scope: Scope): HttpRequest {\n const out: HttpRequest = { method: op.method, path: op.path, query: {}, headers: {} };\n let body: Record<string, unknown> | undefined;\n for (const [pointer, expr] of Object.entries(request)) {\n const value = evaluate(expr, scope);\n if (value === undefined) continue;\n const [, where, ...rest] = pointer.split(\"/\");\n const keys = rest.map(decode);\n if (where === \"path\") out.path = out.path.replace(`{${keys[0]}}`, encodeURIComponent(String(value)));\n else if (where === \"query\") out.query[keys[0]] = String(value);\n else if (where === \"header\") out.headers[keys[0]] = String(value);\n else if (where === \"body\") {\n if (!keys.length) out.body = value;\n else setPointer((body ??= {}), keys, value);\n }\n }\n if (body) out.body = { ...(out.body as object | undefined), ...body };\n const missing = op.parameters.filter(p => p.required && !(p.pointer in request && evaluate(request[p.pointer], scope) !== undefined));\n if (missing.length) throw new BindingError(`Missing required input: ${missing.map(p => p.name).join(\", \")}.`);\n return out;\n}\n\n/** Identical requests share a key, and so one fetch. */\nexport const requestKey = (r: HttpRequest) => JSON.stringify([r.method, r.path, r.query, r.body ?? null]);\n\n/** \"$\", \"$.a.b\" or \"$.a.items[*]\" applied to a response. */\nexport function select(response: unknown, selector: string): unknown {\n const path = selector.replace(/^\\$\\.?/, \"\").replace(/\\[\\*\\]$/, \"\").split(\".\").filter(Boolean);\n return path.reduce<unknown>((v, k) => (v == null ? undefined : (v as Record<string, unknown>)[k]), response);\n}\n\n/**\n * Applies a consume binding's `map` to each item. Mapped properties are added to the item, not substituted for it,\n * so a produce slot shaped by this slot (a dropdown's selected option) keeps every field the API returned.\n */\nexport function mapItems(data: unknown, binding: OperationConsumeBinding, scope: Scope): unknown {\n if (!binding.map || !Object.keys(binding.map).length) return data;\n const one = (item: unknown) => ({\n ...(item && typeof item === \"object\" ? item : {}),\n ...Object.fromEntries(Object.entries(binding.map!).map(([k, e]) => [k, evaluate(e, { ...scope, item })])),\n });\n return Array.isArray(data) ? data.map(one) : data == null ? data : one(data);\n}\n\nexport async function runConsume(binding: OperationConsumeBinding, op: CatalogOperation, scope: Scope, fetcher: Fetcher): Promise<unknown> {\n const response = await fetcher(buildRequest(op, binding.request, scope), op);\n return mapItems(select(response, binding.select), binding, scope);\n}\n\nexport interface StepOutcome { step: string; ok: boolean; response?: unknown; error?: unknown }\n\n/** Runs call steps in order. `forEach` runs a call once per item; `onError: \"stop\"` ends the run at the first failure. */\nexport async function runSteps(steps: Step[], operations: Map<string, CatalogOperation>, scope: Scope, fetcher: Fetcher): Promise<StepOutcome[]> {\n const outcomes: StepOutcome[] = [];\n const results: Record<string, unknown> = { ...scope.steps };\n for (const step of steps) {\n const op = operations.get(step.operation);\n if (!op) throw new BindingError(`Operation \"${step.operation}\" is not in the catalog.`);\n const items = step.forEach ? evaluate(step.forEach, scope) : [scope.item];\n const list = Array.isArray(items) ? items : [items];\n const responses: unknown[] = [];\n let failed = false;\n for (const item of list) {\n try {\n responses.push(await fetcher(buildRequest(op, step.request, { ...scope, item, steps: results }), op));\n } catch (error) {\n failed = true;\n outcomes.push({ step: step.id, ok: false, error });\n if (step.onError === \"stop\") return outcomes;\n }\n }\n const response = step.forEach ? responses : responses[0];\n results[step.id] = { response };\n if (!failed) outcomes.push({ step: step.id, ok: true, response });\n }\n return outcomes;\n}\n",
7
- "import * as React from \"react\";\nimport type { ScreenId } from \"../framework/contract\";\nimport { useBindingRuntime } from \"./BindingProvider\";\nimport { createScreenStore, type ScreenStore } from \"./screenStore\";\n\nexport interface ScreenScope {\n id: ScreenId;\n store: ScreenStore;\n /** Values passed in, keyed by the registry entry's `context` ids. */\n context: Record<string, unknown>;\n}\n\nconst ScreenContext = React.createContext<ScreenScope | null>(null);\nconst ShownContext = React.createContext(true);\n\nexport function useScreen(): ScreenScope {\n const s = React.useContext(ScreenContext);\n if (!s) throw new Error(\"Use binding hooks inside <BindingScreen id=…>.\");\n return s;\n}\n\n/** Marks a subtree that stays mounted while hidden (inactive tabs, cached views). */\nexport function BindingActive({ value, children }: { value: boolean; children: React.ReactNode }) {\n const parent = React.useContext(ShownContext);\n return <ShownContext.Provider value={parent && value}>{children}</ShownContext.Provider>;\n}\n\nexport interface BindingScreenProps {\n /** The screen's id in the registry. */\n id: ScreenId;\n context?: Record<string, unknown>;\n children: React.ReactNode;\n}\n\nconst NO_CONTEXT: Record<string, unknown> = {};\n\n/** Binding scope for one screen: its produce values and context. */\nexport function BindingScreen({ id, context = NO_CONTEXT, children }: BindingScreenProps) {\n const [store] = React.useState(createScreenStore);\n const shown = React.useContext(ShownContext);\n const { loadSaved, mountScreen } = useBindingRuntime();\n React.useEffect(() => { loadSaved(id); }, [loadSaved, id]);\n React.useEffect(() => mountScreen(id, shown), [mountScreen, id, shown]);\n const scope = React.useMemo(() => ({ id, store, context }), [id, store, context]);\n return <ScreenContext.Provider value={scope}>{children}</ScreenContext.Provider>;\n}\n",
8
- "/** A screen's produce values, outside React state; read through useSyncExternalStore. */\nexport interface ScreenStore {\n get: (bindId: string, slot: string) => unknown;\n set: (bindId: string, slot: string, value: unknown) => void;\n subscribe: (listener: () => void) => () => void;\n}\n\nexport function createScreenStore(): ScreenStore {\n const values = new Map<string, unknown>();\n const listeners = new Set<() => void>();\n return {\n get: (b, s) => values.get(`${b}.${s}`),\n set(b, s, value) {\n const k = `${b}.${s}`;\n if (Object.is(values.get(k), value)) return;\n values.set(k, value);\n listeners.forEach(l => l());\n },\n subscribe(l) { listeners.add(l); return () => { listeners.delete(l); }; },\n };\n}\n",
9
- "import * as React from \"react\";\nimport type { OperationConsumeBinding } from \"../framework/contract\";\nimport { evaluate, type Scope } from \"../framework/expr\";\nimport { BindingError, buildRequest, mapItems, requestKey, runSteps, select, type StepOutcome } from \"../framework/runner\";\nimport { useBindingRuntime, type BindingRuntime } from \"./BindingProvider\";\nimport { useScreen, type ScreenScope } from \"./BindingScreen\";\n\nfunction scopeOf(runtime: BindingRuntime, screen: ScreenScope, item?: unknown): Scope {\n return { slot: screen.store.get, context: screen.context, providers: runtime.providers(), transforms: runtime.transforms, item };\n}\n\n/** Publishes a produce slot's value. */\nexport function useProduce(bindId: string, slot: string, value: unknown): void {\n const { store } = useScreen();\n React.useEffect(() => { store.set(bindId, slot, value); }, [store, bindId, slot, value]);\n}\n\nexport type SlotStatus = \"unbound\" | \"waiting\" | \"loading\" | \"ready\" | \"error\";\nexport interface SlotResult<T> {\n status: SlotStatus;\n data: T | undefined;\n error: unknown;\n reload: () => void;\n}\n\nconst WAIT = \"\\u0000wait:\";\n\n/** Data for a consume slot. Subscribes to a request key, so it re-renders only when its own inputs change. */\nexport function useSlot<T = unknown>(bindId: string, slot: string): SlotResult<T> {\n const runtime = useBindingRuntime();\n const screen = useScreen();\n const binding = runtime.binding(screen.id, bindId, slot);\n const [nonce, setNonce] = React.useState(0);\n const [state, setState] = React.useState<{ key: string; status: SlotStatus; data?: T; error?: unknown }>({ key: \"\", status: \"loading\" });\n\n const snapshot = React.useCallback((): string => {\n if (!binding) return \"\";\n try {\n const scope = scopeOf(runtime, screen);\n if (binding.type === \"expression\") return JSON.stringify(evaluate(binding.value, scope) ?? null);\n if (binding.type !== \"operation\") return \"\";\n const op = runtime.operations.get(binding.operation);\n return op ? requestKey(buildRequest(op, binding.request, scope)) : WAIT + \"operation missing\";\n } catch (e) {\n return WAIT + (e instanceof Error ? e.message : String(e));\n }\n }, [binding, runtime, screen]);\n const key = React.useSyncExternalStore(screen.store.subscribe, snapshot, snapshot);\n\n React.useEffect(() => {\n if (!binding || binding.type !== \"operation\" || !key || key.startsWith(WAIT)) return;\n const op = runtime.operations.get(binding.operation)!;\n const scope = scopeOf(runtime, screen);\n const request = buildRequest(op, binding.request, scope);\n const k = requestKey(request);\n let live = true;\n setState(s => ({ key, status: \"loading\", data: s.data }));\n let p = nonce ? undefined : runtime.inflight.get(k);\n if (!p) {\n p = runtime.fetcher(request, op).finally(() => runtime.inflight.delete(k));\n runtime.inflight.set(k, p);\n }\n p.then(\n res => { if (live) setState({ key, status: \"ready\", data: mapItems(select(res, binding.select), binding as OperationConsumeBinding, scope) as T }); },\n error => { if (live) setState({ key, status: \"error\", error }); },\n );\n return () => { live = false; };\n }, [binding, key, nonce, runtime, screen]);\n\n const reload = React.useCallback(() => setNonce(n => n + 1), []);\n\n if (!binding || binding.type === \"steps\" || binding.type === \"none\") return { status: \"unbound\", data: undefined, error: undefined, reload };\n if (binding.type === \"expression\") return { status: \"ready\", data: (key ? JSON.parse(key) : undefined) as T, error: undefined, reload };\n if (key.startsWith(WAIT)) return { status: \"waiting\", data: undefined, error: new BindingError(key.slice(WAIT.length)), reload };\n return { status: state.key === key ? state.status : \"loading\", data: state.data, error: state.error, reload };\n}\n\n/** Resolver for a scoped slot (a cell) given its item. */\nexport function useCell<T = unknown>(bindId: string, slot: string): (item: unknown) => T | undefined {\n const runtime = useBindingRuntime();\n const screen = useScreen();\n const binding = runtime.binding(screen.id, bindId, slot);\n return React.useCallback(\n (item: unknown) => (binding?.type === \"expression\" ? (evaluate(binding.value, scopeOf(runtime, screen, item)) as T) : undefined),\n [binding, runtime, screen],\n );\n}\n\nexport interface TriggerHandle {\n /** False without a confirmed binding. */\n bound: boolean;\n running: boolean;\n /** Runs the slot's API calls; `item` is the row for row actions. */\n run: (item?: unknown) => Promise<StepOutcome[]>;\n}\n\nexport function useTrigger(bindId: string, slot: string): TriggerHandle {\n const runtime = useBindingRuntime();\n const screen = useScreen();\n const binding = runtime.binding(screen.id, bindId, slot);\n const [running, setRunning] = React.useState(false);\n const run = React.useCallback(async (item?: unknown) => {\n if (binding?.type !== \"steps\") return [];\n setRunning(true);\n try { return await runSteps(binding.steps, runtime.operations, scopeOf(runtime, screen, item), runtime.fetcher); }\n finally { setRunning(false); }\n }, [binding, runtime, screen]);\n return { bound: binding?.type === \"steps\" || binding?.type === \"none\", running, run };\n}\n"
5
+ "/**\n * Expression grammar (FRAMEWORK.md §7). One grammar for every source:\n *\n * <componentId>:<slot>[.path] a produce slot on the screen\n * $item[.path] the current item (scoped slot, forEach, or the trigger's payload)\n * $context.<id>[.path] a value the screen received\n * $steps.<stepId>[.path] an earlier call step's result ({ response })\n * <expr>[*].<path> every item of a list\n *\n * Component ids contain dots, so \":\" ends the id. Nothing outside this grammar is valid.\n */\n\nexport type Head =\n | { type: \"slot\"; component: string; slot: string }\n | { type: \"item\" }\n | { type: \"context\"; id: string }\n | { type: \"steps\"; id: string };\n\nexport interface Parsed { head: Head; path: string[] }\n\nconst cache = new Map<string, Parsed>();\n\n/** \"a.b[*].c\" → [\"a\", \"b\", \"*\", \"c\"] */\nexport function segments(path: string): string[] {\n return path.replace(/\\[(\\*|\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n}\n\nexport function parse(expr: string): Parsed {\n const hit = cache.get(expr);\n if (hit) return hit;\n const e = expr.trim();\n let parsed: Parsed;\n if (e.startsWith(\"$\")) {\n const segs = segments(e);\n const [h, id] = segs;\n if (h === \"$item\") parsed = { head: { type: \"item\" }, path: segs.slice(1) };\n else if ((h === \"$context\" || h === \"$steps\") && id) parsed = { head: { type: h === \"$context\" ? \"context\" : \"steps\", id }, path: segs.slice(2) };\n else throw new Error(`Unknown source \"${h}\" in \"${expr}\".`);\n } else {\n const colon = e.indexOf(\":\");\n if (colon < 1) throw new Error(`\"${expr}\" must read \"<componentId>:<slot>\".`);\n const [slot, ...path] = segments(e.slice(colon + 1));\n if (!slot) throw new Error(`\"${expr}\" names no slot.`);\n parsed = { head: { type: \"slot\", component: e.slice(0, colon), slot }, path };\n }\n cache.set(expr, parsed);\n return parsed;\n}\n\n/** Reads a path; \"*\" maps the rest of the path over a list. */\nexport function walk(value: unknown, path: readonly string[]): unknown {\n let v = value;\n for (let i = 0; i < path.length; i++) {\n if (v == null) return undefined;\n if (path[i] === \"*\") {\n if (!Array.isArray(v)) return undefined;\n const rest = path.slice(i + 1);\n return v.map(x => walk(x, rest));\n }\n v = (v as Record<string, unknown>)[path[i]];\n }\n return v;\n}\n",
6
+ "/** Source of the generated `screen-helpers.ts`: the only shared code the generated hooks use. */\nexport const HELPERS = `import { useMutation, useQuery } from \"@tanstack/react-query\";\n\n/** Data for a slot. \\`bound\\` is false when no API feeds it; keep the UI's own value then. */\nexport interface Data<T> { bound: boolean; data: T | undefined; loading: boolean; error: unknown }\n/** An action. \\`run\\` rejects when a call fails; it resolves at once when no API is connected. */\nexport interface Action { bound: boolean; run: (payload?: any) => Promise<void>; running: boolean; error: unknown }\n/** A per-item value, such as a cell in a row. */\nexport interface Cell<T> { bound: boolean; read: (item: any) => T | undefined }\n\nexport const UNBOUND_DATA: Data<never> = { bound: false, data: undefined, loading: false, error: undefined };\nexport const UNBOUND_ACTION: Action = { bound: false, run: async () => {}, running: false, error: undefined };\nexport const UNBOUND_CELL: Cell<never> = { bound: false, read: () => undefined };\n\nexport class ApiError extends Error {\n constructor(readonly status: number, readonly data: unknown) { super(\\`API call failed (\\${status})\\`); this.name = \"ApiError\"; }\n}\n\n/** Reads a path; \"*\" maps the rest of the path over a list. */\nexport function at(value: unknown, path: readonly string[]): any {\n let v: any = value;\n for (let i = 0; i < path.length; i++) {\n if (v == null) return undefined;\n if (path[i] === \"*\") return Array.isArray(v) ? v.map(x => at(x, path.slice(i + 1))) : undefined;\n v = v[path[i]];\n }\n return v;\n}\n\n/** The body of a client response; throws on a non-2xx status. Passes through clients that return the body. */\nexport function ok(res: any): any {\n if (res && typeof res === \"object\" && typeof res.status === \"number\" && \"data\" in res && \"headers\" in res) {\n if (res.status < 200 || res.status >= 300) throw new ApiError(res.status, res.data);\n return res.data;\n }\n return res;\n}\n\n/** True when every required input has a value. */\nexport const has = (inputs: Record<string, unknown>) => Object.values(inputs).every(v => v !== undefined);\n\n/** Throws when a required input has no value. */\nexport function need(operation: string, inputs: Record<string, unknown>) {\n const missing = Object.keys(inputs).filter(k => inputs[k] === undefined);\n if (missing.length) throw new Error(\\`\\${operation}: missing \\${missing.join(\", \")}\\`);\n}\n\n/** Drops undefined values. */\nexport const defined = (o: Record<string, unknown>): any => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined));\n\nexport const path = (v: unknown): any => (v === undefined ? undefined : encodeURIComponent(String(v)));\n\n/** A body from a base value and [keys, value] entries; undefined values are skipped. */\nexport function assemble(base: unknown, entries: Array<[string[], unknown]>): any {\n const out: any = base && typeof base === \"object\" ? { ...base } : {};\n for (const [keys, value] of entries) {\n if (value === undefined) continue;\n let node = out;\n keys.slice(0, -1).forEach(k => { node = node[k] = node[k] && typeof node[k] === \"object\" ? { ...node[k] } : {}; });\n node[keys[keys.length - 1]] = value;\n }\n return out;\n}\n\n/** Adds mapped fields to each item, keeping the fields the API returned. */\nexport function mapItems(data: any, map: (item: any) => Record<string, unknown>): any {\n const one = (item: any) => ({ ...(item && typeof item === \"object\" ? item : {}), ...map(item) });\n return Array.isArray(data) ? data.map(one) : data == null ? data : one(data);\n}\n\nexport const list = (v: unknown): unknown[] => (Array.isArray(v) ? v : v === undefined ? [] : [v]);\n\nexport function finish(failed: unknown[]) {\n if (failed.length === 1) throw failed[0];\n if (failed.length) throw new AggregateError(failed, \\`\\${failed.length} API calls failed\\`);\n}\n\nexport function useData<T>(key: readonly unknown[], fetch: () => Promise<unknown>, select: (data: any) => T, options: { enabled: boolean; everySeconds?: number }): Data<T> {\n const q = useQuery({ queryKey: key, queryFn: fetch, select, enabled: options.enabled, refetchInterval: options.everySeconds ? options.everySeconds * 1000 : false });\n return { bound: true, data: q.data, loading: q.isLoading, error: q.error ?? undefined };\n}\n\nexport function useAction(run: (payload?: any) => Promise<void>): Action {\n const m = useMutation({ mutationFn: run });\n return { bound: true, run: payload => m.mutateAsync(payload), running: m.isPending, error: m.error ?? undefined };\n}\n`;\n",
7
+ "/**\n * Code generator: bindings file + catalog → one plain React Query hook per screen, calling the Orval client.\n *\n * A screen hook's signature comes from the registry only (its components and slots), so call sites stay put\n * when bindings change; bindings change only the hook bodies. Unbound slots return an unbound value.\n */\nimport type {\n BindingsFile, Catalog, CatalogOperation, ContextDeclaration, JsonSchema, ScreenEntry, SlotBinding, Step, ValidationIssue,\n} from \"../framework/contract\";\nimport { parse, segments } from \"../framework/expr\";\nimport { fromFile } from \"../framework/file\";\nimport { flat } from \"../framework/schema\";\nimport { validateRegistry } from \"../framework/validate\";\nimport { HELPERS } from \"./helpers\";\n\nexport interface GeneratedFile { path: string; content: string }\nexport interface GenerateResult { files: GeneratedFile[]; issues: ValidationIssue[] }\n\n/** First-line marker; the CLI only ever deletes files that carry it. */\nexport const GENERATED_MARK = \"@generated\";\nconst HEADER = `// ${GENERATED_MARK} Do not edit: change the bindings and regenerate.\\n`;\n\nconst words = (s: string) => s.split(/[.\\-_]+/).filter(Boolean);\nconst pascal = (s: string) => words(s).map(w => w[0].toUpperCase() + w.slice(1)).join(\"\");\nconst camel = (s: string) => { const p = pascal(s); return p[0].toLowerCase() + p.slice(1); };\nconst str = (v: unknown) => JSON.stringify(v);\nconst IDENT = /^[A-Za-z_$][\\w$]*$/;\nconst prop = (k: string) => (IDENT.test(k) ? k : str(k));\n/** Orval names functions after the operationId, first letter lowercased. */\nexport const orvalName = (id: string) => (IDENT.test(id) ? id[0].toLowerCase() + id.slice(1) : camel(id));\n\n/** JSON Schema → a TypeScript type. Loose on purpose: the API checks API data, the UI only reads it. */\nexport function tsType(schema: JsonSchema | undefined, many = false, depth = 0): string {\n const one = (): string => {\n if (!schema || typeof schema !== \"object\" || depth > 3) return \"any\";\n const s = schema as Record<string, unknown>;\n if (Array.isArray(s.enum) && s.enum.length && s.enum.every(v => typeof v === \"string\")) return (s.enum as string[]).map(str).join(\" | \");\n switch (s.type) {\n case \"string\": return \"string\";\n case \"integer\": case \"number\": return \"number\";\n case \"boolean\": return \"boolean\";\n case \"array\": return `Array<${tsType(s.items as JsonSchema, false, depth + 1)}>`;\n case \"object\": {\n const props = Object.entries((s.properties as Record<string, JsonSchema>) ?? {});\n if (!props.length) return \"Record<string, any>\";\n return `{ ${props.map(([k, v]) => `${prop(k)}?: ${tsType(v, false, depth + 1)}`).join(\"; \")}; [key: string]: any }`;\n }\n default: return \"any\";\n }\n };\n return many ? `Array<${one()}>` : one();\n}\n\ntype At = { component: string; slot: string };\ninterface Scope { item: boolean; steps?: Set<string> }\n\ninterface Ctx {\n screen: ScreenEntry;\n keys: Map<string, string>;\n produces: Map<string, Set<string>>;\n use: Set<string>;\n issue: (code: string, message: string, at?: At) => void;\n warn: (code: string, message: string, at?: At) => void;\n}\n\n/** One expression → TypeScript over `state`, `item` and `steps`. */\nfunction compileExpr(expr: string, cx: Ctx, scope: Scope, at: At): string {\n let p;\n try { p = parse(expr); } catch (e) { cx.issue(\"expr.invalid\", (e as Error).message, at); return \"undefined\"; }\n const path = p.path.map(str);\n const h = p.head;\n const read = (root: string, keys: string[]) => { cx.use.add(\"at\"); return `at(${root}, [${keys.join(\", \")}])`; };\n if (h.type === \"item\") {\n if (!scope.item) { cx.issue(\"expr.no-item\", `\"${expr}\" reads $item, which this slot does not have.`, at); return \"undefined\"; }\n return path.length ? read(\"item\", path) : \"item\";\n }\n if (h.type === \"context\") {\n if (!cx.screen.context.some(c => c.id === h.id)) { cx.issue(\"expr.unknown-context\", `\"${expr}\": ${cx.screen.id} declares no context \"${h.id}\".`, at); return \"undefined\"; }\n return read(\"state.context\", [str(h.id), ...path]);\n }\n if (h.type === \"steps\") {\n if (!scope.steps?.has(h.id)) { cx.issue(\"expr.unknown-step\", `\"${expr}\" reads step \"${h.id}\", which does not run before it.`, at); return \"undefined\"; }\n return read(\"steps\", [str(h.id), ...path]);\n }\n if (!cx.produces.get(h.component)?.has(h.slot)) {\n cx.issue(\"expr.unknown-slot\", `\"${expr}\" reads a value that is not produced on ${cx.screen.id}.`, at);\n return \"undefined\";\n }\n return read(\"state\", [str(cx.keys.get(h.component)!), str(h.slot), ...path]);\n}\n\nconst decode = (k: string) => k.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n\n/**\n * The Orval call for an operation: path params in path order, then the body, then the query params object,\n * then fetch options (header params go there).\n */\nfunction compileCall(op: CatalogOperation, request: Record<string, string>, cx: Ctx, scope: Scope, at: At) {\n const e = (x: string) => compileExpr(x, cx, scope, at);\n const known = new Set(op.parameters.map(p => p.pointer));\n const body: string[] = [];\n let whole: string | undefined;\n const query: string[] = [];\n const headers: string[] = [];\n for (const [pointer, x] of Object.entries(request)) {\n const [, where, ...rest] = pointer.split(\"/\");\n const keys = rest.map(decode);\n if (where === \"body\") {\n if (!op.body) { cx.issue(\"request.no-body\", `${op.id} takes no body, but \"${pointer}\" is set.`, at); continue; }\n if (!keys.length) whole = e(x); else body.push(`[[${keys.map(str).join(\", \")}], ${e(x)}]`);\n } else if (!known.has(pointer)) cx.issue(\"request.unknown-input\", `${op.id} has no input \"${pointer}\".`, at);\n else if (where === \"query\") query.push(`${prop(keys[0])}: ${e(x)}`);\n else if (where === \"header\") headers.push(`${str(keys[0])}: ${e(x)}`);\n }\n const args = [...op.path.matchAll(/\\{([^}]+)\\}/g)].map(m => {\n const x = request[`/path/${m[1]}`];\n if (x === undefined) { cx.issue(\"request.missing-path\", `${op.id} needs \"${m[1]}\" in its path; it is not connected.`, at); return \"undefined\"; }\n cx.use.add(\"path\");\n return `path(${e(x)})`;\n });\n if (op.body) {\n // Typed loosely: the API, not the compiler, decides what a body needs. Unconnected required fields are flagged.\n const set = new Set(Object.keys(request).filter(k => k.startsWith(\"/body/\")).map(k => decode(k.split(\"/\")[2])));\n const gaps = whole ? [] : ((flat(op.body.schema).required ?? []) as string[]).filter(f => !set.has(f));\n if (gaps.length) cx.warn(\"request.required-body\", `${op.id} requires ${gaps.join(\", \")} in its body; not connected.`, at);\n cx.use.add(\"assemble\");\n args.push(`assemble(${whole ?? \"undefined\"}, [${body.join(\", \")}])`);\n }\n if (op.parameters.some(p => p.pointer.startsWith(\"/query/\"))) { cx.use.add(\"defined\"); args.push(`defined({ ${query.join(\", \")} })`); }\n const key = `[${[str(op.id), ...args].join(\", \")}]`;\n if (headers.length) { cx.use.add(\"defined\"); args.push(`{ headers: defined({ ${headers.join(\", \")} }) }`); }\n const required = op.parameters.filter(p => p.required).map(p => `${prop(p.name)}: ${request[p.pointer] === undefined ? \"undefined\" : e(request[p.pointer])}`);\n return { fn: orvalName(op.id), call: `${orvalName(op.id)}(${args.join(\", \")})`, key, required: required.length ? `{ ${required.join(\", \")} }` : \"\" };\n}\n\n/** \"$\", \"$.a\" or \"$.a.items[*]\" → path keys. */\nconst selectPath = (selector: string) => segments(selector.replace(/^\\$\\.?/, \"\").replace(/\\[\\*\\]$/, \"\"));\n\nfunction compileSteps(steps: Step[], cx: Ctx, at: At, ops: Map<string, CatalogOperation>, imports: Set<string>): string {\n const done = new Set<string>();\n const blocks: string[] = [];\n let usesPayload = false;\n cx.use.add(\"ok\"); cx.use.add(\"finish\");\n for (const st of steps) {\n const op = ops.get(st.operation);\n if (!op) { cx.issue(\"catalog.operation-missing\", `${st.operation} is not in the API docs.`, at); continue; }\n const scope = { item: true, steps: done };\n const call = compileCall(op, st.request, cx, scope, at);\n imports.add(call.fn);\n const each = st.forEach ? compileExpr(st.forEach, cx, scope, at) : undefined;\n if (each) cx.use.add(\"list\"); else usesPayload = true;\n if (call.required) cx.use.add(\"need\");\n const readsItem = /\\bitem\\b/.test(call.call + call.required);\n blocks.push([\n ` {`,\n ` const responses: unknown[] = [];`,\n ` for (const item of ${each ? `list(${each})` : \"[payload]\"}) {`,\n readsItem ? \"\" : ` void item;`,\n ` try {`,\n call.required ? ` need(${str(op.id)}, ${call.required});` : \"\",\n ` responses.push(ok(await ${call.call}));`,\n ` } catch (error) {`,\n st.onError === \"stop\" ? ` throw error;` : ` failed.push(error);`,\n ` }`,\n ` }`,\n ` steps[${str(st.id)}] = { response: ${each ? \"responses\" : \"responses[0]\"} };`,\n ` }`,\n ].filter(Boolean).join(\"\\n\"));\n done.add(st.id);\n }\n return [\n `async (${usesPayload ? \"payload\" : \"_payload\"}?: any) => {`,\n ` const steps: Record<string, unknown> = {};`,\n ` const failed: unknown[] = [];`,\n ...blocks,\n ` finish(failed);`,\n ` }`,\n ].join(\"\\n\");\n}\n\nexport function generate(file: BindingsFile, catalog: Catalog): GenerateResult {\n const issues: ValidationIssue[] = [];\n const { fw, index, issues: fileIssues } = fromFile(file, catalog);\n const valid = validateRegistry(fw);\n issues.push(...fileIssues, ...valid.issues);\n const ops = new Map(catalog.operations.map(o => [o.id, o]));\n const DESC = new Map(fw.descriptors.map(d => [d.kind, d]));\n const client = file.output?.client;\n if (!client) issues.push({ severity: \"error\", screen: \"\", code: \"output.missing\", message: `Set \"output\": { \"dir\", \"client\" } in the bindings file.` });\n\n const files: GeneratedFile[] = [{ path: \"screen-helpers.ts\", content: HEADER + HELPERS }];\n const exports: string[] = [];\n\n for (const screen of valid.registry.screens) {\n const name = pascal(screen.id);\n const keys = new Map<string, string>();\n const taken = new Map<string, string>();\n for (const c of screen.components) {\n const k = camel(c.bindId.slice(screen.id.length + 1));\n if (taken.has(k)) issues.push({ severity: \"error\", screen: screen.id, component: c.bindId, code: \"codegen.name-clash\", message: `\"${c.bindId}\" and \"${taken.get(k)}\" both become \"${k}\".` });\n taken.set(k, c.bindId); keys.set(c.bindId, k);\n }\n const cx: Ctx = {\n screen, keys, use: new Set(),\n produces: new Map(screen.components.map(c => [c.bindId, new Set(DESC.get(c.kind)!.slots.filter(s => s.role === \"produce\").map(s => s.id))])),\n issue: (code, message, at) => issues.push({ severity: \"error\", screen: screen.id, code, message, ...at }),\n warn: (code, message, at) => issues.push({ severity: \"warning\", screen: screen.id, code, message, ...at }),\n };\n const bindings = new Map<string, SlotBinding>();\n for (const b of index[screen.id] ?? []) {\n if (!keys.has(b.component)) { cx.issue(\"binding.unknown-component\", `A binding names \"${b.component}\", which is not registered.`, b); continue; }\n if (b.state !== \"confirmed\") { issues.push({ severity: \"warning\", screen: screen.id, component: b.component, slot: b.slot, code: \"binding.draft\", message: `${b.component} · ${b.slot} is a draft; it is not generated.` }); continue; }\n bindings.set(`${b.component}|${b.slot}`, b);\n }\n\n const imports = new Set<string>();\n const types = new Set<string>();\n const body: string[] = [];\n const ret: string[] = [];\n const apiType: string[] = [];\n const stateType: string[] = [];\n\n for (const c of screen.components) {\n const d = DESC.get(c.kind)!;\n const k = keys.get(c.bindId)!;\n const produce = d.slots.filter(s => s.role === \"produce\");\n if (produce.length) stateType.push(` ${prop(k)}?: { ${produce.map(s => `${prop(s.id)}?: ${tsType(s.schema, s.many)}`).join(\"; \")} };`);\n const out: string[] = [];\n const outT: string[] = [];\n const unbound = (slot: string, v: string) => { cx.use.add(v); out.push(`${prop(slot)}: ${v}`); };\n for (const s of d.slots.filter(x => x.role !== \"produce\")) {\n const b = bindings.get(`${c.bindId}|${s.id}`);\n const at = { component: c.bindId, slot: s.id };\n const v = `${k}${pascal(s.id)}`;\n if (s.role === \"trigger\") {\n types.add(\"Action\"); outT.push(`${prop(s.id)}: Action`);\n if (b?.type !== \"steps\") { unbound(s.id, \"UNBOUND_ACTION\"); continue; }\n cx.use.add(\"useAction\");\n body.push(` const ${v} = useAction(${compileSteps(b.steps, cx, at, ops, imports)});`);\n out.push(`${prop(s.id)}: ${v}`);\n continue;\n }\n const T = tsType(s.schema, s.many);\n if (s.scope) {\n types.add(\"Cell\"); outT.push(`${prop(s.id)}: Cell<${T}>`);\n if (b?.type !== \"expression\") { unbound(s.id, \"UNBOUND_CELL\"); continue; }\n out.push(`${prop(s.id)}: { bound: true, read: (item: any) => ${compileExpr(b.value, cx, { item: true }, at)} }`);\n continue;\n }\n types.add(\"Data\"); outT.push(`${prop(s.id)}: Data<${T}>`);\n if (b?.type === \"expression\") {\n out.push(`${prop(s.id)}: { bound: true, data: ${compileExpr(b.value, cx, { item: false }, at)}, loading: false, error: undefined }`);\n continue;\n }\n const op = b?.type === \"operation\" ? ops.get(b.operation) : undefined;\n if (b?.type === \"operation\" && !op) cx.issue(\"catalog.operation-missing\", `${b.operation} is not in the API docs.`, at);\n if (b?.type !== \"operation\" || !op) { unbound(s.id, \"UNBOUND_DATA\"); continue; }\n const call = compileCall(op, b.request, cx, { item: false }, at);\n imports.add(call.fn);\n [\"useData\", \"ok\"].forEach(h => cx.use.add(h));\n if (call.required) cx.use.add(\"has\");\n const sel = selectPath(b.select).map(str);\n if (sel.length) cx.use.add(\"at\");\n const picked = sel.length ? `at(data, [${sel.join(\", \")}])` : \"data\";\n const map = Object.entries(b.map ?? {});\n if (map.length) cx.use.add(\"mapItems\");\n const select = map.length ? `mapItems(${picked}, (item: any) => ({ ${map.map(([f, x]) => `${prop(f)}: ${compileExpr(x, cx, { item: true }, at)}`).join(\", \")} }))` : picked;\n const every = typeof b.load === \"object\" ? `, everySeconds: ${b.load.everySeconds}` : \"\";\n body.push(` const ${v} = useData<${T}>(${call.key}, async () => ok(await ${call.call}), (data: any) => ${select}, { enabled: ${call.required ? `has(${call.required})` : \"true\"}${every} });`);\n out.push(`${prop(s.id)}: ${v}`);\n }\n if (out.length) { ret.push(` ${prop(k)}: { ${out.join(\", \")} },`); apiType.push(` ${prop(k)}: { ${outT.join(\"; \")} };`); }\n }\n if (screen.context.length) stateType.push(` context?: { ${screen.context.map((c: ContextDeclaration) => `${prop(c.id)}?: ${\"schema\" in c.shape ? tsType(c.shape.schema, c.many) : c.many ? \"Array<any>\" : \"any\"}`).join(\"; \")} };`);\n\n const usesState = [...body, ...ret].some(l => /\\bstate\\b/.test(l));\n const lines = [\n HEADER.trimEnd(),\n imports.size ? `import { ${[...imports].sort().join(\", \")} } from ${str(client ?? \"\")};` : null,\n cx.use.size ? `import { ${[...cx.use].sort().join(\", \")} } from \"./screen-helpers\";` : null,\n types.size ? `import type { ${[...types].sort().join(\", \")} } from \"./screen-helpers\";` : null,\n \"\",\n `/** ${screen.label}: values its components produce, and what it was opened with. */`,\n stateType.length ? `export interface ${name}State {\\n${stateType.join(\"\\n\")}\\n}` : `export type ${name}State = Record<string, never>;`,\n \"\",\n `export interface ${name}Api {\\n${apiType.join(\"\\n\")}\\n}`,\n \"\",\n `/** API data and actions for ${screen.label} (${screen.id}). */`,\n `export function use${name}Api(${usesState ? \"state\" : \"_state\"}: ${name}State = {}): ${name}Api {`,\n ...body,\n ` return {`,\n ...ret,\n ` };`,\n `}`,\n \"\",\n ].filter((l): l is string => l !== null);\n files.push({ path: `${screen.id}.ts`, content: lines.join(\"\\n\") });\n exports.push(`export * from \"./${screen.id}\";`);\n }\n files.push({ path: \"index.ts\", content: HEADER + exports.join(\"\\n\") + \"\\n\" });\n return { files, issues };\n}\n"
10
8
  ],
11
- "mappings": "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",
12
- "debugId": "64D1E40B946F01F764756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "BEA7AA51ED34223764756E2164756E21",
13
11
  "names": []
14
12
  }
@@ -1,16 +1,11 @@
1
1
  import * as React from "react";
2
- import type { Catalog, PersistenceAdapter, ScreenId } from "../framework/contract";
3
- import { type FrameworkData } from "../framework/engine";
2
+ import type { BindingsStore, ScreenId } from "../framework/contract";
4
3
  import "./studio.css";
5
4
  export interface BindingStudioProps {
6
- /** Descriptors, registry and extension points. `catalog` is optional: without it the studio reads the docs URL. */
7
- framework: Omit<FrameworkData, "catalog"> & {
8
- catalog?: Catalog;
9
- };
10
- /** Default docs URL; each user can change it in Settings. */
11
- docsUrl?: string;
12
- /** Where manifests are kept. Defaults to the browser's local storage. */
13
- persistence?: PersistenceAdapter;
5
+ /** Reads and writes the bindings file. */
6
+ store: BindingsStore;
7
+ /** Maps the file's `openapi` value (URL or path) to a URL the browser can fetch. Default: the value itself. */
8
+ docsUrl?: (openapi: string) => string;
14
9
  /** Screen to open first. */
15
10
  initialScreen?: ScreenId;
16
11
  /** Shown in the top bar. */
@@ -18,4 +13,4 @@ export interface BindingStudioProps {
18
13
  /** Shows a close button in the top bar. */
19
14
  onClose?: () => void;
20
15
  }
21
- export declare function BindingStudio({ framework, docsUrl, persistence, initialScreen, title, onClose }: BindingStudioProps): React.JSX.Element;
16
+ export declare function BindingStudio({ store, docsUrl, initialScreen, title, onClose }: BindingStudioProps): React.JSX.Element;
@@ -1,15 +1,13 @@
1
1
  import * as React from "react";
2
- import type { BindingManifest } from "../framework/contract";
3
- import type { CatalogState } from "./useCatalog";
2
+ import { type CatalogState } from "./useCatalog";
4
3
  export interface SettingsPanelProps {
5
4
  docsUrl: string;
6
5
  onDocsUrl: (url: string) => void;
7
6
  catalog: CatalogState;
8
7
  onReload: () => void;
9
- /** Every screen's current manifest, for download. */
10
- manifests: () => BindingManifest[];
11
- onImport: (manifests: BindingManifest[]) => void;
8
+ /** Loads pasted OpenAPI text; resolves with an error message, or nothing on success. */
9
+ onPaste: (text: string) => Promise<string | undefined>;
12
10
  onClose: () => void;
13
11
  }
14
- /** Studio settings: where the API docs come from, and moving bindings in and out as files. */
15
- export declare function SettingsPanel({ docsUrl, onDocsUrl, catalog, onReload, manifests, onImport, onClose }: SettingsPanelProps): React.JSX.Element;
12
+ /** Studio settings: where the API docs come from. The value is saved in the bindings file. */
13
+ export declare function SettingsPanel({ docsUrl, onDocsUrl, catalog, onReload, onPaste, onClose }: SettingsPanelProps): React.JSX.Element;
@@ -1603,155 +1603,6 @@
1603
1603
  }
1604
1604
  }
1605
1605
 
1606
- .abs-fab {
1607
- position: fixed;
1608
- z-index: 2147480000;
1609
- right: max(20px, env(safe-area-inset-right, 0px));
1610
- bottom: max(20px, env(safe-area-inset-bottom, 0px));
1611
- display: grid;
1612
- grid-template-columns: auto 0fr;
1613
- cursor: pointer;
1614
- border: 1px solid var(--ds-color-border, #e2e8f0);
1615
- background: var(--ds-color-background, #fff);
1616
- color: var(--ds-color-foreground, #0f172a);
1617
- font: 500 13px / 1 var(--ds-font-family-sans, "Inter", system-ui, -apple-system, sans-serif);
1618
- animation: .36s cubic-bezier(.2,.7,.2,1) .3s backwards abs-fab-in;
1619
- border-radius: 10px;
1620
- align-items: center;
1621
- height: 44px;
1622
- padding: 0 13px;
1623
- transition: grid-template-columns .24s cubic-bezier(.2,.7,.2,1), box-shadow .2s, transform .2s cubic-bezier(.2,.7,.2,1), border-color .2s;
1624
- box-shadow: 0 1px 2px #0f172a0f, 0 6px 16px -6px #0f172a2e;
1625
- }
1626
-
1627
- .abs-fab-ico {
1628
- display: grid;
1629
- color: var(--ds-color-primary, #3b82f6);
1630
- place-items: center;
1631
- }
1632
-
1633
- .abs-fab-label {
1634
- overflow: hidden;
1635
- }
1636
-
1637
- .abs-fab-label > span {
1638
- display: block;
1639
- white-space: nowrap;
1640
- opacity: 0;
1641
- padding-left: 8px;
1642
- transition: opacity .18s, transform .24s cubic-bezier(.2,.7,.2,1);
1643
- transform: translateX(-4px);
1644
- }
1645
-
1646
- .abs-fab:hover {
1647
- grid-template-columns: auto 1fr;
1648
- border-color: var(--ds-color-border-strong, #cbd5e1);
1649
- transform: translateY(-1px);
1650
- box-shadow: 0 1px 2px #0f172a0f, 0 10px 24px -8px #0f172a3d;
1651
- }
1652
-
1653
- .abs-fab:focus-visible {
1654
- grid-template-columns: auto 1fr;
1655
- border-color: var(--ds-color-border-strong, #cbd5e1);
1656
- transform: translateY(-1px);
1657
- box-shadow: 0 1px 2px #0f172a0f, 0 10px 24px -8px #0f172a3d;
1658
- }
1659
-
1660
- .abs-fab:hover .abs-fab-label > span {
1661
- opacity: 1;
1662
- transition-delay: 60ms;
1663
- transform: none;
1664
- }
1665
-
1666
- .abs-fab:focus-visible .abs-fab-label > span {
1667
- opacity: 1;
1668
- transition-delay: 60ms;
1669
- transform: none;
1670
- }
1671
-
1672
- .abs-fab:active {
1673
- transform: translateY(0)scale(.97);
1674
- }
1675
-
1676
- .abs-fab:focus-visible {
1677
- outline: 2px solid var(--ds-color-primary, #3b82f6);
1678
- outline-offset: 2px;
1679
- }
1680
-
1681
- .abs-fab[aria-expanded="true"] {
1682
- opacity: 0;
1683
- pointer-events: none;
1684
- }
1685
-
1686
- @keyframes abs-fab-in {
1687
- from {
1688
- opacity: 0;
1689
- transform: translateY(8px);
1690
- }
1691
- }
1692
-
1693
- .abs-widget {
1694
- overflow: hidden;
1695
- background: var(--ds-color-surface, #f8fafc);
1696
- transform-origin: 100% 100%;
1697
- animation: .24s cubic-bezier(.2,.7,.2,1) abs-widget-in;
1698
- border: 0;
1699
- border-radius: 12px;
1700
- width: min(1440px, 100vw - 32px);
1701
- max-width: none;
1702
- height: min(920px, 100dvh - 32px);
1703
- max-height: none;
1704
- margin: auto;
1705
- padding: 0;
1706
- box-shadow: 0 24px 64px -16px #0f172a59;
1707
- }
1708
-
1709
- .abs-widget::backdrop {
1710
- backdrop-filter: blur(2px);
1711
- animation: .24s abs-fade-in;
1712
- background: #0f172a52;
1713
- }
1714
-
1715
- .abs-widget.is-closing {
1716
- animation: .16s ease-in forwards abs-widget-out;
1717
- }
1718
-
1719
- .abs-widget.is-closing::backdrop {
1720
- animation: .16s ease-in reverse forwards abs-fade-in;
1721
- }
1722
-
1723
- @keyframes abs-widget-in {
1724
- from {
1725
- opacity: 0;
1726
- transform: translateY(8px)scale(.985);
1727
- }
1728
- }
1729
-
1730
- @keyframes abs-widget-out {
1731
- to {
1732
- opacity: 0;
1733
- transform: translateY(6px)scale(.99);
1734
- }
1735
- }
1736
-
1737
- @keyframes abs-fade-in {
1738
- from {
1739
- opacity: 0;
1740
- }
1741
- }
1742
-
1743
- @media (prefers-reduced-motion: reduce) {
1744
- .abs-fab, .abs-fab *, .abs-widget {
1745
- animation-duration: 1ms !important;
1746
- transition-duration: 1ms !important;
1747
- }
1748
-
1749
- .abs-widget::backdrop {
1750
- animation-duration: 1ms !important;
1751
- transition-duration: 1ms !important;
1752
- }
1753
- }
1754
-
1755
1606
  .abs-glide-box {
1756
1607
  isolation: isolate;
1757
1608
  }
@@ -2019,3 +1870,41 @@
2019
1870
  color: var(--abs-fg);
2020
1871
  font-weight: 600;
2021
1872
  }
1873
+
1874
+ .abs-set-links {
1875
+ display: flex;
1876
+ flex-wrap: wrap;
1877
+ gap: 6px 16px;
1878
+ margin-top: 2px;
1879
+ }
1880
+
1881
+ .abs-paste {
1882
+ display: flex;
1883
+ animation: abs-in .2s var(--abs-ease) backwards;
1884
+ flex-direction: column;
1885
+ gap: 6px;
1886
+ margin-top: 4px;
1887
+ }
1888
+
1889
+ .abs-root .abs-paste-area {
1890
+ resize: vertical;
1891
+ font: 12px / 1.5 var(--abs-mono);
1892
+ white-space: pre;
1893
+ overflow: auto;
1894
+ width: 100%;
1895
+ height: auto;
1896
+ min-height: 140px;
1897
+ max-height: 320px;
1898
+ padding: 8px 10px;
1899
+ }
1900
+
1901
+ .abs-paste-area.abs-input[aria-invalid="true"] {
1902
+ border-color: var(--abs-bad);
1903
+ }
1904
+
1905
+ .abs-paste-size {
1906
+ color: var(--abs-muted);
1907
+ font-variant-numeric: tabular-nums;
1908
+ margin-left: auto;
1909
+ font-size: 12px;
1910
+ }
@@ -1,3 +1,2 @@
1
- /** Design-time entry. Keep out of production bundles. */
1
+ /** Studio entry: the design-time UI. Never part of an app bundle. */
2
2
  export { BindingStudio, type BindingStudioProps } from "./BindingStudio";
3
- export { BindingWidget, type BindingWidgetProps } from "./BindingWidget";