@bestagentkits/render 0.2.0 → 0.3.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/CHANGELOG.md +100 -1
- package/README.md +157 -32
- package/dist/blocks/chart/chart-check-kind-rules.d.ts +10 -0
- package/dist/blocks/chart/chart-check-kind-rules.d.ts.map +1 -0
- package/dist/blocks/chart/chart-check-kind-rules.js +151 -0
- package/dist/blocks/chart/chart-check-kind-rules.js.map +1 -0
- package/dist/blocks/chart/chart-check.d.ts +15 -0
- package/dist/blocks/chart/chart-check.d.ts.map +1 -0
- package/dist/blocks/chart/chart-check.js +196 -0
- package/dist/blocks/chart/chart-check.js.map +1 -0
- package/dist/blocks/chart/chart-encoding-schema.d.ts +7 -0
- package/dist/blocks/chart/chart-encoding-schema.d.ts.map +1 -0
- package/dist/blocks/chart/chart-encoding-schema.js +39 -0
- package/dist/blocks/chart/chart-encoding-schema.js.map +1 -0
- package/dist/blocks/chart/chart-encodings.d.ts +29 -0
- package/dist/blocks/chart/chart-encodings.d.ts.map +1 -0
- package/dist/blocks/chart/chart-encodings.js +59 -0
- package/dist/blocks/chart/chart-encodings.js.map +1 -0
- package/dist/blocks/chart/chart-kinds.d.ts +18 -0
- package/dist/blocks/chart/chart-kinds.d.ts.map +1 -0
- package/dist/blocks/chart/chart-kinds.js +60 -0
- package/dist/blocks/chart/chart-kinds.js.map +1 -0
- package/dist/blocks/chart/chart-model-rows.d.ts +23 -0
- package/dist/blocks/chart/chart-model-rows.d.ts.map +1 -0
- package/dist/blocks/chart/chart-model-rows.js +153 -0
- package/dist/blocks/chart/chart-model-rows.js.map +1 -0
- package/dist/blocks/chart/chart-model.d.ts +17 -0
- package/dist/blocks/chart/chart-model.d.ts.map +1 -0
- package/dist/blocks/chart/chart-model.js +131 -0
- package/dist/blocks/chart/chart-model.js.map +1 -0
- package/dist/blocks/chart/chart-styles.d.ts +3 -0
- package/dist/blocks/chart/chart-styles.d.ts.map +1 -0
- package/dist/blocks/chart/chart-styles.js +76 -0
- package/dist/blocks/chart/chart-styles.js.map +1 -0
- package/dist/blocks/chart/chart.d.ts +12 -0
- package/dist/blocks/chart/chart.d.ts.map +1 -0
- package/dist/blocks/chart/chart.js +73 -0
- package/dist/blocks/chart/chart.js.map +1 -0
- package/dist/blocks/chart/index.d.ts +4 -0
- package/dist/blocks/chart/index.d.ts.map +1 -0
- package/dist/blocks/chart/index.js +8 -0
- package/dist/blocks/chart/index.js.map +1 -0
- package/dist/blocks/composition/accordion.d.ts +4 -0
- package/dist/blocks/composition/accordion.d.ts.map +1 -0
- package/dist/blocks/composition/accordion.js +45 -0
- package/dist/blocks/composition/accordion.js.map +1 -0
- package/dist/blocks/composition/bento.d.ts +4 -0
- package/dist/blocks/composition/bento.d.ts.map +1 -0
- package/dist/blocks/composition/bento.js +91 -0
- package/dist/blocks/composition/bento.js.map +1 -0
- package/dist/blocks/composition/carousel.d.ts +4 -0
- package/dist/blocks/composition/carousel.d.ts.map +1 -0
- package/dist/blocks/composition/carousel.js +51 -0
- package/dist/blocks/composition/carousel.js.map +1 -0
- package/dist/blocks/composition/composition-runtime.d.ts +14 -0
- package/dist/blocks/composition/composition-runtime.d.ts.map +1 -0
- package/dist/blocks/composition/composition-runtime.js +136 -0
- package/dist/blocks/composition/composition-runtime.js.map +1 -0
- package/dist/blocks/composition/composition-styles.d.ts +10 -0
- package/dist/blocks/composition/composition-styles.d.ts.map +1 -0
- package/dist/blocks/composition/composition-styles.js +80 -0
- package/dist/blocks/composition/composition-styles.js.map +1 -0
- package/dist/blocks/composition/index.d.ts +4 -0
- package/dist/blocks/composition/index.d.ts.map +1 -0
- package/dist/blocks/composition/index.js +11 -0
- package/dist/blocks/composition/index.js.map +1 -0
- package/dist/blocks/composition/nestable-blocks.d.ts +37 -0
- package/dist/blocks/composition/nestable-blocks.d.ts.map +1 -0
- package/dist/blocks/composition/nestable-blocks.js +92 -0
- package/dist/blocks/composition/nestable-blocks.js.map +1 -0
- package/dist/blocks/composition/tabs.d.ts +4 -0
- package/dist/blocks/composition/tabs.d.ts.map +1 -0
- package/dist/blocks/composition/tabs.js +48 -0
- package/dist/blocks/composition/tabs.js.map +1 -0
- package/dist/blocks/controls/checkbox.d.ts +12 -0
- package/dist/blocks/controls/checkbox.d.ts.map +1 -0
- package/dist/blocks/controls/checkbox.js +43 -0
- package/dist/blocks/controls/checkbox.js.map +1 -0
- package/dist/blocks/controls/choice-options.d.ts +24 -0
- package/dist/blocks/controls/choice-options.d.ts.map +1 -0
- package/dist/blocks/controls/choice-options.js +117 -0
- package/dist/blocks/controls/choice-options.js.map +1 -0
- package/dist/blocks/controls/control-shared.d.ts +66 -0
- package/dist/blocks/controls/control-shared.d.ts.map +1 -0
- package/dist/blocks/controls/control-shared.js +241 -0
- package/dist/blocks/controls/control-shared.js.map +1 -0
- package/dist/blocks/controls/controls-runtime.d.ts +17 -0
- package/dist/blocks/controls/controls-runtime.d.ts.map +1 -0
- package/dist/blocks/controls/controls-runtime.js +180 -0
- package/dist/blocks/controls/controls-runtime.js.map +1 -0
- package/dist/blocks/controls/controls-styles.d.ts +14 -0
- package/dist/blocks/controls/controls-styles.d.ts.map +1 -0
- package/dist/blocks/controls/controls-styles.js +54 -0
- package/dist/blocks/controls/controls-styles.js.map +1 -0
- package/dist/blocks/controls/date-input.d.ts +6 -0
- package/dist/blocks/controls/date-input.d.ts.map +1 -0
- package/dist/blocks/controls/date-input.js +58 -0
- package/dist/blocks/controls/date-input.js.map +1 -0
- package/dist/blocks/controls/field-input.d.ts +10 -0
- package/dist/blocks/controls/field-input.d.ts.map +1 -0
- package/dist/blocks/controls/field-input.js +20 -0
- package/dist/blocks/controls/field-input.js.map +1 -0
- package/dist/blocks/controls/filter-bar.d.ts +11 -0
- package/dist/blocks/controls/filter-bar.d.ts.map +1 -0
- package/dist/blocks/controls/filter-bar.js +115 -0
- package/dist/blocks/controls/filter-bar.js.map +1 -0
- package/dist/blocks/controls/index.d.ts +4 -0
- package/dist/blocks/controls/index.d.ts.map +1 -0
- package/dist/blocks/controls/index.js +41 -0
- package/dist/blocks/controls/index.js.map +1 -0
- package/dist/blocks/controls/number-input.d.ts +4 -0
- package/dist/blocks/controls/number-input.d.ts.map +1 -0
- package/dist/blocks/controls/number-input.js +62 -0
- package/dist/blocks/controls/number-input.js.map +1 -0
- package/dist/blocks/controls/radio-group.d.ts +4 -0
- package/dist/blocks/controls/radio-group.d.ts.map +1 -0
- package/dist/blocks/controls/radio-group.js +56 -0
- package/dist/blocks/controls/radio-group.js.map +1 -0
- package/dist/blocks/controls/select.d.ts +4 -0
- package/dist/blocks/controls/select.d.ts.map +1 -0
- package/dist/blocks/controls/select.js +49 -0
- package/dist/blocks/controls/select.js.map +1 -0
- package/dist/blocks/controls/switch.d.ts +4 -0
- package/dist/blocks/controls/switch.d.ts.map +1 -0
- package/dist/blocks/controls/switch.js +22 -0
- package/dist/blocks/controls/switch.js.map +1 -0
- package/dist/blocks/controls/text-input.d.ts +4 -0
- package/dist/blocks/controls/text-input.d.ts.map +1 -0
- package/dist/blocks/controls/text-input.js +42 -0
- package/dist/blocks/controls/text-input.js.map +1 -0
- package/dist/blocks/data-table/data-table-cells.d.ts +26 -0
- package/dist/blocks/data-table/data-table-cells.d.ts.map +1 -0
- package/dist/blocks/data-table/data-table-cells.js +154 -0
- package/dist/blocks/data-table/data-table-cells.js.map +1 -0
- package/dist/blocks/data-table/data-table-check.d.ts +10 -0
- package/dist/blocks/data-table/data-table-check.d.ts.map +1 -0
- package/dist/blocks/data-table/data-table-check.js +99 -0
- package/dist/blocks/data-table/data-table-check.js.map +1 -0
- package/dist/blocks/data-table/data-table-columns.d.ts +41 -0
- package/dist/blocks/data-table/data-table-columns.d.ts.map +1 -0
- package/dist/blocks/data-table/data-table-columns.js +155 -0
- package/dist/blocks/data-table/data-table-columns.js.map +1 -0
- package/dist/blocks/data-table/data-table-runtime.d.ts +15 -0
- package/dist/blocks/data-table/data-table-runtime.d.ts.map +1 -0
- package/dist/blocks/data-table/data-table-runtime.js +106 -0
- package/dist/blocks/data-table/data-table-runtime.js.map +1 -0
- package/dist/blocks/data-table/data-table-styles.d.ts +11 -0
- package/dist/blocks/data-table/data-table-styles.d.ts.map +1 -0
- package/dist/blocks/data-table/data-table-styles.js +74 -0
- package/dist/blocks/data-table/data-table-styles.js.map +1 -0
- package/dist/blocks/data-table/data-table.d.ts +17 -0
- package/dist/blocks/data-table/data-table.d.ts.map +1 -0
- package/dist/blocks/data-table/data-table.js +159 -0
- package/dist/blocks/data-table/data-table.js.map +1 -0
- package/dist/blocks/data-table/index.d.ts +4 -0
- package/dist/blocks/data-table/index.d.ts.map +1 -0
- package/dist/blocks/data-table/index.js +18 -0
- package/dist/blocks/data-table/index.js.map +1 -0
- package/dist/blocks/engineering/api-endpoint.d.ts +12 -0
- package/dist/blocks/engineering/api-endpoint.d.ts.map +1 -0
- package/dist/blocks/engineering/api-endpoint.js +174 -0
- package/dist/blocks/engineering/api-endpoint.js.map +1 -0
- package/dist/blocks/engineering/engineering-helpers.d.ts +49 -0
- package/dist/blocks/engineering/engineering-helpers.d.ts.map +1 -0
- package/dist/blocks/engineering/engineering-helpers.js +156 -0
- package/dist/blocks/engineering/engineering-helpers.js.map +1 -0
- package/dist/blocks/engineering/engineering-styles.d.ts +12 -0
- package/dist/blocks/engineering/engineering-styles.d.ts.map +1 -0
- package/dist/blocks/engineering/engineering-styles.js +174 -0
- package/dist/blocks/engineering/engineering-styles.js.map +1 -0
- package/dist/blocks/engineering/index.d.ts +4 -0
- package/dist/blocks/engineering/index.d.ts.map +1 -0
- package/dist/blocks/engineering/index.js +30 -0
- package/dist/blocks/engineering/index.js.map +1 -0
- package/dist/blocks/engineering/kanban.d.ts +11 -0
- package/dist/blocks/engineering/kanban.d.ts.map +1 -0
- package/dist/blocks/engineering/kanban.js +162 -0
- package/dist/blocks/engineering/kanban.js.map +1 -0
- package/dist/blocks/engineering/log-viewer.d.ts +14 -0
- package/dist/blocks/engineering/log-viewer.d.ts.map +1 -0
- package/dist/blocks/engineering/log-viewer.js +158 -0
- package/dist/blocks/engineering/log-viewer.js.map +1 -0
- package/dist/blocks/engineering/roadmap.d.ts +13 -0
- package/dist/blocks/engineering/roadmap.d.ts.map +1 -0
- package/dist/blocks/engineering/roadmap.js +197 -0
- package/dist/blocks/engineering/roadmap.js.map +1 -0
- package/dist/blocks/engineering/schema-viewer.d.ts +25 -0
- package/dist/blocks/engineering/schema-viewer.d.ts.map +1 -0
- package/dist/blocks/engineering/schema-viewer.js +124 -0
- package/dist/blocks/engineering/schema-viewer.js.map +1 -0
- package/dist/blocks/engineering/test-results.d.ts +12 -0
- package/dist/blocks/engineering/test-results.d.ts.map +1 -0
- package/dist/blocks/engineering/test-results.js +180 -0
- package/dist/blocks/engineering/test-results.js.map +1 -0
- package/dist/blocks/evidence/annotated-image.d.ts +15 -0
- package/dist/blocks/evidence/annotated-image.d.ts.map +1 -0
- package/dist/blocks/evidence/annotated-image.js +99 -0
- package/dist/blocks/evidence/annotated-image.js.map +1 -0
- package/dist/blocks/evidence/benchmark-comparison.d.ts +11 -0
- package/dist/blocks/evidence/benchmark-comparison.d.ts.map +1 -0
- package/dist/blocks/evidence/benchmark-comparison.js +262 -0
- package/dist/blocks/evidence/benchmark-comparison.js.map +1 -0
- package/dist/blocks/evidence/benchmark-verdict.d.ts +26 -0
- package/dist/blocks/evidence/benchmark-verdict.d.ts.map +1 -0
- package/dist/blocks/evidence/benchmark-verdict.js +31 -0
- package/dist/blocks/evidence/benchmark-verdict.js.map +1 -0
- package/dist/blocks/evidence/evidence-helpers.d.ts +39 -0
- package/dist/blocks/evidence/evidence-helpers.d.ts.map +1 -0
- package/dist/blocks/evidence/evidence-helpers.js +87 -0
- package/dist/blocks/evidence/evidence-helpers.js.map +1 -0
- package/dist/blocks/evidence/evidence-styles.d.ts +12 -0
- package/dist/blocks/evidence/evidence-styles.d.ts.map +1 -0
- package/dist/blocks/evidence/evidence-styles.js +88 -0
- package/dist/blocks/evidence/evidence-styles.js.map +1 -0
- package/dist/blocks/evidence/index.d.ts +4 -0
- package/dist/blocks/evidence/index.d.ts.map +1 -0
- package/dist/blocks/evidence/index.js +15 -0
- package/dist/blocks/evidence/index.js.map +1 -0
- package/dist/blocks/evidence/metric-breakdown.d.ts +22 -0
- package/dist/blocks/evidence/metric-breakdown.d.ts.map +1 -0
- package/dist/blocks/evidence/metric-breakdown.js +203 -0
- package/dist/blocks/evidence/metric-breakdown.js.map +1 -0
- package/dist/blocks/evidence/references.d.ts +13 -0
- package/dist/blocks/evidence/references.d.ts.map +1 -0
- package/dist/blocks/evidence/references.js +103 -0
- package/dist/blocks/evidence/references.js.map +1 -0
- package/dist/blocks/index.d.ts +8 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/index.js +24 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/blocks/layout/grid-item.d.ts +4 -0
- package/dist/blocks/layout/grid-item.d.ts.map +1 -0
- package/dist/blocks/layout/grid-item.js +65 -0
- package/dist/blocks/layout/grid-item.js.map +1 -0
- package/dist/blocks/layout/grid.d.ts +9 -0
- package/dist/blocks/layout/grid.d.ts.map +1 -0
- package/dist/blocks/layout/grid.js +99 -0
- package/dist/blocks/layout/grid.js.map +1 -0
- package/dist/blocks/layout/index.d.ts +4 -0
- package/dist/blocks/layout/index.d.ts.map +1 -0
- package/dist/blocks/layout/index.js +23 -0
- package/dist/blocks/layout/index.js.map +1 -0
- package/dist/blocks/layout/layout-styles.d.ts +40 -0
- package/dist/blocks/layout/layout-styles.d.ts.map +1 -0
- package/dist/blocks/layout/layout-styles.js +110 -0
- package/dist/blocks/layout/layout-styles.js.map +1 -0
- package/dist/blocks/layout/main-aside.d.ts +4 -0
- package/dist/blocks/layout/main-aside.d.ts.map +1 -0
- package/dist/blocks/layout/main-aside.js +21 -0
- package/dist/blocks/layout/main-aside.js.map +1 -0
- package/dist/blocks/layout/rail-layout.d.ts +4 -0
- package/dist/blocks/layout/rail-layout.d.ts.map +1 -0
- package/dist/blocks/layout/rail-layout.js +33 -0
- package/dist/blocks/layout/rail-layout.js.map +1 -0
- package/dist/blocks/layout/semantic-layout-parts.d.ts +14 -0
- package/dist/blocks/layout/semantic-layout-parts.d.ts.map +1 -0
- package/dist/blocks/layout/semantic-layout-parts.js +9 -0
- package/dist/blocks/layout/semantic-layout-parts.js.map +1 -0
- package/dist/blocks/layout/sidebar-layout.d.ts +4 -0
- package/dist/blocks/layout/sidebar-layout.d.ts.map +1 -0
- package/dist/blocks/layout/sidebar-layout.js +30 -0
- package/dist/blocks/layout/sidebar-layout.js.map +1 -0
- package/dist/blocks/layout/split.d.ts +4 -0
- package/dist/blocks/layout/split.d.ts.map +1 -0
- package/dist/blocks/layout/split.js +23 -0
- package/dist/blocks/layout/split.js.map +1 -0
- package/dist/blocks/layout/stack.d.ts +4 -0
- package/dist/blocks/layout/stack.d.ts.map +1 -0
- package/dist/blocks/layout/stack.js +36 -0
- package/dist/blocks/layout/stack.js.map +1 -0
- package/dist/blocks/product/calendar-dates.d.ts +59 -0
- package/dist/blocks/product/calendar-dates.d.ts.map +1 -0
- package/dist/blocks/product/calendar-dates.js +100 -0
- package/dist/blocks/product/calendar-dates.js.map +1 -0
- package/dist/blocks/product/calendar.d.ts +12 -0
- package/dist/blocks/product/calendar.d.ts.map +1 -0
- package/dist/blocks/product/calendar.js +125 -0
- package/dist/blocks/product/calendar.js.map +1 -0
- package/dist/blocks/product/feature-matrix.d.ts +4 -0
- package/dist/blocks/product/feature-matrix.d.ts.map +1 -0
- package/dist/blocks/product/feature-matrix.js +72 -0
- package/dist/blocks/product/feature-matrix.js.map +1 -0
- package/dist/blocks/product/gallery.d.ts +14 -0
- package/dist/blocks/product/gallery.d.ts.map +1 -0
- package/dist/blocks/product/gallery.js +86 -0
- package/dist/blocks/product/gallery.js.map +1 -0
- package/dist/blocks/product/index.d.ts +4 -0
- package/dist/blocks/product/index.d.ts.map +1 -0
- package/dist/blocks/product/index.js +40 -0
- package/dist/blocks/product/index.js.map +1 -0
- package/dist/blocks/product/logo-cloud.d.ts +4 -0
- package/dist/blocks/product/logo-cloud.d.ts.map +1 -0
- package/dist/blocks/product/logo-cloud.js +42 -0
- package/dist/blocks/product/logo-cloud.js.map +1 -0
- package/dist/blocks/product/people.d.ts +4 -0
- package/dist/blocks/product/people.d.ts.map +1 -0
- package/dist/blocks/product/people.js +53 -0
- package/dist/blocks/product/people.js.map +1 -0
- package/dist/blocks/product/pricing.d.ts +4 -0
- package/dist/blocks/product/pricing.d.ts.map +1 -0
- package/dist/blocks/product/pricing.js +86 -0
- package/dist/blocks/product/pricing.js.map +1 -0
- package/dist/blocks/product/product-helpers.d.ts +22 -0
- package/dist/blocks/product/product-helpers.d.ts.map +1 -0
- package/dist/blocks/product/product-helpers.js +48 -0
- package/dist/blocks/product/product-helpers.js.map +1 -0
- package/dist/blocks/product/product-runtime.d.ts +15 -0
- package/dist/blocks/product/product-runtime.d.ts.map +1 -0
- package/dist/blocks/product/product-runtime.js +97 -0
- package/dist/blocks/product/product-runtime.js.map +1 -0
- package/dist/blocks/product/product-styles.d.ts +14 -0
- package/dist/blocks/product/product-styles.d.ts.map +1 -0
- package/dist/blocks/product/product-styles.js +120 -0
- package/dist/blocks/product/product-styles.js.map +1 -0
- package/dist/blocks/product/testimonial.d.ts +8 -0
- package/dist/blocks/product/testimonial.d.ts.map +1 -0
- package/dist/blocks/product/testimonial.js +67 -0
- package/dist/blocks/product/testimonial.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +143 -30
- package/dist/cli.js.map +1 -1
- package/dist/data/data-json-schema.d.ts +9 -0
- package/dist/data/data-json-schema.d.ts.map +1 -0
- package/dist/data/data-json-schema.js +48 -0
- package/dist/data/data-json-schema.js.map +1 -0
- package/dist/data/dataset-types.d.ts +47 -0
- package/dist/data/dataset-types.d.ts.map +1 -0
- package/dist/data/dataset-types.js +49 -0
- package/dist/data/dataset-types.js.map +1 -0
- package/dist/data/format-value.d.ts +39 -0
- package/dist/data/format-value.d.ts.map +1 -0
- package/dist/data/format-value.js +214 -0
- package/dist/data/format-value.js.map +1 -0
- package/dist/data/resolve-block-data.d.ts +24 -0
- package/dist/data/resolve-block-data.d.ts.map +1 -0
- package/dist/data/resolve-block-data.js +190 -0
- package/dist/data/resolve-block-data.js.map +1 -0
- package/dist/data/transform-pipeline.d.ts +65 -0
- package/dist/data/transform-pipeline.d.ts.map +1 -0
- package/dist/data/transform-pipeline.js +234 -0
- package/dist/data/transform-pipeline.js.map +1 -0
- package/dist/data/validate-datasets.d.ts +22 -0
- package/dist/data/validate-datasets.d.ts.map +1 -0
- package/dist/data/validate-datasets.js +137 -0
- package/dist/data/validate-datasets.js.map +1 -0
- package/dist/diagram/adapter-markup-fit.d.ts +44 -0
- package/dist/diagram/adapter-markup-fit.d.ts.map +1 -0
- package/dist/diagram/adapter-markup-fit.js +292 -0
- package/dist/diagram/adapter-markup-fit.js.map +1 -0
- package/dist/diagram/adapter-stylesheet-filter.d.ts +56 -0
- package/dist/diagram/adapter-stylesheet-filter.d.ts.map +1 -0
- package/dist/diagram/adapter-stylesheet-filter.js +245 -0
- package/dist/diagram/adapter-stylesheet-filter.js.map +1 -0
- package/dist/diagram/adapter.d.ts +17 -0
- package/dist/diagram/adapter.d.ts.map +1 -1
- package/dist/diagram/adapter.js +43 -2
- package/dist/diagram/adapter.js.map +1 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/ir.d.ts +18 -0
- package/dist/ir.d.ts.map +1 -1
- package/dist/ir.js.map +1 -1
- package/dist/mcp/mcp-http-transport.d.ts +68 -0
- package/dist/mcp/mcp-http-transport.d.ts.map +1 -0
- package/dist/mcp/mcp-http-transport.js +140 -0
- package/dist/mcp/mcp-http-transport.js.map +1 -0
- package/dist/mcp/mcp-json-rpc-dispatch.d.ts +38 -0
- package/dist/mcp/mcp-json-rpc-dispatch.d.ts.map +1 -0
- package/dist/mcp/mcp-json-rpc-dispatch.js +98 -0
- package/dist/mcp/mcp-json-rpc-dispatch.js.map +1 -0
- package/dist/mcp/mcp-local-tools.d.ts +20 -0
- package/dist/mcp/mcp-local-tools.d.ts.map +1 -0
- package/dist/mcp/mcp-local-tools.js +58 -0
- package/dist/mcp/mcp-local-tools.js.map +1 -0
- package/dist/mcp/mcp-protocol.d.ts +79 -0
- package/dist/mcp/mcp-protocol.d.ts.map +1 -0
- package/dist/mcp/mcp-protocol.js +83 -0
- package/dist/mcp/mcp-protocol.js.map +1 -0
- package/dist/mcp/mcp-stdio-transport.d.ts +28 -0
- package/dist/mcp/mcp-stdio-transport.d.ts.map +1 -0
- package/dist/mcp/mcp-stdio-transport.js +73 -0
- package/dist/mcp/mcp-stdio-transport.js.map +1 -0
- package/dist/mcp/mcp-tool-definitions.d.ts +66 -0
- package/dist/mcp/mcp-tool-definitions.d.ts.map +1 -0
- package/dist/mcp/mcp-tool-definitions.js +246 -0
- package/dist/mcp/mcp-tool-definitions.js.map +1 -0
- package/dist/mcp-server.d.ts +6 -33
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +5 -270
- package/dist/mcp-server.js.map +1 -1
- package/dist/recipes/index.d.ts +27 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +30 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/recipes/recipes.generated.d.ts +8 -0
- package/dist/recipes/recipes.generated.d.ts.map +1 -0
- package/dist/recipes/recipes.generated.js +704 -0
- package/dist/recipes/recipes.generated.js.map +1 -0
- package/dist/registry/actions.d.ts +2 -0
- package/dist/registry/actions.d.ts.map +1 -1
- package/dist/registry/actions.js +3 -1
- package/dist/registry/actions.js.map +1 -1
- package/dist/registry/block-module.d.ts +65 -0
- package/dist/registry/block-module.d.ts.map +1 -0
- package/dist/registry/block-module.js +19 -0
- package/dist/registry/block-module.js.map +1 -0
- package/dist/registry/catalog-search.d.ts +32 -0
- package/dist/registry/catalog-search.d.ts.map +1 -0
- package/dist/registry/catalog-search.js +122 -0
- package/dist/registry/catalog-search.js.map +1 -0
- package/dist/registry/define-helpers.d.ts +89 -0
- package/dist/registry/define-helpers.d.ts.map +1 -0
- package/dist/registry/define-helpers.js +87 -0
- package/dist/registry/define-helpers.js.map +1 -0
- package/dist/registry/describe-many.d.ts +58 -0
- package/dist/registry/describe-many.d.ts.map +1 -0
- package/dist/registry/describe-many.js +156 -0
- package/dist/registry/describe-many.js.map +1 -0
- package/dist/registry/prop-schema.d.ts +32 -1
- package/dist/registry/prop-schema.d.ts.map +1 -1
- package/dist/registry/prop-schema.js +108 -2
- package/dist/registry/prop-schema.js.map +1 -1
- package/dist/registry/registry-builder.d.ts +17 -0
- package/dist/registry/registry-builder.d.ts.map +1 -0
- package/dist/registry/registry-builder.js +158 -0
- package/dist/registry/registry-builder.js.map +1 -0
- package/dist/registry/registry.d.ts +32 -5
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +67 -14
- package/dist/registry/registry.js.map +1 -1
- package/dist/registry/roster.d.ts +34 -5
- package/dist/registry/roster.d.ts.map +1 -1
- package/dist/registry/roster.js +184 -224
- package/dist/registry/roster.js.map +1 -1
- package/dist/render/block-helpers.d.ts +11 -18
- package/dist/render/block-helpers.d.ts.map +1 -1
- package/dist/render/block-helpers.js +14 -44
- package/dist/render/block-helpers.js.map +1 -1
- package/dist/render/blocks.d.ts +9 -33
- package/dist/render/blocks.d.ts.map +1 -1
- package/dist/render/blocks.js +56 -180
- package/dist/render/blocks.js.map +1 -1
- package/dist/render/chart-figure-encoded.d.ts +11 -0
- package/dist/render/chart-figure-encoded.d.ts.map +1 -0
- package/dist/render/chart-figure-encoded.js +81 -0
- package/dist/render/chart-figure-encoded.js.map +1 -0
- package/dist/render/chart-kinds-cartesian.d.ts +14 -0
- package/dist/render/chart-kinds-cartesian.d.ts.map +1 -0
- package/dist/render/chart-kinds-cartesian.js +122 -0
- package/dist/render/chart-kinds-cartesian.js.map +1 -0
- package/dist/render/chart-kinds-composite.d.ts +16 -0
- package/dist/render/chart-kinds-composite.d.ts.map +1 -0
- package/dist/render/chart-kinds-composite.js +144 -0
- package/dist/render/chart-kinds-composite.js.map +1 -0
- package/dist/render/chart-kinds-gauge-treemap.d.ts +8 -0
- package/dist/render/chart-kinds-gauge-treemap.d.ts.map +1 -0
- package/dist/render/chart-kinds-gauge-treemap.js +101 -0
- package/dist/render/chart-kinds-gauge-treemap.js.map +1 -0
- package/dist/render/chart-kinds-histogram-waterfall.d.ts +17 -0
- package/dist/render/chart-kinds-histogram-waterfall.d.ts.map +1 -0
- package/dist/render/chart-kinds-histogram-waterfall.js +172 -0
- package/dist/render/chart-kinds-histogram-waterfall.js.map +1 -0
- package/dist/render/chart-overlays.d.ts +18 -0
- package/dist/render/chart-overlays.d.ts.map +1 -0
- package/dist/render/chart-overlays.js +58 -0
- package/dist/render/chart-overlays.js.map +1 -0
- package/dist/render/chart-scales.d.ts +83 -0
- package/dist/render/chart-scales.d.ts.map +1 -0
- package/dist/render/chart-scales.js +166 -0
- package/dist/render/chart-scales.js.map +1 -0
- package/dist/render/chart-svg-parts.d.ts +50 -0
- package/dist/render/chart-svg-parts.d.ts.map +1 -0
- package/dist/render/chart-svg-parts.js +125 -0
- package/dist/render/chart-svg-parts.js.map +1 -0
- package/dist/render/chart-text.d.ts +18 -0
- package/dist/render/chart-text.d.ts.map +1 -0
- package/dist/render/chart-text.js +69 -0
- package/dist/render/chart-text.js.map +1 -0
- package/dist/render/chart-treemap-layout.d.ts +17 -0
- package/dist/render/chart-treemap-layout.d.ts.map +1 -0
- package/dist/render/chart-treemap-layout.js +74 -0
- package/dist/render/chart-treemap-layout.js.map +1 -0
- package/dist/render/chart-types.d.ts +107 -0
- package/dist/render/chart-types.d.ts.map +1 -0
- package/dist/render/chart-types.js +11 -0
- package/dist/render/chart-types.js.map +1 -0
- package/dist/render/charts.d.ts +28 -11
- package/dist/render/charts.d.ts.map +1 -1
- package/dist/render/charts.js +38 -117
- package/dist/render/charts.js.map +1 -1
- package/dist/render/derived-variables.d.ts +20 -0
- package/dist/render/derived-variables.d.ts.map +1 -1
- package/dist/render/derived-variables.js +23 -0
- package/dist/render/derived-variables.js.map +1 -1
- package/dist/render/document.d.ts +11 -0
- package/dist/render/document.d.ts.map +1 -1
- package/dist/render/document.js +20 -3
- package/dist/render/document.js.map +1 -1
- package/dist/render/escape.d.ts +10 -0
- package/dist/render/escape.d.ts.map +1 -1
- package/dist/render/escape.js +28 -0
- package/dist/render/escape.js.map +1 -1
- package/dist/render/feature-styles.d.ts.map +1 -1
- package/dist/render/feature-styles.js +42 -80
- package/dist/render/feature-styles.js.map +1 -1
- package/dist/render/outline.d.ts +1 -1
- package/dist/render/outline.d.ts.map +1 -1
- package/dist/render/outline.js +4 -1
- package/dist/render/outline.js.map +1 -1
- package/dist/render/recipe-styles.d.ts +26 -0
- package/dist/render/recipe-styles.d.ts.map +1 -0
- package/dist/render/recipe-styles.js +218 -0
- package/dist/render/recipe-styles.js.map +1 -0
- package/dist/render/render-context.d.ts +40 -0
- package/dist/render/render-context.d.ts.map +1 -0
- package/dist/render/render-context.js +16 -0
- package/dist/render/render-context.js.map +1 -0
- package/dist/render/render.d.ts +7 -0
- package/dist/render/render.d.ts.map +1 -1
- package/dist/render/render.js +68 -44
- package/dist/render/render.js.map +1 -1
- package/dist/render/runtime.d.ts +4 -1
- package/dist/render/runtime.d.ts.map +1 -1
- package/dist/render/runtime.js +91 -118
- package/dist/render/runtime.js.map +1 -1
- package/dist/render/showcase-blocks.d.ts +5 -0
- package/dist/render/showcase-blocks.d.ts.map +1 -1
- package/dist/render/showcase-blocks.js +8 -28
- package/dist/render/showcase-blocks.js.map +1 -1
- package/dist/render/showcase-styles.d.ts.map +1 -1
- package/dist/render/showcase-styles.js +15 -31
- package/dist/render/showcase-styles.js.map +1 -1
- package/dist/render/style-units.d.ts +17 -0
- package/dist/render/style-units.d.ts.map +1 -0
- package/dist/render/style-units.js +24 -0
- package/dist/render/style-units.js.map +1 -0
- package/dist/render/styles.d.ts.map +1 -1
- package/dist/render/styles.js +8 -5
- package/dist/render/styles.js.map +1 -1
- package/dist/render/tone.d.ts +14 -0
- package/dist/render/tone.d.ts.map +1 -0
- package/dist/render/tone.js +40 -0
- package/dist/render/tone.js.map +1 -0
- package/dist/render/verify.d.ts +3 -0
- package/dist/render/verify.d.ts.map +1 -1
- package/dist/render/verify.js +15 -2
- package/dist/render/verify.js.map +1 -1
- package/dist/spec/asset-references.d.ts +35 -0
- package/dist/spec/asset-references.d.ts.map +1 -0
- package/dist/spec/asset-references.js +93 -0
- package/dist/spec/asset-references.js.map +1 -0
- package/dist/spec/bounds.d.ts +6 -0
- package/dist/spec/bounds.d.ts.map +1 -1
- package/dist/spec/bounds.js +7 -0
- package/dist/spec/bounds.js.map +1 -1
- package/dist/spec/conditions.d.ts +43 -0
- package/dist/spec/conditions.d.ts.map +1 -0
- package/dist/spec/conditions.js +179 -0
- package/dist/spec/conditions.js.map +1 -0
- package/dist/spec/network-policy.d.ts +33 -0
- package/dist/spec/network-policy.d.ts.map +1 -0
- package/dist/spec/network-policy.js +57 -0
- package/dist/spec/network-policy.js.map +1 -0
- package/dist/spec/normalize.d.ts +7 -2
- package/dist/spec/normalize.d.ts.map +1 -1
- package/dist/spec/normalize.js +203 -57
- package/dist/spec/normalize.js.map +1 -1
- package/dist/theme/dialect-presets.d.ts +12 -0
- package/dist/theme/dialect-presets.d.ts.map +1 -0
- package/dist/theme/dialect-presets.js +214 -0
- package/dist/theme/dialect-presets.js.map +1 -0
- package/dist/theme/load-theme.d.ts +9 -1
- package/dist/theme/load-theme.d.ts.map +1 -1
- package/dist/theme/load-theme.js +25 -2
- package/dist/theme/load-theme.js.map +1 -1
- package/dist/theme/preset-builder.d.ts +36 -0
- package/dist/theme/preset-builder.d.ts.map +1 -0
- package/dist/theme/preset-builder.js +51 -0
- package/dist/theme/preset-builder.js.map +1 -0
- package/dist/theme/presets.d.ts +4 -7
- package/dist/theme/presets.d.ts.map +1 -1
- package/dist/theme/presets.js +7 -40
- package/dist/theme/presets.js.map +1 -1
- package/dist/theme/recipes.d.ts +38 -0
- package/dist/theme/recipes.d.ts.map +1 -0
- package/dist/theme/recipes.js +96 -0
- package/dist/theme/recipes.js.map +1 -0
- package/dist/theme/theme-catalog.d.ts.map +1 -1
- package/dist/theme/theme-catalog.js +16 -0
- package/dist/theme/theme-catalog.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/llms.txt +9 -5
- package/package.json +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,7 +7,106 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|
|
7
7
|
Release mechanics and the compatibility contract live in
|
|
8
8
|
[docs/release-policy.md](./docs/release-policy.md).
|
|
9
9
|
|
|
10
|
-
## [
|
|
10
|
+
## [0.3.0] - 2026-10-06
|
|
11
|
+
|
|
12
|
+
The Page Spec stays `version: 1`, and every spec that was valid in 0.2.0 stays
|
|
13
|
+
valid. These changes alter existing behaviour or output on purpose:
|
|
14
|
+
|
|
15
|
+
- `--theme` (and the `theme` render option) now replaces the spec's
|
|
16
|
+
`theme.recipes` as well as its tokens. Before, spec recipes applied
|
|
17
|
+
regardless.
|
|
18
|
+
- Every `gallery` thumbnail opens a full-size lightbox. There is no author
|
|
19
|
+
flag, so every page with a gallery emits new markup, CSS and runtime.
|
|
20
|
+
- Tabs no longer fire `select` for the initial tab when the page loads, so page
|
|
21
|
+
state keeps its declared initial values.
|
|
22
|
+
- A remote video `poster` that the network policy blocks is a `validate` error
|
|
23
|
+
(`POLICY_VIOLATION` at the `poster` path), not a compile failure at `$`.
|
|
24
|
+
- Pages with tabs or a carousel change markup and CSS so every panel and slide
|
|
25
|
+
reads without scripts and in print.
|
|
26
|
+
- `catalog` text is grouped by category, and `catalog --json` prints one block
|
|
27
|
+
per line with new `category` and `tags` fields.
|
|
28
|
+
- The Claude Code and Codex plugin manifests link to https://render.agentkit.best, and the Codex plugin shows an icon, a logo and the brand colour in the plugin directory.
|
|
29
|
+
- The benchmarks are measured against AgentKit `9e322f928`. The legacy baseline no longer counts the slide guide for document tasks (AgentKit loads it for `--slides` only), so its per-task mean is ~25.0k tokens, not ~33.7k. `render-benchmark.mjs` measures the `ak-render` skill route per task: the AgentKit shared HTML contract, the skill, `catalog`, and `describe --json` for each block type the task's fixture compiles to. It fails when the AgentKit checkout is missing. Presentation context now drops 64–68% (previously reported as 87–88%). The typical-task estimate is 54% with full contracts and 66% with `describe --compact`, which counts the shared contract too (previously 65% and 75%). `agent-token-cost.mjs --reuse-legacy` reruns that estimate from recorded corpus measurements. The README and landing page use the new figures.
|
|
30
|
+
- The landing page shows what the compiler saves an agent (measured and estimated token figures, kept apart), each component crop beside the fixture YAML that produced it, and a gallery of every demo page. The README gains a token cost section.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- Rich composition: a tab panel, an accordion section, a carousel slide and a bento tile hold child blocks in `items[i].blocks` (up to 12, or 6 in a bento tile). Any block may nest except `page`, `section` and `hero`, and tabs may nest in tabs. An item's `text`, and a bento tile's `title`, are optional when the item has blocks; an item with neither is an error at its path.
|
|
35
|
+
- Nested slots with `accepts` and `parents` rules. Diagnostics carry the nested JSON path, and nested blocks count toward the block limit.
|
|
36
|
+
- `grid-item` places blocks on a 12-track grid with `span`, `tabletSpan`, `mobileSpan`, `rowSpan`, `start` and `align`. `grid.columns` takes 1–12 or `auto` (with `minItemWidth`), grids take `gap` and `align`, and `stack` takes `align`.
|
|
37
|
+
- Semantic page layouts: `sidebar-layout` (a `sidebar` beside the main `blocks`, on either `side`), `main-aside` (an `aside` that stays in view on wide screens) and `rail-layout` (a compact `rail`, a labelled `<nav>` when it holds only links or toolbars).
|
|
38
|
+
- Datasets: top-level `datasets`, and `dataRef`, inline `data` and a bounded `transform` (filter, groupBy, sort, select, limit) on blocks that take data. Values format through one locale-free formatter (`number`, `integer`, `compact`, `percent`, `currency`, `duration`, `bytes`, `date`); `percent` takes `87` for "87%". See [docs/data-and-state.md](./docs/data-and-state.md).
|
|
39
|
+
- `visibleWhen` shows a block only while a state value matches (`equals`, `notEquals`, `in`, `notIn`, `truthy`, `falsy`). The compiler emits the initial view, so the page reads correctly without scripts and in print.
|
|
40
|
+
- Native input controls `select`, `radio-group`, `checkbox`, `switch`, `text-input`, `number-input` and `date-input`. Each has a visible label, writes one value to `state.<key>` through `bind`, and fires `change` with its value.
|
|
41
|
+
- `filter-bar` filters a `data-table`, `kanban` or `log-viewer` with 1–8 controls, each naming a row `field` and a `match`. It adds an announced result count and a Reset button; `select` and `radio-group` can list the target's values with `optionsFrom`. A `data-table` that a filter-bar targets renders no search box, row count or "no match" note of its own, so two filters never fight over the same rows; put free-text search in the bar as a `search` child.
|
|
42
|
+
- `data-table`: a typed, sortable table bound to a dataset. Column types `text`, `number`, `percent` (alias `percentage`), `currency`, `date`, `badge`, `link`, `progress` and `sparkline`; search past 10 rows (unless a filter-bar targets the table), a sticky header past 12, labelled cards on phones, and the full table in authored order without scripts or in print.
|
|
43
|
+
- Chart kinds `scatter`, `histogram`, `stacked-bar`, `stacked-bar-100`, `heatmap`, `waterfall`, `funnel`, `gauge` and `treemap`. A chart can bind rows and read them through the `x`, `y`, `series: { field }` and `value` encodings, and takes `markers`, `annotations`, `sort` and a gauge `target`. A bound chart's fallback table comes from the bound rows. Charts that use `labels` and `series` render the same markup as before.
|
|
44
|
+
- Engineering widgets: `kanban`, `roadmap`, `test-results`, `log-viewer`, `api-endpoint` and `schema-viewer`.
|
|
45
|
+
- Evidence widgets: `benchmark-comparison` (computed delta, change and verdict; `currency` is set once for the whole block, not per metric), `metric-breakdown`, `annotated-image` and `references` (stable `#ref-<id>` anchors).
|
|
46
|
+
- Product widgets: `pricing`, `feature-matrix`, `testimonial` (two or more quotes form a grid), `logo-cloud`, `people` and `calendar` (weeks start on Monday; `weekStart: sunday` changes that).
|
|
47
|
+
- Theme recipes restyle components through closed enums for cards, sections, tables, charts, hero, metrics, media and callouts. A preset, a preset file or the spec's `theme.recipes` selects them. See [docs/themes.md](./docs/themes.md#recipes).
|
|
48
|
+
- Four built-in presets: `data-console`, `executive-report`, `product-studio` and `research-notebook`. They reuse the bundled faces. Every built-in preset is tested for WCAG 2.2 contrast in both schemes.
|
|
49
|
+
- An inline spec theme accepts `theme.dark`, dark-scheme token overrides.
|
|
50
|
+
- Catalog discovery: every block has a category and tags. `ak-render catalog --category <c>` lists one category, `ak-render search-catalog <terms...>` ranks block types by intent words, and `ak-render describe <type...> --compact` returns up to 12 contracts with one line per prop; a shape repeated within a contract reads `like <field>` and a repeated long enum `enum as <field>`. Row-filtering words rank `filter-bar` first. MCP gains `search-catalog`, `catalog{category}` and `describe{types, compact}`, on the stdio and the remote server; the remote `search-catalog` needs no token. The library exports `searchCatalog` and `describeMany`.
|
|
51
|
+
- Page recipes: `ak-render recipes [--json]` lists ten starter specs (`architecture-review`, `benchmark-report`, `case-study`, `dashboard`, `decision-memo`, `implementation-plan`, `incident-report`, `product-showcase`, `release-recap`, `research-report`), and `ak-render recipe <name>` prints one as YAML, or the full record with `--json`. An unknown name exits 1 and lists the allowed names; a missing name exits 2. Each recipe validates with no errors or warnings, compiles deterministically, stays within 3,000 bytes of YAML and loads nothing remote. MCP serves them as `recipes` and `recipe{name}` on the stdio and the remote server, and the library as `recipes()`, `recipe(name)` and the `PageRecipe` and `PageRecipeSummary` types; an unknown name throws `SPEC_VALIDATION_ERROR` at path `name` with `details.allowed`.
|
|
52
|
+
- `pnpm recipes:generate` embeds the recipe YAML in `src/recipes/recipes.generated.ts`, and `pnpm recipes:check`, part of `pnpm verify`, fails when that module is stale.
|
|
53
|
+
- The library exports `BLOCK_CATEGORIES`, `THEME_RECIPE_SPECS`, `VALUE_FORMATS` and the `MaterializedData`, `DataRow` and `DataScalar` types.
|
|
54
|
+
- Remote MCP over Streamable HTTP at `https://render.agentkit.best/mcp`, served by the cloud Worker. It lists the same tools as `ak-render mcp`: `catalog`, `search-catalog`, `describe`, `recipes`, `recipe`, `validate`, `render` and `themes`. A remote `render` takes no `out`: it compiles through the same path as `POST /v1/render` (byte-identical HTML), stores the page and returns the summary plus `artifactUrl` and `expiresAt`, never the HTML. The artifact lives one hour, or becomes an expiring share with `share: true` (needs the share scope). `catalog`, `search-catalog`, `describe`, `recipes`, `recipe` and `themes` answer without a token; `validate` and `render` need an AgentKit bearer and count against the same per-subject rate limits as REST.
|
|
55
|
+
- The MCP server is split into transport-independent modules under `src/mcp/`: protocol vocabulary, one set of tool contracts, JSON-RPC routing, the stdio transport, and a Fetch-API Streamable HTTP transport the Worker imports. `ak-render mcp` answers byte for byte as before.
|
|
56
|
+
- `GET /v1/artifact/:id` serves the short-lived artifact a remote MCP render stored.
|
|
57
|
+
- `scripts/cloud-smoke.mjs` smoke-tests a deployed renderer (MCP and REST, share lifecycle, exports) with `BASE_URL` and an optional `TOKEN`; the manual cloud deploy workflow runs it after deploying.
|
|
58
|
+
- `benchmarks/agent-token-cost.mjs` estimates the tokens of a page task end to end: guidance read, output written and what returns into context, against a corpus of hand-written HTML passed with `--legacy-html`. Results are in `docs/artifacts/agent-token-cost.md`, with the corpus recorded by anonymous label. `--legacy-from <artifact.json>` refreshes the artifact from the recorded legacy rows without the private corpus, and a second typical-task row measures the compact workflow (`describe <types...> --compact`). Block types are read from the compiler IR.
|
|
59
|
+
- `pnpm bench:spec` (`benchmarks/spec-compression.mjs`) records, per composition fixture, the spec bytes, the bytes with every `dataRef` inlined, the HTML bytes, and the catalog and compact-describe bytes an agent reads, in `docs/artifacts/spec-compression.{json,md}`. The output is deterministic.
|
|
60
|
+
- Six composition fixtures: `complex-dashboard`, `benchmark-report`, `research-report`, `product-case-study`, `interactive-data-explorer` and `incident-report`. Each validates with no warnings and compiles to identical bytes three times. `fixtures/rejected/validation/` holds well-formed but wrong specs that must fail validation at a located path, optionally pinned by a first line `# expect: CODE $.path`.
|
|
61
|
+
- `tests/browser/composition-matrix.spec.ts` checks every fixture page for horizontal overflow at 320, 375, 768 and 1440 in light and dark, running animation under reduced motion, script-off readability, print, keyboard focus, network requests and critical axe violations. `@axe-core/playwright` is a new devDependency.
|
|
62
|
+
- `scripts/capture-demo-media.mjs` captures five more page shots and four component crops (KPI, terminal, checklist, file tree), and `--only <names>` recaptures a subset without the walkthrough video.
|
|
63
|
+
- A pair of backticks in prose text renders as inline code, so `` `ak-render catalog` `` in a `text`, a step, a list item, a description or a caption reads as a command. The text is escaped before the span is wrapped, nothing else is parsed as markup, and an unpaired backtick stays literal. Titles, `code` blocks, `terminal` lines and the chart summary are unchanged, and `describe` and the JSON Schema say which props do this.
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
|
|
67
|
+
- `catalog` text is grouped by category under `## <category>` headers, one `type — summary` line per block, without the kind column. `catalog --json` and the MCP `catalog` add `category` and `tags` to each entry and print one block and one action per line; the parsed value is otherwise unchanged. A single-type `describe <type>` is byte-identical.
|
|
68
|
+
- The MCP `describe` input no longer requires `type`: pass `type` or `types`, plus optional `compact`. Every local tool description is at most 200 characters.
|
|
69
|
+
- URL props declare the network capability of the asset they load, so the CSP origins and the validation gate come from one schema walk at any depth.
|
|
70
|
+
- When a `oneOf` value fails, diagnostics come from the option the author meant, chosen by JSON shape and then by `type`.
|
|
71
|
+
- A tab's `select` event passes the tab id as its value, so `set-value` without its own `value` stores the selected tab.
|
|
72
|
+
- Chart `labels` is optional in the schema; a chart without bound data still requires it, with the same message and path.
|
|
73
|
+
- The cloud Worker is routed at `render.agentkit.best/mcp` and `render.agentkit.best/v1/*`, beside the site's Custom Domain on the same hostname.
|
|
74
|
+
- The Claude Code and Codex plugin manifests link to https://render.agentkit.best, and the Codex plugin shows an icon, a logo and the brand colour in the plugin directory.
|
|
75
|
+
- The landing page shows what the compiler saves an agent (measured and estimated token figures, kept apart), each component crop beside the fixture YAML that produced it, and a gallery of every demo page. The README gains a token cost section.
|
|
76
|
+
|
|
77
|
+
### Fixed
|
|
78
|
+
|
|
79
|
+
- Tab panels and carousel slides are readable without scripts and in print: every panel ships visible with its title until the runtime marks the container ready.
|
|
80
|
+
- Accordion sections print open, nested blocks included.
|
|
81
|
+
- Accordion and carousel styles apply only to their own sections and slides, so a nested block keeps its own look.
|
|
82
|
+
- The runtime escapes embedded state, so a value such as `</script>` cannot close the script element.
|
|
83
|
+
- An event stops at the nearest block, so it no longer reaches an enclosing block's bindings.
|
|
84
|
+
- A `set-value` action without `value` takes the event's value, for example a slider's. With no event value it does nothing; before, it set `undefined`.
|
|
85
|
+
- The cloud Worker validates bearers against the canonical AgentKit endpoint, `GET https://agentkit.best/api/agentkit/entitlements`, instead of an unreachable host, so authenticated render, share and export can succeed. It fails closed on a rejected token (401), an inactive account (403), and an upstream error, redirect, timeout or malformed body (502). An active app or kit entitlement grants the `render` and `share` scopes, which stay separate checks.
|
|
86
|
+
- Screenshot and PDF export call the Browser Run binding's Quick Actions with the compiled HTML inline and caching off, and `wrangler.jsonc` attaches the `BROWSER` binding.
|
|
87
|
+
- Remote MCP bounds its anonymous surface: a JSON-RPC batch carries at most 16 members, never `initialize`, and is refused (400) under protocol revision 2025-06-18 or later, which removed batching. `catalog`, `search-catalog`, `describe`, `recipes`, `recipe` and `themes` stay anonymous but count per client IP (`anon-ip`, 120/min).
|
|
88
|
+
- A remote MCP request that presents a rejected bearer answers HTTP 401 with `WWW-Authenticate: Bearer`, whatever the method, instead of a tool error; REST 401s carry the same challenge. A request without a bearer is still served, and `validate`/`render` still answer a tool error with `UNAUTHENTICATED`.
|
|
89
|
+
- Cloud rate limits use the Workers Rate Limiting binding, one per route class, instead of KV counters that could fail on rapid writes; a limiter fault refuses the call with `RATE_LIMITED`. An MCP `render` with `share: true` counts against `share` only, as `POST /v1/share` does, and a call refused by authorization consumes nothing.
|
|
90
|
+
- The cloud Worker caches entitlements answers in memory under a SHA-256 digest of the bearer (60 s accepted, 10 s rejected), and limits uncached bearer checks per client IP (30/min) before contacting the entitlements endpoint.
|
|
91
|
+
- Remote MCP reports a storage or runtime fault as a generic `INTERNAL_ERROR` tool error, and the REST routes answer such a fault with a generic 500, so no internal message reaches a caller.
|
|
92
|
+
- Hosted shares and artifacts are served with `content-security-policy: sandbox …; frame-ancestors 'none'`: they run in an opaque origin and cannot be framed.
|
|
93
|
+
- The expiry sweep pages through every listed object with the cursor, reads expiry from listing metadata instead of downloading bodies, and deletes in batches; R2 lifecycle rules (`apps/cloud/r2-lifecycle.json`, applied on deploy) delete artifacts after 1 day and shares after the retention period plus a day.
|
|
94
|
+
- A remote video `poster` that the network policy blocks now fails `validate` with a `POLICY_VIOLATION` at the block's `poster` path, naming the reason. Before, validate passed and compile failed at `$` with "emitted a remote resource reference". A poster is gated by the `images` capability, an allowed remote poster's origin joins the CSP, and the renderer drops a blocked poster even for an IR that skipped validation.
|
|
95
|
+
- Diagram adapter `<style>` elements now receive the page style nonce, so styled adapter SVG renders as drawn instead of in default black. The policy stays nonce-only: inline `style` attributes are removed from adapter output with a warning. Adapter CSS is scoped with `@scope` to its own diagram canvas, so it cannot restyle the page, and it cannot load anything: escapes, character references, `url()` other than a fragment reference such as `url(#grad)`, `image-set()`, every at-rule except `@media`, `@keyframes` and `@supports`, and `@keyframes` that redefine the page's own reject the output to the structured fallback. Comments and `!important` are removed. Adapter markup that writes a `nonce` or any `data-ak-*` attribute, or an `href`, `xlink:href`, `src`, `srcset`, `poster`, `action`, `formaction`, `background`, `data`, `codebase` or `ping` that is not a same-document `#fragment`, or SVG animation whose `attributeName` is one of those, is rejected too, and so is markup that is not a self-contained fragment: a stray or missing end tag, a raw-text element such as `plaintext` or `textarea`, an element that merges into the page document such as `body` or `meta`, an HTML element inside SVG, or a comment. Output from the `ak:diagram` compiler passes these checks. Adapter animation stops under reduced motion, `motion-policy: none` and print. `docs/diagram-adapter.md` lists what adapter CSS may use.
|
|
96
|
+
- Checking adapter markup is linear in its size. An unterminated tag repeated to the 256 KB bound took minutes; it now takes milliseconds.
|
|
97
|
+
- A long unbroken token, such as a path or an env var list, no longer widens the page on a phone. Key-value values, list items, text and callouts break the token inside their own line, so the reported key-value page no longer scrolls sideways at 375px.
|
|
98
|
+
- A `diagram-panel` shows adapter SVG at its natural size. A wide diagram scrolls sideways inside its panel, a named region that scrolls from the keyboard, instead of shrinking its labels until they are unreadable. In print it is scaled to the page width.
|
|
99
|
+
- A `diagram-panel` whose adapter rendered no longer shows the structured description beside the drawing. The description stays in the document behind a closed "Text description" disclosure, which opens in print, with or without script.
|
|
100
|
+
- A long `terminal` session no longer leaves its last lines blank in a capture. Lines now stagger 80ms apart instead of 340ms, lines past the twelfth share its delay, and the whole session is drawn about 1.4s after it arrives.
|
|
101
|
+
- A wide `table` or adapter diagram now shows a soft shade on each edge that has more content beyond it, so a frame that scrolls sideways no longer looks clipped. A frame that fits shows none.
|
|
102
|
+
- A `data-table` row that a filter hides stays hidden at phone widths, where rows become cards.
|
|
103
|
+
- Blocks inside or after a `visibleWhen` view keep the normal block gap and the section-break gaps.
|
|
104
|
+
- A thinned category axis always labels the last category, so a series never reads as ending early.
|
|
105
|
+
- Chart ticks finer than 0.01 keep the decimals the step needs instead of all printing the same value, and only floating-point noise is removed before a value is formatted.
|
|
106
|
+
- A histogram over huge, close values (such as 1e16 and 1e16 + 4) keeps finite, increasing bin edges: when clean steps cannot separate the values it draws one bin.
|
|
107
|
+
- The page outline skips a section behind `visibleWhen`, so it never links to a hidden section.
|
|
108
|
+
- Dataset field names `__proto__`, `constructor` and `prototype` are refused at validation, and a `log-viewer` level named like an object property gets the neutral tone.
|
|
109
|
+
- `date-input` accepts ISO dates in the years 0001–0099.
|
|
11
110
|
|
|
12
111
|
## [0.2.0] - 2026-10-05
|
|
13
112
|
|
package/README.md
CHANGED
|
@@ -67,19 +67,50 @@ Requires Node.js >= 20.11.
|
|
|
67
67
|
|
|
68
68
|
### Find the blocks you need
|
|
69
69
|
|
|
70
|
-
There are
|
|
71
|
-
|
|
72
|
-
`
|
|
73
|
-
|
|
70
|
+
There are 83 block types in eight categories (layout, content, data,
|
|
71
|
+
interaction, media, showcase, engineering, product), from primitives (`section`,
|
|
72
|
+
`grid`, `split`, `text`) to semantic blocks that carry the design for you
|
|
73
|
+
(`hero`, `steps`, `timeline`, `kpi`, `data-table`, `chart`, `kanban`,
|
|
74
|
+
`pricing`, `cta`). Find the ones you need, then read only their contracts:
|
|
74
75
|
|
|
75
76
|
```bash
|
|
76
|
-
ak-render catalog
|
|
77
|
-
ak-render
|
|
78
|
-
ak-render
|
|
77
|
+
ak-render catalog # every block by category, and every action
|
|
78
|
+
ak-render catalog --category data # one category
|
|
79
|
+
ak-render search-catalog sortable table # rank block types by intent words
|
|
80
|
+
ak-render describe kpi chart --compact # one line per prop, for several types
|
|
81
|
+
ak-render describe timeline --json # one full contract: defaults, bounds, a11y notes
|
|
79
82
|
```
|
|
80
83
|
|
|
81
|
-
Containers (`section`, `grid`, `split`, `stack`
|
|
82
|
-
`
|
|
84
|
+
Containers (`section`, `grid`, `split`, `stack` and the page layouts
|
|
85
|
+
`sidebar-layout`, `main-aside`, `rail-layout`) take their children under
|
|
86
|
+
`blocks:`. Tabs, accordion sections, carousel slides and bento tiles hold
|
|
87
|
+
blocks too, under `items[i].blocks`.
|
|
88
|
+
|
|
89
|
+
Text is plain text, with one exception: in prose props such as `text`, a step's
|
|
90
|
+
or list item's `text`, a `description` or a `caption`, a pair of backticks
|
|
91
|
+
renders as inline code, so `` `ak-render catalog` `` reads as a command. Nothing
|
|
92
|
+
else is parsed as markup, an unpaired backtick stays literal, and titles, code
|
|
93
|
+
and terminal lines are never changed. `describe` marks each prop that does this.
|
|
94
|
+
|
|
95
|
+
### Start from a page recipe
|
|
96
|
+
|
|
97
|
+
A recipe is a complete, valid starter spec for a common page: a dashboard, a
|
|
98
|
+
benchmark report, an architecture review, an incident report, a product
|
|
99
|
+
showcase, a case study, a release recap, an implementation plan, a research
|
|
100
|
+
report or a decision memo. Replace its placeholder text and data, then validate.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
ak-render recipes # names, summaries and the blocks each uses
|
|
104
|
+
ak-render recipe dashboard > page.yaml # the starter spec as YAML
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Datasets and state
|
|
108
|
+
|
|
109
|
+
Declare a table once under `datasets` and bind charts, tables and widgets to it
|
|
110
|
+
with `dataRef`, reshaped by a bounded `transform`. Native controls write page
|
|
111
|
+
`state`, `visibleWhen` switches views from it, and `filter-bar` filters a table,
|
|
112
|
+
board or log. All of it is data, and every page still reads completely with
|
|
113
|
+
scripts off. See [docs/data-and-state.md](./docs/data-and-state.md).
|
|
83
114
|
|
|
84
115
|
### Validate and fix
|
|
85
116
|
|
|
@@ -103,10 +134,12 @@ ak-render plan.yaml --theme blueprint # override the spec's theme
|
|
|
103
134
|
|
|
104
135
|
### Themes
|
|
105
136
|
|
|
106
|
-
|
|
107
|
-
display face: `blueprint`, `
|
|
108
|
-
`
|
|
109
|
-
|
|
137
|
+
Ten built-in presets, each with a light and a dark scheme and an embedded
|
|
138
|
+
display face: `blueprint`, `data-console`, `editorial`, `executive-report`,
|
|
139
|
+
`paper-ink`, `product-studio`, `research-notebook`, `swiss-clean`,
|
|
140
|
+
`terminal-mono` and `warm-signal`. Presets also choose component recipes, such
|
|
141
|
+
as ledger tables or outlined cards, from closed lists. Pick one under
|
|
142
|
+
`theme.preset`, or extend one with validated tokens:
|
|
110
143
|
|
|
111
144
|
```yaml
|
|
112
145
|
theme:
|
|
@@ -122,8 +155,9 @@ presets. See [docs/themes.md](./docs/themes.md).
|
|
|
122
155
|
|
|
123
156
|
### Interaction
|
|
124
157
|
|
|
125
|
-
Tabs, accordions, carousels,
|
|
126
|
-
theme toggle come from a small trusted
|
|
158
|
+
Tabs, accordions, carousels, native form controls, filter bars, sortable
|
|
159
|
+
tables, dialogs, copy buttons and the theme toggle come from a small trusted
|
|
160
|
+
runtime. A spec wires them with a closed
|
|
127
161
|
set of declarative actions (`ak-render catalog` lists them); there is no
|
|
128
162
|
JavaScript field. Every page reads completely with scripts off, with motion
|
|
129
163
|
reduced, in print and in a screenshot.
|
|
@@ -131,7 +165,9 @@ reduced, in print and in a screenshot.
|
|
|
131
165
|
### Images, video and the network
|
|
132
166
|
|
|
133
167
|
Local paths (`assets/shot.png`) always work. A remote URL renders as a labelled
|
|
134
|
-
fallback with a link unless the spec opts in
|
|
168
|
+
fallback with a link unless the spec opts in. A remote video `poster` is the
|
|
169
|
+
exception: it has no fallback, so `validate` rejects it at its own path until
|
|
170
|
+
the page allows remote `images`:
|
|
135
171
|
|
|
136
172
|
```yaml
|
|
137
173
|
policy:
|
|
@@ -144,7 +180,8 @@ The page's Content Security Policy is derived from that policy. See
|
|
|
144
180
|
|
|
145
181
|
## Use it from an agent
|
|
146
182
|
|
|
147
|
-
Agents follow one loop: `catalog`
|
|
183
|
+
Agents follow one loop: find blocks with `catalog` or `search-catalog`, start
|
|
184
|
+
from a `recipe` when one fits, `describe --compact` the blocks they use,
|
|
148
185
|
`validate` and fix diagnostics by JSON path, then compile. The
|
|
149
186
|
[agent guide](./docs/agent-guide.md) has the details and [llms.txt](./llms.txt)
|
|
150
187
|
is the LLM-facing index.
|
|
@@ -174,11 +211,26 @@ codex plugin marketplace add bestagentkits/ak-render
|
|
|
174
211
|
codex plugin add ak-render@ak-render
|
|
175
212
|
```
|
|
176
213
|
|
|
177
|
-
###
|
|
214
|
+
### Three ways to run it
|
|
215
|
+
|
|
216
|
+
All three serve the same tools with the same contracts, backed by the same
|
|
217
|
+
compiler, so a spec renders to the same bytes whichever an agent picks.
|
|
218
|
+
|
|
219
|
+
| Mode | Needs | `render` returns | Network |
|
|
220
|
+
| --- | --- | --- | --- |
|
|
221
|
+
| Local CLI | Node 20.11+ | writes `--out`, prints a summary with `--json` | none |
|
|
222
|
+
| Local MCP (stdio) | Node 20.11+ | writes `out`, returns a summary | none |
|
|
223
|
+
| Remote MCP (Streamable HTTP) | an AgentKit token | stores the page, returns a summary and `artifactUrl` | yes |
|
|
224
|
+
|
|
225
|
+
Local is canonical and needs no account. The remote server exists for agents
|
|
226
|
+
that cannot install Node or need a URL to hand someone.
|
|
178
227
|
|
|
179
|
-
`ak-render
|
|
180
|
-
|
|
181
|
-
|
|
228
|
+
**Local CLI.** The loop above, with `ak-render` on the path or through `npx`.
|
|
229
|
+
|
|
230
|
+
**Local MCP over stdio.** `ak-render mcp` serves `catalog`, `search-catalog`,
|
|
231
|
+
`describe`, `recipes`, `recipe`, `validate`, `render` and `themes` as MCP
|
|
232
|
+
tools. `render` writes the HTML to disk
|
|
233
|
+
and returns only a summary, so the page never enters the agent's context.
|
|
182
234
|
|
|
183
235
|
```json
|
|
184
236
|
{
|
|
@@ -188,6 +240,65 @@ summary, so the page never enters the agent's context.
|
|
|
188
240
|
}
|
|
189
241
|
```
|
|
190
242
|
|
|
243
|
+
**Remote MCP over Streamable HTTP.** `https://render.agentkit.best/mcp` serves
|
|
244
|
+
`catalog`, `search-catalog`, `describe`, `recipes`, `recipe`, `validate`,
|
|
245
|
+
`render` and `themes` with the same contracts. A remote server cannot write into your filesystem, so
|
|
246
|
+
`render` takes no `out`: it stores the page and returns the same summary plus an
|
|
247
|
+
`artifactUrl` that lives for one hour, or a share link that lives for 30 days
|
|
248
|
+
with `share: true`. The HTML still never enters the agent's context.
|
|
249
|
+
`catalog`, `search-catalog`, `describe`, `recipes`, `recipe` and `themes`
|
|
250
|
+
answer without a token; `validate` and `render` need an AgentKit bearer token.
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"mcpServers": {
|
|
255
|
+
"ak-render": {
|
|
256
|
+
"type": "http",
|
|
257
|
+
"url": "https://render.agentkit.best/mcp",
|
|
258
|
+
"headers": { "Authorization": "Bearer ${AGENTKIT_TOKEN}" }
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Details, limits and the REST routes are in
|
|
265
|
+
[apps/cloud/README.md](./apps/cloud/README.md).
|
|
266
|
+
|
|
267
|
+
## Token cost
|
|
268
|
+
|
|
269
|
+
The compiled page goes to disk, never through the model. What the agent pays
|
|
270
|
+
is guidance it reads, the spec it writes, and a one-line summary it reads back.
|
|
271
|
+
|
|
272
|
+
| Part of a page task | Hand-written HTML | AK Render |
|
|
273
|
+
| --- | ---: | ---: |
|
|
274
|
+
| Presentation guidance read | 25.0k (baseline mean) | 10.6k (shared contract, skill, catalog, `describe --json`) |
|
|
275
|
+
| Written by the agent | 13.9k (median legacy page) | 7.2k (projected spec) |
|
|
276
|
+
| Returned into context | the written page is already there | 0.1k (render summary) |
|
|
277
|
+
| **Total, estimated** | **38.9k** | **17.9k (−54%)** |
|
|
278
|
+
|
|
279
|
+
With the compact workflow the agent guide recommends,
|
|
280
|
+
`describe <types...> --compact`, the guidance read is 5.7k and the total
|
|
281
|
+
13.1k (−66%). The spec written and the summary returned are the same.
|
|
282
|
+
|
|
283
|
+
- **Benchmarked:** presentation context drops 64–68%, from 23.7k–26.6k tokens
|
|
284
|
+
of AgentKit's legacy HTML guidance to 7.9k–8.5k on the `ak-render` skill
|
|
285
|
+
route: the shared AgentKit contract, the skill, `catalog`, and the
|
|
286
|
+
`describe --json` output of the blocks a task uses
|
|
287
|
+
([render benchmark](./docs/artifacts/benchmark-render.md)). The `ak:preview`
|
|
288
|
+
diff task (68%) follows AgentKit's reference-loading table directly; the
|
|
289
|
+
explain, brainstorm and plan rows use the `ak-preview` reference set as a
|
|
290
|
+
proxy for their hand-written HTML route.
|
|
291
|
+
- **Measured on 12 HTML pages agents wrote in real projects:** a median of 26%
|
|
292
|
+
of each page is visible text; the rest is markup, CSS and script. The
|
|
293
|
+
projected median output saving is 52%. A page that is mostly prose saves
|
|
294
|
+
little or nothing: one of the twelve grew by 35%.
|
|
295
|
+
- **Not measured yet:** live model token counts, repair loops, wall time and
|
|
296
|
+
output quality.
|
|
297
|
+
|
|
298
|
+
Characters are measured; tokens are estimated at 4 characters per token. Method
|
|
299
|
+
and per-page data: [agent token cost](./docs/artifacts/agent-token-cost.md),
|
|
300
|
+
produced by `benchmarks/agent-token-cost.mjs`.
|
|
301
|
+
|
|
191
302
|
## Design in one screen
|
|
192
303
|
|
|
193
304
|
```text
|
|
@@ -210,15 +321,17 @@ Six decisions define the boundary, argued in
|
|
|
210
321
|
model-friendly spec normalizes into a flat node graph with stable IDs for
|
|
211
322
|
rendering, future diff/patch/editor tooling, and MCP surfaces.
|
|
212
323
|
2. **Catalog and registry are separate.** `catalog()` is compact and cheap;
|
|
213
|
-
`describe(type)` carries the full contract
|
|
324
|
+
`describe(type)` carries the full contract, and `--compact` one line per
|
|
325
|
+
prop. Discovery stays out of the token
|
|
214
326
|
budget until a block is actually selected.
|
|
215
327
|
3. **The interaction runtime is trusted and declarative.** A closed action
|
|
216
328
|
vocabulary, one small event-delegation script, native HTML controls first,
|
|
217
329
|
and only the feature modules a page uses.
|
|
218
330
|
4. **Themes are typed data, never CSS.** Built-in presets plus user presets that
|
|
219
331
|
`extends` them. No CSS escape hatch, no CDN fonts.
|
|
220
|
-
5. **Local is canonical; cloud is opt-in.** The hosted renderer
|
|
221
|
-
compiler and
|
|
332
|
+
5. **Local is canonical; cloud is opt-in.** The hosted renderer and the remote
|
|
333
|
+
MCP server reuse the same compiler and tool contracts and are never the
|
|
334
|
+
source of truth.
|
|
222
335
|
6. **Optional capabilities arrive as adapters.** Diagrams can delegate to an
|
|
223
336
|
installed diagram compiler; without one, a structured fallback renders.
|
|
224
337
|
|
|
@@ -248,8 +361,11 @@ import {
|
|
|
248
361
|
| `render(spec, options)` | Compile a spec to a standalone HTML artifact | Available |
|
|
249
362
|
| `validate(spec)` | Report spec diagnostics without rendering | Available |
|
|
250
363
|
| `normalize(spec)` | Produce the flat internal IR | Available |
|
|
251
|
-
| `catalog()` | Compact list of
|
|
364
|
+
| `catalog(options)` | Compact list of blocks and actions, optionally one `category` | Available |
|
|
365
|
+
| `searchCatalog(query)` | Block types ranked by intent words | Available |
|
|
252
366
|
| `describe(type)` | Full machine-readable contract for one entry | Available |
|
|
367
|
+
| `describeMany(types, options)` | Up to 12 contracts, full or `compact` | Available |
|
|
368
|
+
| `recipes()`, `recipe(name)` | Page recipe list, and one recipe's starter spec | Available |
|
|
253
369
|
| `loadTheme(input)` | Validate and resolve a theme preset | Available |
|
|
254
370
|
| `buildThemeCatalog(options)` | Discover built-in, user, project, and explicit presets | Available |
|
|
255
371
|
|
|
@@ -259,8 +375,11 @@ import {
|
|
|
259
375
|
ak-render page.yaml --out page.html
|
|
260
376
|
ak-render - --out page.html < page.yaml # read the spec from stdin
|
|
261
377
|
ak-render validate page.json
|
|
262
|
-
ak-render catalog
|
|
263
|
-
ak-render
|
|
378
|
+
ak-render catalog [--category <c>]
|
|
379
|
+
ak-render search-catalog <terms...>
|
|
380
|
+
ak-render describe <type...> [--compact]
|
|
381
|
+
ak-render recipes
|
|
382
|
+
ak-render recipe <name> # YAML by default
|
|
264
383
|
ak-render themes
|
|
265
384
|
ak-render mcp # MCP server over stdio
|
|
266
385
|
|
|
@@ -273,8 +392,10 @@ Every command accepts `--json` and never prompts.
|
|
|
273
392
|
## Fixtures and snapshots
|
|
274
393
|
|
|
275
394
|
`fixtures/pages/` holds the representative corpus the compiler is built
|
|
276
|
-
against: plan, explain, recap, diff, dashboard, media, interactive
|
|
277
|
-
showcase pages
|
|
395
|
+
against: plan, explain, recap, diff, dashboard, media, interactive and theme
|
|
396
|
+
showcase pages, one page per widget family, layout, data and theme feature,
|
|
397
|
+
and six composition pages (a dashboard, a benchmark report, a research report,
|
|
398
|
+
a product case study, a data explorer and an incident report). `fixtures/snapshots/` holds one committed artifact per built-in
|
|
278
399
|
preset. See [fixtures/README.md](./fixtures/README.md) and
|
|
279
400
|
[docs/themes.md](./docs/themes.md). Fixtures are the specification: a new
|
|
280
401
|
capability is not done until a fixture exercises it.
|
|
@@ -290,18 +411,22 @@ capability is not done until a fixture exercises it.
|
|
|
290
411
|
| `benchmarks/` | Reproducible measurement harnesses |
|
|
291
412
|
| `docs/adr/` | Architecture decision records |
|
|
292
413
|
| `docs/artifacts/` | Captured measurements and evidence |
|
|
293
|
-
| `skills/`, `.claude-plugin/`, `.agents/plugins
|
|
414
|
+
| `skills/`, `.claude-plugin/`, `.agents/plugins/`, `plugin.json`, `mcp.json` | Agent skill and plugin manifests |
|
|
415
|
+
| `assets/` | Embedded font licences and the plugin icon (`icon.svg` is the source of `logo.png` and `composer-icon.png`) |
|
|
294
416
|
| `site/` | Landing page spec, build script output and Cloudflare config |
|
|
295
|
-
| `
|
|
417
|
+
| `src/mcp/` | MCP protocol, shared tool contracts, stdio and Streamable HTTP transports |
|
|
418
|
+
| `apps/cloud/` | Opt-in Cloudflare renderer: REST routes and the remote MCP endpoint |
|
|
296
419
|
|
|
297
420
|
## Development
|
|
298
421
|
|
|
299
422
|
```bash
|
|
300
423
|
pnpm install
|
|
301
|
-
pnpm verify # lint
|
|
424
|
+
pnpm verify # lint, typecheck, font and recipe checks, unit tests, build
|
|
302
425
|
pnpm test:browser # Playwright, after: pnpm exec playwright install chromium
|
|
303
426
|
pnpm test:package # pack, install into a temp project, exercise API and bin
|
|
304
427
|
pnpm bench:baseline # re-run the legacy presentation-context measurement
|
|
428
|
+
pnpm bench:spec # spec compression for the composition fixtures
|
|
429
|
+
pnpm build && pnpm bench:render --agentkit ../agentkit --repeat 9 # committed render artifact
|
|
305
430
|
pnpm site:build # compile the landing page and gallery into site/dist
|
|
306
431
|
pnpm site:deploy # build, then deploy site/dist with wrangler
|
|
307
432
|
```
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chart rules that run on the same resolved input the renderer draws: gauge
|
|
3
|
+
* range, funnel order, treemap size, stacked shares, clipped values, pivot
|
|
4
|
+
* gaps and overlay positions.
|
|
5
|
+
*/
|
|
6
|
+
import type { IrNode } from '../../ir.js';
|
|
7
|
+
import type { Report } from './chart-check.js';
|
|
8
|
+
/** Rules that run on the resolved chart, once its shape and fields are valid. */
|
|
9
|
+
export declare function checkKindRules(node: IrNode, kind: string, report: Report): void;
|
|
10
|
+
//# sourceMappingURL=chart-check-kind-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-check-kind-rules.d.ts","sourceRoot":"","sources":["../../../src/blocks/chart/chart-check-kind-rules.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAkC/C,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAyF/E"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chart rules that run on the same resolved input the renderer draws: gauge
|
|
3
|
+
* range, funnel order, treemap size, stacked shares, clipped values, pivot
|
|
4
|
+
* gaps and overlay positions.
|
|
5
|
+
*/
|
|
6
|
+
import { fieldValue } from '../../data/dataset-types.js';
|
|
7
|
+
import { pathIndex, pathKey } from '../../diagnostics.js';
|
|
8
|
+
import { objectListProp, stringProp } from '../../render/block-helpers.js';
|
|
9
|
+
import { encodingProp, magnitudeEncoding, seriesField } from './chart-encodings.js';
|
|
10
|
+
import { CARTESIAN_KINDS, MAX_TREEMAP_CELLS, NUMERIC_X_KINDS, SINGLE_SERIES_KINDS, } from './chart-kinds.js';
|
|
11
|
+
import { buildChartInput } from './chart-model.js';
|
|
12
|
+
/** Overlay x positions must land on the axis: a category name, or a number on a numeric axis. */
|
|
13
|
+
function checkOverlays(node, kind, input, report) {
|
|
14
|
+
if (!CARTESIAN_KINDS.includes(kind))
|
|
15
|
+
return;
|
|
16
|
+
const numericAxis = NUMERIC_X_KINDS.includes(kind);
|
|
17
|
+
const known = kind === 'waterfall' ? [...input.labels, 'Total'] : input.labels;
|
|
18
|
+
for (const key of ['markers', 'annotations']) {
|
|
19
|
+
const items = objectListProp(node, key);
|
|
20
|
+
const placed = key === 'markers' ? input.encoded?.markers : input.encoded?.annotations;
|
|
21
|
+
items.forEach((_, index) => {
|
|
22
|
+
const x = placed?.[index]?.x;
|
|
23
|
+
const fits = numericAxis ? typeof x === 'number' : known.includes(String(x));
|
|
24
|
+
if (fits)
|
|
25
|
+
return;
|
|
26
|
+
report({
|
|
27
|
+
path: pathKey(pathIndex(pathKey(node.path, key), index), 'x'),
|
|
28
|
+
severity: 'warning',
|
|
29
|
+
message: numericAxis
|
|
30
|
+
? `a ${kind} chart places overlays by number; "${String(x)}" is not drawn`
|
|
31
|
+
: `"${String(x)}" is not a category of this chart and is not drawn`,
|
|
32
|
+
details: { allowed: [...known] },
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Rules that run on the resolved chart, once its shape and fields are valid. */
|
|
38
|
+
export function checkKindRules(node, kind, report) {
|
|
39
|
+
const input = buildChartInput(node);
|
|
40
|
+
const encoded = input.encoded;
|
|
41
|
+
const values = input.series[0]?.values ?? [];
|
|
42
|
+
const valuesPath = node.data === undefined
|
|
43
|
+
? pathKey(pathIndex(pathKey(node.path, 'series'), 0), 'values')
|
|
44
|
+
: pathKey(pathKey(node.path, magnitudeEncoding(node).key), 'field');
|
|
45
|
+
if (SINGLE_SERIES_KINDS.includes(kind) && node.data === undefined && input.series.length > 1) {
|
|
46
|
+
report({
|
|
47
|
+
path: pathKey(node.path, 'series'),
|
|
48
|
+
severity: 'warning',
|
|
49
|
+
message: `a ${kind} chart draws only the first series`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (kind === 'gauge' && encoded !== undefined) {
|
|
53
|
+
const min = encoded.value.min ?? 0;
|
|
54
|
+
const max = encoded.value.max ?? 100;
|
|
55
|
+
const count = node.data === undefined ? values.length : node.data.rows.length;
|
|
56
|
+
if (count !== 1 || (node.data === undefined && input.labels.length !== 1)) {
|
|
57
|
+
report({ path: valuesPath, message: `a gauge shows exactly one value; found ${count}` });
|
|
58
|
+
}
|
|
59
|
+
else if ((values[0] ?? 0) < min || (values[0] ?? 0) > max) {
|
|
60
|
+
report({
|
|
61
|
+
path: valuesPath,
|
|
62
|
+
message: `the gauge value ${values[0]} is outside ${min}–${max}; set value.min or value.max`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (encoded.target !== undefined && (encoded.target < min || encoded.target > max)) {
|
|
66
|
+
report({
|
|
67
|
+
path: pathKey(node.path, 'target'),
|
|
68
|
+
severity: 'warning',
|
|
69
|
+
message: `target ${encoded.target} is outside ${min}–${max} and is drawn at the edge`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (kind === 'funnel') {
|
|
74
|
+
const rises = values.findIndex((value, index) => index > 0 && value > (values[index - 1] ?? 0));
|
|
75
|
+
if (rises > 0) {
|
|
76
|
+
report({
|
|
77
|
+
path: valuesPath,
|
|
78
|
+
severity: 'warning',
|
|
79
|
+
message: `funnel stage "${input.labels[rises]}" is larger than the stage before it`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (kind === 'treemap') {
|
|
84
|
+
if (input.labels.length > MAX_TREEMAP_CELLS) {
|
|
85
|
+
report({
|
|
86
|
+
path: valuesPath,
|
|
87
|
+
code: 'SPEC_BOUNDS_ERROR',
|
|
88
|
+
message: `a treemap holds at most ${MAX_TREEMAP_CELLS} cells; found ${input.labels.length}`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (values.some((value) => value < 0)) {
|
|
92
|
+
report({ path: valuesPath, message: 'treemap values must not be negative' });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (kind === 'stacked-bar-100' &&
|
|
96
|
+
input.series.some((series) => series.values.some((v) => v < 0))) {
|
|
97
|
+
report({ path: valuesPath, message: 'stacked-bar-100 values must not be negative' });
|
|
98
|
+
}
|
|
99
|
+
if (CARTESIAN_KINDS.includes(kind) && encoded !== undefined && kind !== 'stacked-bar-100') {
|
|
100
|
+
const { min, max } = encoded.y;
|
|
101
|
+
const plotted = kind === 'scatter'
|
|
102
|
+
? encoded.points.map((point) => point.y)
|
|
103
|
+
: input.series.flatMap((s) => s.values);
|
|
104
|
+
const outside = plotted.filter((value) => (min !== undefined && value < min) || (max !== undefined && value > max)).length;
|
|
105
|
+
if (outside > 0 && kind !== 'histogram' && kind !== 'waterfall') {
|
|
106
|
+
report({
|
|
107
|
+
path: pathKey(node.path, 'y'),
|
|
108
|
+
severity: 'warning',
|
|
109
|
+
message: `${outside} values fall outside y.min/y.max and are clipped at the edge`,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (node.data !== undefined &&
|
|
114
|
+
seriesField(node) !== undefined &&
|
|
115
|
+
!SINGLE_SERIES_KINDS.includes(kind)) {
|
|
116
|
+
checkPivotGaps(node, input.labels.length, report);
|
|
117
|
+
}
|
|
118
|
+
checkOverlays(node, kind, input, report);
|
|
119
|
+
}
|
|
120
|
+
/** Warn when a pivoted series misses a category (drawn as 0) or repeats one (summed). */
|
|
121
|
+
function checkPivotGaps(node, categories, report) {
|
|
122
|
+
if (stringProp(node, 'kind') === 'scatter' || stringProp(node, 'kind') === 'heatmap')
|
|
123
|
+
return;
|
|
124
|
+
const x = encodingProp(node, 'x')?.field;
|
|
125
|
+
const group = seriesField(node);
|
|
126
|
+
if (x === undefined || group === undefined || node.data === undefined)
|
|
127
|
+
return;
|
|
128
|
+
const seen = new Map();
|
|
129
|
+
const groups = new Set();
|
|
130
|
+
for (const row of node.data.rows) {
|
|
131
|
+
const key = JSON.stringify([fieldValue(row, group), fieldValue(row, x)]);
|
|
132
|
+
groups.add(JSON.stringify(fieldValue(row, group)));
|
|
133
|
+
seen.set(key, (seen.get(key) ?? 0) + 1);
|
|
134
|
+
}
|
|
135
|
+
const path = pathKey(pathKey(node.path, 'series'), 'field');
|
|
136
|
+
if ([...seen.values()].some((count) => count > 1)) {
|
|
137
|
+
report({
|
|
138
|
+
path,
|
|
139
|
+
severity: 'warning',
|
|
140
|
+
message: 'some series repeat an x value; their values are summed (use transform.groupBy to aggregate explicitly)',
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (seen.size < groups.size * categories) {
|
|
144
|
+
report({
|
|
145
|
+
path,
|
|
146
|
+
severity: 'warning',
|
|
147
|
+
message: 'some series have no row for an x value; those points are drawn as 0',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=chart-check-kind-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-check-kind-rules.js","sourceRoot":"","sources":["../../../src/blocks/chart/chart-check-kind-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-field chart checks: what the prop schema cannot express.
|
|
3
|
+
*
|
|
4
|
+
* Inline charts need labels and series; bound charts must not repeat them and
|
|
5
|
+
* must name existing, numeric fields for each kind's encodings. Kind rules
|
|
6
|
+
* (gauge range, funnel order, treemap size, stacked shares) run on the same
|
|
7
|
+
* resolved input the renderer draws.
|
|
8
|
+
*/
|
|
9
|
+
import { type DiagnosticBag, type DiagnosticInput } from '../../diagnostics.js';
|
|
10
|
+
import type { IrNode } from '../../ir.js';
|
|
11
|
+
export type Report = (input: Omit<DiagnosticInput, 'code'> & {
|
|
12
|
+
code?: DiagnosticInput['code'];
|
|
13
|
+
}) => void;
|
|
14
|
+
export declare function checkChart(node: IrNode, bag: DiagnosticBag): void;
|
|
15
|
+
//# sourceMappingURL=chart-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-check.d.ts","sourceRoot":"","sources":["../../../src/blocks/chart/chart-check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAW,MAAM,sBAAsB,CAAC;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiB1C,MAAM,MAAM,MAAM,GAAG,CACnB,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;CAAE,KACtE,IAAI,CAAC;AAiLV,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAcjE"}
|