@bestagentkits/render 0.1.1-next.1 → 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 +209 -1
- package/README.md +324 -44
- package/assets/fonts/bricolage-grotesque/OFL.txt +93 -0
- package/assets/fonts/fraunces/OFL.txt +93 -0
- package/assets/fonts/geist/OFL.txt +93 -0
- package/assets/fonts/inter-tight/OFL.txt +93 -0
- package/assets/fonts/jetbrains-mono/OFL.txt +93 -0
- package/assets/fonts/plus-jakarta-sans/OFL.txt +93 -0
- 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 +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +193 -39
- 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 +10 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +9 -0
- package/dist/mcp-server.js.map +1 -0
- 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 +360 -184
- package/dist/registry/roster.js.map +1 -1
- package/dist/render/block-helpers.d.ts +45 -0
- package/dist/render/block-helpers.d.ts.map +1 -0
- package/dist/render/block-helpers.js +83 -0
- package/dist/render/block-helpers.js.map +1 -0
- package/dist/render/blocks.d.ts +10 -35
- package/dist/render/blocks.d.ts.map +1 -1
- package/dist/render/blocks.js +144 -263
- 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 +33 -11
- package/dist/render/charts.d.ts.map +1 -1
- package/dist/render/charts.js +145 -109
- package/dist/render/charts.js.map +1 -1
- package/dist/render/derived-variables.d.ts +37 -0
- package/dist/render/derived-variables.d.ts.map +1 -0
- package/dist/render/derived-variables.js +40 -0
- package/dist/render/derived-variables.js.map +1 -0
- package/dist/render/diagram-fallback.d.ts +25 -0
- package/dist/render/diagram-fallback.d.ts.map +1 -0
- package/dist/render/diagram-fallback.js +86 -0
- package/dist/render/diagram-fallback.js.map +1 -0
- package/dist/render/document.d.ts +15 -0
- package/dist/render/document.d.ts.map +1 -1
- package/dist/render/document.js +53 -8
- package/dist/render/document.js.map +1 -1
- package/dist/render/effects-styles.d.ts +14 -0
- package/dist/render/effects-styles.d.ts.map +1 -0
- package/dist/render/effects-styles.js +39 -0
- package/dist/render/effects-styles.js.map +1 -0
- package/dist/render/embedded-fonts.generated.d.ts +22 -0
- package/dist/render/embedded-fonts.generated.d.ts.map +1 -0
- package/dist/render/embedded-fonts.generated.js +59 -0
- package/dist/render/embedded-fonts.generated.js.map +1 -0
- 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 +14 -0
- package/dist/render/feature-styles.d.ts.map +1 -0
- package/dist/render/feature-styles.js +123 -0
- package/dist/render/feature-styles.js.map +1 -0
- package/dist/render/font-faces.d.ts +22 -0
- package/dist/render/font-faces.d.ts.map +1 -0
- package/dist/render/font-faces.js +60 -0
- package/dist/render/font-faces.js.map +1 -0
- package/dist/render/outline.d.ts +21 -0
- package/dist/render/outline.d.ts.map +1 -0
- package/dist/render/outline.js +47 -0
- package/dist/render/outline.js.map +1 -0
- 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 +108 -41
- 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 +275 -128
- package/dist/render/runtime.js.map +1 -1
- package/dist/render/showcase-blocks.d.ts +52 -0
- package/dist/render/showcase-blocks.d.ts.map +1 -0
- package/dist/render/showcase-blocks.js +329 -0
- package/dist/render/showcase-blocks.js.map +1 -0
- package/dist/render/showcase-styles.d.ts +15 -0
- package/dist/render/showcase-styles.d.ts.map +1 -0
- package/dist/render/showcase-styles.js +201 -0
- package/dist/render/showcase-styles.js.map +1 -0
- package/dist/render/signature-styles.d.ts +18 -0
- package/dist/render/signature-styles.d.ts.map +1 -0
- package/dist/render/signature-styles.js +41 -0
- package/dist/render/signature-styles.js.map +1 -0
- 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 +18 -9
- package/dist/render/styles.d.ts.map +1 -1
- package/dist/render/styles.js +228 -129
- package/dist/render/styles.js.map +1 -1
- package/dist/render/surface-styles.d.ts +24 -0
- package/dist/render/surface-styles.d.ts.map +1 -0
- package/dist/render/surface-styles.js +41 -0
- package/dist/render/surface-styles.js.map +1 -0
- 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 +45 -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 +219 -41
- 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 +11 -3
- package/dist/theme/load-theme.d.ts.map +1 -1
- package/dist/theme/load-theme.js +71 -12
- 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 +8 -10
- package/dist/theme/presets.d.ts.map +1 -1
- package/dist/theme/presets.js +40 -56
- 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/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +4 -4
- package/dist/theme/tokens.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/llms.txt +29 -0
- package/package.json +13 -3
package/dist/render/blocks.js
CHANGED
|
@@ -1,52 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Block renderers.
|
|
3
|
-
*
|
|
4
|
-
* One renderer per registry type. Renderers are pure functions of a node, the
|
|
5
|
-
* IR, and the resolved theme: no clock, no randomness, no module-level mutable
|
|
6
|
-
* state, because the emitted bytes must be reproducible.
|
|
7
|
-
*
|
|
8
|
-
* Two conventions apply to every renderer:
|
|
9
|
-
* 1. Exactly one element in the emitted markup carries `data-ak-id`, so a
|
|
10
|
-
* `copy`/`download`/`toggle` target resolves to the content a reader means.
|
|
11
|
-
* 2. Action bindings become `data-ak-on-*` attributes; the runtime owns what
|
|
12
|
-
* they do. No renderer emits a handler, a style attribute, or a script.
|
|
13
|
-
*/
|
|
14
1
|
import { runDiagramAdapter } from '../diagram/adapter.js';
|
|
15
2
|
import { isPlainObject } from '../json.js';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
3
|
+
import { DEFAULT_REGISTRY } from '../registry/registry.js';
|
|
4
|
+
import { EMBED_PROVIDERS } from '../spec/providers.js';
|
|
5
|
+
import { blockedReason, element, figureCaption, heading, imageReferenceAllowed, listProp, nodeAttributes, numberProp, numProp, objectListProp, resolveMedia, str, stringProp, titleHeader, } from './block-helpers.js';
|
|
6
|
+
import { renderDiagramFallback } from './diagram-fallback.js';
|
|
7
|
+
import { escapeAttribute, escapeInlineText, escapeText, escapeUrl, renderAttributes, } from './escape.js';
|
|
8
|
+
import { browserShot, SHOWCASE_RENDERERS } from './showcase-blocks.js';
|
|
9
|
+
import { toneBadge, valueTone } from './tone.js';
|
|
19
10
|
const NO_OP_RENDERER = () => '';
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return
|
|
23
|
-
}
|
|
24
|
-
function numberProp(node, key, fallback = 0) {
|
|
25
|
-
const value = node.props[key];
|
|
26
|
-
return typeof value === 'number' ? value : fallback;
|
|
27
|
-
}
|
|
28
|
-
function listProp(node, key) {
|
|
29
|
-
const value = node.props[key];
|
|
30
|
-
return Array.isArray(value) ? value : [];
|
|
31
|
-
}
|
|
32
|
-
function objectListProp(node, key) {
|
|
33
|
-
return listProp(node, key).filter(isPlainObject);
|
|
34
|
-
}
|
|
35
|
-
function str(value, fallback = '') {
|
|
36
|
-
return typeof value === 'string' ? value : fallback;
|
|
37
|
-
}
|
|
38
|
-
function numProp(value, fallback = 0) {
|
|
39
|
-
return typeof value === 'number' ? value : fallback;
|
|
40
|
-
}
|
|
41
|
-
/** `data-ak-id` plus every non-click binding on the node. */
|
|
42
|
-
function nodeAttributes(node, extra = {}) {
|
|
43
|
-
const attributes = { 'data-ak-id': node.id, ...extra };
|
|
44
|
-
for (const [event, actions] of Object.entries(node.bindings)) {
|
|
45
|
-
if (event === 'click')
|
|
46
|
-
continue;
|
|
47
|
-
attributes[`data-ak-on-${event}`] = JSON.stringify(actions);
|
|
48
|
-
}
|
|
49
|
-
return attributes;
|
|
11
|
+
/** Fragment id of a section, shared by the section renderer and the page outline. */
|
|
12
|
+
export function sectionAnchor(nodeId) {
|
|
13
|
+
return `ak-sec-${nodeId}`;
|
|
50
14
|
}
|
|
51
15
|
/** `data-ak-on-click` for a control, when the node binds a click action. */
|
|
52
16
|
function clickAttribute(bindings) {
|
|
@@ -55,71 +19,48 @@ function clickAttribute(bindings) {
|
|
|
55
19
|
return {};
|
|
56
20
|
return { 'data-ak-on-click': JSON.stringify(actions) };
|
|
57
21
|
}
|
|
58
|
-
function element(tag, attributes, inner) {
|
|
59
|
-
const rendered = renderAttributes(attributes);
|
|
60
|
-
return inner === '' ? `<${tag}${rendered}></${tag}>` : `<${tag}${rendered}>${inner}</${tag}>`;
|
|
61
|
-
}
|
|
62
|
-
function heading(level, text, className = 'ak-section-head') {
|
|
63
|
-
return `<header class="${className}"><h${level}>${escapeText(text)}</h${level}></header>`;
|
|
64
|
-
}
|
|
65
|
-
/** A section heading for blocks whose `title` is optional. */
|
|
66
|
-
function titleHeader(node, level = 2) {
|
|
67
|
-
const title = stringProp(node, 'title');
|
|
68
|
-
return title === '' ? '' : heading(level, title);
|
|
69
|
-
}
|
|
70
|
-
function figureCaption(value) {
|
|
71
|
-
return value === '' ? '' : `<figcaption>${escapeText(value)}</figcaption>`;
|
|
72
|
-
}
|
|
73
22
|
function toneAttribute(node, fallback = 'info') {
|
|
74
23
|
return { 'data-tone': stringProp(node, 'tone', fallback) };
|
|
75
24
|
}
|
|
76
|
-
|
|
77
|
-
|
|
25
|
+
/** A cell reads as a number when it is digits with optional sign, grouping, decimals, percent or a short unit. */
|
|
26
|
+
const NUMERIC_CELL = /^[-+−]?[$€£]?\d[\d,]*(?:\.\d+)?\s?(?:%|[A-Za-z]{1,3})?$/u;
|
|
27
|
+
/** Column indexes whose every non-empty cell is numeric, so they can align on the right. */
|
|
28
|
+
function numericColumns(rows, width) {
|
|
29
|
+
const numeric = new Set();
|
|
30
|
+
for (let column = 0; column < width; column += 1) {
|
|
31
|
+
const cells = rows
|
|
32
|
+
.map((row) => (Array.isArray(row) ? str(row[column]).trim() : ''))
|
|
33
|
+
.filter((cell) => cell !== '');
|
|
34
|
+
if (cells.length > 0 && cells.every((cell) => NUMERIC_CELL.test(cell)))
|
|
35
|
+
numeric.add(column);
|
|
36
|
+
}
|
|
37
|
+
return numeric;
|
|
78
38
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
39
|
+
/** A diff line count; zero stays neutral so only real change is coloured. */
|
|
40
|
+
function lineCountCell(value, kind) {
|
|
41
|
+
const sign = kind === 'add' ? '+' : '\u2212';
|
|
42
|
+
const tone = value === 0 ? 'ak-zero' : `ak-${kind}`;
|
|
43
|
+
return `<td class="ak-num ${tone}">${sign}${escapeText(String(value))}</td>`;
|
|
83
44
|
}
|
|
84
|
-
/**
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
* a provider allowlist the reference's host must belong to one of those
|
|
89
|
-
* providers. A block that names a provider itself requires that provider to be
|
|
90
|
-
* allowlisted, so a spec cannot promote an arbitrary host to trusted by
|
|
91
|
-
* labelling it "youtube".
|
|
92
|
-
*/
|
|
93
|
-
function networkAllows(policy, capability, reference, provider) {
|
|
94
|
-
if (!capabilityAllowed(policy, capability))
|
|
95
|
-
return false;
|
|
96
|
-
if (policy === 'deny')
|
|
97
|
-
return false;
|
|
98
|
-
const declared = policy.providers ?? [];
|
|
99
|
-
if (provider !== '') {
|
|
100
|
-
return declared.includes(provider) && hostMatchesProvider(provider, reference);
|
|
101
|
-
}
|
|
102
|
-
if (declared.length === 0)
|
|
103
|
-
return true;
|
|
104
|
-
return hostMatchesAnyProvider(declared, reference);
|
|
45
|
+
/** Split code into one span per line so the stylesheet can number lines; newlines stay in the text. */
|
|
46
|
+
function codeLines(text) {
|
|
47
|
+
const lines = text.replace(/\n$/u, '').split('\n');
|
|
48
|
+
return lines.map((line) => `<span class="ak-line">${escapeText(line)}</span>`).join('\n');
|
|
105
49
|
}
|
|
106
50
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
* matching capability and, when a provider allowlist exists, an allowlisted
|
|
111
|
-
* host. Nothing here can produce an embed the spec did not ask for in a way the
|
|
112
|
-
* policy did not allow.
|
|
51
|
+
* Wrap each word of the hero title so it can rise into view on its own beat.
|
|
52
|
+
* The spaces stay as text between the wrappers, so the heading's text content
|
|
53
|
+
* and its line wrapping are unchanged.
|
|
113
54
|
*/
|
|
114
|
-
function
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
55
|
+
function heroWords(title) {
|
|
56
|
+
return title
|
|
57
|
+
.split(/(\s+)/u)
|
|
58
|
+
.map((part) => part === '' || /^\s+$/u.test(part)
|
|
59
|
+
? part
|
|
60
|
+
: `<span class="ak-word"><span>${escapeText(part)}</span></span>`)
|
|
61
|
+
.join('');
|
|
121
62
|
}
|
|
122
|
-
function mediaFallbackBody(title, description, url, poster, linkText, note
|
|
63
|
+
function mediaFallbackBody(title, description, url, poster, linkText, note) {
|
|
123
64
|
const posterMarkup = poster === '' ? '' : `<img src="${escapeAttribute(escapeUrl(poster))}" alt="" />`;
|
|
124
65
|
const link = url === ''
|
|
125
66
|
? ''
|
|
@@ -127,7 +68,7 @@ function mediaFallbackBody(title, description, url, poster, linkText, note = 'Re
|
|
|
127
68
|
return [
|
|
128
69
|
posterMarkup,
|
|
129
70
|
title === '' ? '' : `<p><strong>${escapeText(title)}</strong></p>`,
|
|
130
|
-
`<p class="ak-muted">${
|
|
71
|
+
`<p class="ak-muted">${escapeInlineText(description)}</p>`,
|
|
131
72
|
`<p class="ak-caption">${escapeText(note)}</p>`,
|
|
132
73
|
link,
|
|
133
74
|
]
|
|
@@ -135,6 +76,7 @@ function mediaFallbackBody(title, description, url, poster, linkText, note = 'Re
|
|
|
135
76
|
.join('');
|
|
136
77
|
}
|
|
137
78
|
const RENDERERS = {
|
|
79
|
+
...SHOWCASE_RENDERERS,
|
|
138
80
|
page: (node, context) => {
|
|
139
81
|
// Every page needs exactly one h1. A hero (or an explicit level-1 heading)
|
|
140
82
|
// provides it; otherwise the document title does, so a page without a hero
|
|
@@ -146,19 +88,13 @@ const RENDERERS = {
|
|
|
146
88
|
: `<h1 class="ak-page-title">${escapeText(context.ir.meta.title)}</h1>`;
|
|
147
89
|
return element('main', { class: 'ak-main', id: 'ak-main-content', 'aria-label': context.ir.meta.title }, `${title}${context.renderChildren(node)}`);
|
|
148
90
|
},
|
|
149
|
-
section: (node, context) => element('section',
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
'data-ak-columns': String(Math.min(Math.max(numberProp(node, 'columns', 3), 1), 6)),
|
|
157
|
-
}), context.renderChildren(node)),
|
|
158
|
-
split: (node, context) => element('div', nodeAttributes(node, {
|
|
159
|
-
class: 'ak-block ak-split',
|
|
160
|
-
'data-ratio': stringProp(node, 'ratio', 'even'),
|
|
161
|
-
}), context.renderChildren(node)),
|
|
91
|
+
section: (node, context) => element('section',
|
|
92
|
+
// The id is the outline's link target; node ids are unique, so it is too.
|
|
93
|
+
nodeAttributes(node, {
|
|
94
|
+
class: 'ak-block ak-section',
|
|
95
|
+
id: sectionAnchor(node.id),
|
|
96
|
+
'data-surface': stringProp(node, 'surface') === 'inverse' ? 'inverse' : undefined,
|
|
97
|
+
}), `${titleHeader(node)}${context.renderChildren(node)}`),
|
|
162
98
|
spacer: (node) => element('div', {
|
|
163
99
|
class: 'ak-spacer',
|
|
164
100
|
'data-size': stringProp(node, 'size', 'medium'),
|
|
@@ -179,30 +115,38 @@ const RENDERERS = {
|
|
|
179
115
|
: variant === 'caption'
|
|
180
116
|
? 'ak-block ak-caption'
|
|
181
117
|
: 'ak-block';
|
|
182
|
-
return `<p${renderAttributes(nodeAttributes(node, { class: className }))}>${
|
|
118
|
+
return `<p${renderAttributes(nodeAttributes(node, { class: className }))}>${escapeInlineText(stringProp(node, 'text'))}</p>`;
|
|
183
119
|
},
|
|
184
120
|
'rich-text': (node) => {
|
|
185
121
|
const paragraphs = stringProp(node, 'text')
|
|
186
122
|
.split(/\n{2,}/u)
|
|
187
123
|
.map((part) => part.trim())
|
|
188
124
|
.filter((part) => part !== '');
|
|
189
|
-
return element('div', nodeAttributes(node, { class: 'ak-block ak-prose' }), paragraphs.map((part) => `<p>${
|
|
125
|
+
return element('div', nodeAttributes(node, { class: 'ak-block ak-prose' }), paragraphs.map((part) => `<p>${escapeInlineText(part.replace(/\n/gu, ' '))}</p>`).join(''));
|
|
190
126
|
},
|
|
191
127
|
quote: (node) => {
|
|
192
128
|
const cite = stringProp(node, 'cite');
|
|
193
|
-
return element('blockquote', nodeAttributes(node, { class: 'ak-block ak-quote' }), `<p>${
|
|
129
|
+
return element('blockquote', nodeAttributes(node, { class: 'ak-block ak-quote' }), `<p>${escapeInlineText(stringProp(node, 'text'))}</p>${cite === '' ? '' : `<cite>${escapeText(cite)}</cite>`}`);
|
|
194
130
|
},
|
|
195
131
|
code: (node) => {
|
|
196
132
|
const title = stringProp(node, 'title');
|
|
197
133
|
const language = stringProp(node, 'language', 'text');
|
|
134
|
+
const copy = renderAttributes({
|
|
135
|
+
'data-ak-on-click': JSON.stringify([{ action: 'copy', target: node.id }]),
|
|
136
|
+
'aria-label': title === '' ? 'Copy code' : `Copy ${title}`,
|
|
137
|
+
});
|
|
198
138
|
return [
|
|
199
139
|
`<div class="ak-block ak-code">`,
|
|
200
|
-
|
|
140
|
+
'<div class="ak-code-head">',
|
|
141
|
+
`<span class="ak-label">${escapeText(title === '' ? language : title)}</span>`,
|
|
142
|
+
title === '' || language === ''
|
|
201
143
|
? ''
|
|
202
|
-
: `<
|
|
144
|
+
: `<span class="ak-code-lang">${escapeText(language)}</span>`,
|
|
145
|
+
`<button type="button" class="ak-code-copy"${copy}>Copy</button>`,
|
|
146
|
+
'</div>',
|
|
203
147
|
`<pre${renderAttributes({ 'data-ak-id': node.id })}><code${renderAttributes({
|
|
204
148
|
class: `language-${language}`,
|
|
205
|
-
})}>${
|
|
149
|
+
})}>${codeLines(stringProp(node, 'text'))}</code></pre>`,
|
|
206
150
|
'</div>',
|
|
207
151
|
]
|
|
208
152
|
.filter((part) => part !== '')
|
|
@@ -221,7 +165,7 @@ const RENDERERS = {
|
|
|
221
165
|
stringProp(node, 'title') === ''
|
|
222
166
|
? ''
|
|
223
167
|
: heading(3, stringProp(node, 'title'), 'ak-card-title'),
|
|
224
|
-
text === '' ? '' : `<p>${
|
|
168
|
+
text === '' ? '' : `<p>${escapeInlineText(text)}</p>`,
|
|
225
169
|
context.renderChildren(node),
|
|
226
170
|
].join(''));
|
|
227
171
|
},
|
|
@@ -231,7 +175,7 @@ const RENDERERS = {
|
|
|
231
175
|
return [
|
|
232
176
|
`<div${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-alert', ...toneAttribute(node) }))}${role}>`,
|
|
233
177
|
`<p><strong>${escapeText(stringProp(node, 'title'))}</strong></p>`,
|
|
234
|
-
`<p>${
|
|
178
|
+
`<p>${escapeInlineText(stringProp(node, 'text'))}</p>`,
|
|
235
179
|
'</div>',
|
|
236
180
|
].join('');
|
|
237
181
|
},
|
|
@@ -248,18 +192,27 @@ const RENDERERS = {
|
|
|
248
192
|
`<aside${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-callout', ...toneAttribute(node) }))}>`,
|
|
249
193
|
`<p class="ak-label">${escapeText(icon)}</p>`,
|
|
250
194
|
`<p><strong>${escapeText(stringProp(node, 'title'))}</strong></p>`,
|
|
251
|
-
`<p>${
|
|
195
|
+
`<p>${escapeInlineText(stringProp(node, 'text'))}</p>`,
|
|
252
196
|
'</aside>',
|
|
253
197
|
].join('');
|
|
254
198
|
},
|
|
255
|
-
hero: (node) => {
|
|
199
|
+
hero: (node, context) => {
|
|
256
200
|
const eyebrow = stringProp(node, 'eyebrow');
|
|
257
201
|
const description = stringProp(node, 'description');
|
|
202
|
+
const source = stringProp(node, 'src');
|
|
258
203
|
return [
|
|
259
|
-
`<div${renderAttributes(nodeAttributes(node, {
|
|
204
|
+
`<div${renderAttributes(nodeAttributes(node, {
|
|
205
|
+
class: 'ak-block ak-hero',
|
|
206
|
+
'data-align': stringProp(node, 'align') === 'center' ? 'center' : undefined,
|
|
207
|
+
'data-media': source === '' ? undefined : 'true',
|
|
208
|
+
}))}>`,
|
|
260
209
|
eyebrow === '' ? '' : `<p class="ak-eyebrow">${escapeText(eyebrow)}</p>`,
|
|
261
|
-
`<h1>${
|
|
262
|
-
description === '' ? '' : `<p>${
|
|
210
|
+
`<h1>${heroWords(stringProp(node, 'title'))}</h1>`,
|
|
211
|
+
description === '' ? '' : `<p>${escapeInlineText(description)}</p>`,
|
|
212
|
+
// The shot is the first thing on screen, so it loads eagerly.
|
|
213
|
+
source === ''
|
|
214
|
+
? ''
|
|
215
|
+
: `<figure class="ak-hero-media"><div class="ak-hero-stage">${browserShot(source, stringProp(node, 'alt'), stringProp(node, 'address'), context.ir.policy.network, 'eager')}</div></figure>`,
|
|
263
216
|
'</div>',
|
|
264
217
|
].join('');
|
|
265
218
|
},
|
|
@@ -292,7 +245,7 @@ const RENDERERS = {
|
|
|
292
245
|
`<ol class="ak-steps">${items
|
|
293
246
|
.map((item) => {
|
|
294
247
|
const text = str(item.text);
|
|
295
|
-
return `<li><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${
|
|
248
|
+
return `<li><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeInlineText(text)}</p>`}</li>`;
|
|
296
249
|
})
|
|
297
250
|
.join('')}</ol>`,
|
|
298
251
|
].join(''));
|
|
@@ -304,7 +257,7 @@ const RENDERERS = {
|
|
|
304
257
|
`<ol class="ak-timeline">${items
|
|
305
258
|
.map((item) => {
|
|
306
259
|
const text = str(item.text);
|
|
307
|
-
return `<li><time>${escapeText(str(item.when))}</time><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${
|
|
260
|
+
return `<li><time>${escapeText(str(item.when))}</time><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeInlineText(text)}</p>`}</li>`;
|
|
308
261
|
})
|
|
309
262
|
.join('')}</ol>`,
|
|
310
263
|
].join(''));
|
|
@@ -316,7 +269,7 @@ const RENDERERS = {
|
|
|
316
269
|
`<ul class="ak-list">${items
|
|
317
270
|
.map((item) => {
|
|
318
271
|
const badge = str(item.badge);
|
|
319
|
-
return `<li data-ak-filter-item data-ak-label="${escapeAttribute(str(item.text))}"><span>${
|
|
272
|
+
return `<li data-ak-filter-item data-ak-label="${escapeAttribute(str(item.text))}"><span>${escapeInlineText(str(item.text))}</span>${badge === '' ? '' : `<span class="ak-badge">${escapeText(badge)}</span>`}</li>`;
|
|
320
273
|
})
|
|
321
274
|
.join('')}</ul>`,
|
|
322
275
|
].join(''));
|
|
@@ -328,7 +281,7 @@ const RENDERERS = {
|
|
|
328
281
|
`<ul class="ak-grid" data-ak-columns="3">${items
|
|
329
282
|
.map((item) => {
|
|
330
283
|
const text = str(item.text);
|
|
331
|
-
return `<li class="ak-card ak-card--elevated"><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${
|
|
284
|
+
return `<li class="ak-card ak-card--elevated"><p><strong>${escapeText(str(item.title))}</strong></p>${text === '' ? '' : `<p>${escapeInlineText(text)}</p>`}</li>`;
|
|
332
285
|
})
|
|
333
286
|
.join('')}</ul>`,
|
|
334
287
|
].join(''));
|
|
@@ -337,20 +290,24 @@ const RENDERERS = {
|
|
|
337
290
|
const columns = listProp(node, 'columns');
|
|
338
291
|
const rows = listProp(node, 'rows');
|
|
339
292
|
const title = stringProp(node, 'title');
|
|
293
|
+
const numeric = numericColumns(rows, columns.length);
|
|
294
|
+
const align = (index) => (numeric.has(index) ? ' class="ak-num"' : '');
|
|
340
295
|
const head = columns
|
|
341
|
-
.map((column) => `<th scope="col">${escapeText(str(column))}</th>`)
|
|
296
|
+
.map((column, index) => `<th scope="col"${align(index)}>${escapeText(str(column))}</th>`)
|
|
342
297
|
.join('');
|
|
343
298
|
const body = rows
|
|
344
299
|
.map((row) => {
|
|
345
300
|
const cells = (Array.isArray(row) ? row : [])
|
|
346
|
-
.map((cell) => `<td>${escapeText(str(cell))}</td>`)
|
|
301
|
+
.map((cell, index) => `<td${align(index)}>${escapeText(str(cell))}</td>`)
|
|
347
302
|
.join('');
|
|
348
303
|
return `<tr>${cells}</tr>`;
|
|
349
304
|
})
|
|
350
305
|
.join('');
|
|
351
306
|
return element('section', nodeAttributes(node, { class: 'ak-block' }), [
|
|
352
307
|
title === '' ? '' : heading(2, title),
|
|
353
|
-
|
|
308
|
+
// The visible heading already names the table, so the caption stays for
|
|
309
|
+
// assistive technology only instead of printing the title twice.
|
|
310
|
+
`<div class="ak-table-wrap"><table>${title === '' ? '' : `<caption class="ak-sr">${escapeText(title)}</caption>`}<thead><tr>${head}</tr></thead><tbody>${body}</tbody></table></div>`,
|
|
354
311
|
].join(''));
|
|
355
312
|
},
|
|
356
313
|
comparison: (node) => {
|
|
@@ -368,16 +325,19 @@ const RENDERERS = {
|
|
|
368
325
|
return element('section', nodeAttributes(node, { class: 'ak-block' }), [
|
|
369
326
|
titleHeader(node),
|
|
370
327
|
`<div class="ak-table-wrap"><table><caption>Risk by impact and likelihood</caption><thead><tr><th scope="col">Area</th><th scope="col">Impact</th><th scope="col">Likelihood</th><th scope="col">Note</th></tr></thead><tbody>${items
|
|
371
|
-
.map((item) => `<tr><th scope="row">${escapeText(str(item.area))}</th><td>${
|
|
328
|
+
.map((item) => `<tr><th scope="row">${escapeText(str(item.area))}</th><td>${toneBadge(str(item.impact))}</td><td>${toneBadge(str(item.likelihood))}</td><td>${escapeInlineText(str(item.note))}</td></tr>`)
|
|
372
329
|
.join('')}</tbody></table></div>`,
|
|
373
330
|
].join(''));
|
|
374
331
|
},
|
|
375
332
|
'diff-summary': (node) => {
|
|
376
333
|
const items = objectListProp(node, 'items');
|
|
334
|
+
const header = titleHeader(node);
|
|
335
|
+
// A visible block title already names the table; the caption then stays for screen readers only.
|
|
336
|
+
const caption = header === '' ? '<caption>' : '<caption class="ak-sr">';
|
|
377
337
|
return element('section', nodeAttributes(node, { class: 'ak-block' }), [
|
|
378
|
-
|
|
379
|
-
`<div class="ak-table-wrap"><table
|
|
380
|
-
.map((item) => `<tr><th scope="row"><code>${escapeText(str(item.path))}</code></th><td>${
|
|
338
|
+
header,
|
|
339
|
+
`<div class="ak-table-wrap"><table>${caption}Changed files</caption><thead><tr><th scope="col">Path</th><th scope="col">Status</th><th scope="col" class="ak-num">Additions</th><th scope="col" class="ak-num">Deletions</th></tr></thead><tbody>${items
|
|
340
|
+
.map((item) => `<tr><th scope="row"><code>${escapeText(str(item.path))}</code></th><td>${toneBadge(str(item.status))}</td>${lineCountCell(numProp(item.additions, 0), 'add')}${lineCountCell(numProp(item.deletions, 0), 'del')}</tr>`)
|
|
381
341
|
.join('')}</tbody></table></div>`,
|
|
382
342
|
].join(''));
|
|
383
343
|
},
|
|
@@ -386,63 +346,10 @@ const RENDERERS = {
|
|
|
386
346
|
return element('section', nodeAttributes(node, { class: 'ak-block' }), [
|
|
387
347
|
titleHeader(node),
|
|
388
348
|
`<ul class="ak-grid" data-ak-columns="2">${items
|
|
389
|
-
.map((item) => `<li class="ak-card ak-surface"><p class="ak-label">${escapeText(str(item.kind))}</p><p><strong>${escapeText(str(item.title))}</strong></p><p>${
|
|
349
|
+
.map((item) => `<li class="ak-card ak-surface" data-tone="${valueTone(str(item.kind))}"><p class="ak-label">${escapeText(str(item.kind))}</p><p><strong>${escapeText(str(item.title))}</strong></p><p>${escapeInlineText(str(item.text))}</p></li>`)
|
|
390
350
|
.join('')}</ul>`,
|
|
391
351
|
].join(''));
|
|
392
352
|
},
|
|
393
|
-
tabs: (node) => {
|
|
394
|
-
const items = objectListProp(node, 'items');
|
|
395
|
-
const base = node.id;
|
|
396
|
-
const tabs = items
|
|
397
|
-
.map((item, index) => {
|
|
398
|
-
const tabId = str(item.id, `${base}-tab-${index}`);
|
|
399
|
-
return `<button type="button" role="tab" id="${escapeAttribute(tabId)}" data-ak-tab-id="${escapeAttribute(tabId)}" aria-controls="${escapeAttribute(`${base}-panel-${index}`)}" aria-selected="${index === 0 ? 'true' : 'false'}" tabindex="${index === 0 ? '0' : '-1'}">${escapeText(str(item.title))}</button>`;
|
|
400
|
-
})
|
|
401
|
-
.join('');
|
|
402
|
-
const panels = items
|
|
403
|
-
.map((item, index) => `<div role="tabpanel" id="${escapeAttribute(`${base}-panel-${index}`)}" aria-labelledby="${escapeAttribute(str(item.id, `${base}-tab-${index}`))}" tabindex="${index === 0 ? '0' : '-1'}"${index === 0 ? '' : ' hidden'}>${escapeText(str(item.text))}</div>`)
|
|
404
|
-
.join('');
|
|
405
|
-
return element('section', nodeAttributes(node, { class: 'ak-block ak-tabs', 'data-ak-tabs': 'true' }), [
|
|
406
|
-
titleHeader(node),
|
|
407
|
-
`<div role="tablist" aria-label="${escapeAttribute(stringProp(node, 'title', 'Tabs'))}">${tabs}</div>${panels}`,
|
|
408
|
-
].join(''));
|
|
409
|
-
},
|
|
410
|
-
accordion: (node) => {
|
|
411
|
-
const items = objectListProp(node, 'items');
|
|
412
|
-
return element('section', nodeAttributes(node, { class: 'ak-block ak-accordion' }), [
|
|
413
|
-
titleHeader(node),
|
|
414
|
-
items
|
|
415
|
-
.map((item, index) =>
|
|
416
|
-
// Each disclosure carries its own id so a declarative expand or
|
|
417
|
-
// collapse action can address one section. Native <details> remains
|
|
418
|
-
// the behavior; the action only drives it.
|
|
419
|
-
`<details${index === 0 ? ' open' : ''}${renderAttributes({
|
|
420
|
-
'data-ak-id': `${node.id}-item-${index}`,
|
|
421
|
-
})}><summary>${escapeText(str(item.title))}</summary><p>${escapeText(str(item.text))}</p></details>`)
|
|
422
|
-
.join(''),
|
|
423
|
-
].join(''));
|
|
424
|
-
},
|
|
425
|
-
carousel: (node) => {
|
|
426
|
-
const items = objectListProp(node, 'items');
|
|
427
|
-
const label = stringProp(node, 'ariaLabel', 'Carousel');
|
|
428
|
-
const slides = items
|
|
429
|
-
.map((item, index) => `<div class="ak-carousel-slide" data-ak-slide tabindex="-1" aria-hidden="${index === 0 ? 'false' : 'true'}"${index === 0 ? '' : ' hidden'}><h3>${escapeText(str(item.title))}</h3><p>${escapeText(str(item.text))}</p></div>`)
|
|
430
|
-
.join('');
|
|
431
|
-
return element('section', nodeAttributes(node, {
|
|
432
|
-
class: 'ak-block ak-carousel',
|
|
433
|
-
'data-ak-carousel-root': 'true',
|
|
434
|
-
role: 'group',
|
|
435
|
-
'aria-roledescription': 'carousel',
|
|
436
|
-
'aria-label': label,
|
|
437
|
-
}), [
|
|
438
|
-
`<div class="ak-carousel-slides">${slides}</div>`,
|
|
439
|
-
`<div class="ak-carousel-controls">
|
|
440
|
-
<button type="button" class="ak-btn" data-ak-carousel="prev" aria-label="Previous slide">Previous</button>
|
|
441
|
-
<button type="button" class="ak-btn" data-ak-carousel="next" aria-label="Next slide">Next</button>
|
|
442
|
-
<span class="ak-carousel-status" data-ak-carousel-status aria-live="polite">1 / ${Math.max(items.length, 1)}</span>
|
|
443
|
-
</div>`,
|
|
444
|
-
].join(''));
|
|
445
|
-
},
|
|
446
353
|
toolbar: (node) => {
|
|
447
354
|
const items = objectListProp(node, 'items');
|
|
448
355
|
return element('div', nodeAttributes(node, { class: 'ak-block ak-toolbar', role: 'toolbar' }), [
|
|
@@ -472,22 +379,6 @@ const RENDERERS = {
|
|
|
472
379
|
}),
|
|
473
380
|
].join(''));
|
|
474
381
|
},
|
|
475
|
-
chart: (node) => {
|
|
476
|
-
const series = objectListProp(node, 'series').map((entry) => ({
|
|
477
|
-
label: str(entry.label),
|
|
478
|
-
values: (Array.isArray(entry.values) ? entry.values : []).map((value) => numProp(value, 0)),
|
|
479
|
-
}));
|
|
480
|
-
const description = stringProp(node, 'description');
|
|
481
|
-
const title = stringProp(node, 'title');
|
|
482
|
-
return `<div${renderAttributes(nodeAttributes(node, { class: 'ak-block' }))}>${renderChart({
|
|
483
|
-
kind: stringProp(node, 'kind', 'bar'),
|
|
484
|
-
id: node.id,
|
|
485
|
-
labels: listProp(node, 'labels').map((label) => str(label)),
|
|
486
|
-
series,
|
|
487
|
-
...(title === '' ? {} : { title }),
|
|
488
|
-
...(description === '' ? {} : { description }),
|
|
489
|
-
})}</div>`;
|
|
490
|
-
},
|
|
491
382
|
'diagram-panel': (node, context) => {
|
|
492
383
|
const spec = isPlainObject(node.props.spec) ? node.props.spec : {};
|
|
493
384
|
const asObjects = (value) => (Array.isArray(value) ? value.filter(isPlainObject) : []);
|
|
@@ -499,20 +390,7 @@ const RENDERERS = {
|
|
|
499
390
|
// The semantic fallback is always available: it is the only rendering when
|
|
500
391
|
// no adapter is installed, and it stays in the document as the accessible
|
|
501
392
|
// description when one is.
|
|
502
|
-
const fallbackBody =
|
|
503
|
-
described.length === 0
|
|
504
|
-
? ''
|
|
505
|
-
: `<ul class="ak-list">${described
|
|
506
|
-
.map((component) => `<li><code>${escapeText(str(component.id))}</code><span>${escapeText(str(component.label))}</span></li>`)
|
|
507
|
-
.join('')}</ul>`,
|
|
508
|
-
edges.length === 0
|
|
509
|
-
? ''
|
|
510
|
-
: `<ul class="ak-list">${edges
|
|
511
|
-
.map((edge) => `<li><code>${escapeText(str(edge.from))} → ${escapeText(str(edge.to))}</code><span>${escapeText(str(edge.label))}</span></li>`)
|
|
512
|
-
.join('')}</ul>`,
|
|
513
|
-
]
|
|
514
|
-
.filter((part) => part !== '')
|
|
515
|
-
.join('');
|
|
393
|
+
const fallbackBody = renderDiagramFallback(described, edges);
|
|
516
394
|
const adapterResult = runDiagramAdapter(context.diagramAdapter, {
|
|
517
395
|
spec: (node.props.spec ?? null),
|
|
518
396
|
title: diagramTitle,
|
|
@@ -526,22 +404,30 @@ const RENDERERS = {
|
|
|
526
404
|
message: `diagram adapter "${adapterResult.adapter}" output was rejected (${adapterResult.rejected}); the structured fallback is used`,
|
|
527
405
|
});
|
|
528
406
|
}
|
|
407
|
+
if (adapterResult?.removedInlineStyles !== undefined) {
|
|
408
|
+
context.warnings?.push({
|
|
409
|
+
code: 'POLICY_VIOLATION',
|
|
410
|
+
severity: 'warning',
|
|
411
|
+
path: `$.blocks.${node.id}`,
|
|
412
|
+
message: `diagram adapter "${adapterResult.adapter}" output had ${adapterResult.removedInlineStyles} inline style attribute(s), which the page Content Security Policy refuses; they were removed. Move those styles into a <style> element.`,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
529
415
|
const accepted = adapterResult !== undefined &&
|
|
530
416
|
adapterResult.rejected === undefined &&
|
|
531
417
|
adapterResult.markup !== '';
|
|
418
|
+
const description = `<p class="ak-diagram-title">${escapeText(diagramTitle)}</p>${fallbackBody}`;
|
|
532
419
|
return [
|
|
533
420
|
`<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-diagram' }))}>`,
|
|
534
421
|
titleHeader(node, 2),
|
|
422
|
+
// Adapter output keeps its natural size: a wide diagram scrolls sideways
|
|
423
|
+
// inside a keyboard-focusable region instead of shrinking its labels. The
|
|
424
|
+
// text description then folds away behind a disclosure, so it does not
|
|
425
|
+
// repeat the drawing; it stays in the document, prints open, and the
|
|
426
|
+
// static SVG reads without script and in print. The inner canvas is the
|
|
427
|
+
// root the adapter's stylesheets are scoped to.
|
|
535
428
|
accepted
|
|
536
|
-
? `<div class="ak-diagram-rendered" data-ak-diagram-adapter="${escapeAttribute(adapterResult.adapter)}">${adapterResult.markup}</div>`
|
|
537
|
-
:
|
|
538
|
-
`<div class="ak-diagram-fallback" data-ak-diagram-fallback>`,
|
|
539
|
-
`<p><strong>${escapeText(diagramTitle)}</strong></p>`,
|
|
540
|
-
fallbackBody,
|
|
541
|
-
accepted
|
|
542
|
-
? '<p class="ak-caption">Rendered by a diagram adapter. The structured description below is the accessible equivalent.</p>'
|
|
543
|
-
: '<p class="ak-caption">Rendered as a structured fallback because no diagram adapter is configured.</p>',
|
|
544
|
-
'</div>',
|
|
429
|
+
? `<div class="ak-diagram-rendered" data-ak-diagram-adapter="${escapeAttribute(adapterResult.adapter)}" role="region" aria-label="${escapeAttribute(diagramTitle)}" tabindex="0"><div class="ak-diagram-canvas" data-ak-diagram-scope="${escapeAttribute(adapterResult.scope ?? '')}">${adapterResult.markup}</div></div><details class="ak-diagram-details" data-ak-diagram-fallback><summary>Text description</summary><div class="ak-diagram-fallback">${description}</div></details>`
|
|
430
|
+
: `<div class="ak-diagram-fallback" data-ak-diagram-fallback>${description}<p class="ak-caption">Rendered as a structured fallback because no diagram adapter is configured.</p></div>`,
|
|
545
431
|
figureCaption(caption),
|
|
546
432
|
'</figure>',
|
|
547
433
|
]
|
|
@@ -555,7 +441,7 @@ const RENDERERS = {
|
|
|
555
441
|
if (!resolved.allowed) {
|
|
556
442
|
return [
|
|
557
443
|
`<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
|
|
558
|
-
`<div class="ak-media-fallback"><p><strong>${escapeText(alt)}</strong></p><p class="ak-caption">Remote image not loaded:
|
|
444
|
+
`<div class="ak-media-fallback"><p><strong>${escapeText(alt)}</strong></p><p class="ak-caption">Remote image not loaded: ${blockedReason(context.ir.policy.network, 'images')}.</p><a href="${escapeAttribute(resolved.src)}" rel="noreferrer noopener">Open image</a></div>`,
|
|
559
445
|
figureCaption(captionText),
|
|
560
446
|
'</figure>',
|
|
561
447
|
].join('');
|
|
@@ -567,29 +453,19 @@ const RENDERERS = {
|
|
|
567
453
|
'</figure>',
|
|
568
454
|
].join('');
|
|
569
455
|
},
|
|
570
|
-
gallery: (node, context) => {
|
|
571
|
-
const columns = Math.min(Math.max(numberProp(node, 'columns', 3), 1), 6);
|
|
572
|
-
const items = objectListProp(node, 'items');
|
|
573
|
-
return element('section', nodeAttributes(node, { class: 'ak-block' }), [
|
|
574
|
-
titleHeader(node),
|
|
575
|
-
`<ul class="ak-gallery" data-ak-columns="${columns}">${items
|
|
576
|
-
.map((item) => {
|
|
577
|
-
const resolved = resolveMedia(str(item.src), context.ir.policy.network, 'images');
|
|
578
|
-
const captionText = str(item.caption);
|
|
579
|
-
const body = resolved.allowed
|
|
580
|
-
? `<img src="${escapeAttribute(resolved.src)}" alt="${escapeAttribute(str(item.alt))}" loading="lazy" decoding="async" />`
|
|
581
|
-
: `<a href="${escapeAttribute(resolved.src)}" rel="noreferrer noopener">${escapeText(str(item.alt))}</a>`;
|
|
582
|
-
return `<li><figure>${body}${captionText === '' ? '' : `<figcaption>${escapeText(captionText)}</figcaption>`}</figure></li>`;
|
|
583
|
-
})
|
|
584
|
-
.join('')}</ul>`,
|
|
585
|
-
].join(''));
|
|
586
|
-
},
|
|
587
456
|
video: (node, context) => {
|
|
588
457
|
const source = stringProp(node, 'src');
|
|
589
458
|
const provider = stringProp(node, 'provider');
|
|
590
459
|
const resolved = resolveMedia(source, context.ir.policy.network, 'media', provider);
|
|
591
460
|
const fallback = isPlainObject(node.props.fallback) ? node.props.fallback : {};
|
|
592
461
|
const captionText = stringProp(node, 'caption');
|
|
462
|
+
// A poster is a still image, so it passes the same `images` gate as an image
|
|
463
|
+
// block. Validation rejects a blocked remote poster; dropping it here keeps
|
|
464
|
+
// the renderer safe for an IR that did not come through validation.
|
|
465
|
+
const requestedPoster = stringProp(node, 'poster');
|
|
466
|
+
const poster = imageReferenceAllowed(context.ir.policy.network, requestedPoster)
|
|
467
|
+
? requestedPoster
|
|
468
|
+
: '';
|
|
593
469
|
// A provider reference never becomes a frame, whether or not it is allowed:
|
|
594
470
|
// the page links to the provider and keeps the poster, so the artifact stays
|
|
595
471
|
// frame-free. Only the explanation differs between allowed and denied.
|
|
@@ -597,9 +473,9 @@ const RENDERERS = {
|
|
|
597
473
|
const label = EMBED_PROVIDERS[provider]?.label ?? provider;
|
|
598
474
|
return [
|
|
599
475
|
`<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
|
|
600
|
-
`<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, `${label} content`), source,
|
|
476
|
+
`<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, `${label} content`), source, poster, str(fallback.linkText, `Open on ${label}`), resolved.allowed
|
|
601
477
|
? `Embedded players are not emitted; this page links to ${label} instead.`
|
|
602
|
-
: `Embedded players are not emitted and
|
|
478
|
+
: `Embedded players are not emitted and ${blockedReason(context.ir.policy.network, 'media')}; this page links to ${label} instead.`)}</div>`,
|
|
603
479
|
figureCaption(captionText),
|
|
604
480
|
'</figure>',
|
|
605
481
|
].join('');
|
|
@@ -607,15 +483,14 @@ const RENDERERS = {
|
|
|
607
483
|
if (!resolved.allowed) {
|
|
608
484
|
return [
|
|
609
485
|
`<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
|
|
610
|
-
`<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, 'Remote video is
|
|
486
|
+
`<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, 'Remote video is not available on this page.'), str(fallback.url, source), poster, str(fallback.linkText, 'Open video'), `Remote media is not embedded because ${blockedReason(context.ir.policy.network, 'media')}.`)}</div>`,
|
|
611
487
|
figureCaption(captionText),
|
|
612
488
|
'</figure>',
|
|
613
489
|
].join('');
|
|
614
490
|
}
|
|
615
|
-
const poster = stringProp(node, 'poster');
|
|
616
491
|
return [
|
|
617
492
|
`<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
|
|
618
|
-
`<video controls preload="metadata"${poster === '' ? '' : ` poster="${escapeAttribute(poster)}"`}><source src="${escapeAttribute(resolved.src)}" />${
|
|
493
|
+
`<video controls preload="metadata"${poster === '' ? '' : ` poster="${escapeAttribute(escapeUrl(poster))}"`}><source src="${escapeAttribute(resolved.src)}" />${escapeInlineText(str(fallback.description, 'Video content'))}</video>`,
|
|
619
494
|
figureCaption(captionText),
|
|
620
495
|
'</figure>',
|
|
621
496
|
].join('');
|
|
@@ -634,7 +509,7 @@ const RENDERERS = {
|
|
|
634
509
|
`<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
|
|
635
510
|
`<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, `${label} audio`), source, '', str(fallback.linkText, `Open on ${label}`), resolved.allowed
|
|
636
511
|
? `Embedded players are not emitted; this page links to ${label} instead.`
|
|
637
|
-
: `Embedded players are not emitted and
|
|
512
|
+
: `Embedded players are not emitted and ${blockedReason(context.ir.policy.network, 'media')}; this page links to ${label} instead.`)}</div>`,
|
|
638
513
|
figureCaption(captionText),
|
|
639
514
|
'</figure>',
|
|
640
515
|
].join('');
|
|
@@ -642,14 +517,14 @@ const RENDERERS = {
|
|
|
642
517
|
if (!resolved.allowed) {
|
|
643
518
|
return [
|
|
644
519
|
`<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
|
|
645
|
-
`<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, 'Remote audio is
|
|
520
|
+
`<div class="ak-media-fallback">${mediaFallbackBody(stringProp(node, 'title'), str(fallback.description, 'Remote audio is not available on this page.'), str(fallback.url, source), '', str(fallback.linkText, 'Open audio'), `Remote media is not embedded because ${blockedReason(context.ir.policy.network, 'media')}.`)}</div>`,
|
|
646
521
|
figureCaption(captionText),
|
|
647
522
|
'</figure>',
|
|
648
523
|
].join('');
|
|
649
524
|
}
|
|
650
525
|
return [
|
|
651
526
|
`<figure${renderAttributes(nodeAttributes(node, { class: 'ak-block ak-media' }))}>`,
|
|
652
|
-
`<audio controls preload="metadata" src="${escapeAttribute(resolved.src)}">${
|
|
527
|
+
`<audio controls preload="metadata" src="${escapeAttribute(resolved.src)}">${escapeInlineText(str(fallback.description, 'Audio content'))}</audio>`,
|
|
653
528
|
figureCaption(captionText),
|
|
654
529
|
'</figure>',
|
|
655
530
|
].join('');
|
|
@@ -704,7 +579,7 @@ const RENDERERS = {
|
|
|
704
579
|
'aria-label': stringProp(node, 'ariaLabel', stringProp(node, 'title')),
|
|
705
580
|
}))}>`,
|
|
706
581
|
heading(2, stringProp(node, 'title'), 'ak-dialog-title'),
|
|
707
|
-
text === '' ? '' : `<p>${
|
|
582
|
+
text === '' ? '' : `<p>${escapeInlineText(text)}</p>`,
|
|
708
583
|
`<div class="ak-dialog-actions">${actions
|
|
709
584
|
.map((action) => {
|
|
710
585
|
const on = isPlainObject(action.on) ? action.on : {};
|
|
@@ -736,14 +611,20 @@ function searchMatch(node) {
|
|
|
736
611
|
}
|
|
737
612
|
return 'text';
|
|
738
613
|
}
|
|
739
|
-
/**
|
|
614
|
+
/**
|
|
615
|
+
* Render one node: a block module's renderer first, then the core renderer,
|
|
616
|
+
* falling back to an empty string for an unregistered type.
|
|
617
|
+
*/
|
|
740
618
|
export function renderNode(node, context) {
|
|
619
|
+
const module = context.registry.modules.get(node.type);
|
|
620
|
+
if (module !== undefined)
|
|
621
|
+
return module.render(node, context);
|
|
741
622
|
const renderer = RENDERERS[node.type] ?? NO_OP_RENDERER;
|
|
742
623
|
return renderer(node, context);
|
|
743
624
|
}
|
|
744
625
|
/** True when a renderer exists for the type. */
|
|
745
|
-
export function hasRenderer(type) {
|
|
746
|
-
return RENDERERS[type] !== undefined;
|
|
626
|
+
export function hasRenderer(type, registry = DEFAULT_REGISTRY) {
|
|
627
|
+
return registry.modules.has(type) || RENDERERS[type] !== undefined;
|
|
747
628
|
}
|
|
748
629
|
export { element, nodeAttributes };
|
|
749
630
|
//# sourceMappingURL=blocks.js.map
|