@agent-native/core 0.42.0 → 0.43.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/README.md +17 -56
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +24 -13
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts +2 -6
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +8 -66
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/blocks/index.d.ts +11 -0
- package/dist/client/blocks/index.d.ts.map +1 -1
- package/dist/client/blocks/index.js +11 -0
- package/dist/client/blocks/index.js.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.js +2 -2
- package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +86 -21
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/FileTreeBlock.js +27 -4
- package/dist/client/blocks/library/FileTreeBlock.js.map +1 -1
- package/dist/client/blocks/library/JsonExplorerBlock.js +1 -1
- package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -1
- package/dist/client/blocks/library/MermaidBlock.js +1 -1
- package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
- package/dist/client/blocks/library/annotation-rail.d.ts +19 -0
- package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
- package/dist/client/blocks/library/annotation-rail.js +19 -0
- package/dist/client/blocks/library/annotation-rail.js.map +1 -1
- package/dist/client/blocks/library/callout.config.d.ts +29 -0
- package/dist/client/blocks/library/callout.config.d.ts.map +1 -0
- package/dist/client/blocks/library/callout.config.js +33 -0
- package/dist/client/blocks/library/callout.config.js.map +1 -0
- package/dist/client/blocks/library/callout.d.ts +20 -0
- package/dist/client/blocks/library/callout.d.ts.map +1 -0
- package/dist/client/blocks/library/callout.js +61 -0
- package/dist/client/blocks/library/callout.js.map +1 -0
- package/dist/client/blocks/library/checklist.d.ts.map +1 -1
- package/dist/client/blocks/library/checklist.js +3 -3
- package/dist/client/blocks/library/checklist.js.map +1 -1
- package/dist/client/blocks/library/decision.config.d.ts +37 -0
- package/dist/client/blocks/library/decision.config.d.ts.map +1 -0
- package/dist/client/blocks/library/decision.config.js +32 -0
- package/dist/client/blocks/library/decision.config.js.map +1 -0
- package/dist/client/blocks/library/decision.d.ts +19 -0
- package/dist/client/blocks/library/decision.d.ts.map +1 -0
- package/dist/client/blocks/library/decision.js +119 -0
- package/dist/client/blocks/library/decision.js.map +1 -0
- package/dist/client/blocks/library/diagram.config.d.ts +64 -0
- package/dist/client/blocks/library/diagram.config.d.ts.map +1 -0
- package/dist/client/blocks/library/diagram.config.js +111 -0
- package/dist/client/blocks/library/diagram.config.js.map +1 -0
- package/dist/client/blocks/library/diagram.d.ts +16 -0
- package/dist/client/blocks/library/diagram.d.ts.map +1 -0
- package/dist/client/blocks/library/diagram.js +261 -0
- package/dist/client/blocks/library/diagram.js.map +1 -0
- package/dist/client/blocks/library/question-form.config.d.ts +69 -0
- package/dist/client/blocks/library/question-form.config.d.ts.map +1 -0
- package/dist/client/blocks/library/question-form.config.js +58 -0
- package/dist/client/blocks/library/question-form.config.js.map +1 -0
- package/dist/client/blocks/library/question-form.d.ts +20 -0
- package/dist/client/blocks/library/question-form.d.ts.map +1 -0
- package/dist/client/blocks/library/question-form.js +286 -0
- package/dist/client/blocks/library/question-form.js.map +1 -0
- package/dist/client/blocks/library/sanitize-html.d.ts +5 -0
- package/dist/client/blocks/library/sanitize-html.d.ts.map +1 -0
- package/dist/client/blocks/library/sanitize-html.js +240 -0
- package/dist/client/blocks/library/sanitize-html.js.map +1 -0
- package/dist/client/blocks/library/server-specs.d.ts.map +1 -1
- package/dist/client/blocks/library/server-specs.js +59 -0
- package/dist/client/blocks/library/server-specs.js.map +1 -1
- package/dist/client/blocks/library/specs.d.ts.map +1 -1
- package/dist/client/blocks/library/specs.js +11 -0
- package/dist/client/blocks/library/specs.js.map +1 -1
- package/dist/client/blocks/library/tabs.d.ts.map +1 -1
- package/dist/client/blocks/library/tabs.js +12 -12
- package/dist/client/blocks/library/tabs.js.map +1 -1
- package/dist/client/blocks/library/wireframe-kit.d.ts +260 -0
- package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -0
- package/dist/client/blocks/library/wireframe-kit.js +920 -0
- package/dist/client/blocks/library/wireframe-kit.js.map +1 -0
- package/dist/client/blocks/library/wireframe.config.d.ts +123 -0
- package/dist/client/blocks/library/wireframe.config.d.ts.map +1 -0
- package/dist/client/blocks/library/wireframe.config.js +294 -0
- package/dist/client/blocks/library/wireframe.config.js.map +1 -0
- package/dist/client/blocks/library/wireframe.d.ts +15 -0
- package/dist/client/blocks/library/wireframe.d.ts.map +1 -0
- package/dist/client/blocks/library/wireframe.js +206 -0
- package/dist/client/blocks/library/wireframe.js.map +1 -0
- package/dist/client/blocks/registry.d.ts +9 -0
- package/dist/client/blocks/registry.d.ts.map +1 -1
- package/dist/client/blocks/registry.js +12 -5
- package/dist/client/blocks/registry.js.map +1 -1
- package/dist/client/blocks/server.d.ts +1 -0
- package/dist/client/blocks/server.d.ts.map +1 -1
- package/dist/client/blocks/server.js +1 -0
- package/dist/client/blocks/server.js.map +1 -1
- package/dist/client/blocks/types.d.ts +8 -0
- package/dist/client/blocks/types.d.ts.map +1 -1
- package/dist/client/blocks/types.js.map +1 -1
- package/dist/client/rich-markdown-editor/DragHandle.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/DragHandle.js +77 -12
- package/dist/client/rich-markdown-editor/DragHandle.js.map +1 -1
- package/dist/styles/agent-native.css +1 -0
- package/dist/styles/blocks.css +1380 -0
- package/docs/content/plan-plugin.md +8 -8
- package/docs/content/pr-visual-recap.md +2 -2
- package/docs/content/template-plan.md +94 -17
- package/package.json +2 -1
- package/docs/content/visual-plans.md +0 -82
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specs.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/specs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAsB,MAAM,gBAAgB,CAAC;AAEpE,iFAAiF;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,8EAA8E;AAC9E,+EAA+E;AAC/E,OAAO,EACL,aAAa,EACb,UAAU,GAEX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,iBAAiB,EACjB,cAAc,GAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,cAAc,GAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EACL,eAAe,EACf,YAAY,GAEb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAiB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,WAAW,GAEZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,qCAAqC,GAEtC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GAEjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE/E;;;;;;;;;;;;;GAaG;AACH,iFAAiF;AACjF,+EAA+E;AAC/E,0EAA0E;AAC1E,MAAM,gBAAgB,GAAqB;IACzC,WAAW,CAAc;QACvB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,0FAA0F;QAC5F,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,MAAM,EACJ,sFAAsF;SACzF,CAAC;KACH,CAAC;IACF,WAAW,CAAkB;QAC3B,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,iBAAiB;QACzB,GAAG,EAAE,cAAc;QACnB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,kKAAkK;QACpK,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;KACxD,CAAC;IACF,WAAW,CAAkB;QAC3B,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,iBAAiB;QACzB,GAAG,EAAE,cAAc;QACnB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,mRAAmR;QACrR,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gBACE,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE;gBAChD,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;gBAC1D,KAAK,EAAE;oBACL,UAAU,EAAE;wBACV,GAAG,EAAE;4BACH,IAAI,EAAE,CAAC,SAAS,CAAC;4BACjB,OAAO,EAAE,cAAc;4BACvB,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;yBAC5C;qBACF;iBACF;aACF,EACD,IAAI,EACJ,CAAC,CACF;SACF,CAAC;KACH,CAAC;IACF,WAAW,CAAgB;QACzB,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,eAAe;QACvB,GAAG,EAAE,YAAY;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,oJAAoJ;QACtJ,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,QAAQ,EAAE;gBACR;oBACE,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE;wBACN,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE;wBACtC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;qBAChC;iBACF;aACF;SACF,CAAC;KACH,CAAC;IACF,WAAW,CAAW;QACpB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,MAAM;QACb,WAAW,EACT,+JAA+J;QACjK,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,MAAM,EAAE,0CAA0C;YAClD,KAAK,EAAE,kEAAkE;YACzE,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IACF,WAAW,CAAe;QACxB,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,cAAc;QACtB,GAAG,EAAE,WAAW;QAChB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,8KAA8K;QAChL,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,cAAc;oBACpB,MAAM,EAAE,UAAU;oBAClB,IAAI,EAAE,0BAA0B;iBACjC;gBACD,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE;aAC/C;SACF,CAAC;KACH,CAAC;IACF,WAAW,CAAmB;QAC5B,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,kBAAkB;QAC1B,GAAG,EAAE,eAAe;QACpB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,wGAAwG;QAC1G,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gBACE,EAAE,EAAE,QAAQ;gBACZ,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;gBACvB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;aAChC,EACD,IAAI,EACJ,CAAC,CACF;YACD,cAAc,EAAE,qCAAqC;SACtD,CAAC;KACH,CAAC;IACF,WAAW,CAAoB;QAC7B,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,mBAAmB;QAC3B,GAAG,EAAE,gBAAgB;QACrB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,iBAAiB;QACvB,SAAS,EAAE,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,0IAA0I;QAC5I,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,QAAQ,EAAE,oBAAoB;YAC9B,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,6GAA6G;YACnH,WAAW,EAAE;gBACX;oBACE,KAAK,EAAE,GAAG;oBACV,KAAK,EAAE,QAAQ;oBACf,IAAI,EAAE,sCAAsC;iBAC7C;aACF;SACF,CAAC;KACH,CAAC;CACH,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAqB;IACjD,cAAc;IACd,UAAU;IACV,SAAS;IACT,aAAa;IACb,SAAS;IACT,SAAS;IACT,YAAY;IACZ,GAAG,gBAAgB;CACpB,CAAC;AAcF;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAuB,EACvB,UAAiD,EAAE;IAEnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,QAAQ,CAAC,CAAC,CAAE,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC","sourcesContent":["import { defineBlock, type BlockSpec } from \"../types.js\";\nimport { registerBlocks, type BlockRegistry } from \"../registry.js\";\n\n// Pre-built standard library specs (schema + mdx + React Read/Edit all bundled).\nimport { checklistBlock } from \"./checklist.js\";\nimport { tableBlock } from \"./table.js\";\nimport { codeBlock } from \"./code.js\";\nimport { codeTabsBlock } from \"./code-tabs.js\";\nimport { htmlBlock } from \"./html.js\";\nimport { tabsBlock } from \"./tabs.js\";\nimport { columnsBlock } from \"./columns.js\";\n\n// Dev-doc blocks: React-free schema + MDX config paired with the shared React\n// Read/Edit renderers. Composed into full specs below with canonical metadata.\nimport {\n mermaidSchema,\n mermaidMdx,\n type MermaidData,\n} from \"./mermaid.config.js\";\nimport { MermaidRead, MermaidEdit } from \"./MermaidBlock.js\";\nimport {\n apiEndpointSchema,\n apiEndpointMdx,\n type ApiEndpointData,\n} from \"./api-endpoint.config.js\";\nimport { ApiEndpointRead, ApiEndpointEdit } from \"./ApiEndpointBlock.js\";\nimport {\n openApiSpecSchema,\n openApiSpecMdx,\n type OpenApiSpecData,\n} from \"./openapi-spec.config.js\";\nimport { OpenApiSpecRead, OpenApiSpecEdit } from \"./OpenApiSpecBlock.js\";\nimport {\n dataModelSchema,\n dataModelMdx,\n type DataModelData,\n} from \"./data-model.config.js\";\nimport { DataModelRead, DataModelEdit } from \"./DataModelBlock.js\";\nimport { diffSchema, diffMdx, type DiffData } from \"./diff.config.js\";\nimport { DiffRead, DiffEdit } from \"./DiffBlock.js\";\nimport {\n fileTreeSchema,\n fileTreeMdx,\n type FileTreeData,\n} from \"./file-tree.config.js\";\nimport { FileTreeRead, FileTreeEdit } from \"./FileTreeBlock.js\";\nimport {\n jsonExplorerSchema,\n jsonExplorerMdx,\n JSON_EXPLORER_DEFAULT_COLLAPSED_DEPTH,\n type JsonExplorerData,\n} from \"./json-explorer.config.js\";\nimport { JsonExplorerRead, JsonExplorerEdit } from \"./JsonExplorerBlock.js\";\nimport {\n annotatedCodeSchema,\n annotatedCodeMdx,\n type AnnotatedCodeData,\n} from \"./annotated-code.config.js\";\nimport { AnnotatedCodeRead, AnnotatedCodeEdit } from \"./AnnotatedCodeBlock.js\";\n\n/**\n * Canonical specs for the standard library's dev-doc blocks (Mermaid, API\n * endpoint, OpenAPI spec, data model, diff, file tree, JSON explorer,\n * annotated code).\n * Each pairs the shared React-free schema/MDX config\n * with the shared React `Read`/`Edit` renderers and the canonical\n * label/description/editSurface/empty metadata. Apps that need a slightly\n * different label/description/empty for a block pass an override to\n * {@link registerLibraryBlocks} rather than re-authoring the whole spec.\n *\n * The six fully pre-built standard specs (checklist, table, code-tabs, html,\n * tabs, columns) already bundle their metadata in their own modules, so they are appended\n * by {@link libraryBlockSpecs} rather than re-declared here.\n */\n// Typed `BlockSpec<any>[]` (not `BlockSpec<unknown>[]`) so the per-block generic\n// data types coexist in one array — mirroring `registerBlocks`' own signature,\n// where `childrenField: keyof TData` would otherwise collapse to `never`.\nconst devDocBlockSpecs: BlockSpec<any>[] = [\n defineBlock<MermaidData>({\n type: \"mermaid\",\n schema: mermaidSchema,\n mdx: mermaidMdx,\n Read: MermaidRead,\n Edit: MermaidEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"Diagram (Mermaid)\",\n description:\n \"A Mermaid diagram (flowchart, sequence, etc.) defined as text and rendered as a diagram.\",\n empty: () => ({\n source:\n \"flowchart TD\\n A[Start] --> B{Decision}\\n B -->|Yes| C[Do it]\\n B -->|No| D[Skip]\",\n }),\n }),\n defineBlock<ApiEndpointData>({\n type: \"api-endpoint\",\n schema: apiEndpointSchema,\n mdx: apiEndpointMdx,\n Read: ApiEndpointRead,\n Edit: ApiEndpointEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"API endpoint\",\n description:\n \"A Swagger-style API endpoint reference: a colored method pill + path, collapsed by default, expanding to params, request body, and per-status response examples.\",\n empty: () => ({ method: \"GET\", path: \"/api/resource\" }),\n }),\n defineBlock<OpenApiSpecData>({\n type: \"openapi-spec\",\n schema: openApiSpecSchema,\n mdx: openApiSpecMdx,\n Read: OpenApiSpecRead,\n Edit: OpenApiSpecEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"OpenAPI spec\",\n description:\n \"A whole-document API specification / Redoc / Swagger-UI-style API reference rendered from a complete OpenAPI 3 / Swagger 2 spec (JSON): operations grouped by tag, each a collapsible row expanding to params, request body, and per-status responses, with $ref models resolved.\",\n empty: () => ({\n spec: JSON.stringify(\n {\n openapi: \"3.0.0\",\n info: { title: \"Example API\", version: \"1.0.0\" },\n tags: [{ name: \"widgets\", description: \"Manage widgets\" }],\n paths: {\n \"/widgets\": {\n get: {\n tags: [\"widgets\"],\n summary: \"List widgets\",\n responses: { \"200\": { description: \"OK\" } },\n },\n },\n },\n },\n null,\n 2,\n ),\n }),\n }),\n defineBlock<DataModelData>({\n type: \"data-model\",\n schema: dataModelSchema,\n mdx: dataModelMdx,\n Read: DataModelRead,\n Edit: DataModelEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"Data model\",\n description:\n \"A schema modeling / ERD / dbdiagram-style data model: entity cards with typed fields (PK/FK/nullable flags) and interactive foreign-key relations.\",\n empty: () => ({\n entities: [\n {\n id: \"e_user\",\n name: \"User\",\n fields: [\n { name: \"id\", type: \"uuid\", pk: true },\n { name: \"email\", type: \"text\" },\n ],\n },\n ],\n }),\n }),\n defineBlock<DiffData>({\n type: \"diff\",\n schema: diffSchema,\n mdx: diffMdx,\n Read: DiffRead,\n Edit: DiffEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"Diff\",\n description:\n \"A GitHub-style before/after line diff for a file, with unified or split (side-by-side) view, added/removed line highlighting, and collapsible unchanged runs.\",\n empty: () => ({\n before: \"function add(a, b) {\\n return a + b;\\n}\",\n after: \"function add(a: number, b: number): number {\\n return a + b;\\n}\",\n language: \"ts\",\n }),\n }),\n defineBlock<FileTreeData>({\n type: \"file-tree\",\n schema: fileTreeSchema,\n mdx: fileTreeMdx,\n Read: FileTreeRead,\n Edit: FileTreeEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"File tree\",\n description:\n \"A VS Code / GitHub-explorer file and change tree derived from slash-delimited paths, with per-file change badges (added/modified/removed/renamed), notes, and code snippets.\",\n empty: () => ({\n entries: [\n {\n path: \"src/index.ts\",\n change: \"modified\",\n note: \"Wire the new route here.\",\n },\n { path: \"src/routes/git.ts\", change: \"added\" },\n ],\n }),\n }),\n defineBlock<JsonExplorerData>({\n type: \"json-explorer\",\n schema: jsonExplorerSchema,\n mdx: jsonExplorerMdx,\n Read: JsonExplorerRead,\n Edit: JsonExplorerEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"JSON explorer\",\n description:\n \"A collapsible browser-devtools / Postman-style JSON tree with type-colored values and expand/collapse.\",\n empty: () => ({\n json: JSON.stringify(\n {\n id: \"abc123\",\n active: true,\n tags: [\"alpha\", \"beta\"],\n meta: { count: 2, owner: null },\n },\n null,\n 2,\n ),\n collapsedDepth: JSON_EXPLORER_DEFAULT_COLLAPSED_DEPTH,\n }),\n }),\n defineBlock<AnnotatedCodeData>({\n type: \"annotated-code\",\n schema: annotatedCodeSchema,\n mdx: annotatedCodeMdx,\n Read: AnnotatedCodeRead,\n Edit: AnnotatedCodeEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"Annotated code\",\n description:\n \"A line-numbered code walkthrough whose line ranges carry anchored explanatory notes (Stripe-docs / Sourcegraph explain-this-code style).\",\n empty: () => ({\n filename: \"src/server/auth.ts\",\n language: \"ts\",\n code: \"export function resolveAuth(provider: string) {\\n const cfg = providers[provider];\\n return cfg.token;\\n}\",\n annotations: [\n {\n lines: \"2\",\n label: \"Lookup\",\n note: \"Resolves the provider config by key.\",\n },\n ],\n }),\n }),\n];\n\n/**\n * The full standard library spec set, in registration order: the fully pre-built\n * specs (checklist, table, code-tabs, html, tabs, columns) followed by the eight\n * dev-doc specs. This is the single list both the plan and content browser\n * registries register — adding a library block here lands in both apps.\n */\nexport const libraryBlockSpecs: BlockSpec<any>[] = [\n checklistBlock,\n tableBlock,\n codeBlock,\n codeTabsBlock,\n htmlBlock,\n tabsBlock,\n columnsBlock,\n ...devDocBlockSpecs,\n];\n\n/**\n * Per-block metadata overrides for {@link registerLibraryBlocks}, keyed by the\n * canonical block `type`. Lets an app tweak the few fields that legitimately\n * differ (a `type` rename, a tweaked `description` or `empty` seed) without\n * re-authoring the spec. Anything omitted keeps the canonical value, so the\n * schema / MDX config and the React `Read`/`Edit` renderers always stay shared.\n */\nexport type LibraryBlockOverrides = Record<\n string,\n Partial<Pick<BlockSpec<any>, \"type\" | \"label\" | \"description\" | \"empty\">>\n>;\n\n/**\n * Register the standard library block specs into a {@link BlockRegistry}. Both\n * the plan and content browser registries call this, then register only their\n * own app-specific blocks on top — so the shared library lives in exactly one\n * place. Pass `overrides` (keyed by canonical `type`) for the small per-app\n * differences (content re-types `table` → `table-block`; each app phrases the\n * Mermaid description and seeds the OpenAPI example a little differently).\n */\nexport function registerLibraryBlocks(\n registry: BlockRegistry,\n options: { overrides?: LibraryBlockOverrides } = {},\n): void {\n const overrides = options.overrides ?? {};\n const specs = libraryBlockSpecs.map((spec) => {\n const override = overrides[spec.type];\n return override ? ({ ...spec, ...override } as BlockSpec<any>) : spec;\n });\n registerBlocks(registry, specs);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"specs.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/specs.tsx"],"names":[],"mappings":"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","sourcesContent":["import { defineBlock, type BlockSpec } from \"../types.js\";\nimport { registerBlocks, type BlockRegistry } from \"../registry.js\";\n\n// Pre-built standard library specs (schema + mdx + React Read/Edit all bundled).\nimport { checklistBlock } from \"./checklist.js\";\nimport { tableBlock } from \"./table.js\";\nimport { codeBlock } from \"./code.js\";\nimport { codeTabsBlock } from \"./code-tabs.js\";\nimport { htmlBlock } from \"./html.js\";\nimport { tabsBlock } from \"./tabs.js\";\nimport { columnsBlock } from \"./columns.js\";\nimport { calloutBlock } from \"./callout.js\";\nimport { decisionBlock } from \"./decision.js\";\nimport { questionFormBlock, visualQuestionsBlock } from \"./question-form.js\";\nimport { diagramBlock } from \"./diagram.js\";\nimport { wireframeBlock } from \"./wireframe.js\";\n\n// Dev-doc blocks: React-free schema + MDX config paired with the shared React\n// Read/Edit renderers. Composed into full specs below with canonical metadata.\nimport {\n mermaidSchema,\n mermaidMdx,\n type MermaidData,\n} from \"./mermaid.config.js\";\nimport { MermaidRead, MermaidEdit } from \"./MermaidBlock.js\";\nimport {\n apiEndpointSchema,\n apiEndpointMdx,\n type ApiEndpointData,\n} from \"./api-endpoint.config.js\";\nimport { ApiEndpointRead, ApiEndpointEdit } from \"./ApiEndpointBlock.js\";\nimport {\n openApiSpecSchema,\n openApiSpecMdx,\n type OpenApiSpecData,\n} from \"./openapi-spec.config.js\";\nimport { OpenApiSpecRead, OpenApiSpecEdit } from \"./OpenApiSpecBlock.js\";\nimport {\n dataModelSchema,\n dataModelMdx,\n type DataModelData,\n} from \"./data-model.config.js\";\nimport { DataModelRead, DataModelEdit } from \"./DataModelBlock.js\";\nimport { diffSchema, diffMdx, type DiffData } from \"./diff.config.js\";\nimport { DiffRead, DiffEdit } from \"./DiffBlock.js\";\nimport {\n fileTreeSchema,\n fileTreeMdx,\n type FileTreeData,\n} from \"./file-tree.config.js\";\nimport { FileTreeRead, FileTreeEdit } from \"./FileTreeBlock.js\";\nimport {\n jsonExplorerSchema,\n jsonExplorerMdx,\n JSON_EXPLORER_DEFAULT_COLLAPSED_DEPTH,\n type JsonExplorerData,\n} from \"./json-explorer.config.js\";\nimport { JsonExplorerRead, JsonExplorerEdit } from \"./JsonExplorerBlock.js\";\nimport {\n annotatedCodeSchema,\n annotatedCodeMdx,\n type AnnotatedCodeData,\n} from \"./annotated-code.config.js\";\nimport { AnnotatedCodeRead, AnnotatedCodeEdit } from \"./AnnotatedCodeBlock.js\";\n\n/**\n * Canonical specs for the standard library's dev-doc blocks (Mermaid, API\n * endpoint, OpenAPI spec, data model, diff, file tree, JSON explorer,\n * annotated code).\n * Each pairs the shared React-free schema/MDX config\n * with the shared React `Read`/`Edit` renderers and the canonical\n * label/description/editSurface/empty metadata. Apps that need a slightly\n * different label/description/empty for a block pass an override to\n * {@link registerLibraryBlocks} rather than re-authoring the whole spec.\n *\n * The six fully pre-built standard specs (checklist, table, code-tabs, html,\n * tabs, columns) already bundle their metadata in their own modules, so they are appended\n * by {@link libraryBlockSpecs} rather than re-declared here.\n */\n// Typed `BlockSpec<any>[]` (not `BlockSpec<unknown>[]`) so the per-block generic\n// data types coexist in one array — mirroring `registerBlocks`' own signature,\n// where `childrenField: keyof TData` would otherwise collapse to `never`.\nconst devDocBlockSpecs: BlockSpec<any>[] = [\n defineBlock<MermaidData>({\n type: \"mermaid\",\n schema: mermaidSchema,\n mdx: mermaidMdx,\n Read: MermaidRead,\n Edit: MermaidEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"Diagram (Mermaid)\",\n description:\n \"A Mermaid diagram (flowchart, sequence, etc.) defined as text and rendered as a diagram.\",\n empty: () => ({\n source:\n \"flowchart TD\\n A[Start] --> B{Decision}\\n B -->|Yes| C[Do it]\\n B -->|No| D[Skip]\",\n }),\n }),\n defineBlock<ApiEndpointData>({\n type: \"api-endpoint\",\n schema: apiEndpointSchema,\n mdx: apiEndpointMdx,\n Read: ApiEndpointRead,\n Edit: ApiEndpointEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"API endpoint\",\n description:\n \"A Swagger-style API endpoint reference: a colored method pill + path, collapsed by default, expanding to params, request body, and per-status response examples.\",\n empty: () => ({ method: \"GET\", path: \"/api/resource\" }),\n }),\n defineBlock<OpenApiSpecData>({\n type: \"openapi-spec\",\n schema: openApiSpecSchema,\n mdx: openApiSpecMdx,\n Read: OpenApiSpecRead,\n Edit: OpenApiSpecEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"OpenAPI spec\",\n description:\n \"A whole-document API specification / Redoc / Swagger-UI-style API reference rendered from a complete OpenAPI 3 / Swagger 2 spec (JSON): operations grouped by tag, each a collapsible row expanding to params, request body, and per-status responses, with $ref models resolved.\",\n empty: () => ({\n spec: JSON.stringify(\n {\n openapi: \"3.0.0\",\n info: { title: \"Example API\", version: \"1.0.0\" },\n tags: [{ name: \"widgets\", description: \"Manage widgets\" }],\n paths: {\n \"/widgets\": {\n get: {\n tags: [\"widgets\"],\n summary: \"List widgets\",\n responses: { \"200\": { description: \"OK\" } },\n },\n },\n },\n },\n null,\n 2,\n ),\n }),\n }),\n defineBlock<DataModelData>({\n type: \"data-model\",\n schema: dataModelSchema,\n mdx: dataModelMdx,\n Read: DataModelRead,\n Edit: DataModelEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"Data model\",\n description:\n \"A schema modeling / ERD / dbdiagram-style data model: entity cards with typed fields (PK/FK/nullable flags) and interactive foreign-key relations.\",\n empty: () => ({\n entities: [\n {\n id: \"e_user\",\n name: \"User\",\n fields: [\n { name: \"id\", type: \"uuid\", pk: true },\n { name: \"email\", type: \"text\" },\n ],\n },\n ],\n }),\n }),\n defineBlock<DiffData>({\n type: \"diff\",\n schema: diffSchema,\n mdx: diffMdx,\n Read: DiffRead,\n Edit: DiffEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"Diff\",\n description:\n \"A GitHub-style before/after line diff for a file, with unified or split (side-by-side) view, added/removed line highlighting, and collapsible unchanged runs.\",\n empty: () => ({\n before: \"function add(a, b) {\\n return a + b;\\n}\",\n after: \"function add(a: number, b: number): number {\\n return a + b;\\n}\",\n language: \"ts\",\n }),\n }),\n defineBlock<FileTreeData>({\n type: \"file-tree\",\n schema: fileTreeSchema,\n mdx: fileTreeMdx,\n Read: FileTreeRead,\n Edit: FileTreeEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"File tree\",\n description:\n \"A VS Code / GitHub-explorer file and change tree derived from slash-delimited paths, with per-file change badges (added/modified/removed/renamed), notes, and code snippets.\",\n empty: () => ({\n entries: [\n {\n path: \"src/index.ts\",\n change: \"modified\",\n note: \"Wire the new route here.\",\n },\n { path: \"src/routes/git.ts\", change: \"added\" },\n ],\n }),\n }),\n defineBlock<JsonExplorerData>({\n type: \"json-explorer\",\n schema: jsonExplorerSchema,\n mdx: jsonExplorerMdx,\n Read: JsonExplorerRead,\n Edit: JsonExplorerEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"JSON explorer\",\n description:\n \"A collapsible browser-devtools / Postman-style JSON tree with type-colored values and expand/collapse.\",\n empty: () => ({\n json: JSON.stringify(\n {\n id: \"abc123\",\n active: true,\n tags: [\"alpha\", \"beta\"],\n meta: { count: 2, owner: null },\n },\n null,\n 2,\n ),\n collapsedDepth: JSON_EXPLORER_DEFAULT_COLLAPSED_DEPTH,\n }),\n }),\n defineBlock<AnnotatedCodeData>({\n type: \"annotated-code\",\n schema: annotatedCodeSchema,\n mdx: annotatedCodeMdx,\n Read: AnnotatedCodeRead,\n Edit: AnnotatedCodeEdit,\n placement: [\"block\"],\n editSurface: \"panel\",\n label: \"Annotated code\",\n description:\n \"A line-numbered code walkthrough whose line ranges carry anchored explanatory notes (Stripe-docs / Sourcegraph explain-this-code style).\",\n empty: () => ({\n filename: \"src/server/auth.ts\",\n language: \"ts\",\n code: \"export function resolveAuth(provider: string) {\\n const cfg = providers[provider];\\n return cfg.token;\\n}\",\n annotations: [\n {\n lines: \"2\",\n label: \"Lookup\",\n note: \"Resolves the provider config by key.\",\n },\n ],\n }),\n }),\n];\n\n/**\n * The full standard library spec set, in registration order: the fully pre-built\n * specs (checklist, table, code-tabs, html, tabs, columns) followed by the eight\n * dev-doc specs. This is the single list both the plan and content browser\n * registries register — adding a library block here lands in both apps.\n */\nexport const libraryBlockSpecs: BlockSpec<any>[] = [\n checklistBlock,\n tableBlock,\n codeBlock,\n codeTabsBlock,\n htmlBlock,\n tabsBlock,\n columnsBlock,\n calloutBlock,\n decisionBlock,\n questionFormBlock,\n visualQuestionsBlock,\n diagramBlock,\n wireframeBlock,\n ...devDocBlockSpecs,\n];\n\n/**\n * Per-block metadata overrides for {@link registerLibraryBlocks}, keyed by the\n * canonical block `type`. Lets an app tweak the few fields that legitimately\n * differ (a `type` rename, a tweaked `description` or `empty` seed) without\n * re-authoring the spec. Anything omitted keeps the canonical value, so the\n * schema / MDX config and the React `Read`/`Edit` renderers always stay shared.\n */\nexport type LibraryBlockOverrides = Record<\n string,\n Partial<Pick<BlockSpec<any>, \"type\" | \"label\" | \"description\" | \"empty\">>\n>;\n\n/**\n * Register the standard library block specs into a {@link BlockRegistry}. Both\n * the plan and content browser registries call this, then register only their\n * own app-specific blocks on top — so the shared library lives in exactly one\n * place. Pass `overrides` (keyed by canonical `type`) for the small per-app\n * differences (content re-types `table` → `table-block`; each app phrases the\n * Mermaid description and seeds the OpenAPI example a little differently).\n */\nexport function registerLibraryBlocks(\n registry: BlockRegistry,\n options: { overrides?: LibraryBlockOverrides } = {},\n): void {\n const overrides = options.overrides ?? {};\n const specs = libraryBlockSpecs.map((spec) => {\n const override = overrides[spec.type];\n return override ? ({ ...spec, ...override } as BlockSpec<any>) : spec;\n });\n registerBlocks(registry, specs);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/tabs.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAEV,cAAc,EACd,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAC;AAuG1B,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,GAAG,GACJ,EAAE,cAAc,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/tabs.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAEV,cAAc,EACd,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAC;AAuG1B,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,GAAG,GACJ,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAuC1B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,KAAK,EACL,GAAG,GACJ,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAgM1B;AAuLD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,2CA0BpB,CAAC"}
|
|
@@ -39,7 +39,7 @@ function tabsWith(data, tabs) {
|
|
|
39
39
|
}
|
|
40
40
|
function tabButtonClass(selected, orientation) {
|
|
41
41
|
return cn("rounded-lg border border-transparent text-sm font-semibold transition-colors", orientation === "vertical"
|
|
42
|
-
? "min-w-0 max-w-72 shrink-0 px-3 py-2 text-left
|
|
42
|
+
? "min-w-0 max-w-72 shrink-0 px-3 py-2 text-left @xl/tabs:w-full @xl/tabs:max-w-none"
|
|
43
43
|
: "shrink-0 whitespace-nowrap px-4 py-2", selected
|
|
44
44
|
? "bg-primary/5 text-foreground dark:bg-primary/10"
|
|
45
45
|
: "text-muted-foreground hover:bg-muted/40 hover:text-foreground");
|
|
@@ -51,7 +51,7 @@ function tabLabelClass(orientation) {
|
|
|
51
51
|
function TabRail({ tabs, activeId, onSelect, orientation, }) {
|
|
52
52
|
const vertical = orientation === "vertical";
|
|
53
53
|
return (_jsx("div", { className: cn(vertical
|
|
54
|
-
? "mb-5 flex w-full min-w-0 max-w-full flex-nowrap gap-1 overflow-x-auto
|
|
54
|
+
? "mb-5 flex w-full min-w-0 max-w-full flex-nowrap gap-1 overflow-x-auto @xl/tabs:mb-0 @xl/tabs:max-h-[62vh] @xl/tabs:flex-col @xl/tabs:overflow-x-hidden @xl/tabs:overflow-y-auto @xl/tabs:pr-2"
|
|
55
55
|
: "mb-8 flex w-full min-w-0 max-w-full flex-nowrap gap-1 overflow-x-auto"), role: "tablist", "aria-orientation": orientation, "data-plan-interactive": true, children: tabs.map((tab) => {
|
|
56
56
|
const selected = tab.id === activeId;
|
|
57
57
|
return (_jsx("button", { type: "button", role: "tab", "aria-selected": selected, onClick: () => onSelect(tab.id), className: tabButtonClass(selected, orientation), children: _jsx("span", { className: tabLabelClass(orientation), children: tab.label }) }, tab.id));
|
|
@@ -64,12 +64,12 @@ export function TabsBlockReader({ data, blockId, title, ctx, }) {
|
|
|
64
64
|
const compact = isCompact(title);
|
|
65
65
|
const orientation = tabOrientation(data);
|
|
66
66
|
const vertical = orientation === "vertical";
|
|
67
|
-
return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), _jsxs("div", { className: cn(vertical &&
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
67
|
+
return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), _jsx("div", { className: cn(vertical && "@container/tabs"), children: _jsxs("div", { className: cn(vertical &&
|
|
68
|
+
"grid min-w-0 gap-5 @xl/tabs:grid-cols-[minmax(10rem,14rem)_minmax(0,1fr)] @xl/tabs:items-start"), children: [_jsx(TabRail, { tabs: data.tabs, activeId: active?.id, onSelect: setActiveId, orientation: orientation }), active && (_jsx("div", { className: cn(vertical && "min-w-0"), children: active.blocks.map((child) => (_jsx("div", { children: ctx.renderBlock?.({
|
|
69
|
+
block: child,
|
|
70
|
+
editing: false,
|
|
71
|
+
compactVisuals: compact,
|
|
72
|
+
}) }, child.id))) }))] }) })] }));
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
75
|
* Editor: pill tabs plus tab management (add/remove/rename), with child blocks
|
|
@@ -119,9 +119,9 @@ export function TabsBlockEditor({ data, onChange, editable, blockId, title, ctx,
|
|
|
119
119
|
// section, so wrapping again here would double-nest. The read renderer
|
|
120
120
|
// (`TabsBlockReader`) owns its own section because read mode renders the spec
|
|
121
121
|
// directly.
|
|
122
|
-
return (_jsx("div", { className: "min-w-0", "data-tabs-edit-block": blockId, children: _jsxs("div", { className: cn(vertical &&
|
|
123
|
-
"grid min-w-0 gap-5
|
|
124
|
-
? "flex-nowrap overflow-x-auto
|
|
122
|
+
return (_jsx("div", { className: cn("min-w-0", vertical && "@container/tabs"), "data-tabs-edit-block": blockId, children: _jsxs("div", { className: cn(vertical &&
|
|
123
|
+
"grid min-w-0 gap-5 @xl/tabs:grid-cols-[minmax(10rem,14rem)_minmax(0,1fr)] @xl/tabs:items-start"), children: [_jsxs("div", { className: cn("flex min-w-0 items-start gap-2", vertical ? "mb-5 @xl/tabs:mb-0" : "mb-8 w-full"), children: [_jsx("div", { className: cn("flex min-w-0 flex-1 gap-1", vertical
|
|
124
|
+
? "flex-nowrap overflow-x-auto @xl/tabs:max-h-[62vh] @xl/tabs:flex-col @xl/tabs:overflow-x-hidden @xl/tabs:overflow-y-auto @xl/tabs:pr-2"
|
|
125
125
|
: "w-full flex-nowrap items-center overflow-x-auto"), role: "tablist", "aria-orientation": orientation, "data-plan-interactive": true, children: data.tabs.map((tab) => {
|
|
126
126
|
const selected = tab.id === active?.id;
|
|
127
127
|
const tabLabel = (_jsx("span", { className: tabLabelClass(orientation), children: tab.label }));
|
|
@@ -129,7 +129,7 @@ export function TabsBlockEditor({ data, onChange, editable, blockId, title, ctx,
|
|
|
129
129
|
return (_jsx("button", { type: "button", role: "tab", "aria-selected": selected, onClick: () => setActiveId(tab.id), className: tabButtonClass(selected, orientation), children: tabLabel }, tab.id));
|
|
130
130
|
}
|
|
131
131
|
const tabButton = (_jsx("button", { type: "button", role: "tab", "aria-selected": selected, onClick: () => setActiveId(tab.id), className: cn(tabButtonClass(selected, orientation), vertical && editable && selected && "pr-9"), children: tabLabel }));
|
|
132
|
-
return (_jsxs("div", { className: "group/tab relative flex min-w-0 max-w-72 shrink-0
|
|
132
|
+
return (_jsxs("div", { className: "group/tab relative flex min-w-0 max-w-72 shrink-0 @xl/tabs:w-full @xl/tabs:max-w-none", children: [tabButton, editable && selected && (_jsx(TabsSettingsPopover, { active: active, orientation: orientation, tabs: data.tabs, triggerClassName: "pointer-events-none absolute right-1.5 top-1/2 -translate-y-1/2 opacity-0 transition-opacity group-hover/tab:pointer-events-auto group-hover/tab:opacity-100 group-focus-within/tab:pointer-events-auto group-focus-within/tab:opacity-100 data-[state=open]:pointer-events-auto data-[state=open]:opacity-100", onRename: renameTab, onOrientationChange: setOrientation, onAdd: addTab, onRemove: removeTab }))] }, tab.id));
|
|
133
133
|
}) }), editable && !vertical && (_jsx(TabsSettingsPopover, { active: active, orientation: orientation, tabs: data.tabs, onRename: renameTab, onOrientationChange: setOrientation, onAdd: addTab, onRemove: removeTab }))] }), active && (_jsx("div", { className: cn(vertical && "min-w-0"), children: ctx.renderBlocksEditor
|
|
134
134
|
? ctx.renderBlocksEditor({
|
|
135
135
|
blocks: active.blocks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/tabs.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport {\n IconLayoutNavbar,\n IconPencil,\n IconPlus,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../../utils.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../components/ui/popover.js\";\nimport { defineBlock } from \"../types.js\";\nimport type {\n BlockContainerRegion,\n BlockReadProps,\n BlockEditProps,\n NestedBlock,\n} from \"../types.js\";\nimport {\n tabsSchema,\n tabsMdx,\n type TabsData,\n type TabsOrientation,\n type TabsTab,\n} from \"./tabs.config.js\";\n\n/**\n * Standard `tabs` block: a horizontal pill-tab container whose tabs each hold a\n * list of child blocks. Lives in core so any app (plan today, content later) can\n * register it.\n *\n * `Read`/`Edit` mirror the legacy plan `TabsBlock` markup byte-for-byte (same\n * `plan-block` section, the `inline-flex` pill tab rail with `role=\"tablist\"`/\n * `role=\"tab\"`, the same active-tab `useState`, and the `compactVisuals`\n * heuristic on the block title) so converting the block to the registry does not\n * change rendered output. The block chrome uses semantic shadcn tokens so the\n * same renderer stays quiet in both the plan and content apps.\n *\n * Child rendering flows through `ctx.renderBlock` — the app's own block\n * dispatcher — so registered children render via their spec and unconverted\n * children fall through the app's legacy switch. This is the coexistence seam:\n * the core tabs block never has to know app-specific child block types.\n */\n\n/** Mint a reasonably-unique tab id without pulling a dep into core. */\nfunction newTabId(): string {\n return `tab-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** Compact embedded visuals for dense tab panes, matching legacy behavior. */\nfunction isCompact(title: string | undefined): boolean {\n return /interaction|component|note/i.test(title ?? \"\");\n}\n\nconst tabSettingsInputClass =\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\";\n\nfunction tabOrientation(data: Pick<TabsData, \"orientation\">): TabsOrientation {\n return data.orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n}\n\nfunction tabsWith(data: TabsData, tabs: TabsTab[]): TabsData {\n return { ...data, tabs };\n}\n\nfunction tabButtonClass(\n selected: boolean,\n orientation: TabsOrientation,\n): string {\n return cn(\n \"rounded-lg border border-transparent text-sm font-semibold transition-colors\",\n orientation === \"vertical\"\n ? \"min-w-0 max-w-72 shrink-0 px-3 py-2 text-left md:w-full md:max-w-none\"\n : \"shrink-0 whitespace-nowrap px-4 py-2\",\n selected\n ? \"bg-primary/5 text-foreground dark:bg-primary/10\"\n : \"text-muted-foreground hover:bg-muted/40 hover:text-foreground\",\n );\n}\n\nfunction tabLabelClass(orientation: TabsOrientation): string | undefined {\n return orientation === \"vertical\" ? \"block min-w-0 truncate\" : undefined;\n}\n\n/** Shared pill-tab rail. */\nfunction TabRail({\n tabs,\n activeId,\n onSelect,\n orientation,\n}: {\n tabs: TabsTab[];\n activeId: string | undefined;\n onSelect: (id: string) => void;\n orientation: TabsOrientation;\n}) {\n const vertical = orientation === \"vertical\";\n return (\n <div\n className={cn(\n vertical\n ? \"mb-5 flex w-full min-w-0 max-w-full flex-nowrap gap-1 overflow-x-auto md:mb-0 md:max-h-[62vh] md:flex-col md:overflow-x-hidden md:overflow-y-auto md:pr-2\"\n : \"mb-8 flex w-full min-w-0 max-w-full flex-nowrap gap-1 overflow-x-auto\",\n )}\n role=\"tablist\"\n aria-orientation={orientation}\n data-plan-interactive\n >\n {tabs.map((tab) => {\n const selected = tab.id === activeId;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => onSelect(tab.id)}\n className={tabButtonClass(selected, orientation)}\n >\n <span className={tabLabelClass(orientation)}>{tab.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\n/** Read renderer: pill tabs, child blocks rendered read-only via the app. */\nexport function TabsBlockReader({\n data,\n blockId,\n title,\n ctx,\n}: BlockReadProps<TabsData>) {\n const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? \"\");\n const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];\n const compact = isCompact(title);\n const orientation = tabOrientation(data);\n const vertical = orientation === \"vertical\";\n return (\n <section className=\"plan-block\" data-block-id={blockId}>\n {title && <div className=\"plan-block-label\">{title}</div>}\n <div\n className={cn(\n vertical &&\n \"grid min-w-0 gap-5 md:grid-cols-[minmax(10rem,14rem)_minmax(0,1fr)] md:items-start\",\n )}\n >\n <TabRail\n tabs={data.tabs}\n activeId={active?.id}\n onSelect={setActiveId}\n orientation={orientation}\n />\n {active && (\n <div className={cn(vertical && \"min-w-0\")}>\n {active.blocks.map((child) => (\n <div key={child.id}>\n {ctx.renderBlock?.({\n block: child,\n editing: false,\n compactVisuals: compact,\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\n );\n}\n\n/**\n * Editor: pill tabs plus tab management (add/remove/rename), with child blocks\n * rendered editable in place through the app dispatcher. A child change updates\n * that child within its tab and commits the whole tabs block — mirroring the\n * legacy `TabsBlock` onChange bubbling so the plan's recursive `updateBlocks`/\n * `findBlock` (`PlanContentRenderer`) keeps working unchanged.\n */\nexport function TabsBlockEditor({\n data,\n onChange,\n editable,\n blockId,\n title,\n ctx,\n}: BlockEditProps<TabsData>) {\n const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? \"\");\n const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];\n const compact = isCompact(title);\n const orientation = tabOrientation(data);\n const vertical = orientation === \"vertical\";\n\n const commit = (tabs: TabsTab[]) => onChange(tabsWith(data, tabs));\n\n const setOrientation = (next: TabsOrientation) =>\n onChange({\n ...data,\n orientation: next === \"vertical\" ? \"vertical\" : undefined,\n });\n\n const renameTab = (id: string, label: string) =>\n commit(data.tabs.map((tab) => (tab.id === id ? { ...tab, label } : tab)));\n\n const removeTab = (id: string) => {\n const next = data.tabs.filter((tab) => tab.id !== id);\n if (next.length === 0) return; // tabs must keep at least one (schema min 1)\n commit(next);\n if (activeId === id) setActiveId(next[0]?.id ?? \"\");\n };\n\n const addTab = () => {\n if (data.tabs.length >= 12) return; // schema max\n const id = newTabId();\n commit([\n ...data.tabs,\n { id, label: `Tab ${data.tabs.length + 1}`, blocks: [] },\n ]);\n setActiveId(id);\n };\n\n const updateChild = (tabId: string, child: NestedBlock) =>\n commit(\n data.tabs.map((tab) =>\n tab.id === tabId\n ? {\n ...tab,\n blocks: tab.blocks.map((existing) =>\n existing.id === child.id ? child : existing,\n ),\n }\n : tab,\n ),\n );\n\n // Renders BARE (no `plan-block` section / title): in edit mode the app's\n // block dispatcher already wraps registered editors in a titled `plan-block`\n // section, so wrapping again here would double-nest. The read renderer\n // (`TabsBlockReader`) owns its own section because read mode renders the spec\n // directly.\n return (\n <div className=\"min-w-0\" data-tabs-edit-block={blockId}>\n <div\n className={cn(\n vertical &&\n \"grid min-w-0 gap-5 md:grid-cols-[minmax(10rem,14rem)_minmax(0,1fr)] md:items-start\",\n )}\n >\n <div\n className={cn(\n \"flex min-w-0 items-start gap-2\",\n vertical ? \"mb-5 md:mb-0\" : \"mb-8 w-full\",\n )}\n >\n <div\n className={cn(\n \"flex min-w-0 flex-1 gap-1\",\n vertical\n ? \"flex-nowrap overflow-x-auto md:max-h-[62vh] md:flex-col md:overflow-x-hidden md:overflow-y-auto md:pr-2\"\n : \"w-full flex-nowrap items-center overflow-x-auto\",\n )}\n role=\"tablist\"\n aria-orientation={orientation}\n data-plan-interactive\n >\n {data.tabs.map((tab) => {\n const selected = tab.id === active?.id;\n const tabLabel = (\n <span className={tabLabelClass(orientation)}>{tab.label}</span>\n );\n if (!vertical) {\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActiveId(tab.id)}\n className={tabButtonClass(selected, orientation)}\n >\n {tabLabel}\n </button>\n );\n }\n const tabButton = (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActiveId(tab.id)}\n className={cn(\n tabButtonClass(selected, orientation),\n vertical && editable && selected && \"pr-9\",\n )}\n >\n {tabLabel}\n </button>\n );\n return (\n <div\n key={tab.id}\n className=\"group/tab relative flex min-w-0 max-w-72 shrink-0 md:w-full md:max-w-none\"\n >\n {tabButton}\n {editable && selected && (\n <TabsSettingsPopover\n active={active}\n orientation={orientation}\n tabs={data.tabs}\n triggerClassName=\"pointer-events-none absolute right-1.5 top-1/2 -translate-y-1/2 opacity-0 transition-opacity group-hover/tab:pointer-events-auto group-hover/tab:opacity-100 group-focus-within/tab:pointer-events-auto group-focus-within/tab:opacity-100 data-[state=open]:pointer-events-auto data-[state=open]:opacity-100\"\n onRename={renameTab}\n onOrientationChange={setOrientation}\n onAdd={addTab}\n onRemove={removeTab}\n />\n )}\n </div>\n );\n })}\n </div>\n {editable && !vertical && (\n <TabsSettingsPopover\n active={active}\n orientation={orientation}\n tabs={data.tabs}\n onRename={renameTab}\n onOrientationChange={setOrientation}\n onAdd={addTab}\n onRemove={removeTab}\n />\n )}\n </div>\n {active && (\n <div className={cn(vertical && \"min-w-0\")}>\n {ctx.renderBlocksEditor\n ? ctx.renderBlocksEditor({\n blocks: active.blocks,\n onChange: (nextBlocks) =>\n onChange(\n {\n ...data,\n tabs: data.tabs.map((tab) =>\n tab.id === active.id\n ? { ...tab, blocks: nextBlocks }\n : tab,\n ),\n },\n {\n containerRegion: {\n regionId: active.id,\n blocks: nextBlocks,\n },\n },\n ),\n editable,\n containerBlockId: blockId,\n regionId: active.id,\n regionLabel: active.label,\n compactVisuals: compact,\n })\n : active.blocks.map((child) => (\n <div key={child.id}>\n {ctx.renderBlock?.({\n block: child,\n editing: true,\n compactVisuals: compact,\n onChange: (next) => updateChild(active.id, next),\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction TabsSettingsPopover({\n active,\n orientation,\n tabs,\n onRename,\n onOrientationChange,\n onAdd,\n onRemove,\n triggerClassName,\n}: {\n active: TabsTab | undefined;\n orientation: TabsOrientation;\n tabs: TabsTab[];\n onRename: (id: string, label: string) => void;\n onOrientationChange: (orientation: TabsOrientation) => void;\n onAdd: () => void;\n onRemove: (id: string) => void;\n triggerClassName?: string;\n}) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Edit tabs\"\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-md text-plan-muted transition-colors hover:text-plan-text focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n triggerClassName,\n )}\n >\n <IconPencil className=\"size-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n side=\"bottom\"\n className=\"w-80 p-0\"\n data-plan-interactive\n >\n <div className=\"border-b border-border px-3 py-2\">\n <div className=\"text-sm font-semibold text-foreground\">\n Tab settings\n </div>\n <div className=\"text-xs text-muted-foreground\">\n Rename the active tab, change layout, or manage the tab set.\n </div>\n </div>\n <div className=\"grid gap-3 p-3\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Active tab label\n </span>\n <input\n type=\"text\"\n data-plan-interactive\n className={tabSettingsInputClass}\n value={active?.label ?? \"\"}\n disabled={!active}\n onChange={(event) => {\n if (!active) return;\n onRename(active.id, event.target.value);\n }}\n />\n </label>\n <label className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Layout\n </span>\n <div\n className=\"grid grid-cols-2 gap-1 rounded-md border border-border bg-muted/30 p-1\"\n role=\"radiogroup\"\n aria-label=\"Tabs layout\"\n >\n {(\n [\n [\"horizontal\", \"Top\"],\n [\"vertical\", \"Side\"],\n ] satisfies Array<[TabsOrientation, string]>\n ).map(([value, label]) => {\n const selected = orientation === value;\n return (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-plan-interactive\n onClick={() => onOrientationChange(value)}\n className={cn(\n \"h-8 rounded px-2 text-xs font-medium transition-colors\",\n selected\n ? \"bg-background text-foreground\"\n : \"text-muted-foreground hover:bg-background/70 hover:text-foreground\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n </label>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n data-plan-interactive\n disabled={tabs.length >= 12}\n onClick={onAdd}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border px-2.5 text-xs font-medium text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <IconPlus className=\"size-3.5\" />\n Add tab\n </button>\n <button\n type=\"button\"\n data-plan-interactive\n disabled={!active || tabs.length <= 1}\n onClick={() => {\n if (!active) return;\n onRemove(active.id);\n }}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border px-2.5 text-xs font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <IconTrash className=\"size-3.5\" />\n Remove current\n </button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction tabRegions(data: TabsData): BlockContainerRegion[] {\n return data.tabs.map((tab) => ({\n id: tab.id,\n label: tab.label,\n blocks: tab.blocks,\n }));\n}\n\nfunction addTabRegion(data: TabsData, afterRegionId?: string): TabsData {\n if (data.tabs.length >= 12) return data;\n const nextTab: TabsTab = {\n id: newTabId(),\n label: `Tab ${data.tabs.length + 1}`,\n blocks: [],\n };\n if (!afterRegionId) return tabsWith(data, [...data.tabs, nextTab]);\n const afterIndex = data.tabs.findIndex((tab) => tab.id === afterRegionId);\n if (afterIndex < 0) return tabsWith(data, [...data.tabs, nextTab]);\n return tabsWith(data, [\n ...data.tabs.slice(0, afterIndex + 1),\n nextTab,\n ...data.tabs.slice(afterIndex + 1),\n ]);\n}\n\nfunction removeTabRegion(data: TabsData, regionId: string): TabsData {\n if (data.tabs.length <= 1) return data;\n return tabsWith(\n data,\n data.tabs.filter((tab) => tab.id !== regionId),\n );\n}\n\nfunction reorderTabRegion(\n data: TabsData,\n fromRegionId: string,\n toRegionId: string,\n): TabsData {\n const fromIndex = data.tabs.findIndex((tab) => tab.id === fromRegionId);\n const toIndex = data.tabs.findIndex((tab) => tab.id === toRegionId);\n if (fromIndex < 0 || toIndex < 0 || fromIndex === toIndex) return data;\n const next = [...data.tabs];\n const [moved] = next.splice(fromIndex, 1);\n if (!moved) return data;\n next.splice(toIndex, 0, moved);\n return tabsWith(data, next);\n}\n\n/**\n * The standard tabs block spec (with React `Read`/`Edit`). Apps register this in\n * their browser registry. The schema + MDX config come from `./tabs.config.ts`,\n * the exact same object server / agent code registers, so rendering and source\n * round-trip never drift.\n */\nexport const tabsBlock = defineBlock<TabsData>({\n type: \"tabs\",\n schema: tabsSchema,\n mdx: tabsMdx,\n Read: TabsBlockReader,\n Edit: TabsBlockEditor,\n placement: [\"block\", \"inline\"],\n editSurface: \"container\",\n container: {\n regions: tabRegions,\n updateRegion: (data, regionId, blocks) =>\n tabsWith(\n data,\n data.tabs.map((tab) =>\n tab.id === regionId ? { ...tab, blocks } : tab,\n ),\n ),\n addRegion: addTabRegion,\n removeRegion: removeTabRegion,\n reorderRegion: reorderTabRegion,\n },\n label: \"Tabs\",\n icon: IconLayoutNavbar,\n description:\n \"A top or side tab container; each tab holds its own list of blocks.\",\n empty: () => ({ tabs: [{ id: newTabId(), label: \"Tab 1\", blocks: [] }] }),\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/tabs.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport {\n IconLayoutNavbar,\n IconPencil,\n IconPlus,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../../utils.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../components/ui/popover.js\";\nimport { defineBlock } from \"../types.js\";\nimport type {\n BlockContainerRegion,\n BlockReadProps,\n BlockEditProps,\n NestedBlock,\n} from \"../types.js\";\nimport {\n tabsSchema,\n tabsMdx,\n type TabsData,\n type TabsOrientation,\n type TabsTab,\n} from \"./tabs.config.js\";\n\n/**\n * Standard `tabs` block: a horizontal pill-tab container whose tabs each hold a\n * list of child blocks. Lives in core so any app (plan today, content later) can\n * register it.\n *\n * `Read`/`Edit` mirror the legacy plan `TabsBlock` markup byte-for-byte (same\n * `plan-block` section, the `inline-flex` pill tab rail with `role=\"tablist\"`/\n * `role=\"tab\"`, the same active-tab `useState`, and the `compactVisuals`\n * heuristic on the block title) so converting the block to the registry does not\n * change rendered output. The block chrome uses semantic shadcn tokens so the\n * same renderer stays quiet in both the plan and content apps.\n *\n * Child rendering flows through `ctx.renderBlock` — the app's own block\n * dispatcher — so registered children render via their spec and unconverted\n * children fall through the app's legacy switch. This is the coexistence seam:\n * the core tabs block never has to know app-specific child block types.\n */\n\n/** Mint a reasonably-unique tab id without pulling a dep into core. */\nfunction newTabId(): string {\n return `tab-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** Compact embedded visuals for dense tab panes, matching legacy behavior. */\nfunction isCompact(title: string | undefined): boolean {\n return /interaction|component|note/i.test(title ?? \"\");\n}\n\nconst tabSettingsInputClass =\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\";\n\nfunction tabOrientation(data: Pick<TabsData, \"orientation\">): TabsOrientation {\n return data.orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n}\n\nfunction tabsWith(data: TabsData, tabs: TabsTab[]): TabsData {\n return { ...data, tabs };\n}\n\nfunction tabButtonClass(\n selected: boolean,\n orientation: TabsOrientation,\n): string {\n return cn(\n \"rounded-lg border border-transparent text-sm font-semibold transition-colors\",\n orientation === \"vertical\"\n ? \"min-w-0 max-w-72 shrink-0 px-3 py-2 text-left @xl/tabs:w-full @xl/tabs:max-w-none\"\n : \"shrink-0 whitespace-nowrap px-4 py-2\",\n selected\n ? \"bg-primary/5 text-foreground dark:bg-primary/10\"\n : \"text-muted-foreground hover:bg-muted/40 hover:text-foreground\",\n );\n}\n\nfunction tabLabelClass(orientation: TabsOrientation): string | undefined {\n return orientation === \"vertical\" ? \"block min-w-0 truncate\" : undefined;\n}\n\n/** Shared pill-tab rail. */\nfunction TabRail({\n tabs,\n activeId,\n onSelect,\n orientation,\n}: {\n tabs: TabsTab[];\n activeId: string | undefined;\n onSelect: (id: string) => void;\n orientation: TabsOrientation;\n}) {\n const vertical = orientation === \"vertical\";\n return (\n <div\n className={cn(\n vertical\n ? \"mb-5 flex w-full min-w-0 max-w-full flex-nowrap gap-1 overflow-x-auto @xl/tabs:mb-0 @xl/tabs:max-h-[62vh] @xl/tabs:flex-col @xl/tabs:overflow-x-hidden @xl/tabs:overflow-y-auto @xl/tabs:pr-2\"\n : \"mb-8 flex w-full min-w-0 max-w-full flex-nowrap gap-1 overflow-x-auto\",\n )}\n role=\"tablist\"\n aria-orientation={orientation}\n data-plan-interactive\n >\n {tabs.map((tab) => {\n const selected = tab.id === activeId;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => onSelect(tab.id)}\n className={tabButtonClass(selected, orientation)}\n >\n <span className={tabLabelClass(orientation)}>{tab.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\n/** Read renderer: pill tabs, child blocks rendered read-only via the app. */\nexport function TabsBlockReader({\n data,\n blockId,\n title,\n ctx,\n}: BlockReadProps<TabsData>) {\n const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? \"\");\n const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];\n const compact = isCompact(title);\n const orientation = tabOrientation(data);\n const vertical = orientation === \"vertical\";\n return (\n <section className=\"plan-block\" data-block-id={blockId}>\n {title && <div className=\"plan-block-label\">{title}</div>}\n <div className={cn(vertical && \"@container/tabs\")}>\n <div\n className={cn(\n vertical &&\n \"grid min-w-0 gap-5 @xl/tabs:grid-cols-[minmax(10rem,14rem)_minmax(0,1fr)] @xl/tabs:items-start\",\n )}\n >\n <TabRail\n tabs={data.tabs}\n activeId={active?.id}\n onSelect={setActiveId}\n orientation={orientation}\n />\n {active && (\n <div className={cn(vertical && \"min-w-0\")}>\n {active.blocks.map((child) => (\n <div key={child.id}>\n {ctx.renderBlock?.({\n block: child,\n editing: false,\n compactVisuals: compact,\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n );\n}\n\n/**\n * Editor: pill tabs plus tab management (add/remove/rename), with child blocks\n * rendered editable in place through the app dispatcher. A child change updates\n * that child within its tab and commits the whole tabs block — mirroring the\n * legacy `TabsBlock` onChange bubbling so the plan's recursive `updateBlocks`/\n * `findBlock` (`PlanContentRenderer`) keeps working unchanged.\n */\nexport function TabsBlockEditor({\n data,\n onChange,\n editable,\n blockId,\n title,\n ctx,\n}: BlockEditProps<TabsData>) {\n const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? \"\");\n const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];\n const compact = isCompact(title);\n const orientation = tabOrientation(data);\n const vertical = orientation === \"vertical\";\n\n const commit = (tabs: TabsTab[]) => onChange(tabsWith(data, tabs));\n\n const setOrientation = (next: TabsOrientation) =>\n onChange({\n ...data,\n orientation: next === \"vertical\" ? \"vertical\" : undefined,\n });\n\n const renameTab = (id: string, label: string) =>\n commit(data.tabs.map((tab) => (tab.id === id ? { ...tab, label } : tab)));\n\n const removeTab = (id: string) => {\n const next = data.tabs.filter((tab) => tab.id !== id);\n if (next.length === 0) return; // tabs must keep at least one (schema min 1)\n commit(next);\n if (activeId === id) setActiveId(next[0]?.id ?? \"\");\n };\n\n const addTab = () => {\n if (data.tabs.length >= 12) return; // schema max\n const id = newTabId();\n commit([\n ...data.tabs,\n { id, label: `Tab ${data.tabs.length + 1}`, blocks: [] },\n ]);\n setActiveId(id);\n };\n\n const updateChild = (tabId: string, child: NestedBlock) =>\n commit(\n data.tabs.map((tab) =>\n tab.id === tabId\n ? {\n ...tab,\n blocks: tab.blocks.map((existing) =>\n existing.id === child.id ? child : existing,\n ),\n }\n : tab,\n ),\n );\n\n // Renders BARE (no `plan-block` section / title): in edit mode the app's\n // block dispatcher already wraps registered editors in a titled `plan-block`\n // section, so wrapping again here would double-nest. The read renderer\n // (`TabsBlockReader`) owns its own section because read mode renders the spec\n // directly.\n return (\n <div\n className={cn(\"min-w-0\", vertical && \"@container/tabs\")}\n data-tabs-edit-block={blockId}\n >\n <div\n className={cn(\n vertical &&\n \"grid min-w-0 gap-5 @xl/tabs:grid-cols-[minmax(10rem,14rem)_minmax(0,1fr)] @xl/tabs:items-start\",\n )}\n >\n <div\n className={cn(\n \"flex min-w-0 items-start gap-2\",\n vertical ? \"mb-5 @xl/tabs:mb-0\" : \"mb-8 w-full\",\n )}\n >\n <div\n className={cn(\n \"flex min-w-0 flex-1 gap-1\",\n vertical\n ? \"flex-nowrap overflow-x-auto @xl/tabs:max-h-[62vh] @xl/tabs:flex-col @xl/tabs:overflow-x-hidden @xl/tabs:overflow-y-auto @xl/tabs:pr-2\"\n : \"w-full flex-nowrap items-center overflow-x-auto\",\n )}\n role=\"tablist\"\n aria-orientation={orientation}\n data-plan-interactive\n >\n {data.tabs.map((tab) => {\n const selected = tab.id === active?.id;\n const tabLabel = (\n <span className={tabLabelClass(orientation)}>{tab.label}</span>\n );\n if (!vertical) {\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActiveId(tab.id)}\n className={tabButtonClass(selected, orientation)}\n >\n {tabLabel}\n </button>\n );\n }\n const tabButton = (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActiveId(tab.id)}\n className={cn(\n tabButtonClass(selected, orientation),\n vertical && editable && selected && \"pr-9\",\n )}\n >\n {tabLabel}\n </button>\n );\n return (\n <div\n key={tab.id}\n className=\"group/tab relative flex min-w-0 max-w-72 shrink-0 @xl/tabs:w-full @xl/tabs:max-w-none\"\n >\n {tabButton}\n {editable && selected && (\n <TabsSettingsPopover\n active={active}\n orientation={orientation}\n tabs={data.tabs}\n triggerClassName=\"pointer-events-none absolute right-1.5 top-1/2 -translate-y-1/2 opacity-0 transition-opacity group-hover/tab:pointer-events-auto group-hover/tab:opacity-100 group-focus-within/tab:pointer-events-auto group-focus-within/tab:opacity-100 data-[state=open]:pointer-events-auto data-[state=open]:opacity-100\"\n onRename={renameTab}\n onOrientationChange={setOrientation}\n onAdd={addTab}\n onRemove={removeTab}\n />\n )}\n </div>\n );\n })}\n </div>\n {editable && !vertical && (\n <TabsSettingsPopover\n active={active}\n orientation={orientation}\n tabs={data.tabs}\n onRename={renameTab}\n onOrientationChange={setOrientation}\n onAdd={addTab}\n onRemove={removeTab}\n />\n )}\n </div>\n {active && (\n <div className={cn(vertical && \"min-w-0\")}>\n {ctx.renderBlocksEditor\n ? ctx.renderBlocksEditor({\n blocks: active.blocks,\n onChange: (nextBlocks) =>\n onChange(\n {\n ...data,\n tabs: data.tabs.map((tab) =>\n tab.id === active.id\n ? { ...tab, blocks: nextBlocks }\n : tab,\n ),\n },\n {\n containerRegion: {\n regionId: active.id,\n blocks: nextBlocks,\n },\n },\n ),\n editable,\n containerBlockId: blockId,\n regionId: active.id,\n regionLabel: active.label,\n compactVisuals: compact,\n })\n : active.blocks.map((child) => (\n <div key={child.id}>\n {ctx.renderBlock?.({\n block: child,\n editing: true,\n compactVisuals: compact,\n onChange: (next) => updateChild(active.id, next),\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction TabsSettingsPopover({\n active,\n orientation,\n tabs,\n onRename,\n onOrientationChange,\n onAdd,\n onRemove,\n triggerClassName,\n}: {\n active: TabsTab | undefined;\n orientation: TabsOrientation;\n tabs: TabsTab[];\n onRename: (id: string, label: string) => void;\n onOrientationChange: (orientation: TabsOrientation) => void;\n onAdd: () => void;\n onRemove: (id: string) => void;\n triggerClassName?: string;\n}) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Edit tabs\"\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-md text-plan-muted transition-colors hover:text-plan-text focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n triggerClassName,\n )}\n >\n <IconPencil className=\"size-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n side=\"bottom\"\n className=\"w-80 p-0\"\n data-plan-interactive\n >\n <div className=\"border-b border-border px-3 py-2\">\n <div className=\"text-sm font-semibold text-foreground\">\n Tab settings\n </div>\n <div className=\"text-xs text-muted-foreground\">\n Rename the active tab, change layout, or manage the tab set.\n </div>\n </div>\n <div className=\"grid gap-3 p-3\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Active tab label\n </span>\n <input\n type=\"text\"\n data-plan-interactive\n className={tabSettingsInputClass}\n value={active?.label ?? \"\"}\n disabled={!active}\n onChange={(event) => {\n if (!active) return;\n onRename(active.id, event.target.value);\n }}\n />\n </label>\n <label className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Layout\n </span>\n <div\n className=\"grid grid-cols-2 gap-1 rounded-md border border-border bg-muted/30 p-1\"\n role=\"radiogroup\"\n aria-label=\"Tabs layout\"\n >\n {(\n [\n [\"horizontal\", \"Top\"],\n [\"vertical\", \"Side\"],\n ] satisfies Array<[TabsOrientation, string]>\n ).map(([value, label]) => {\n const selected = orientation === value;\n return (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-plan-interactive\n onClick={() => onOrientationChange(value)}\n className={cn(\n \"h-8 rounded px-2 text-xs font-medium transition-colors\",\n selected\n ? \"bg-background text-foreground\"\n : \"text-muted-foreground hover:bg-background/70 hover:text-foreground\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n </label>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n data-plan-interactive\n disabled={tabs.length >= 12}\n onClick={onAdd}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border px-2.5 text-xs font-medium text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <IconPlus className=\"size-3.5\" />\n Add tab\n </button>\n <button\n type=\"button\"\n data-plan-interactive\n disabled={!active || tabs.length <= 1}\n onClick={() => {\n if (!active) return;\n onRemove(active.id);\n }}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border px-2.5 text-xs font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <IconTrash className=\"size-3.5\" />\n Remove current\n </button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction tabRegions(data: TabsData): BlockContainerRegion[] {\n return data.tabs.map((tab) => ({\n id: tab.id,\n label: tab.label,\n blocks: tab.blocks,\n }));\n}\n\nfunction addTabRegion(data: TabsData, afterRegionId?: string): TabsData {\n if (data.tabs.length >= 12) return data;\n const nextTab: TabsTab = {\n id: newTabId(),\n label: `Tab ${data.tabs.length + 1}`,\n blocks: [],\n };\n if (!afterRegionId) return tabsWith(data, [...data.tabs, nextTab]);\n const afterIndex = data.tabs.findIndex((tab) => tab.id === afterRegionId);\n if (afterIndex < 0) return tabsWith(data, [...data.tabs, nextTab]);\n return tabsWith(data, [\n ...data.tabs.slice(0, afterIndex + 1),\n nextTab,\n ...data.tabs.slice(afterIndex + 1),\n ]);\n}\n\nfunction removeTabRegion(data: TabsData, regionId: string): TabsData {\n if (data.tabs.length <= 1) return data;\n return tabsWith(\n data,\n data.tabs.filter((tab) => tab.id !== regionId),\n );\n}\n\nfunction reorderTabRegion(\n data: TabsData,\n fromRegionId: string,\n toRegionId: string,\n): TabsData {\n const fromIndex = data.tabs.findIndex((tab) => tab.id === fromRegionId);\n const toIndex = data.tabs.findIndex((tab) => tab.id === toRegionId);\n if (fromIndex < 0 || toIndex < 0 || fromIndex === toIndex) return data;\n const next = [...data.tabs];\n const [moved] = next.splice(fromIndex, 1);\n if (!moved) return data;\n next.splice(toIndex, 0, moved);\n return tabsWith(data, next);\n}\n\n/**\n * The standard tabs block spec (with React `Read`/`Edit`). Apps register this in\n * their browser registry. The schema + MDX config come from `./tabs.config.ts`,\n * the exact same object server / agent code registers, so rendering and source\n * round-trip never drift.\n */\nexport const tabsBlock = defineBlock<TabsData>({\n type: \"tabs\",\n schema: tabsSchema,\n mdx: tabsMdx,\n Read: TabsBlockReader,\n Edit: TabsBlockEditor,\n placement: [\"block\", \"inline\"],\n editSurface: \"container\",\n container: {\n regions: tabRegions,\n updateRegion: (data, regionId, blocks) =>\n tabsWith(\n data,\n data.tabs.map((tab) =>\n tab.id === regionId ? { ...tab, blocks } : tab,\n ),\n ),\n addRegion: addTabRegion,\n removeRegion: removeTabRegion,\n reorderRegion: reorderTabRegion,\n },\n label: \"Tabs\",\n icon: IconLayoutNavbar,\n description:\n \"A top or side tab container; each tab holds its own list of blocks.\",\n empty: () => ({ tabs: [{ id: newTabId(), label: \"Tab 1\", blocks: [] }] }),\n});\n"]}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { type CSSProperties, type ReactNode, type RefObject } from "react";
|
|
2
|
+
import type { WireframeElName, WireframeNode, WireframeTone } from "./wireframe.config.js";
|
|
3
|
+
/**
|
|
4
|
+
* Shared wireframe "kit" — hand-drawn low-fi primitives, the el → component node
|
|
5
|
+
* registry, the rough.js sketch overlay, and the viewer-level sketchy/clean
|
|
6
|
+
* style preference. Ported verbatim (geometry-wise) from the plan template's
|
|
7
|
+
* `app/components/plan/wireframe/kit/*` so any app can render wireframe blocks.
|
|
8
|
+
*
|
|
9
|
+
* DECOUPLING: the only behavioral change from the plan copy is theme detection —
|
|
10
|
+
* core blocks read `document.documentElement.classList.contains("dark")` (the
|
|
11
|
+
* MermaidBlock precedent) instead of importing `next-themes`. Everything else
|
|
12
|
+
* (the `.plan-wf` / `[data-rough]` class contract the rough overlay measures,
|
|
13
|
+
* the `--wf-*` / `--ink` / `--paper` token names every primitive reads) is
|
|
14
|
+
* preserved exactly, so the kit looks identical in plan and renders correctly in
|
|
15
|
+
* any app once the matching tokens exist in `core/styles/blocks.css`.
|
|
16
|
+
*/
|
|
17
|
+
export type WireframeStyle = "sketchy" | "clean";
|
|
18
|
+
export declare function setWireframeStyle(style: WireframeStyle): void;
|
|
19
|
+
export declare function toggleWireframeStyle(): void;
|
|
20
|
+
export declare function useWireframeStyle(): WireframeStyle;
|
|
21
|
+
/** Read the live dark-mode flag from the document root (next-themes-free). */
|
|
22
|
+
export declare function useIsDark(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Frame-level config threaded to every Screen so skeleton / theme / sketch-vs-
|
|
25
|
+
* clean reach the kit no matter which path renders the root Screen.
|
|
26
|
+
*/
|
|
27
|
+
export declare const KitConfigContext: import("react").Context<{
|
|
28
|
+
skeleton?: boolean;
|
|
29
|
+
sketch?: number;
|
|
30
|
+
theme?: "light" | "dark";
|
|
31
|
+
style?: "sketchy" | "clean";
|
|
32
|
+
}>;
|
|
33
|
+
declare const V: {
|
|
34
|
+
readonly ink: "var(--ink)";
|
|
35
|
+
readonly soft: "var(--ink-soft)";
|
|
36
|
+
readonly line: "var(--line)";
|
|
37
|
+
readonly paper: "var(--paper)";
|
|
38
|
+
readonly card: "var(--card)";
|
|
39
|
+
readonly accent: "var(--accent)";
|
|
40
|
+
readonly accentSoft: "var(--accent-soft)";
|
|
41
|
+
readonly warn: "var(--warn)";
|
|
42
|
+
readonly warnSoft: "var(--warn-soft)";
|
|
43
|
+
readonly ok: "var(--ok)";
|
|
44
|
+
readonly okSoft: "var(--ok-soft)";
|
|
45
|
+
readonly stroke: "var(--stroke)";
|
|
46
|
+
readonly radius: "var(--radius)";
|
|
47
|
+
readonly gap: "var(--gap)";
|
|
48
|
+
readonly pad: "var(--pad)";
|
|
49
|
+
readonly fs: "var(--fs)";
|
|
50
|
+
readonly hand: "var(--font-hand)";
|
|
51
|
+
readonly script: "var(--font-script)";
|
|
52
|
+
};
|
|
53
|
+
type ToneColors = {
|
|
54
|
+
fg: string;
|
|
55
|
+
bg: string;
|
|
56
|
+
bd: string;
|
|
57
|
+
};
|
|
58
|
+
declare function toneColors(tone?: WireframeTone): ToneColors;
|
|
59
|
+
declare function toneInk(tone?: WireframeTone): string;
|
|
60
|
+
declare function fontWeight(weight?: "normal" | "medium" | "bold"): number;
|
|
61
|
+
export declare function Screen({ children, pad, sketch, density, theme, skeleton, style, }: {
|
|
62
|
+
children?: ReactNode;
|
|
63
|
+
pad?: number | string;
|
|
64
|
+
sketch?: number;
|
|
65
|
+
density?: "compact" | "regular" | "roomy";
|
|
66
|
+
theme?: "light" | "dark";
|
|
67
|
+
skeleton?: boolean;
|
|
68
|
+
style?: CSSProperties;
|
|
69
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
70
|
+
export declare function Hand({ children, size, weight, color, script, style, }: {
|
|
71
|
+
children?: ReactNode;
|
|
72
|
+
size?: number | string;
|
|
73
|
+
weight?: number;
|
|
74
|
+
color?: string;
|
|
75
|
+
script?: boolean;
|
|
76
|
+
style?: CSSProperties;
|
|
77
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
78
|
+
export declare function Bar({ w, h, color, r, style, }: {
|
|
79
|
+
w?: number | string;
|
|
80
|
+
h?: number | string;
|
|
81
|
+
color?: string;
|
|
82
|
+
r?: number | string;
|
|
83
|
+
style?: CSSProperties;
|
|
84
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
85
|
+
export declare function Lines({ n, gap, widths, color, style, }: {
|
|
86
|
+
n?: number;
|
|
87
|
+
gap?: number;
|
|
88
|
+
widths?: Array<number | string>;
|
|
89
|
+
color?: string;
|
|
90
|
+
style?: CSSProperties;
|
|
91
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
92
|
+
export declare function Box({ children, pad, fill, dashed, style, }: {
|
|
93
|
+
children?: ReactNode;
|
|
94
|
+
pad?: number | string;
|
|
95
|
+
fill?: string;
|
|
96
|
+
dashed?: boolean;
|
|
97
|
+
style?: CSSProperties;
|
|
98
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
99
|
+
export declare function Check({ done, shape, size, }: {
|
|
100
|
+
done?: boolean;
|
|
101
|
+
shape?: "square" | "circle";
|
|
102
|
+
size?: number;
|
|
103
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
104
|
+
export declare function Pill({ children, tone, style, }: {
|
|
105
|
+
children?: ReactNode;
|
|
106
|
+
tone?: WireframeTone;
|
|
107
|
+
style?: CSSProperties;
|
|
108
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
109
|
+
export declare function Prio({ level, label }: {
|
|
110
|
+
level?: number;
|
|
111
|
+
label?: string;
|
|
112
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
113
|
+
export declare function Btn({ children, solid, full, size, tone, style, }: {
|
|
114
|
+
children?: ReactNode;
|
|
115
|
+
solid?: boolean;
|
|
116
|
+
full?: boolean;
|
|
117
|
+
size?: "sm" | "md" | "lg";
|
|
118
|
+
tone?: WireframeTone;
|
|
119
|
+
style?: CSSProperties;
|
|
120
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
121
|
+
export declare function Chip({ children, active, style, }: {
|
|
122
|
+
children?: ReactNode;
|
|
123
|
+
active?: boolean;
|
|
124
|
+
style?: CSSProperties;
|
|
125
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
126
|
+
export declare function Field({ label, value, placeholder, h, area, right, style, }: {
|
|
127
|
+
label?: string;
|
|
128
|
+
value?: string;
|
|
129
|
+
placeholder?: number | string;
|
|
130
|
+
h?: number | string;
|
|
131
|
+
area?: boolean;
|
|
132
|
+
right?: ReactNode;
|
|
133
|
+
style?: CSSProperties;
|
|
134
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
135
|
+
export declare function StatusBar(): import("react/jsx-runtime").JSX.Element;
|
|
136
|
+
export declare function Fab({ icon }: {
|
|
137
|
+
icon?: string;
|
|
138
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
139
|
+
export declare function BrowserBar({ title, children, }: {
|
|
140
|
+
title?: string;
|
|
141
|
+
children?: ReactNode;
|
|
142
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
143
|
+
export declare function SectionLabel({ children, right, tone, }: {
|
|
144
|
+
children?: ReactNode;
|
|
145
|
+
right?: ReactNode;
|
|
146
|
+
tone?: WireframeTone;
|
|
147
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
148
|
+
export declare function Avatar({ size }: {
|
|
149
|
+
size?: number;
|
|
150
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
151
|
+
export declare function IconSquare({ size, active, }: {
|
|
152
|
+
size?: number;
|
|
153
|
+
active?: boolean;
|
|
154
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
155
|
+
export declare function NavItem({ label, count, active, dot, tone, }: {
|
|
156
|
+
label?: string;
|
|
157
|
+
count?: number;
|
|
158
|
+
active?: boolean;
|
|
159
|
+
dot?: boolean;
|
|
160
|
+
tone?: WireframeTone;
|
|
161
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
162
|
+
export declare function Sidebar({ children, width, style, }: {
|
|
163
|
+
children?: ReactNode;
|
|
164
|
+
width?: number;
|
|
165
|
+
style?: CSSProperties;
|
|
166
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
167
|
+
export declare function Main({ children, style, }: {
|
|
168
|
+
children?: ReactNode;
|
|
169
|
+
style?: CSSProperties;
|
|
170
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
171
|
+
export declare function Row({ children, full, style, }: {
|
|
172
|
+
children?: ReactNode;
|
|
173
|
+
full?: boolean;
|
|
174
|
+
style?: CSSProperties;
|
|
175
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
176
|
+
export declare function Col({ children, full, style, }: {
|
|
177
|
+
children?: ReactNode;
|
|
178
|
+
full?: boolean;
|
|
179
|
+
style?: CSSProperties;
|
|
180
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
181
|
+
export declare function TaskRow({ title, note, due, dueTone, prio, done, }: {
|
|
182
|
+
title?: string;
|
|
183
|
+
note?: string;
|
|
184
|
+
due?: string;
|
|
185
|
+
dueTone?: WireframeTone;
|
|
186
|
+
prio?: number;
|
|
187
|
+
done?: boolean;
|
|
188
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
189
|
+
export declare function Card({ children, style, }: {
|
|
190
|
+
children?: ReactNode;
|
|
191
|
+
style?: CSSProperties;
|
|
192
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
193
|
+
export declare function Column({ title, count, tone, width, children, }: {
|
|
194
|
+
title?: string;
|
|
195
|
+
count?: number;
|
|
196
|
+
tone?: WireframeTone;
|
|
197
|
+
width?: number;
|
|
198
|
+
children?: ReactNode;
|
|
199
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
200
|
+
export declare function Toolbar({ children, style, }: {
|
|
201
|
+
children?: ReactNode;
|
|
202
|
+
style?: CSSProperties;
|
|
203
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
204
|
+
export declare function Tabs({ items, }: {
|
|
205
|
+
items?: Array<{
|
|
206
|
+
label: string;
|
|
207
|
+
active?: boolean;
|
|
208
|
+
}>;
|
|
209
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
210
|
+
export declare function KV({ rows }: {
|
|
211
|
+
rows?: Array<{
|
|
212
|
+
k: string;
|
|
213
|
+
v: string;
|
|
214
|
+
}>;
|
|
215
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
216
|
+
export declare function SearchBar({ placeholder, }: {
|
|
217
|
+
placeholder?: string;
|
|
218
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
219
|
+
export declare function Divider({ style }: {
|
|
220
|
+
style?: CSSProperties;
|
|
221
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
222
|
+
export declare function Title({ text, script, size, color, }: {
|
|
223
|
+
text?: string;
|
|
224
|
+
script?: boolean;
|
|
225
|
+
size?: number | string;
|
|
226
|
+
color?: string;
|
|
227
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
228
|
+
export declare function Text({ value, color, weight, script, }: {
|
|
229
|
+
value?: string;
|
|
230
|
+
color?: WireframeTone;
|
|
231
|
+
weight?: "normal" | "medium" | "bold";
|
|
232
|
+
script?: boolean;
|
|
233
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
234
|
+
type NodeRenderer = (node: WireframeNode, children: ReactNode) => ReactNode;
|
|
235
|
+
declare const REGISTRY: Record<WireframeElName, NodeRenderer>;
|
|
236
|
+
/** Render a single kit-tree node (and its children, recursively). */
|
|
237
|
+
export declare function renderNode(node: WireframeNode, key?: string | number): ReactNode;
|
|
238
|
+
/** Render an array of nodes. */
|
|
239
|
+
export declare function renderNodes(nodes: WireframeNode[]): ReactNode;
|
|
240
|
+
/** Whether an `el` name has a registered renderer. */
|
|
241
|
+
export declare function hasRenderer(el: string): el is WireframeElName;
|
|
242
|
+
export { REGISTRY as NODE_REGISTRY, V as WFV, toneColors, toneInk, fontWeight };
|
|
243
|
+
/** The default selector used for HTML mockups: bordered/box-like elements. */
|
|
244
|
+
export declare const HTML_ROUGH_SELECTOR = "[data-rough],button,input,textarea,select,.wf-card,.wf-box,hr,.wf-frame-target";
|
|
245
|
+
/** Map the 0–100 sketch slider to a rough.js roughness (calm + legible). */
|
|
246
|
+
export declare function sketchRoughness(sketch: number): number;
|
|
247
|
+
/**
|
|
248
|
+
* Renders the rough overlay for a frame. `scopeRef` points at the frame root.
|
|
249
|
+
* When `enabled` is false (skeleton / clean register) it renders nothing and the
|
|
250
|
+
* crisp CSS borders stay visible.
|
|
251
|
+
*/
|
|
252
|
+
export declare function RoughOverlay({ scopeRef, sketch, enabled, drawFrame, frameRadius, selector, }: {
|
|
253
|
+
scopeRef: RefObject<HTMLElement | null>;
|
|
254
|
+
sketch?: number;
|
|
255
|
+
enabled?: boolean;
|
|
256
|
+
drawFrame?: boolean;
|
|
257
|
+
frameRadius?: number;
|
|
258
|
+
selector?: string;
|
|
259
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
260
|
+
//# sourceMappingURL=wireframe-kit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireframe-kit.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/wireframe-kit.tsx"],"names":[],"mappings":"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"}
|