api_binding_ui 1.0.0 → 2.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.
Files changed (75) hide show
  1. package/README.md +74 -384
  2. package/SKILL.md +49 -294
  3. package/dist/framework/contract.d.ts +268 -0
  4. package/dist/framework/engine.d.ts +88 -0
  5. package/dist/framework/expr.d.ts +34 -0
  6. package/dist/framework/loadCatalog.d.ts +6 -0
  7. package/dist/framework/names.d.ts +7 -0
  8. package/dist/framework/openapi.d.ts +7 -0
  9. package/dist/framework/runner.d.ts +33 -0
  10. package/dist/framework/schema.d.ts +22 -0
  11. package/dist/framework/store.d.ts +17 -0
  12. package/dist/framework/validate.d.ts +7 -0
  13. package/dist/index-e9twc25y.js +754 -0
  14. package/dist/index-e9twc25y.js.map +16 -0
  15. package/dist/index.d.ts +11 -26
  16. package/dist/index.js +345 -3790
  17. package/dist/index.js.map +14 -0
  18. package/dist/runtime/BindingProvider.d.ts +42 -0
  19. package/dist/runtime/BindingScreen.d.ts +23 -0
  20. package/dist/runtime/hooks.d.ts +22 -0
  21. package/dist/runtime/screenStore.d.ts +7 -0
  22. package/dist/studio/ApiPicker.d.ts +15 -0
  23. package/dist/studio/BindingStudio.d.ts +21 -0
  24. package/dist/studio/BindingWidget.d.ts +9 -0
  25. package/dist/studio/Collapse.d.ts +6 -0
  26. package/dist/studio/ComponentList.d.ts +10 -0
  27. package/dist/studio/FindAnything.d.ts +7 -0
  28. package/dist/studio/Inspector.d.ts +12 -0
  29. package/dist/studio/Navigator.d.ts +17 -0
  30. package/dist/studio/SettingsPanel.d.ts +15 -0
  31. package/dist/studio/Tip.d.ts +23 -0
  32. package/dist/studio/editors/ConsumeEditor.d.ts +4 -0
  33. package/dist/studio/editors/RequestInputs.d.ts +11 -0
  34. package/dist/studio/editors/ScopedEditor.d.ts +3 -0
  35. package/dist/studio/editors/SlotSection.d.ts +3 -0
  36. package/dist/studio/editors/SourceSelect.d.ts +10 -0
  37. package/dist/studio/editors/StepCard.d.ts +12 -0
  38. package/dist/studio/editors/TriggerEditor.d.ts +4 -0
  39. package/dist/studio/editors/types.d.ts +14 -0
  40. package/dist/studio/icons.d.ts +65 -0
  41. package/dist/studio/index.css +2021 -0
  42. package/dist/studio/index.d.ts +3 -0
  43. package/dist/studio/index.js +2806 -0
  44. package/dist/studio/index.js.map +33 -0
  45. package/dist/studio/useBindings.d.ts +20 -0
  46. package/dist/studio/useCatalog.d.ts +15 -0
  47. package/dist/studio/useGlide.d.ts +11 -0
  48. package/dist/studio/useSettings.d.ts +8 -0
  49. package/package.json +20 -9
  50. package/spec/FRAMEWORK.md +271 -0
  51. package/dist/api-binding-ui.css +0 -244
  52. package/dist/components/ApiBindingWorkspace.d.ts +0 -10
  53. package/dist/components/ApiMappings.d.ts +0 -21
  54. package/dist/components/BindApiButton.d.ts +0 -41
  55. package/dist/components/RequestPreview.d.ts +0 -7
  56. package/dist/components/SimulationDialog.d.ts +0 -8
  57. package/dist/components/WorkspaceContext.d.ts +0 -7
  58. package/dist/components/ui/AppGrid.d.ts +0 -27
  59. package/dist/components/ui/Badge.d.ts +0 -9
  60. package/dist/components/ui/Banner.d.ts +0 -8
  61. package/dist/components/ui/Button.d.ts +0 -31
  62. package/dist/components/ui/Card.d.ts +0 -14
  63. package/dist/components/ui/Dialog.d.ts +0 -61
  64. package/dist/components/ui/Icons.d.ts +0 -21
  65. package/dist/components/ui/Input.d.ts +0 -31
  66. package/dist/core/bindingContext.d.ts +0 -67
  67. package/dist/core/catalog.d.ts +0 -18
  68. package/dist/core/componentId.d.ts +0 -12
  69. package/dist/core/model.d.ts +0 -57
  70. package/dist/core/transport.d.ts +0 -33
  71. package/dist/core/valueCoercion.d.ts +0 -14
  72. package/dist/hooks/useAppliedBinding.d.ts +0 -6
  73. package/dist/index.css +0 -244
  74. package/dist/style.css +0 -244
  75. package/dist/types.d.ts +0 -232
@@ -0,0 +1,33 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/studio/BindingStudio.tsx", "../src/studio/ComponentList.tsx", "../src/studio/Collapse.tsx", "../src/studio/icons.tsx", "../src/studio/useGlide.tsx", "../src/studio/FindAnything.tsx", "../src/studio/Tip.tsx", "../src/studio/editors/ConsumeEditor.tsx", "../src/studio/ApiPicker.tsx", "../src/studio/editors/RequestInputs.tsx", "../src/studio/editors/types.ts", "../src/studio/editors/SourceSelect.tsx", "../src/studio/editors/ScopedEditor.tsx", "../src/studio/editors/TriggerEditor.tsx", "../src/studio/editors/StepCard.tsx", "../src/studio/editors/SlotSection.tsx", "../src/studio/Inspector.tsx", "../src/studio/Navigator.tsx", "../src/studio/SettingsPanel.tsx", "../src/studio/useSettings.ts", "../src/studio/useBindings.ts", "../src/studio/useCatalog.ts", "../src/framework/loadCatalog.ts", "../src/studio/BindingWidget.tsx"],
4
+ "sourcesContent": [
5
+ "import * as React from \"react\";\nimport type { Catalog, PersistenceAdapter, ScreenId, SlotBinding } from \"../framework/contract\";\nimport { createEngine, type FrameworkData } from \"../framework/engine\";\nimport { localStorageAdapter, toManifest } from \"../framework/store\";\nimport { validateRegistry } from \"../framework/validate\";\nimport { ComponentList } from \"./ComponentList\";\nimport { FindAnything } from \"./FindAnything\";\nimport { Icon } from \"./icons\";\nimport { Inspector } from \"./Inspector\";\nimport { Navigator } from \"./Navigator\";\nimport { SettingsPanel } from \"./SettingsPanel\";\nimport { useBindings, type Removed, type SaveStatus } from \"./useBindings\";\nimport { useCatalog } from \"./useCatalog\";\nimport { DEFAULT_DOCS_URL, useSettings } from \"./useSettings\";\nimport \"./studio.css\";\n\nexport interface BindingStudioProps {\n /** Descriptors, registry and extension points. `catalog` is optional: without it the studio reads the docs URL. */\n framework: Omit<FrameworkData, \"catalog\"> & { catalog?: Catalog };\n /** Default docs URL; each user can change it in Settings. */\n docsUrl?: string;\n /** Where manifests are kept. Defaults to the browser's local storage. */\n persistence?: PersistenceAdapter;\n /** Screen to open first. */\n initialScreen?: ScreenId;\n /** Shown in the top bar. */\n title?: string;\n /** Shows a close button in the top bar. */\n onClose?: () => void;\n}\n\nfunction SaveState({ status, onRetry }: { status: SaveStatus; onRetry: () => void }) {\n return (\n <span className={\"abs-saved is-\" + status} aria-live=\"polite\">\n {status === \"failed\" ? <button type=\"button\" onClick={onRetry}><Icon name=\"alert\" size={14} />Not saved · Retry</button>\n : status === \"saving\" ? <><Icon name=\"refresh\" size={14} className=\"abs-spin\" />Saving…</>\n : status === \"saved\" ? <><Icon name=\"check\" size={14} />Saved</> : null}\n </span>\n );\n}\n\nfunction UndoToast({ removed, label, onUndo, onDismiss }: { removed: Removed; label: string; onUndo: () => void; onDismiss: () => void }) {\n React.useEffect(() => { const t = setTimeout(onDismiss, 6000); return () => clearTimeout(t); }, [removed, onDismiss]);\n return (\n <div className=\"abs-toast\" role=\"status\">\n <span>{label} disconnected</span>\n <button type=\"button\" onClick={onUndo}>Undo</button>\n </div>\n );\n}\n\nconst EMPTY_HINT = (\n <aside className=\"abs-insp abs-insp-empty abs-enter\">\n <span className=\"abs-empty-ico\"><Icon name=\"pointer\" size={20} /></span>\n <b>Select a component</b>\n <span>Pick something from the list to connect it to an API.</span>\n </aside>\n);\n\nexport function BindingStudio({ framework, docsUrl = DEFAULT_DOCS_URL, persistence, initialScreen, title = \"Bind API\", onClose }: BindingStudioProps) {\n const [settings, updateSettings] = useSettings({ docsUrl });\n const [catalogState, reloadCatalog] = useCatalog(settings.docsUrl, framework.catalog);\n const [settingsOpen, setSettingsOpen] = React.useState(false);\n const closeSettings = React.useCallback(() => setSettingsOpen(false), []);\n\n const adapter = React.useMemo(() => persistence ?? localStorageAdapter(), [persistence]);\n const catalog = catalogState.catalog;\n // Invalid registry entries are dropped.\n const fw = React.useMemo<FrameworkData | null>(\n () => (catalog ? { ...framework, catalog, registry: validateRegistry({ ...framework, catalog }).registry } : null),\n [framework, catalog],\n );\n\n const binds = useBindings(fw, adapter);\n\n const settingsButton = (\n <div className=\"abs-settings-wrap\">\n <button type=\"button\" className={\"abs-iconbtn abs-settings-btn\" + (settingsOpen ? \" is-on\" : \"\")} aria-label=\"Settings\" aria-expanded={settingsOpen}\n onClick={() => setSettingsOpen(o => !o)}>\n <Icon name=\"settings\" />\n {catalogState.status === \"error\" ? <span className=\"abs-dot-bad\" aria-hidden=\"true\" /> : null}\n </button>\n {onClose ? <button type=\"button\" className=\"abs-iconbtn\" aria-label=\"Close\" onClick={onClose}><Icon name=\"close\" /></button> : null}\n {settingsOpen ? (\n <SettingsPanel docsUrl={settings.docsUrl} onDocsUrl={url => updateSettings({ docsUrl: url })} catalog={catalogState} onReload={reloadCatalog}\n manifests={() => (fw ? Object.entries(binds.index).map(([s, b]) => toManifest(fw, s, b)) : [])} onImport={binds.importManifests} onClose={closeSettings} />\n ) : null}\n </div>\n );\n if (!fw) {\n return (\n <div className=\"abs-root\">\n <header className=\"abs-top\"><div className=\"abs-brand\">{title}</div><span />{settingsButton}</header>\n <div className=\"abs-state-page\">\n {catalogState.status === \"error\" ? (\n <>\n <span className=\"abs-empty-ico is-bad\"><Icon name=\"alert\" size={20} /></span>\n <b>The API docs did not load</b>\n <span>{catalogState.error}</span>\n <div className=\"abs-set-row\">\n <button type=\"button\" className=\"abs-btn abs-btn-primary\" onClick={reloadCatalog}><Icon name=\"refresh\" size={14} />Try again</button>\n <button type=\"button\" className=\"abs-btn\" onClick={() => setSettingsOpen(true)}>Change the URL</button>\n </div>\n </>\n ) : (\n <><span className=\"abs-loader\" aria-hidden=\"true\" /><span aria-live=\"polite\">Loading API docs…</span></>\n )}\n </div>\n </div>\n );\n }\n return <Workbench fw={fw} binds={binds} title={title} initialScreen={initialScreen} settingsButton={settingsButton} />;\n}\n\nfunction Workbench({ fw, binds, title, initialScreen, settingsButton }: {\n fw: FrameworkData; binds: ReturnType<typeof useBindings>; title: string; initialScreen?: ScreenId; settingsButton: React.ReactNode;\n}) {\n const { index, loaded, status, removed, put, drop, undo, dismiss, retry } = binds;\n // In memory: inside a host app the URL belongs to the host's router.\n const [place, go] = React.useState<{ screen?: ScreenId; component?: string }>({ screen: initialScreen });\n const engine = React.useMemo(() => createEngine(fw, index), [fw, index]);\n\n const screen = (place.screen && engine.SCR.get(place.screen)) || fw.registry.screens[0];\n const comp = screen && place.component ? engine.compOf(screen.id, place.component) : undefined;\n const screenId = screen?.id;\n const select = React.useCallback((component?: string) => go({ screen: screenId, component }), [go, screenId]);\n const putHere = React.useCallback((b: SlotBinding) => { if (screenId) put(screenId, b); }, [put, screenId]);\n const dropHere = React.useCallback((c: string, s: string) => { if (screenId) drop(screenId, c, s); }, [drop, screenId]);\n\n if (!screen) return <div className=\"abs-root\"><div className=\"abs-empty\">No screens are registered yet.</div></div>;\n const total = engine.tally(fw.registry.screens);\n const removedLabel = removed ? engine.compOf(removed.screen, removed.binding.component)?.label ?? removed.binding.component : \"\";\n return (\n <div className=\"abs-root\">\n <header className=\"abs-top\">\n <div className=\"abs-brand\">{title}</div>\n <FindAnything engine={engine} onGo={(s, c) => go({ screen: s, component: c })} />\n <div className=\"abs-top-meta\">\n <SaveState status={status} onRetry={retry} />\n <span className=\"abs-overall\" title={`Components connected across all ${fw.registry.screens.length} screens`}>\n <b>{total.bound}</b>/{total.total} connected\n </span>\n {settingsButton}\n </div>\n </header>\n <div className={\"abs-body\" + (comp ? \" has-insp\" : \"\")}>\n <Navigator engine={engine} current={screen.id} onPick={id => go({ screen: id })} />\n {loaded ? <ComponentList key={screen.id} engine={engine} screen={screen} selected={comp?.bindId} onSelect={select} /> : <div className=\"abs-center\" />}\n {comp ? <Inspector key={screen.id + comp.bindId} engine={engine} screen={screen} comp={comp} put={putHere} drop={dropHere} goTo={select} onClose={() => select(undefined)} />\n : loaded ? EMPTY_HINT : null}\n </div>\n {removed ? <UndoToast removed={removed} label={removedLabel} onUndo={undo} onDismiss={dismiss} /> : null}\n </div>\n );\n}\n",
6
+ "import * as React from \"react\";\nimport type { ComponentInstance, ScreenEntry } from \"../framework/contract\";\nimport type { Engine } from \"../framework/engine\";\nimport { Collapse } from \"./Collapse\";\nimport { Icon, KindIcon, Ring, StateIcon } from \"./icons\";\nimport { useGlide } from \"./useGlide\";\n\n/** A screen's components as a tree, filterable to unconnected ones. */\nexport function ComponentList({ engine, screen, selected, onSelect }: { engine: Engine; screen: ScreenEntry; selected?: string; onSelect: (id: string) => void }) {\n const [todo, setTodo] = React.useState(false);\n const [open, setOpen] = React.useState<Record<string, boolean>>({});\n const all = screen.components.filter(c => engine.bindable(engine.descOf(c)).length);\n const byParent = new Map<string, ComponentInstance[]>();\n all.forEach(c => { if (c.parent) byParent.set(c.parent, [...(byParent.get(c.parent) ?? []), c]); });\n const kids = (id: string) => byParent.get(id) ?? [];\n const t = engine.tally([screen]);\n const pending = (c: ComponentInstance) => engine.compState(screen.id, c) !== \"bound\";\n const visible = (c: ComponentInstance): boolean => !todo || pending(c) || kids(c.bindId).some(visible);\n\n const glide = useGlide<HTMLDivElement>();\n const row = (c: ComponentInstance, depth: number): React.ReactNode => {\n const ch = kids(c.bindId).filter(visible);\n const isOpen = open[c.bindId] ?? true;\n const d = engine.descOf(c)!;\n return (\n <div key={c.bindId} role=\"listitem\">\n <div data-glide className={\"abs-comp\" + (c.bindId === selected ? \" is-on\" : \"\")} style={{ paddingLeft: 8 + depth * 24 }}>\n {ch.length ? (\n <button type=\"button\" className=\"abs-iconbtn abs-twist\" onClick={() => setOpen(o => ({ ...o, [c.bindId]: !isOpen }))}\n aria-label={isOpen ? \"Collapse\" : \"Expand\"} aria-expanded={isOpen}>\n <Icon name=\"chevronRight\" size={14} className={isOpen ? \"abs-rot90\" : \"\"} />\n </button>\n ) : <span className=\"abs-twist\" />}\n <button type=\"button\" className=\"abs-comp-main\" onClick={() => onSelect(c.bindId)} aria-current={c.bindId === selected ? \"true\" : undefined}>\n <KindIcon svg={d.icon} />\n <span className=\"abs-comp-l\">{c.label}</span>\n <span className=\"abs-comp-k\">{d.label}{ch.length ? ` · ${ch.length}` : \"\"}</span>\n <StateIcon state={engine.compState(screen.id, c)} />\n </button>\n </div>\n {ch.length > 0 && <Collapse open={isOpen}>{ch.map(k => row(k, depth + 1))}</Collapse>}\n </div>\n );\n };\n const todoCount = all.filter(pending).length;\n return (\n <div className=\"abs-center abs-scroll\">\n <header className=\"abs-screen-h\">\n <div className=\"abs-screen-t\">\n <div className=\"abs-crumbs\">{[...screen.path, ...(screen.parent ? [engine.SCR.get(screen.parent)?.label] : [])].join(\" / \")}</div>\n <h1>{screen.label}</h1>\n </div>\n <div className=\"abs-progress\">\n <Ring done={t.bound} total={t.total} size={36} stroke={3.5} />\n <div><b>{t.bound}<span>/{t.total}</span></b><small>connected</small></div>\n </div>\n </header>\n <div className=\"abs-seg\" role=\"group\" aria-label=\"Show\">\n <span className=\"abs-seg-thumb\" style={{ transform: `translateX(${todo ? 100 : 0}%)` }} aria-hidden=\"true\" />\n <button type=\"button\" className={!todo ? \"is-on\" : \"\"} onClick={() => setTodo(false)} aria-pressed={!todo}><Icon name=\"list\" size={14} />All<span>{all.length}</span></button>\n <button type=\"button\" className={todo ? \"is-on\" : \"\"} onClick={() => setTodo(true)} aria-pressed={todo}><Icon name=\"todo\" size={14} />To do<span>{todoCount}</span></button>\n </div>\n <div className=\"abs-comps abs-glide-box\" role=\"list\" ref={glide.ref} {...glide.handlers}>\n {glide.indicator}\n {all.filter(c => !c.parent && visible(c)).map(c => row(c, 0))}\n {todo && !todoCount && <div className=\"abs-done\"><Icon name=\"bound\" size={24} /><b>Everything here is connected</b></div>}\n </div>\n </div>\n );\n}\n",
7
+ "import * as React from \"react\";\n\n/** Animates height between 0 and auto without measuring: a one-row grid whose row goes 0fr → 1fr. */\nexport function Collapse({ open, children }: { open: boolean; children: React.ReactNode }) {\n return <div className={\"abs-collapse\" + (open ? \" is-open\" : \"\")} aria-hidden={!open}><div className=\"abs-collapse-in\">{children}</div></div>;\n}\n",
8
+ "import * as React from \"react\";\n\n/* One icon family: 16-unit grid, 1.5 stroke, round caps and joins. Component kinds supply their own glyphs in the same style. */\nconst paths = {\n search: <><circle cx=\"7.25\" cy=\"7.25\" r=\"4.5\" /><path d=\"m13.5 13.5-2.9-2.9\" /></>,\n check: <path d=\"m3.5 8.25 3 3 6-6.5\" />,\n bound: <><circle cx=\"8\" cy=\"8\" r=\"6\" /><path d=\"m5.6 8.1 1.7 1.7 3.2-3.4\" /></>,\n suggested: <><circle cx=\"8\" cy=\"8\" r=\"6\" /><circle cx=\"8\" cy=\"8\" r=\"2\" fill=\"currentColor\" stroke=\"none\" /></>,\n partial: <><circle cx=\"8\" cy=\"8\" r=\"6\" /><path d=\"M8 2a6 6 0 0 1 0 12z\" fill=\"currentColor\" stroke=\"none\" /></>,\n unbound: <circle cx=\"8\" cy=\"8\" r=\"6\" strokeDasharray=\"2.2 2.4\" />,\n data: <><ellipse cx=\"8\" cy=\"4\" rx=\"5\" ry=\"1.75\" /><path d=\"M3 4v8c0 .97 2.24 1.75 5 1.75s5-.78 5-1.75V4M3 8c0 .97 2.24 1.75 5 1.75S13 8.97 13 8\" /></>,\n action: <path d=\"M8.75 1.75 3.75 9h4.5l-1 5.25 5-7.25h-4.5z\" />,\n row: <><rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"2\" /><path d=\"M2 7h12\" /></>,\n plus: <path d=\"M8 3.25v9.5M3.25 8h9.5\" />,\n chevronRight: <path d=\"m6.25 3.75 4.25 4.25-4.25 4.25\" />,\n chevronDown: <path d=\"m3.75 6.25 4.25 4.25 4.25-4.25\" />,\n close: <path d=\"m4.25 4.25 7.5 7.5M11.75 4.25l-7.5 7.5\" />,\n screen: <><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"2\" /><path d=\"M1.75 6h12.5\" /></>,\n dialog: <><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"2\" /><rect x=\"4.75\" y=\"6\" width=\"6.5\" height=\"4.5\" rx=\"1\" /></>,\n api: <path d=\"M5.25 4.5 1.75 8l3.5 3.5M10.75 4.5 14.25 8l-3.5 3.5M9.25 3l-2.5 10\" />,\n trash: <path d=\"M2.75 4.25h10.5M6.25 4.25v-1.5h3.5v1.5M4.25 4.25l.6 8.5a1 1 0 0 0 1 .9h4.3a1 1 0 0 0 1-.9l.6-8.5\" />,\n link: <path d=\"M6.75 9.25a2.75 2.75 0 0 0 3.9 0l2-2a2.75 2.75 0 0 0-3.9-3.9l-.6.6M9.25 6.75a2.75 2.75 0 0 0-3.9 0l-2 2a2.75 2.75 0 0 0 3.9 3.9l.6-.6\" />,\n repeat: <><path d=\"m11.25 1.75 2 2-2 2\" /><path d=\"M2.75 7.5v-.75a3 3 0 0 1 3-3h7.5M4.75 14.25l-2-2 2-2\" /><path d=\"M13.25 8.5v.75a3 3 0 0 1-3 3h-7.5\" /></>,\n arrowLeft: <path d=\"M13 8H3m4-4L3 8l4 4\" />,\n component: <rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"2\" />,\n pointer: <path d=\"m3.25 3.25 3.5 9.5 1.5-4 4-1.5zM8.75 8.75l3.5 3.5\" />,\n refresh: <path d=\"M13.25 8A5.25 5.25 0 1 1 11.7 4.3M13.25 2.5v2.75H10.5\" />,\n list: <path d=\"M5.75 4h7.5M5.75 8h7.5M5.75 12h7.5M2.75 4h.01M2.75 8h.01M2.75 12h.01\" />,\n todo: <><circle cx=\"8\" cy=\"8\" r=\"6\" strokeDasharray=\"2.2 2.4\" /><path d=\"M8 5.5V8l1.75 1.25\" /></>,\n target: <><circle cx=\"8\" cy=\"8\" r=\"6\" /><circle cx=\"8\" cy=\"8\" r=\"3\" /><circle cx=\"8\" cy=\"8\" r=\".6\" fill=\"currentColor\" /></>,\n apply: <path d=\"M12.75 3.25v3.5a2 2 0 0 1-2 2h-7.5m3-3-3 3 3 3\" />,\n info: <><circle cx=\"8\" cy=\"8\" r=\"6\" /><path d=\"M8 7.25v3.5M8 5.25h.01\" /></>,\n settings: <><path d=\"M6.6 1.75h2.8l.4 1.7 1.3.75 1.65-.55 1.4 2.43-1.25 1.17v1.5l1.25 1.17-1.4 2.43-1.65-.55-1.3.75-.4 1.7H6.6l-.4-1.7-1.3-.75-1.65.55-1.4-2.43 1.25-1.17v-1.5L1.85 6.08l1.4-2.43 1.65.55 1.3-.75z\" /><circle cx=\"8\" cy=\"8\" r=\"2\" /></>,\n download: <path d=\"M8 2.75v7.5m-3-3 3 3 3-3M2.75 11.75v.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1v-.5\" />,\n upload: <path d=\"M8 10.25v-7.5m-3 3 3-3 3 3M2.75 11.75v.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1v-.5\" />,\n alert: <><circle cx=\"8\" cy=\"8\" r=\"6\" /><path d=\"M8 5v3.25M8 10.75h.01\" /></>,\n} satisfies Record<string, React.ReactNode>;\n\nexport type IconName = keyof typeof paths;\n\nexport function Icon({ name, size = 16, className }: { name: IconName; size?: number; className?: string }) {\n return (\n <svg className={\"abs-ico \" + (className ?? \"\")} width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n {paths[name]}\n </svg>\n );\n}\n\n/** Descriptor SVG drawn as a CSS mask: follows currentColor and is never parsed as markup. */\nexport function KindIcon({ svg }: { svg?: string }) {\n if (svg && /^\\s*<svg[\\s>]/i.test(svg)) {\n const svgDoc = /xmlns=/.test(svg) ? svg : svg.replace(/<svg/i, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n const url = `url(\"data:image/svg+xml,${encodeURIComponent(svgDoc)}\")`;\n return <span className=\"abs-kico\" aria-hidden=\"true\"><span className=\"abs-kico-m\" style={{ maskImage: url, WebkitMaskImage: url }} /></span>;\n }\n return <span className=\"abs-kico\" aria-hidden=\"true\"><Icon name=\"component\" /></span>;\n}\n\nconst STATE_LABEL = { bound: \"Connected\", suggested: \"Needs review\", partial: \"Partly connected\", unbound: \"Not connected\" } as const;\nexport type StateName = keyof typeof STATE_LABEL;\nexport const stateLabel = (s: StateName) => STATE_LABEL[s];\n\nexport function StateIcon({ state, size = 16 }: { state: StateName; size?: number }) {\n return (\n <span className={`abs-state abs-state-${state}`} title={STATE_LABEL[state]}>\n <Icon name={state} size={size} />\n <span className=\"abs-sr\">{STATE_LABEL[state]}</span>\n </span>\n );\n}\n\n/** Circular progress. */\nexport function Ring({ done, total, size = 18, stroke = 2.5 }: { done: number; total: number; size?: number; stroke?: number }) {\n const f = total ? done / total : 0;\n if (size <= 16) {\n // Pie at small sizes; a thin arc reads as a spinner.\n const pr = size / 4 - 0.25, pc = 2 * Math.PI * pr, h = size / 2;\n return (\n <svg className={\"abs-ring abs-pie\" + (total && done === total ? \" is-done\" : \"\")} width={size} height={size} viewBox={`0 0 ${size} ${size}`} aria-hidden=\"true\">\n <circle cx={h} cy={h} r={h - 0.75} strokeWidth={1.5} className=\"abs-ring-bg\" />\n <circle cx={h} cy={h} r={pr} strokeWidth={pr * 2} className=\"abs-ring-fg\" strokeDasharray={pc} strokeDashoffset={pc * (1 - f)} transform={`rotate(-90 ${h} ${h})`} />\n </svg>\n );\n }\n const r = (size - stroke) / 2, c = 2 * Math.PI * r;\n return (\n <svg className={\"abs-ring\" + (total && done === total ? \" is-done\" : \"\")} width={size} height={size} viewBox={`0 0 ${size} ${size}`} aria-hidden=\"true\">\n <circle cx={size / 2} cy={size / 2} r={r} strokeWidth={stroke} className=\"abs-ring-bg\" />\n <circle cx={size / 2} cy={size / 2} r={r} strokeWidth={stroke} className=\"abs-ring-fg\"\n strokeDasharray={c} strokeDashoffset={c * (1 - f)} transform={`rotate(-90 ${size / 2} ${size / 2})`} />\n </svg>\n );\n}\n",
9
+ "import * as React from \"react\";\n\n/** Shared hover highlight for items marked `data-glide`; follows `active` when given. Measures outside render. */\nexport function useGlide<T extends HTMLElement>(active?: Element | null) {\n const ref = React.useRef<T>(null);\n const bar = React.useRef<HTMLSpanElement>(null);\n\n const moveTo = React.useCallback((el: Element | null) => {\n const box = ref.current, b = bar.current;\n if (!box || !b) return;\n if (!el) { b.style.opacity = \"0\"; return; }\n const r = el.getBoundingClientRect(), c = box.getBoundingClientRect();\n const first = b.style.opacity !== \"1\";\n // First show fades in place; later moves slide.\n b.style.transition = first ? \"opacity 120ms ease\" : \"\";\n b.style.transform = `translate(${r.left - c.left + box.scrollLeft}px, ${r.top - c.top + box.scrollTop}px)`;\n b.style.width = `${r.width}px`;\n b.style.height = `${r.height}px`;\n b.style.opacity = \"1\";\n }, []);\n\n React.useEffect(() => { if (active !== undefined) moveTo(active); }, [active, moveTo]);\n\n const handlers = React.useMemo(() => ({\n onPointerOver: (e: React.PointerEvent) => {\n if (active !== undefined) return;\n moveTo((e.target as Element).closest(\"[data-glide]\"));\n },\n onPointerLeave: () => { if (active === undefined) moveTo(null); },\n }), [active, moveTo]);\n\n const indicator = <span ref={bar} className=\"abs-glide\" aria-hidden=\"true\" />;\n return { ref, handlers, indicator, moveTo };\n}\n",
10
+ "import * as React from \"react\";\nimport type { ComponentInstance, ScreenEntry, ScreenId } from \"../framework/contract\";\nimport type { Engine } from \"../framework/engine\";\nimport { Icon, KindIcon, StateIcon } from \"./icons\";\nimport { useGlide } from \"./useGlide\";\n\n/** Search across all screens and components. Ctrl/⌘ K focuses it. */\ntype Hit = { screen: ScreenEntry; comp?: ComponentInstance };\n\nexport function FindAnything({ engine, onGo }: { engine: Engine; onGo: (screen: ScreenId, comp?: string) => void }) {\n const [q, setQ] = React.useState(\"\");\n const [open, setOpen] = React.useState(false);\n const [active, setActive] = React.useState(0);\n const input = React.useRef<HTMLInputElement>(null);\n const box = React.useRef<HTMLDivElement>(null);\n const glide = useGlide<HTMLDivElement>(null);\n const list = glide.ref;\n\n const index = React.useMemo(() => engine.fw.registry.screens.flatMap(screen => [\n { hit: { screen } as Hit, text: [screen.label, ...screen.path].join(\" \").toLowerCase() },\n ...screen.components.filter(c => engine.bindable(engine.descOf(c)).length).map(comp => ({\n hit: { screen, comp } as Hit, text: [comp.label, engine.descOf(comp)!.label, screen.label].join(\" \").toLowerCase(),\n })),\n ]), [engine.fw]);\n\n const hits = React.useMemo(() => {\n const words = q.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n if (!words.length) return [];\n return index.filter(x => words.every(w => x.text.includes(w)))\n .sort((a, b) => Number(!a.text.startsWith(words[0])) - Number(!b.text.startsWith(words[0])))\n .slice(0, 40).map(x => x.hit);\n }, [q, index]);\n\n React.useEffect(() => {\n const key = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === \"k\") { e.preventDefault(); input.current?.focus(); setOpen(true); } };\n const away = (e: PointerEvent) => { if (!box.current?.contains(e.target as Node)) setOpen(false); };\n window.addEventListener(\"keydown\", key); document.addEventListener(\"pointerdown\", away);\n return () => { window.removeEventListener(\"keydown\", key); document.removeEventListener(\"pointerdown\", away); };\n }, []);\n React.useEffect(() => setActive(0), [q]);\n React.useEffect(() => {\n const el = list.current?.querySelector(`[data-i=\"${active}\"]`) ?? null;\n el?.scrollIntoView({ block: \"nearest\" });\n glide.moveTo(el);\n }, [active, hits, list, glide]);\n\n const go = (h: Hit) => { onGo(h.screen.id, h.comp?.bindId); setOpen(false); setQ(\"\"); input.current?.blur(); };\n const onKey = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") { e.preventDefault(); setActive(a => Math.min(hits.length - 1, a + 1)); }\n else if (e.key === \"ArrowUp\") { e.preventDefault(); setActive(a => Math.max(0, a - 1)); }\n else if (e.key === \"Enter\" && hits[active]) go(hits[active]);\n else if (e.key === \"Escape\" && (show || q)) { e.preventDefault(); setOpen(false); setQ(\"\"); }\n };\n const show = open && q.trim().length > 0;\n return (\n <div className=\"abs-find\" ref={box}>\n <div className=\"abs-find-box\">\n <Icon name=\"search\" className=\"abs-c-muted\" />\n <input ref={input} value={q} onChange={e => { setQ(e.target.value); setOpen(true); }} onFocus={() => setOpen(true)} onKeyDown={onKey}\n placeholder=\"Find a component or screen\" aria-label=\"Find a component or screen\" role=\"combobox\" aria-expanded={show} aria-controls=\"abs-find-list\" />\n <kbd>Ctrl K</kbd>\n </div>\n <div className={\"abs-pop abs-find-pop abs-glide-box\" + (show ? \" is-open\" : \"\")} role=\"listbox\" id=\"abs-find-list\" ref={list}>\n {glide.indicator}\n {show && !hits.length ? <div className=\"abs-empty-sm\">Nothing matches “{q}”. Try a screen or component name.</div> : null}\n {show ? hits.map((h, i) => {\n const d = h.comp && engine.descOf(h.comp);\n return (\n <div key={h.screen.id + (h.comp?.bindId ?? \"\")} data-i={i} role=\"option\" aria-selected={i === active}\n className={\"abs-opt\" + (i === active ? \" is-active\" : \"\")} onPointerEnter={() => setActive(i)} onPointerDown={e => { e.preventDefault(); go(h); }}>\n {h.comp ? <KindIcon svg={d?.icon} /> : <span className=\"abs-kico\"><Icon name={h.screen.parent ? \"dialog\" : \"screen\"} /></span>}\n <span className=\"abs-opt-t\">\n <span>{h.comp?.label ?? h.screen.label}</span>\n <code>{h.comp ? `${d?.label} · ${h.screen.label}` : h.screen.path.join(\" / \")}</code>\n </span>\n {h.comp ? <StateIcon state={engine.compState(h.screen.id, h.comp)} /> : <span className=\"abs-nav-count\">{count(engine.tally([h.screen]))}</span>}\n </div>\n );\n }) : null}\n </div>\n </div>\n );\n}\nconst count = (t: { bound: number; total: number }) => `${t.bound}/${t.total}`;\n",
11
+ "import * as React from \"react\";\nimport { Icon } from \"./icons\";\n\nexport interface Placement { top: number; left: number; side: \"top\" | \"bottom\" }\n\n/** Above the anchor when it fits, otherwise below; horizontally centred and kept inside the viewport. */\nexport function placeTip(\n anchor: { top: number; bottom: number; left: number; width: number },\n tip: { width: number; height: number },\n viewport: { width: number; height: number },\n gap = 8,\n margin = 8,\n): Placement {\n const side = anchor.top - gap - tip.height >= margin || anchor.bottom + gap + tip.height > viewport.height - margin ? \"top\" : \"bottom\";\n const top = side === \"top\" ? anchor.top - gap - tip.height : anchor.bottom + gap;\n const centred = anchor.left + anchor.width / 2 - tip.width / 2;\n const left = Math.min(Math.max(centred, margin), Math.max(margin, viewport.width - margin - tip.width));\n return { top: Math.max(margin, top), left, side };\n}\n\nconst SHOW_DELAY = 250;\n\n/** Info button with a tooltip on hover and keyboard focus. Rendered in the top layer, so no container clips it. */\nexport function Tip({ text }: { text: string }) {\n const id = React.useId();\n const btn = React.useRef<HTMLButtonElement>(null);\n const body = React.useRef<HTMLSpanElement>(null);\n const timer = React.useRef<ReturnType<typeof setTimeout>>(undefined);\n const [open, setOpen] = React.useState(false);\n\n const show = React.useCallback((delay: number) => {\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setOpen(true), delay);\n }, []);\n const hide = React.useCallback(() => { clearTimeout(timer.current); setOpen(false); }, []);\n React.useEffect(() => () => clearTimeout(timer.current), []);\n\n React.useLayoutEffect(() => {\n const el = body.current, anchor = btn.current;\n if (!open || !el || !anchor) return;\n el.showPopover();\n const p = placeTip(anchor.getBoundingClientRect(), el.getBoundingClientRect(), { width: innerWidth, height: innerHeight });\n el.style.top = `${p.top}px`;\n el.style.left = `${p.left}px`;\n el.dataset.side = p.side;\n // A moved anchor makes the position stale; close instead of tracking it.\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") { e.preventDefault(); hide(); } };\n addEventListener(\"scroll\", hide, true);\n addEventListener(\"resize\", hide);\n addEventListener(\"keydown\", onKey);\n return () => {\n removeEventListener(\"scroll\", hide, true);\n removeEventListener(\"resize\", hide);\n removeEventListener(\"keydown\", onKey);\n if (el.matches(\":popover-open\")) el.hidePopover();\n };\n }, [open, hide]);\n\n return (\n <span className=\"abs-tip\">\n <button ref={btn} type=\"button\" className=\"abs-tip-btn\" aria-describedby={id} aria-label=\"More information\"\n onClick={e => e.stopPropagation()}\n onPointerEnter={() => show(SHOW_DELAY)} onPointerLeave={hide}\n onFocus={e => { if (e.currentTarget.matches(\":focus-visible\")) show(0); }} onBlur={hide}>\n <Icon name=\"info\" size={14} />\n </button>\n <span ref={body} role=\"tooltip\" id={id} popover=\"manual\" className=\"abs-tip-body\">{text}</span>\n </span>\n );\n}\n",
12
+ "import * as React from \"react\";\nimport type { ExpressionConsumeBinding, OperationConsumeBinding } from \"../../framework/contract\";\nimport { humanize } from \"../../framework/engine\";\nimport { ApiPicker } from \"../ApiPicker\";\nimport { Icon } from \"../icons\";\nimport { RequestInputs } from \"./RequestInputs\";\nimport type { EditorProps } from \"./types\";\n\n/** A slot that needs data: pick the API, where the data is in the response, how items map, and what to send. */\nexport function ConsumeEditor(p: EditorProps) {\n const { engine, screen, comp, slot, put } = p;\n const b = engine.getB(screen, comp.bindId, slot.id) as OperationConsumeBinding | ExpressionConsumeBinding | undefined;\n const shape = engine.shapeOf(screen, comp, slot);\n const ranked = React.useCallback(() => engine.rank(screen, comp, slot), [engine, screen, comp, slot]);\n const srcs = React.useMemo(() => engine.sources(screen), [engine, screen]);\n const op = b?.type === \"operation\" ? b : undefined;\n const view = op ? engine.OPV.get(op.operation) : undefined;\n\n const choose = (opId: string) => {\n const main = engine.proposeConsume(screen, comp, slot, opId);\n if (!main) return;\n // Siblings only on the first pick, never over existing bindings.\n const siblings = op ? [] : engine.siblingFills(screen, comp, slot, opId);\n [main, ...siblings].forEach(put);\n };\n const fieldsAt = engine.fieldsAt;\n const update = (patch: Partial<OperationConsumeBinding>) => op && put({ ...op, ...patch, state: \"draft\" });\n\n const props = shape.fields && !shape.via ? shape.fields : null;\n const choices = view ? (shape.many || props ? [...view.lists.map(l => [l.select, l.fields.length] as const), ...(view.one ? [[\"$\", 0] as const] : [])] : view.scalars.map(([s]) => [s, 0] as const)) : [];\n return (\n <>\n <ApiPicker engine={engine} ranked={ranked} value={op?.operation} onPick={choose} />\n {view && op && (\n <>\n {choices.length > 1 && (\n <div className=\"abs-field\">\n <label htmlFor={`sel-${comp.bindId}-${slot.id}`}>{shape.many || props ? \"Use list\" : \"Use value\"}</label>\n <select id={`sel-${comp.bindId}-${slot.id}`} className=\"abs-select\" value={op.select} onChange={e => update({ select: e.target.value, map: props ? engine.proposeMap(props, fieldsAt(view, e.target.value)) : undefined })}>\n {choices.map(([s]) => <option key={s} value={s}>{s === \"$\" ? \"Whole response\" : humanize(s)}</option>)}\n </select>\n </div>\n )}\n {props && (\n <div className=\"abs-block\">\n <div className=\"abs-block-h\"><span>Shows</span></div>\n <div className=\"abs-map\">\n {props.map(([f, t]) => (\n <div className=\"abs-map-row\" key={f}>\n <label htmlFor={`map-${comp.bindId}-${f}`}>{humanize(f)}</label>\n <Icon name=\"arrowLeft\" size={14} className=\"abs-c-muted\" />\n <select id={`map-${comp.bindId}-${f}`} className={\"abs-select\" + (op.map?.[f] ? \"\" : \" is-empty\")} value={op.map?.[f] ?? \"\"}\n onChange={e => { const m = { ...(op.map ?? {}) }; if (e.target.value) m[f] = e.target.value; else delete m[f]; update({ map: m }); }}>\n <option value=\"\">Not set</option>\n {fieldsAt(view, op.select).map(([ff, ft]) => [ff, engine.typeFit(t, ft)] as const).filter(([, fit]) => fit.ok)\n .map(([ff, fit]) => <option key={ff} value={`$item.${ff}${fit.transform ? ` | ${fit.transform}()` : \"\"}`}>{humanize(ff)}</option>)}\n </select>\n </div>\n ))}\n </div>\n </div>\n )}\n <RequestInputs engine={engine} view={view} request={op.request} sources={srcs} onChange={request => update({ request })} idp={`req-${comp.bindId}-${slot.id}`} />\n <div className=\"abs-field abs-field-inline\">\n <label htmlFor={`load-${comp.bindId}-${slot.id}`}>Load</label>\n <select id={`load-${comp.bindId}-${slot.id}`} className=\"abs-select abs-select-sm\" value={op.load === \"demand\" ? \"demand\" : \"open\"} onChange={e => update({ load: e.target.value as \"open\" | \"demand\" })}>\n <option value=\"open\">When the screen opens</option>\n <option value=\"demand\">When first used</option>\n </select>\n </div>\n </>\n )}\n </>\n );\n}\n",
13
+ "import * as React from \"react\";\nimport type { Engine, OpView, Ranked } from \"../framework/engine\";\nimport { Icon } from \"./icons\";\nimport { useGlide } from \"./useGlide\";\n\nexport const opTitle = (v: OpView) => v.op.summary?.trim() || `${v.op.method} ${v.op.path}`;\n\nexport function MethodTag({ method }: { method: string }) {\n return <span className={`abs-method abs-method-${method.toLowerCase()}`}>{method}</span>;\n}\n\n/** Searchable list of every documented operation, best matches first. */\nexport function ApiPicker({ engine, ranked, value, onPick, label = \"Choose API\", autoOpen = false }: {\n engine: Engine; ranked: () => Ranked[]; value?: string; onPick: (id: string) => void; label?: string; autoOpen?: boolean;\n}) {\n const [open, setOpen] = React.useState(autoOpen);\n const [q, setQ] = React.useState(\"\");\n const [active, setActive] = React.useState(0);\n const root = React.useRef<HTMLDivElement>(null);\n const glide = useGlide<HTMLDivElement>(null);\n const list = glide.ref;\n const id = React.useId();\n\n const top = React.useMemo(() => (open ? ranked().filter(r => r.score >= 0.4).slice(0, 3) : []), [open, ranked]);\n const items = React.useMemo(() => {\n if (!open) return [] as Array<{ v: OpView; best?: Ranked; group: string }>;\n const needle = q.trim().toLowerCase();\n const hit = (v: OpView) => !needle || [v.op.id, v.op.summary, v.op.path, ...v.op.tags].join(\" \").toLowerCase().includes(needle);\n const out: Array<{ v: OpView; best?: Ranked; group: string }> = [];\n if (!needle) top.forEach(r => out.push({ v: r.view, best: r, group: \"Best matches\" }));\n const shown = new Set(out.map(x => x.v.op.id));\n const groupOf = (v: OpView) => [v.op.product, v.op.tags[0] ?? \"Other\"].filter(Boolean).join(\" · \");\n [...engine.OPS].sort((a, b) => groupOf(a).localeCompare(groupOf(b)) || opTitle(a).localeCompare(opTitle(b)))\n .forEach(v => { if (!shown.has(v.op.id) && hit(v)) out.push({ v, group: groupOf(v) }); });\n return out;\n }, [open, q, top, engine]);\n\n React.useEffect(() => {\n if (!open) return;\n const close = (e: PointerEvent) => { if (!root.current?.contains(e.target as Node)) setOpen(false); };\n document.addEventListener(\"pointerdown\", close);\n return () => document.removeEventListener(\"pointerdown\", close);\n }, [open]);\n React.useEffect(() => { setActive(0); }, [q, open]);\n React.useEffect(() => {\n const el = list.current?.querySelector(`[data-i=\"${active}\"]`) ?? null;\n el?.scrollIntoView({ block: \"nearest\" });\n glide.moveTo(el);\n }, [active, items, list, glide]);\n\n const pick = (opId: string) => { onPick(opId); setOpen(false); setQ(\"\"); };\n const onKey = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") { e.preventDefault(); setActive(a => Math.min(items.length - 1, a + 1)); }\n else if (e.key === \"ArrowUp\") { e.preventDefault(); setActive(a => Math.max(0, a - 1)); }\n else if (e.key === \"Enter\" && items[active]) { e.preventDefault(); pick(items[active].v.op.id); }\n else if (e.key === \"Escape\") { e.preventDefault(); setOpen(false); }\n };\n const current = value ? engine.OPV.get(value) : undefined;\n\n let lastGroup = \"\";\n return (\n <div className=\"abs-picker\" ref={root}>\n {current ? (\n <button type=\"button\" className=\"abs-opcard\" onClick={() => setOpen(o => !o)} aria-expanded={open}>\n <MethodTag method={current.op.method} />\n <span className=\"abs-opcard-t\">\n <b>{opTitle(current)}</b>\n <code>{current.op.path}</code>\n </span>\n <span className=\"abs-link\">Change</span>\n </button>\n ) : (\n <button type=\"button\" className=\"abs-btn abs-btn-dashed\" onClick={() => setOpen(o => !o)} aria-expanded={open}>\n <Icon name=\"api\" /> {label}\n </button>\n )}\n {open ? (\n <div className=\"abs-pop\" role=\"dialog\" aria-label=\"Choose an API\">\n <div className=\"abs-pop-search\">\n <Icon name=\"search\" />\n <input autoFocus value={q} onChange={e => setQ(e.target.value)} onKeyDown={onKey} placeholder={`Search ${engine.OPS.length} APIs`}\n role=\"combobox\" aria-expanded=\"true\" aria-controls={id} aria-activedescendant={items[active] ? `${id}-${active}` : undefined} />\n </div>\n <div className=\"abs-pop-list abs-glide-box\" ref={list} id={id} role=\"listbox\">\n {glide.indicator}\n {items.length === 0 ? <div className=\"abs-empty-sm\">No API matches “{q}”. Search by name, path or tag.</div> : null}\n {items.map((it, i) => {\n const head = it.group !== lastGroup ? (lastGroup = it.group) : null;\n return (\n <React.Fragment key={it.group + it.v.op.id}>\n {head ? <div className=\"abs-pop-group\" role=\"presentation\">{head === \"Best matches\" ? <><Icon name=\"target\" size={12} /> Best matches</> : head}</div> : null}\n <div id={`${id}-${i}`} data-i={i} role=\"option\" aria-selected={i === active}\n className={\"abs-opt\" + (i === active ? \" is-active\" : \"\") + (it.v.op.id === value ? \" is-current\" : \"\")}\n onPointerEnter={() => setActive(i)} onPointerDown={e => { e.preventDefault(); pick(it.v.op.id); }}>\n <MethodTag method={it.v.op.method} />\n <span className=\"abs-opt-t\">\n <span>{opTitle(it.v)}</span>\n <code>{it.v.op.path}</code>\n </span>\n {it.v.op.id === value ? <Icon name=\"check\" className=\"abs-c-accent\" /> : null}\n </div>\n </React.Fragment>\n );\n })}\n </div>\n {items[active]?.best?.reasons.length ? (\n <div className=\"abs-pop-why\" aria-live=\"polite\"><Icon name=\"info\" size={14} /><span><b>Why suggested:</b> {items[active].best!.reasons.join(\" · \")}</span></div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n",
14
+ "import * as React from \"react\";\nimport type { Engine, OpView, Source } from \"../../framework/engine\";\nimport { humanize } from \"../../framework/engine\";\nimport { Icon } from \"../icons\";\nimport { SourceSelect } from \"./SourceSelect\";\n\n/** Request fields of an operation, required first. Optional ones fold away. */\nexport function RequestInputs({ engine, view, request, sources, onChange, idp }: { engine: Engine; view: OpView; request: Record<string, string>; sources: Source[]; onChange: (r: Record<string, string>) => void; idp: string }) {\n const req = [...view.req].sort((a, b) => Number(b[2]) - Number(a[2]));\n const required = req.filter(r => r[2]), optional = req.filter(r => !r[2]);\n const filled = req.filter(([p]) => request[p]).length;\n const [more, setMore] = React.useState(false);\n if (!req.length) return null;\n const row = ([ptr, type, isReq]: [string, string, boolean]) => (\n <div className=\"abs-map-row\" key={ptr}>\n <label htmlFor={idp + ptr} title={ptr}>{humanize(ptr)}{isReq && <span className=\"abs-req\" aria-label=\"required\">*</span>}</label>\n <Icon name=\"arrowLeft\" size={14} className=\"abs-c-muted\" />\n <SourceSelect engine={engine} id={idp + ptr} type={type} value={request[ptr]} sources={sources}\n onChange={v => { const r = { ...request }; if (v) r[ptr] = v; else delete r[ptr]; onChange(r); }} />\n </div>\n );\n const shownOptional = optional.filter(([p]) => more || request[p]);\n const shown = required.length + shownOptional.length;\n return (\n <div className=\"abs-block\">\n {shown > 0 && <div className=\"abs-block-h\"><span>Sends</span><span className=\"abs-count\">{filled}/{req.length}</span></div>}\n {shown > 0 && <div className=\"abs-map\">\n {required.map(row)}\n {shownOptional.map(row)}\n </div>}\n {optional.length > shownOptional.length && (\n <button type=\"button\" className=\"abs-link abs-more\" onClick={() => setMore(true)}><Icon name=\"plus\" size={14} /> {shown ? `${optional.length - shownOptional.length} more inputs` : `Add inputs (${optional.length} optional)`}</button>\n )}\n </div>\n );\n}\n",
15
+ "import type { ComponentInstance, ScreenId, SlotBinding, SlotDescriptor } from \"../../framework/contract\";\nimport type { Engine, Source } from \"../../framework/engine\";\n\n/** Props shared by slot editors. */\nexport interface EditorProps {\n engine: Engine;\n screen: ScreenId;\n comp: ComponentInstance;\n slot: SlotDescriptor;\n put: (b: SlotBinding) => void;\n drop: () => void;\n goTo: (bindId: string) => void;\n}\n\n/** How each source group is named in value pickers. */\nexport const GROUP_LABEL: Record<Source[\"group\"], string> = { item: \"Row\", screen: \"This screen\", context: \"Passed in\", provider: \"App\" };\n",
16
+ "import type { Engine, Source } from \"../../framework/engine\";\nimport { GROUP_LABEL } from \"./types\";\n\n/** Picker for one value: every value on the screen that fits the target type, grouped by where it comes from. */\nexport function SourceSelect({ engine, value, type, sources, onChange, id }: { engine: Engine; value?: string; type: string; sources: Source[]; onChange: (v: string | undefined) => void; id: string }) {\n const waiting = sources.filter(s => s.waitsFor);\n const fits = sources.filter(s => s.type !== \"list\" && !s.waitsFor).map(s => ({ s, fit: engine.typeFit(type, s.type) })).filter(x => x.fit.ok);\n const groups = new Map<string, typeof fits>();\n fits.forEach(x => { const g = GROUP_LABEL[x.s.group]; groups.set(g, [...(groups.get(g) ?? []), x]); });\n const known = !value || fits.some(x => x.s.expr + (x.fit.transform ? ` | ${x.fit.transform}()` : \"\") === value);\n return (\n <select id={id} className={\"abs-select\" + (value ? \"\" : \" is-empty\")} value={value ?? \"\"} onChange={e => onChange(e.target.value || undefined)}>\n <option value=\"\">Not set</option>\n {!known && <option value={value}>{value}</option>}\n {[...groups].map(([g, xs]) => (\n <optgroup key={g} label={g}>\n {xs.map(({ s, fit }) => <option key={s.expr} value={s.expr + (fit.transform ? ` | ${fit.transform}()` : \"\")}>{s.label}</option>)}\n </optgroup>\n ))}\n {waiting.length > 0 && (\n <optgroup label=\"Connect first\">\n {waiting.map(s => <option key={s.expr} disabled>{s.label}: connect {s.waitsFor}</option>)}\n </optgroup>\n )}\n </select>\n );\n}\n\n",
17
+ "import type { ExpressionConsumeBinding } from \"../../framework/contract\";\nimport { humanize, type Source } from \"../../framework/engine\";\nimport { Icon } from \"../icons\";\nimport type { EditorProps } from \"./types\";\n\n/** A slot evaluated per item of its parent (a cell in a row). */\nexport function ScopedEditor({ engine, screen, comp, slot, put, goTo }: EditorProps) {\n const b = engine.getB(screen, comp.bindId, slot.id) as ExpressionConsumeBinding | undefined;\n const fields = engine.scopeFields(screen, comp, slot);\n const parent = comp.parent ? engine.compOf(screen, comp.parent) : undefined;\n if (!fields?.length) {\n return (\n <div className=\"abs-hint\">\n <Icon name=\"link\" />\n <span>Uses data from <b>{parent?.label}</b>.</span>\n {parent && <button type=\"button\" className=\"abs-link\" onClick={() => goTo(parent.bindId)}>Connect it first</button>}\n </div>\n );\n }\n const type = engine.shapeOf(screen, comp, slot).type ?? \"any\";\n const item: Source[] = fields.map(([f, t]) => ({ expr: `$item.${f}`, label: humanize(f), name: f, type: t, group: \"item\" }));\n const suggestions = !b ? engine.rankSources(comp.label, type, item, 0.45).slice(0, 3) : [];\n const id = `scope-${comp.bindId}-${slot.id}`;\n return (\n <>\n <div className=\"abs-field\">\n <label htmlFor={id}>Field from {parent?.label}</label>\n <select id={id} className={\"abs-select\" + (b ? \"\" : \" is-empty\")} value={b?.value ?? \"\"}\n onChange={e => e.target.value && put({ component: comp.bindId, slot: slot.id, type: \"expression\", value: e.target.value, origin: \"manual\", state: \"draft\" })}>\n <option value=\"\">Choose a field</option>\n {item.filter(s => engine.typeFit(type, s.type).ok).map(s => <option key={s.expr} value={s.expr}>{s.label}</option>)}\n </select>\n </div>\n {suggestions.length > 0 && (\n <div className=\"abs-suggests\">\n {suggestions.map(sg => (\n <button key={sg.expr} type=\"button\" className=\"abs-suggest\" onClick={() => put({ component: comp.bindId, slot: slot.id, type: \"expression\", value: sg.expr, origin: \"suggested\", state: \"draft\" })}>\n <Icon name=\"apply\" size={14} /> {sg.source.label}\n </button>\n ))}\n </div>\n )}\n </>\n );\n}\n",
18
+ "import * as React from \"react\";\nimport type { NoApiBinding, Step, TriggerBinding } from \"../../framework/contract\";\nimport { ApiPicker } from \"../ApiPicker\";\nimport { Icon } from \"../icons\";\nimport { StepCard } from \"./StepCard\";\nimport type { EditorProps } from \"./types\";\n\n/** An event: the API calls it runs, in order, or \"No API needed\". */\nexport function TriggerEditor(p: EditorProps) {\n const { engine, screen, comp, slot, put } = p;\n const b = engine.getB(screen, comp.bindId, slot.id) as TriggerBinding | NoApiBinding | undefined;\n const steps = b?.type === \"steps\" ? b.steps : [];\n const [adding, setAdding] = React.useState(false);\n const set = (next: Step[]) => (next.length ? put({ component: comp.bindId, slot: slot.id, type: \"steps\", steps: next, origin: b?.origin ?? \"manual\", state: \"draft\" }) : p.drop());\n const none = () => put({ component: comp.bindId, slot: slot.id, type: \"none\", origin: \"manual\", state: \"confirmed\" });\n const mc = engine.manyContext(screen);\n const ranked = React.useCallback(() => engine.rank(screen, comp, slot), [engine, screen, comp, slot]);\n // Hooks above, early return below.\n if (b?.type === \"none\") return <div className=\"abs-hint\"><Icon name=\"check\" /><span>Calls no API.</span></div>;\n\n const addCall = (opId: string) => {\n const v = engine.OPV.get(opId)!;\n const forEach = mc ? `$context.${mc.id}` : undefined;\n const next = 1 + Math.max(0, ...steps.map(x => Number(x.id.replace(/^s/, \"\")) || 0));\n set([...steps, { type: \"call\", id: `s${next}`, operation: opId, request: engine.proposeRequest(v, engine.triggerSources(screen)), forEach, onError: \"stop\" }]);\n setAdding(false);\n };\n\n return (\n <div className=\"abs-steps\">\n {steps.map((st, i) => (\n <StepCard key={i} {...p} step={st} index={i} total={steps.length}\n onChange={x => set(steps.map((y, j) => (j === i ? x : y)))}\n onRemove={() => set(steps.filter((_, j) => j !== i))}\n onMove={d => { const n = [...steps]; [n[i], n[i + d]] = [n[i + d], n[i]]; set(n); }} />\n ))}\n {adding ? (\n <div className=\"abs-addstep\">\n <ApiPicker engine={engine} ranked={ranked} onPick={addCall} label=\"Call API\" autoOpen />\n <button type=\"button\" className=\"abs-link abs-more\" onClick={() => setAdding(false)}>Cancel</button>\n </div>\n ) : (\n <>\n <button type=\"button\" className=\"abs-btn abs-btn-dashed\" onClick={() => setAdding(true)}><Icon name=\"plus\" /> {steps.length ? \"Call another API\" : \"Call an API\"}</button>\n {!steps.length && <button type=\"button\" className=\"abs-link abs-more\" onClick={none}>No API needed</button>}\n </>\n )}\n </div>\n );\n}\n",
19
+ "import * as React from \"react\";\nimport type { Step } from \"../../framework/contract\";\nimport { ApiPicker } from \"../ApiPicker\";\nimport { Icon } from \"../icons\";\nimport { RequestInputs } from \"./RequestInputs\";\nimport type { EditorProps } from \"./types\";\n\n/** One API call in a trigger: which API, whether it runs per item, and what it sends. */\nexport function StepCard({ engine, screen, comp, slot, step, index, total, onChange, onRemove, onMove }: EditorProps & { step: Step; index: number; total: number; onChange: (s: Step) => void; onRemove: () => void; onMove: (d: -1 | 1) => void }) {\n const ranked = React.useCallback(() => engine.rank(screen, comp, slot), [engine, screen, comp, slot]);\n const mc = engine.manyContext(screen);\n const view = engine.OPV.get(step.operation);\n const srcs = React.useMemo(() => (step.forEach ? engine.triggerSources(screen) : engine.sources(screen)), [engine, screen, step]);\n return (\n <div className=\"abs-step\">\n <div className=\"abs-step-h\">\n <span className=\"abs-step-n\">{index + 1}</span>\n <Icon name=\"api\" className=\"abs-c-muted\" />\n <span className=\"abs-step-t\">Call API</span>\n <span className=\"abs-step-tools\">\n {index > 0 && <button type=\"button\" className=\"abs-iconbtn\" onClick={() => onMove(-1)} aria-label=\"Move up\"><Icon name=\"chevronDown\" className=\"abs-rot180\" /></button>}\n {index < total - 1 && <button type=\"button\" className=\"abs-iconbtn\" onClick={() => onMove(1)} aria-label=\"Move down\"><Icon name=\"chevronDown\" /></button>}\n <button type=\"button\" className=\"abs-iconbtn\" onClick={onRemove} aria-label=\"Remove step\"><Icon name=\"trash\" /></button>\n </span>\n </div>\n {view && (\n <div className=\"abs-step-b\">\n <ApiPicker engine={engine} ranked={ranked} value={step.operation}\n onPick={id => onChange({ ...step, operation: id, request: engine.proposeRequest(engine.OPV.get(id)!, srcs) })} />\n {mc && (\n <label className=\"abs-toggle\">\n <input type=\"checkbox\" checked={!!step.forEach} onChange={e => onChange({ ...step, forEach: e.target.checked ? `$context.${mc.id}` : undefined })} />\n <span className=\"abs-toggle-ui\" aria-hidden=\"true\" />\n <Icon name=\"repeat\" size={14} className=\"abs-c-muted\" /> Run for each <span className=\"abs-toggle-of\">{mc.label}</span>\n </label>\n )}\n <RequestInputs engine={engine} view={view} request={step.request} sources={srcs} onChange={request => onChange({ ...step, request })} idp={`st-${comp.bindId}-${index}-`} />\n </div>\n )}\n </div>\n );\n}\n",
20
+ "import { Icon, StateIcon, stateLabel } from \"../icons\";\nimport { Tip } from \"../Tip\";\nimport { ConsumeEditor } from \"./ConsumeEditor\";\nimport { ScopedEditor } from \"./ScopedEditor\";\nimport { TriggerEditor } from \"./TriggerEditor\";\nimport type { EditorProps } from \"./types\";\n\nconst ROLE_HELP = {\n consume: \"Data this component shows. Pick the API that returns it.\",\n scoped: \"A value shown for each row. Pick the field from the row's data.\",\n trigger: \"What happens when this is used. Pick the API calls it makes, or mark it as calling none.\",\n} as const;\n\n/** One card per bindable slot; the editor depends on the slot's role. */\nexport function SlotSection(p: EditorProps) {\n const { engine, screen, comp, slot } = p;\n const state = engine.slotState(screen, comp.bindId, slot.id);\n const b = engine.getB(screen, comp.bindId, slot.id);\n const kind = slot.role === \"trigger\" ? \"trigger\" : slot.scope ? \"scoped\" : \"consume\";\n return (\n <section className={`abs-slot abs-slot-${state}`} aria-labelledby={`slot-${comp.bindId}-${slot.id}`}>\n <header className=\"abs-slot-h\">\n <Icon name={kind === \"trigger\" ? \"action\" : kind === \"scoped\" ? \"row\" : \"data\"} className=\"abs-c-muted\" />\n <h3 id={`slot-${comp.bindId}-${slot.id}`}>\n {slot.label}{slot.required ? <span className=\"abs-req\" aria-label=\"required\">*</span> : null}\n </h3>\n <Tip text={slot.description ? `${slot.description}. ${ROLE_HELP[kind]}` : ROLE_HELP[kind]} />\n <span className={`abs-pill abs-pill-${state}`}><StateIcon state={state} size={13} />{stateLabel(state)}</span>\n </header>\n <div className=\"abs-slot-b\">\n {kind === \"trigger\" ? <TriggerEditor {...p} /> : kind === \"scoped\" ? <ScopedEditor {...p} /> : <ConsumeEditor {...p} />}\n </div>\n {b ? (\n <footer className={\"abs-slot-f\" + (state === \"suggested\" ? \"\" : \" is-plain\")}>\n {state === \"suggested\" ? <button type=\"button\" className=\"abs-btn abs-btn-primary\" onClick={() => p.put({ ...b, state: \"confirmed\" })}><Icon name=\"check\" /> Confirm</button> : null}\n <button type=\"button\" className=\"abs-btn abs-btn-ghost\" onClick={p.drop}>{state === \"suggested\" ? \"Discard\" : b.type === \"none\" ? \"Undo\" : \"Disconnect\"}</button>\n </footer>\n ) : null}\n </section>\n );\n}\n",
21
+ "import type { ComponentInstance, ScreenEntry, SlotBinding } from \"../framework/contract\";\nimport type { Engine } from \"../framework/engine\";\nimport { SlotSection } from \"./editors/SlotSection\";\nimport { Icon, KindIcon } from \"./icons\";\n\n/** Settings for one component: a card per bindable slot. */\nexport function Inspector({ engine, screen, comp, put, drop, goTo, onClose }: { engine: Engine; screen: ScreenEntry; comp: ComponentInstance; put: (b: SlotBinding) => void; drop: (c: string, s: string) => void; goTo: (id: string) => void; onClose: () => void }) {\n const d = engine.descOf(comp)!;\n const parent = comp.parent ? engine.compOf(screen.id, comp.parent) : undefined;\n return (\n <aside className=\"abs-insp abs-enter\" aria-label={`${comp.label} settings`}>\n <header className=\"abs-insp-h\">\n <KindIcon svg={d.icon} />\n <div>\n <h2>{comp.label}</h2>\n <span>{d.label}{parent && <> in <button type=\"button\" className=\"abs-link\" onClick={() => goTo(parent.bindId)}>{parent.label}</button></>}</span>\n </div>\n <button type=\"button\" className=\"abs-iconbtn\" onClick={onClose} aria-label=\"Close panel\"><Icon name=\"close\" /></button>\n </header>\n <div className=\"abs-insp-b abs-scroll\">\n {engine.bindable(d).map(sl => (\n <SlotSection key={comp.bindId + sl.id} engine={engine} screen={screen.id} comp={comp} slot={sl}\n put={put} drop={() => drop(comp.bindId, sl.id)} goTo={goTo} />\n ))}\n </div>\n </aside>\n );\n}\n",
22
+ "import * as React from \"react\";\nimport type { ScreenEntry, ScreenId } from \"../framework/contract\";\nimport type { Engine } from \"../framework/engine\";\nimport { Collapse } from \"./Collapse\";\nimport { Icon } from \"./icons\";\nimport { useGlide } from \"./useGlide\";\n\n/** Screens grouped by path: product, then groups. */\nexport type NavNode = { key: string; name: string; nodes: NavNode[]; screens: ScreenEntry[]; all: ScreenEntry[] };\nexport function buildTree(screens: ScreenEntry[]): NavNode[] {\n const root: NavNode = { key: \"\", name: \"\", nodes: [], screens: [], all: [] };\n for (const s of screens) {\n let node = root;\n node.all.push(s);\n for (const seg of s.path.length ? s.path : [\"Other\"]) {\n const key = node.key + \"/\" + seg;\n let next = node.nodes.find(n => n.key === key);\n if (!next) { next = { key, name: seg, nodes: [], screens: [], all: [] }; node.nodes.push(next); }\n node = next;\n node.all.push(s);\n }\n if (!s.parent) node.screens.push(s);\n }\n return root.nodes;\n}\n\nexport function Navigator({ engine, current, onPick }: { engine: Engine; current: ScreenId; onPick: (id: ScreenId) => void }) {\n const [q, setQ] = React.useState(\"\");\n const [open, setOpen] = React.useState<Record<string, boolean>>({});\n const screens = engine.fw.registry.screens;\n const tree = React.useMemo(() => buildTree(screens), [screens]);\n const byParent = React.useMemo(() => {\n const m = new Map<ScreenId, ScreenEntry[]>();\n screens.forEach(s => { if (s.parent) m.set(s.parent, [...(m.get(s.parent) ?? []), s]); });\n return m;\n }, [screens]);\n const needle = q.trim().toLowerCase();\n const match = (s: ScreenEntry) => !needle || [s.label, ...s.path].join(\" \").toLowerCase().includes(needle);\n\n // Only the groups holding the current screen open; everything else stays collapsed.\n React.useEffect(() => {\n const path = screens.find(s => s.id === current)?.path ?? [];\n setOpen(o => { const n = { ...o }; path.forEach((_, i) => { n[\"/\" + path.slice(0, i + 1).join(\"/\")] = true; }); return n; });\n }, [current, screens]);\n\n const glide = useGlide<HTMLDivElement>();\n const screenRow = (s: ScreenEntry, depth: number): React.ReactNode => {\n const kids = byParent.get(s.id) ?? [];\n if (!(match(s) || kids.some(match))) return null;\n const t = engine.tally([s]);\n return (\n <React.Fragment key={s.id}>\n <button type=\"button\" data-glide className={\"abs-nav-item\" + (s.id === current ? \" is-on\" : \"\")} style={{ paddingLeft: 12 + depth * 16 }} onClick={() => onPick(s.id)}\n aria-current={s.id === current ? \"page\" : undefined} aria-label={`${s.label}, ${t.bound} of ${t.total} connected`}>\n <Icon name={s.parent ? \"dialog\" : \"screen\"} />\n <span className=\"abs-nav-l\">{s.label}</span>\n {t.total > 0 && t.bound === t.total ? <Icon name=\"check\" size={14} className=\"abs-c-ok\" /> : <span className=\"abs-nav-count\">{t.bound}/{t.total}</span>}\n </button>\n {kids.map(k => screenRow(k, depth + 1))}\n </React.Fragment>\n );\n };\n const group = (n: NavNode, depth: number): React.ReactNode => {\n if (needle && !n.all.some(match)) return null;\n const isOpen = !!needle || !!open[n.key];\n const t = engine.tally(n.all);\n const holdsCurrent = n.all.some(s => s.id === current);\n return (\n <div key={n.key} className=\"abs-tree\" role=\"treeitem\" aria-expanded={isOpen}>\n <button type=\"button\" data-glide className={\"abs-nav-group-h\" + (holdsCurrent ? \" has-current\" : \"\")} style={{ paddingLeft: 12 + depth * 16 }}\n onClick={() => setOpen(o => ({ ...o, [n.key]: !isOpen }))} aria-expanded={isOpen} aria-label={`${n.name}, ${t.bound} of ${t.total} connected`}>\n <span className=\"abs-nav-l\">{n.name}</span>\n <span className=\"abs-nav-count\">{t.bound}/{t.total}</span>\n <Icon name=\"chevronRight\" size={14} className={\"abs-chev\" + (isOpen ? \" abs-rot90\" : \"\")} />\n </button>\n <Collapse open={isOpen}>\n <div role=\"group\">\n {n.nodes.map(x => group(x, depth + 1))}\n {n.screens.map(s => screenRow(s, depth + 1))}\n </div>\n </Collapse>\n </div>\n );\n };\n return (\n <nav className=\"abs-nav\" aria-label=\"Screens\">\n <div className=\"abs-nav-head\">\n <div className=\"abs-search\">\n <Icon name=\"search\" className=\"abs-c-muted\" size={14} />\n <input value={q} onChange={e => setQ(e.target.value)} placeholder=\"Filter screens\" aria-label=\"Filter screens\" />\n </div>\n </div>\n <div className=\"abs-nav-scroll abs-scroll abs-glide-box\" role=\"tree\" aria-label=\"Products\" ref={glide.ref} {...glide.handlers}>\n {glide.indicator}\n <div className=\"abs-eyebrow abs-eyebrow-sm\">Products</div>\n {tree.map(n => group(n, 0))}\n {needle && !screens.some(match) ? <div className=\"abs-empty-sm\">No screen matches “{q}”.</div> : null}\n </div>\n </nav>\n );\n}\n",
23
+ "import * as React from \"react\";\nimport type { BindingManifest } from \"../framework/contract\";\nimport { parseManifests } from \"../framework/store\";\nimport { Icon } from \"./icons\";\nimport type { CatalogState } from \"./useCatalog\";\nimport { DEFAULT_DOCS_URL } from \"./useSettings\";\n\nexport interface SettingsPanelProps {\n docsUrl: string;\n onDocsUrl: (url: string) => void;\n catalog: CatalogState;\n onReload: () => void;\n /** Every screen's current manifest, for download. */\n manifests: () => BindingManifest[];\n onImport: (manifests: BindingManifest[]) => void;\n onClose: () => void;\n}\n\nconst TIME = new Intl.DateTimeFormat(undefined, { hour: \"numeric\", minute: \"2-digit\" });\n\nfunction isUrl(v: string) {\n try { const u = new URL(v, location.href); return u.protocol === \"https:\" || u.protocol === \"http:\" || u.protocol === \"blob:\"; } catch { return false; }\n}\n\nfunction docsSummary(c: CatalogState): string {\n if (c.status === \"loading\") return \"Loading…\";\n if (c.status === \"error\") return c.error;\n const products = new Set(c.catalog.operations.map(o => o.product).filter(Boolean));\n return `${products.size || 1} ${products.size === 1 ? \"product\" : \"products\"} · ${c.catalog.operations.length} APIs · loaded ${TIME.format(c.loadedAt)}`;\n}\n\n/** Studio settings: where the API docs come from, and moving bindings in and out as files. */\nexport function SettingsPanel({ docsUrl, onDocsUrl, catalog, onReload, manifests, onImport, onClose }: SettingsPanelProps) {\n const [draft, setDraft] = React.useState(docsUrl);\n const [importMsg, setImportMsg] = React.useState<{ ok: boolean; text: string } | null>(null);\n const panel = React.useRef<HTMLDivElement>(null);\n const file = React.useRef<HTMLInputElement>(null);\n const valid = isUrl(draft);\n const dirty = draft.trim() !== docsUrl;\n\n React.useEffect(() => {\n // preventDefault keeps Escape from also closing an enclosing <dialog>.\n const key = (e: KeyboardEvent) => { if (e.key === \"Escape\") { e.preventDefault(); onClose(); } };\n const away = (e: PointerEvent) => { if (!panel.current?.contains(e.target as Node) && !(e.target as Element).closest?.(\".abs-settings-btn\")) onClose(); };\n window.addEventListener(\"keydown\", key);\n document.addEventListener(\"pointerdown\", away);\n return () => { window.removeEventListener(\"keydown\", key); document.removeEventListener(\"pointerdown\", away); };\n }, [onClose]);\n\n const apply = (e: React.FormEvent) => {\n e.preventDefault();\n if (!valid) return;\n if (dirty) onDocsUrl(draft.trim()); else onReload();\n };\n\n const download = () => {\n const blob = new Blob([JSON.stringify(manifests(), null, 2) + \"\\n\"], { type: \"application/json\" });\n const a = document.createElement(\"a\");\n a.href = URL.createObjectURL(blob);\n a.download = \"bindings.json\";\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 1000);\n };\n\n const readFile = async (f: File | undefined) => {\n if (!f) return;\n try {\n const list = parseManifests(await f.text());\n onImport(list);\n setImportMsg({ ok: true, text: `Imported ${list.length} ${list.length === 1 ? \"screen\" : \"screens\"}.` });\n } catch (err) {\n setImportMsg({ ok: false, text: err instanceof Error ? err.message : \"The file could not be read.\" });\n } finally {\n if (file.current) file.current.value = \"\";\n }\n };\n\n return (\n <div className=\"abs-settings abs-pop\" ref={panel} role=\"dialog\" aria-label=\"Settings\">\n <form className=\"abs-set-sec\" onSubmit={apply}>\n <label className=\"abs-set-h\" htmlFor=\"abs-docs-url\">API docs</label>\n <p className=\"abs-set-d\">The OpenAPI file every API in the studio is read from.</p>\n <div className=\"abs-set-row\">\n <input id=\"abs-docs-url\" name=\"docsUrl\" type=\"url\" inputMode=\"url\" autoComplete=\"off\" spellCheck={false}\n className={\"abs-input\" + (valid ? \"\" : \" is-invalid\")} value={draft} onChange={e => setDraft(e.target.value)}\n aria-invalid={!valid} aria-describedby=\"abs-docs-status\" />\n <button type=\"submit\" className=\"abs-btn abs-btn-primary\" disabled={!valid || catalog.status === \"loading\"}>\n {dirty ? \"Use\" : <><Icon name=\"refresh\" size={14} className={catalog.status === \"loading\" ? \"abs-spin\" : \"\"} />Reload</>}\n </button>\n </div>\n <p id=\"abs-docs-status\" className={\"abs-set-status\" + (catalog.status === \"error\" ? \" is-error\" : \"\")} aria-live=\"polite\">\n {valid ? docsSummary(catalog) : \"Enter a full URL, for example \" + DEFAULT_DOCS_URL}\n </p>\n {docsUrl !== DEFAULT_DOCS_URL ? (\n <button type=\"button\" className=\"abs-link abs-more\" onClick={() => { setDraft(DEFAULT_DOCS_URL); onDocsUrl(DEFAULT_DOCS_URL); }}>Use the default URL</button>\n ) : null}\n </form>\n\n <div className=\"abs-set-sec\">\n <span className=\"abs-set-h\">Bindings</span>\n <p className=\"abs-set-d\">Download to commit them with the app. Import replaces the screens the file contains.</p>\n <div className=\"abs-set-row\">\n <button type=\"button\" className=\"abs-btn\" onClick={download}><Icon name=\"download\" size={14} />Download</button>\n <button type=\"button\" className=\"abs-btn\" onClick={() => file.current?.click()}><Icon name=\"upload\" size={14} />Import…</button>\n <input ref={file} type=\"file\" accept=\"application/json,.json\" hidden onChange={e => void readFile(e.target.files?.[0])} />\n </div>\n {importMsg ? <p className={\"abs-set-status\" + (importMsg.ok ? \"\" : \" is-error\")} role=\"status\">{importMsg.text}</p> : null}\n </div>\n </div>\n );\n}\n",
24
+ "import * as React from \"react\";\n\n/** Default OpenAPI document for the catalog. */\nexport const DEFAULT_DOCS_URL = \"https://apidocs.highradius.com/documentation-ui/index.yaml\";\n\nexport interface StudioSettings {\n /** OpenAPI document URL (JSON or YAML). */\n docsUrl: string;\n}\n\n// Versioned: a new shape gets a new key.\nconst KEY = \"abs.settings.v1\";\n\nfunction read(defaults: StudioSettings): StudioSettings {\n try {\n const raw = globalThis.localStorage?.getItem(KEY);\n const saved = raw ? (JSON.parse(raw) as Partial<StudioSettings>) : {};\n return { docsUrl: typeof saved.docsUrl === \"string\" && saved.docsUrl ? saved.docsUrl : defaults.docsUrl };\n } catch {\n return defaults;\n }\n}\n\n/** Per-browser settings in local storage. */\nexport function useSettings(defaults: StudioSettings) {\n const [settings, setSettings] = React.useState(() => read(defaults));\n const update = React.useCallback((patch: Partial<StudioSettings>) => {\n setSettings(prev => {\n const next = { ...prev, ...patch };\n try { globalThis.localStorage?.setItem(KEY, JSON.stringify(next)); } catch { /* storage blocked: keep for this session only */ }\n return next;\n });\n }, []);\n return [settings, update] as const;\n}\n",
25
+ "import * as React from \"react\";\nimport type { BindingManifest, PersistenceAdapter, ScreenId, SlotBinding } from \"../framework/contract\";\nimport type { BindingIndex, FrameworkData } from \"../framework/engine\";\nimport { dropBinding, loadAll, markDirty, putBinding, savePending, type Pending } from \"../framework/store\";\n\nexport type SaveStatus = \"idle\" | \"saving\" | \"saved\" | \"failed\";\nexport interface Removed { screen: ScreenId; binding: SlotBinding }\n\n/** Studio bindings: loaded once, saved 400 ms after the last edit; the last removal can be undone. */\nexport function useBindings(fw: FrameworkData | null, adapter: PersistenceAdapter) {\n const [index, setIndex] = React.useState<BindingIndex>({});\n const [loaded, setLoaded] = React.useState(false);\n const [status, setStatus] = React.useState<SaveStatus>(\"idle\");\n const [removed, setRemoved] = React.useState<Removed | null>(null);\n const pending = React.useRef<Pending>(new Map());\n const latest = React.useRef(index);\n latest.current = index;\n\n // String key: reloading a catalog with the same screens does not reload bindings.\n const screenIds = fw?.registry.screens.map(s => s.id).join(\"\\n\") ?? \"\";\n React.useEffect(() => {\n if (!screenIds) return;\n let live = true;\n loadAll(adapter, screenIds.split(\"\\n\")).then(i => { if (live) { setIndex(i); setLoaded(true); } });\n return () => { live = false; };\n }, [adapter, screenIds]);\n\n const flush = React.useCallback(async () => {\n if (!pending.current.size || !fw) return;\n setStatus(\"saving\");\n const failed = await savePending(adapter, fw, latest.current, pending.current);\n setStatus(failed.length ? \"failed\" : pending.current.size ? \"saving\" : \"saved\");\n }, [adapter, fw]);\n\n React.useEffect(() => {\n if (!pending.current.size) return;\n setStatus(\"saving\");\n const t = setTimeout(flush, 400);\n return () => clearTimeout(t);\n }, [index, flush]);\n // Flush on unmount; warn before closing with unsaved edits.\n React.useEffect(() => () => { void flush(); }, [flush]);\n React.useEffect(() => {\n const warn = (e: BeforeUnloadEvent) => { if (pending.current.size) e.preventDefault(); };\n window.addEventListener(\"beforeunload\", warn);\n return () => window.removeEventListener(\"beforeunload\", warn);\n }, []);\n\n const put = React.useCallback((screen: ScreenId, b: SlotBinding) => {\n markDirty(pending.current, screen);\n setIndex(i => putBinding(i, screen, b));\n }, []);\n const drop = React.useCallback((screen: ScreenId, component: string, slot: string) => {\n const binding = latest.current[screen]?.find(x => x.component === component && x.slot === slot);\n if (binding) setRemoved({ screen, binding });\n markDirty(pending.current, screen);\n setIndex(i => dropBinding(i, screen, component, slot));\n }, []);\n const undo = React.useCallback(() => {\n if (removed) put(removed.screen, removed.binding);\n setRemoved(null);\n }, [put, removed]);\n const dismiss = React.useCallback(() => setRemoved(null), []);\n /** Replaces the bindings of the screens in the imported manifests. */\n const importManifests = React.useCallback((manifests: BindingManifest[]) => {\n manifests.forEach(m => markDirty(pending.current, m.screen));\n setIndex(i => ({ ...i, ...Object.fromEntries(manifests.map(m => [m.screen, m.bindings])) }));\n }, []);\n\n return { index, loaded, status, removed, put, drop, undo, dismiss, importManifests, retry: flush };\n}\n",
26
+ "import * as React from \"react\";\nimport type { Catalog } from \"../framework/contract\";\nimport { loadCatalog } from \"../framework/loadCatalog\";\n\nexport type CatalogState =\n | { status: \"loading\"; catalog?: Catalog }\n | { status: \"ready\"; catalog: Catalog; loadedAt: Date }\n | { status: \"error\"; catalog?: Catalog; error: string };\n\n/** Catalog from the docs URL, or the one passed in. Keeps the previous catalog while reloading. */\nexport function useCatalog(url: string, provided?: Catalog) {\n const [state, setState] = React.useState<CatalogState>(() =>\n provided ? { status: \"ready\", catalog: provided, loadedAt: new Date() } : { status: \"loading\" });\n const [nonce, setNonce] = React.useState(0);\n\n React.useEffect(() => {\n if (provided) { setState({ status: \"ready\", catalog: provided, loadedAt: new Date() }); return; }\n const ctrl = new AbortController();\n setState(s => ({ status: \"loading\", catalog: s.catalog }));\n loadCatalog(url, { signal: ctrl.signal }).then(\n catalog => setState({ status: \"ready\", catalog, loadedAt: new Date() }),\n e => { if (!ctrl.signal.aborted) setState(s => ({ status: \"error\", catalog: s.catalog, error: e instanceof Error ? e.message : String(e) })); },\n );\n return () => ctrl.abort();\n }, [url, provided, nonce]);\n\n const reload = React.useCallback(() => setNonce(n => n + 1), []);\n return [state, reload] as const;\n}\n",
27
+ "/** Fetches a published OpenAPI document (JSON or YAML). Separate from openapi.ts to keep YAML out of the runtime bundle. */\nimport { parse } from \"yaml\";\nimport type { Catalog } from \"./contract\";\nimport { catalogFromOpenApi } from \"./openapi\";\n\nexport class CatalogLoadError extends Error {\n constructor(message: string, readonly url: string) { super(message); this.name = \"CatalogLoadError\"; }\n}\n\nexport async function loadCatalog(url: string, init?: RequestInit): Promise<Catalog> {\n let res: Response;\n try {\n res = await fetch(url, { ...init, headers: { Accept: \"application/yaml, application/json, text/yaml, */*\", ...init?.headers } });\n } catch {\n // fetch rejects only on network or CORS failure; the browser does not say which.\n throw new CatalogLoadError(\"The docs could not be reached. Check the URL, your network, and that the docs server allows this site (CORS).\", url);\n }\n if (!res.ok) throw new CatalogLoadError(`The docs server answered ${res.status} ${res.statusText}. Check the URL.`, url);\n const text = await res.text();\n let doc: unknown;\n try {\n doc = text.trimStart().startsWith(\"{\") ? JSON.parse(text) : parse(text);\n } catch {\n throw new CatalogLoadError(\"The file is not valid JSON or YAML.\", url);\n }\n try {\n return catalogFromOpenApi(doc, { url });\n } catch (e) {\n throw new CatalogLoadError(e instanceof Error ? e.message : \"The file is not an OpenAPI document.\", url);\n }\n}\n",
28
+ "import * as React from \"react\";\nimport type { ScreenId } from \"../framework/contract\";\nimport { localStorageAdapter } from \"../framework/store\";\nimport { useBindingRuntime } from \"../runtime/BindingProvider\";\nimport { BindingStudio, type BindingStudioProps } from \"./BindingStudio\";\nimport { Icon } from \"./icons\";\nimport \"./studio.css\";\n\nexport type BindingWidgetProps = Pick<BindingStudioProps, \"framework\" | \"docsUrl\" | \"title\">;\n\nconst fallbackStore = localStorageAdapter();\n\n/**\n * Floating button that opens the studio over the app, on the screen currently shown.\n * Render it inside <BindingProvider>, in design mode only. Edits apply to the app when it closes.\n */\nexport function BindingWidget({ framework, docsUrl, title }: BindingWidgetProps) {\n const runtime = useBindingRuntime();\n const dialog = React.useRef<HTMLDialogElement>(null);\n const fab = React.useRef<HTMLButtonElement>(null);\n const [state, setState] = React.useState<\"closed\" | \"open\" | \"closing\">(\"closed\");\n const [screen, setScreen] = React.useState<ScreenId | undefined>();\n\n const open = () => {\n setScreen(runtime.activeScreen());\n setState(\"open\");\n };\n const requestClose = React.useCallback(() => setState(s => (s === \"open\" ? \"closing\" : s)), []);\n\n React.useLayoutEffect(() => {\n if (state === \"open\" && !dialog.current?.open) dialog.current?.showModal();\n }, [state]);\n\n const finishClose = (e: React.AnimationEvent) => {\n if (e.target !== dialog.current || state !== \"closing\") return;\n dialog.current?.close();\n setState(\"closed\");\n runtime.reloadSaved();\n fab.current?.focus();\n };\n\n return (\n <>\n <button ref={fab} type=\"button\" className=\"abs-fab\" onClick={open} aria-haspopup=\"dialog\" aria-expanded={state !== \"closed\"}>\n <span className=\"abs-fab-ico\"><Icon name=\"link\" size={18} /></span>\n <span className=\"abs-fab-label\"><span>{title ?? \"Bind API\"}</span></span>\n </button>\n {state !== \"closed\" ? (\n <dialog ref={dialog} className={\"abs-widget\" + (state === \"closing\" ? \" is-closing\" : \"\")} aria-label={title ?? \"Bind API\"}\n onCancel={e => { e.preventDefault(); requestClose(); }}\n onClick={e => { if (e.target === e.currentTarget) requestClose(); }}\n onAnimationEnd={finishClose}>\n <BindingStudio framework={framework} docsUrl={docsUrl} title={title} initialScreen={screen}\n persistence={runtime.persistence ?? fallbackStore} onClose={requestClose} />\n </dialog>\n ) : null}\n </>\n );\n}\n"
29
+ ],
30
+ "mappings": "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",
31
+ "debugId": "34079C9B227D68B264756E2164756E21",
32
+ "names": []
33
+ }
@@ -0,0 +1,20 @@
1
+ import type { BindingManifest, PersistenceAdapter, ScreenId, SlotBinding } from "../framework/contract";
2
+ import type { BindingIndex, FrameworkData } from "../framework/engine";
3
+ export type SaveStatus = "idle" | "saving" | "saved" | "failed";
4
+ export interface Removed {
5
+ screen: ScreenId;
6
+ binding: SlotBinding;
7
+ }
8
+ /** Studio bindings: loaded once, saved 400 ms after the last edit; the last removal can be undone. */
9
+ export declare function useBindings(fw: FrameworkData | null, adapter: PersistenceAdapter): {
10
+ index: BindingIndex;
11
+ loaded: boolean;
12
+ status: SaveStatus;
13
+ removed: Removed | null;
14
+ put: (screen: ScreenId, b: SlotBinding) => void;
15
+ drop: (screen: ScreenId, component: string, slot: string) => void;
16
+ undo: () => void;
17
+ dismiss: () => void;
18
+ importManifests: (manifests: BindingManifest[]) => void;
19
+ retry: () => Promise<void>;
20
+ };
@@ -0,0 +1,15 @@
1
+ import type { Catalog } from "../framework/contract";
2
+ export type CatalogState = {
3
+ status: "loading";
4
+ catalog?: Catalog;
5
+ } | {
6
+ status: "ready";
7
+ catalog: Catalog;
8
+ loadedAt: Date;
9
+ } | {
10
+ status: "error";
11
+ catalog?: Catalog;
12
+ error: string;
13
+ };
14
+ /** Catalog from the docs URL, or the one passed in. Keeps the previous catalog while reloading. */
15
+ export declare function useCatalog(url: string, provided?: Catalog): readonly [CatalogState, () => void];
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ /** Shared hover highlight for items marked `data-glide`; follows `active` when given. Measures outside render. */
3
+ export declare function useGlide<T extends HTMLElement>(active?: Element | null): {
4
+ ref: React.RefObject<T | null>;
5
+ handlers: {
6
+ onPointerOver: (e: React.PointerEvent) => void;
7
+ onPointerLeave: () => void;
8
+ };
9
+ indicator: React.JSX.Element;
10
+ moveTo: (el: Element | null) => void;
11
+ };
@@ -0,0 +1,8 @@
1
+ /** Default OpenAPI document for the catalog. */
2
+ export declare const DEFAULT_DOCS_URL = "https://apidocs.highradius.com/documentation-ui/index.yaml";
3
+ export interface StudioSettings {
4
+ /** OpenAPI document URL (JSON or YAML). */
5
+ docsUrl: string;
6
+ }
7
+ /** Per-browser settings in local storage. */
8
+ export declare function useSettings(defaults: StudioSettings): readonly [StudioSettings, (patch: Partial<StudioSettings>) => void];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "api_binding_ui",
3
- "version": "1.0.0",
4
- "description": "API Binding Studio - Isolated visual API mapping, simulation, and verification studio for enterprise web apps.",
3
+ "version": "2.0.0",
4
+ "description": "API binding framework: bind any UI component to documented APIs at design time, run the bindings in production.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -11,18 +11,28 @@
11
11
  "types": "./dist/index.d.ts",
12
12
  "import": "./dist/index.js"
13
13
  },
14
- "./style.css": "./dist/api-binding-ui.css"
14
+ "./studio": {
15
+ "types": "./dist/studio/index.d.ts",
16
+ "import": "./dist/studio/index.js"
17
+ },
18
+ "./studio.css": "./dist/studio/index.css",
19
+ "./package.json": "./package.json"
15
20
  },
16
21
  "files": [
17
22
  "dist",
23
+ "spec/FRAMEWORK.md",
18
24
  "README.md",
19
25
  "SKILL.md"
20
26
  ],
27
+ "sideEffects": [
28
+ "**/*.css"
29
+ ],
21
30
  "scripts": {
22
- "dev": "vite --port 5174",
23
- "build": "bun build src/index.ts --outdir dist --target browser --external react --external react-dom && powershell -Command \"Copy-Item -Path 'dist/index.css' -Destination 'dist/api-binding-ui.css' -Force\" && node ./node_modules/typescript/bin/tsc -p tsconfig.build.json",
24
- "preview": "vite preview",
25
- "test": "bun test"
31
+ "dev": "bun --port=5174 ./index.html",
32
+ "build": "rm -rf dist && bun build src/index.ts src/studio/index.ts --outdir dist --root src --target browser --splitting --sourcemap=linked --external react --external react-dom --external react/jsx-runtime --external yaml && node ./node_modules/typescript/bin/tsc -p tsconfig.build.json",
33
+ "typecheck": "node ./node_modules/typescript/bin/tsc --noEmit -p tsconfig.json",
34
+ "test": "bun test",
35
+ "prepublishOnly": "bun run typecheck && bun test && bun run build"
26
36
  },
27
37
  "peerDependencies": {
28
38
  "react": ">=18.0.0",
@@ -32,11 +42,12 @@
32
42
  "@types/node": "^22.13.0",
33
43
  "@types/react": "^19.2.0",
34
44
  "@types/react-dom": "^19.2.0",
35
- "@vitejs/plugin-react": "^5.1.0",
36
45
  "react": "^19.2.0",
37
46
  "react-dom": "^19.2.0",
38
47
  "typescript": "^5.8.0",
39
- "vite": "^6.2.0",
40
48
  "vitest": "^3.0.0"
49
+ },
50
+ "dependencies": {
51
+ "yaml": "^2.8.1"
41
52
  }
42
53
  }