@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
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data table columns: the authored column schema and the resolved column
|
|
3
|
+
* model the cell renderers read.
|
|
4
|
+
*
|
|
5
|
+
* A column names one data field (`key`) and a semantic `type`; the type picks
|
|
6
|
+
* the default value format and alignment, so an author states meaning and the
|
|
7
|
+
* compiler decides presentation. When no columns are authored they are derived
|
|
8
|
+
* from the data's fields.
|
|
9
|
+
*/
|
|
10
|
+
import { type FormatSpec } from '../../data/format-value.js';
|
|
11
|
+
import type { IrNode } from '../../ir.js';
|
|
12
|
+
import { type JsonValue } from '../../json.js';
|
|
13
|
+
import type { PropSchema } from '../../registry/prop-schema.js';
|
|
14
|
+
export declare const COLUMN_TYPES: readonly ["text", "number", "percent", "currency", "date", "badge", "link", "progress", "sparkline"];
|
|
15
|
+
export type ColumnType = (typeof COLUMN_TYPES)[number];
|
|
16
|
+
export declare const BADGE_TONES: readonly ["success", "danger", "warning", "info", "neutral"];
|
|
17
|
+
export declare const COLUMN_ALIGNS: readonly ["start", "end", "center"];
|
|
18
|
+
export type ColumnAlign = (typeof COLUMN_ALIGNS)[number];
|
|
19
|
+
/** Columns shown when none are authored. */
|
|
20
|
+
export declare const DERIVED_COLUMN_LIMIT = 8;
|
|
21
|
+
export declare const MAX_COLUMNS = 12;
|
|
22
|
+
export declare const COLUMN_SCHEMA: PropSchema;
|
|
23
|
+
export interface DataColumn {
|
|
24
|
+
key: string;
|
|
25
|
+
label: string;
|
|
26
|
+
type: ColumnType;
|
|
27
|
+
format: FormatSpec;
|
|
28
|
+
align: ColumnAlign;
|
|
29
|
+
/** link: the field that holds each row's URL. */
|
|
30
|
+
hrefField: string;
|
|
31
|
+
/** progress: the scale maximum. */
|
|
32
|
+
max: number;
|
|
33
|
+
/** sparkline: the series fields. */
|
|
34
|
+
fields: string[];
|
|
35
|
+
/** badge: exact value to tone. */
|
|
36
|
+
tones: Record<string, string>;
|
|
37
|
+
}
|
|
38
|
+
export declare function columnType(value: JsonValue | undefined): ColumnType;
|
|
39
|
+
/** The authored columns, or columns derived from the first fields of the data. */
|
|
40
|
+
export declare function resolveColumns(node: IrNode): DataColumn[];
|
|
41
|
+
//# sourceMappingURL=data-table-columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-columns.d.ts","sourceRoot":"","sources":["../../../src/blocks/data-table/data-table-columns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAEL,KAAK,UAAU,EAGhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,eAAO,MAAM,YAAY,sGAUf,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAKvD,eAAO,MAAM,WAAW,8DAA+D,CAAC;AAExF,eAAO,MAAM,aAAa,qCAAsC,CAAC;AACjE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,4CAA4C;AAC5C,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,WAAW,KAAK,CAAC;AAwB9B,eAAO,MAAM,aAAa,EAAE,UA8B1B,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAInE;AAyDD,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAQzD"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data table columns: the authored column schema and the resolved column
|
|
3
|
+
* model the cell renderers read.
|
|
4
|
+
*
|
|
5
|
+
* A column names one data field (`key`) and a semantic `type`; the type picks
|
|
6
|
+
* the default value format and alignment, so an author states meaning and the
|
|
7
|
+
* compiler decides presentation. When no columns are authored they are derived
|
|
8
|
+
* from the data's fields.
|
|
9
|
+
*/
|
|
10
|
+
import { fieldValue } from '../../data/dataset-types.js';
|
|
11
|
+
import { FORMAT_FIELDS, VALUE_FORMATS, } from '../../data/format-value.js';
|
|
12
|
+
import { isPlainObject } from '../../json.js';
|
|
13
|
+
import { enumStr, list, num, obj, str } from '../../registry/define-helpers.js';
|
|
14
|
+
import { objectListProp } from '../../render/block-helpers.js';
|
|
15
|
+
export const COLUMN_TYPES = [
|
|
16
|
+
'text',
|
|
17
|
+
'number',
|
|
18
|
+
'percent',
|
|
19
|
+
'currency',
|
|
20
|
+
'date',
|
|
21
|
+
'badge',
|
|
22
|
+
'link',
|
|
23
|
+
'progress',
|
|
24
|
+
'sparkline',
|
|
25
|
+
];
|
|
26
|
+
/** Accepted spellings that resolve to a canonical type. */
|
|
27
|
+
const TYPE_ALIASES = { percentage: 'percent' };
|
|
28
|
+
export const BADGE_TONES = ['success', 'danger', 'warning', 'info', 'neutral'];
|
|
29
|
+
export const COLUMN_ALIGNS = ['start', 'end', 'center'];
|
|
30
|
+
/** Columns shown when none are authored. */
|
|
31
|
+
export const DERIVED_COLUMN_LIMIT = 8;
|
|
32
|
+
export const MAX_COLUMNS = 12;
|
|
33
|
+
const FIELD = str({ maxLength: 64 });
|
|
34
|
+
const DEFAULT_FORMAT = {
|
|
35
|
+
text: 'text',
|
|
36
|
+
number: 'number',
|
|
37
|
+
percent: 'percent',
|
|
38
|
+
currency: 'currency',
|
|
39
|
+
date: 'date',
|
|
40
|
+
badge: 'text',
|
|
41
|
+
link: 'text',
|
|
42
|
+
progress: 'number',
|
|
43
|
+
sparkline: 'number',
|
|
44
|
+
};
|
|
45
|
+
const NUMERIC_TYPES = new Set([
|
|
46
|
+
'number',
|
|
47
|
+
'percent',
|
|
48
|
+
'currency',
|
|
49
|
+
'progress',
|
|
50
|
+
'sparkline',
|
|
51
|
+
]);
|
|
52
|
+
export const COLUMN_SCHEMA = obj({
|
|
53
|
+
key: str({ required: true, maxLength: 64, description: 'Data field shown in this column.' }),
|
|
54
|
+
label: str({ maxLength: 80, description: 'Header text; defaults to the key.' }),
|
|
55
|
+
type: enumStr([...COLUMN_TYPES, ...Object.keys(TYPE_ALIASES)], {
|
|
56
|
+
default: 'text',
|
|
57
|
+
description: 'Picks the default format and alignment. percentage = percent.',
|
|
58
|
+
}),
|
|
59
|
+
// No default: an omitted format means "the type's format".
|
|
60
|
+
format: {
|
|
61
|
+
kind: 'string',
|
|
62
|
+
enum: VALUE_FORMATS,
|
|
63
|
+
description: 'Overrides the type format. percent takes 87 for 87%.',
|
|
64
|
+
},
|
|
65
|
+
unit: FORMAT_FIELDS.unit,
|
|
66
|
+
currency: FORMAT_FIELDS.currency,
|
|
67
|
+
decimals: FORMAT_FIELDS.decimals,
|
|
68
|
+
align: enumStr(COLUMN_ALIGNS, { description: 'Default: end for numeric types.' }),
|
|
69
|
+
hrefField: str({ maxLength: 64, description: 'link: field holding the URL; default key.' }),
|
|
70
|
+
max: num({ min: 0, description: 'progress: scale maximum (default 100).' }),
|
|
71
|
+
fields: list(FIELD, {
|
|
72
|
+
minItems: 2,
|
|
73
|
+
maxItems: 24,
|
|
74
|
+
description: 'sparkline: numeric fields, oldest first.',
|
|
75
|
+
}),
|
|
76
|
+
tones: {
|
|
77
|
+
kind: 'record',
|
|
78
|
+
of: enumStr(BADGE_TONES),
|
|
79
|
+
maxKeys: 12,
|
|
80
|
+
description: 'badge: value to tone.',
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
export function columnType(value) {
|
|
84
|
+
if (typeof value !== 'string')
|
|
85
|
+
return 'text';
|
|
86
|
+
if (COLUMN_TYPES.includes(value))
|
|
87
|
+
return value;
|
|
88
|
+
return TYPE_ALIASES[value] ?? 'text';
|
|
89
|
+
}
|
|
90
|
+
function isNumberOrNull(value) {
|
|
91
|
+
return value === null || typeof value === 'number';
|
|
92
|
+
}
|
|
93
|
+
/** A derived column is numeric when every present value is a number. */
|
|
94
|
+
function derivedType(data, key) {
|
|
95
|
+
const values = data.rows.map((row) => fieldValue(row, key));
|
|
96
|
+
const numeric = values.some((value) => value !== null) && values.every(isNumberOrNull);
|
|
97
|
+
return numeric ? 'number' : 'text';
|
|
98
|
+
}
|
|
99
|
+
function stringList(value) {
|
|
100
|
+
return Array.isArray(value)
|
|
101
|
+
? value.filter((item) => typeof item === 'string')
|
|
102
|
+
: [];
|
|
103
|
+
}
|
|
104
|
+
function toneMap(value) {
|
|
105
|
+
if (!isPlainObject(value))
|
|
106
|
+
return {};
|
|
107
|
+
const tones = {};
|
|
108
|
+
for (const [key, tone] of Object.entries(value)) {
|
|
109
|
+
if (typeof tone === 'string')
|
|
110
|
+
tones[key] = tone;
|
|
111
|
+
}
|
|
112
|
+
return tones;
|
|
113
|
+
}
|
|
114
|
+
function formatSpec(column, type) {
|
|
115
|
+
const spec = {
|
|
116
|
+
format: typeof column.format === 'string' ? column.format : DEFAULT_FORMAT[type],
|
|
117
|
+
};
|
|
118
|
+
if (typeof column.unit === 'string')
|
|
119
|
+
spec.unit = column.unit;
|
|
120
|
+
if (typeof column.currency === 'string')
|
|
121
|
+
spec.currency = column.currency;
|
|
122
|
+
if (typeof column.decimals === 'number')
|
|
123
|
+
spec.decimals = column.decimals;
|
|
124
|
+
return spec;
|
|
125
|
+
}
|
|
126
|
+
function resolveColumn(column) {
|
|
127
|
+
const key = typeof column.key === 'string' ? column.key : '';
|
|
128
|
+
const type = columnType(column.type);
|
|
129
|
+
const align = typeof column.align === 'string' ? column.align : undefined;
|
|
130
|
+
const max = typeof column.max === 'number' && column.max > 0 ? column.max : 100;
|
|
131
|
+
return {
|
|
132
|
+
key,
|
|
133
|
+
label: typeof column.label === 'string' && column.label !== '' ? column.label : key,
|
|
134
|
+
type,
|
|
135
|
+
format: formatSpec(column, type),
|
|
136
|
+
align: align ?? (NUMERIC_TYPES.has(type) ? 'end' : 'start'),
|
|
137
|
+
hrefField: typeof column.hrefField === 'string' ? column.hrefField : key,
|
|
138
|
+
max,
|
|
139
|
+
fields: stringList(column.fields),
|
|
140
|
+
tones: toneMap(column.tones),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/** The authored columns, or columns derived from the first fields of the data. */
|
|
144
|
+
export function resolveColumns(node) {
|
|
145
|
+
const authored = objectListProp(node, 'columns');
|
|
146
|
+
if (authored.length > 0)
|
|
147
|
+
return authored.map(resolveColumn);
|
|
148
|
+
const data = node.data;
|
|
149
|
+
if (data === undefined)
|
|
150
|
+
return [];
|
|
151
|
+
return data.fields
|
|
152
|
+
.slice(0, DERIVED_COLUMN_LIMIT)
|
|
153
|
+
.map((key) => resolveColumn({ key, type: derivedType(data, key) }));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=data-table-columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-columns.js","sourceRoot":"","sources":["../../../src/blocks/data-table/data-table-columns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime for the data table: column sorting, row search and the sticky
|
|
3
|
+
* header's fit check. ES5-style, like `runtime.ts`, and emitted only on pages
|
|
4
|
+
* that use the feature.
|
|
5
|
+
*
|
|
6
|
+
* The markup reads completely without it: rows keep their authored order and
|
|
7
|
+
* the search bar stays hidden until `data-ak-table-ready` is set. Sort buttons
|
|
8
|
+
* are created here, inside each `<th>`, so a page without scripts never shows a
|
|
9
|
+
* control that does nothing.
|
|
10
|
+
*
|
|
11
|
+
* Search hides a row with `data-ak-dt-miss`, not `hidden`, so a filter that
|
|
12
|
+
* toggles `hidden` on the same rows composes with it instead of fighting it.
|
|
13
|
+
*/
|
|
14
|
+
export declare const DATA_TABLE_RUNTIME = "\nvar DT_NUMBER = /^-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?$/i;\nfunction dtRows(table) { return table.tBodies.length ? Array.prototype.slice.call(table.tBodies[0].rows) : []; }\nfunction dtHeads(table) { return table.tHead && table.tHead.rows.length ? Array.prototype.slice.call(table.tHead.rows[0].cells) : []; }\nfunction sortDataTable(table, index) {\n var heads = dtHeads(table);\n var head = heads[index];\n if (!head) return;\n var direction = head.getAttribute('aria-sort') === 'ascending' ? 'descending' : 'ascending';\n var rows = dtRows(table);\n var values = rows.map(function (row) {\n var cell = row.cells[index];\n return cell && cell.hasAttribute('data-sort') ? cell.getAttribute('data-sort') : null;\n });\n var numeric = values.every(function (value) { return value === null || DT_NUMBER.test(value); });\n var order = rows.map(function (row, position) { return position; });\n order.sort(function (a, b) {\n var x = values[a];\n var y = values[b];\n // Empty cells sort last in both directions; ties keep their current order.\n if (x === null || y === null) return x === y ? a - b : (x === null ? 1 : -1);\n var result = numeric ? Number(x) - Number(y) : (x < y ? -1 : (x > y ? 1 : 0));\n if (direction === 'descending') result = -result;\n return result || a - b;\n });\n var body = table.tBodies[0];\n order.forEach(function (position) { body.appendChild(rows[position]); });\n heads.forEach(function (cell) { cell.removeAttribute('aria-sort'); });\n head.setAttribute('aria-sort', direction);\n announce('Sorted by ' + (head.textContent || '').trim() + ', ' + direction);\n}\nfunction searchDataTable(block, table, query, speak) {\n var needle = String(query || '').trim().toLowerCase();\n var rows = dtRows(table);\n var shown = 0;\n rows.forEach(function (row) {\n var hit = needle === '' || (row.textContent || '').toLowerCase().indexOf(needle) !== -1;\n if (hit) row.removeAttribute('data-ak-dt-miss');\n else row.setAttribute('data-ak-dt-miss', '');\n if (hit && !row.hidden) shown += 1;\n });\n var total = rows.length;\n var noun = total === 1 ? ' row' : ' rows';\n var count = q('[data-ak-dt-count]', block);\n if (count) count.textContent = shown === total ? total + noun : shown + ' of ' + total + noun;\n var empty = q('[data-ak-dt-empty]', block);\n if (empty) empty.hidden = shown !== 0;\n if (speak) announce(shown + ' of ' + total + noun + ' shown');\n}\nfunction fitDataTables() {\n qa('[data-ak-data-table][data-ak-sticky]').forEach(function (block) {\n var wrap = q('.ak-table-wrap', block);\n if (!wrap) return;\n // Measure as a scroller; a table that fits needs no sideways scroll, so its\n // frame stops being a scroll container and the header can stick to the page.\n block.removeAttribute('data-ak-dt-fits');\n if (wrap.scrollWidth <= wrap.clientWidth + 1) block.setAttribute('data-ak-dt-fits', '');\n });\n}\nfunction wireDataTables() {\n var blocks = qa('[data-ak-data-table]');\n blocks.forEach(function (block) {\n var table = q('table', block);\n if (!table) return;\n dtHeads(table).forEach(function (head, index) {\n var button = doc.createElement('button');\n button.type = 'button';\n button.className = 'ak-dt-sort';\n while (head.firstChild) button.appendChild(head.firstChild);\n var icon = doc.createElement('span');\n icon.className = 'ak-dt-sort-icon';\n icon.setAttribute('aria-hidden', 'true');\n button.appendChild(icon);\n head.appendChild(button);\n button.addEventListener('click', function () { sortDataTable(table, index); }, false);\n });\n var input = q('[data-ak-dt-search]', block);\n if (input) {\n input.addEventListener('input', function () { searchDataTable(block, table, input.value, true); }, false);\n if (input.value) searchDataTable(block, table, input.value, false);\n }\n block.setAttribute('data-ak-table-ready', '');\n });\n if (!blocks.length) return;\n fitDataTables();\n var pending = false;\n window.addEventListener('resize', function () {\n if (pending) return;\n pending = true;\n window.requestAnimationFrame(function () { pending = false; fitDataTables(); });\n }, false);\n}";
|
|
15
|
+
//# sourceMappingURL=data-table-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-runtime.d.ts","sourceRoot":"","sources":["../../../src/blocks/data-table/data-table-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,kBAAkB,kqIA2F7B,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime for the data table: column sorting, row search and the sticky
|
|
3
|
+
* header's fit check. ES5-style, like `runtime.ts`, and emitted only on pages
|
|
4
|
+
* that use the feature.
|
|
5
|
+
*
|
|
6
|
+
* The markup reads completely without it: rows keep their authored order and
|
|
7
|
+
* the search bar stays hidden until `data-ak-table-ready` is set. Sort buttons
|
|
8
|
+
* are created here, inside each `<th>`, so a page without scripts never shows a
|
|
9
|
+
* control that does nothing.
|
|
10
|
+
*
|
|
11
|
+
* Search hides a row with `data-ak-dt-miss`, not `hidden`, so a filter that
|
|
12
|
+
* toggles `hidden` on the same rows composes with it instead of fighting it.
|
|
13
|
+
*/
|
|
14
|
+
export const DATA_TABLE_RUNTIME = `
|
|
15
|
+
var DT_NUMBER = /^-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?$/i;
|
|
16
|
+
function dtRows(table) { return table.tBodies.length ? Array.prototype.slice.call(table.tBodies[0].rows) : []; }
|
|
17
|
+
function dtHeads(table) { return table.tHead && table.tHead.rows.length ? Array.prototype.slice.call(table.tHead.rows[0].cells) : []; }
|
|
18
|
+
function sortDataTable(table, index) {
|
|
19
|
+
var heads = dtHeads(table);
|
|
20
|
+
var head = heads[index];
|
|
21
|
+
if (!head) return;
|
|
22
|
+
var direction = head.getAttribute('aria-sort') === 'ascending' ? 'descending' : 'ascending';
|
|
23
|
+
var rows = dtRows(table);
|
|
24
|
+
var values = rows.map(function (row) {
|
|
25
|
+
var cell = row.cells[index];
|
|
26
|
+
return cell && cell.hasAttribute('data-sort') ? cell.getAttribute('data-sort') : null;
|
|
27
|
+
});
|
|
28
|
+
var numeric = values.every(function (value) { return value === null || DT_NUMBER.test(value); });
|
|
29
|
+
var order = rows.map(function (row, position) { return position; });
|
|
30
|
+
order.sort(function (a, b) {
|
|
31
|
+
var x = values[a];
|
|
32
|
+
var y = values[b];
|
|
33
|
+
// Empty cells sort last in both directions; ties keep their current order.
|
|
34
|
+
if (x === null || y === null) return x === y ? a - b : (x === null ? 1 : -1);
|
|
35
|
+
var result = numeric ? Number(x) - Number(y) : (x < y ? -1 : (x > y ? 1 : 0));
|
|
36
|
+
if (direction === 'descending') result = -result;
|
|
37
|
+
return result || a - b;
|
|
38
|
+
});
|
|
39
|
+
var body = table.tBodies[0];
|
|
40
|
+
order.forEach(function (position) { body.appendChild(rows[position]); });
|
|
41
|
+
heads.forEach(function (cell) { cell.removeAttribute('aria-sort'); });
|
|
42
|
+
head.setAttribute('aria-sort', direction);
|
|
43
|
+
announce('Sorted by ' + (head.textContent || '').trim() + ', ' + direction);
|
|
44
|
+
}
|
|
45
|
+
function searchDataTable(block, table, query, speak) {
|
|
46
|
+
var needle = String(query || '').trim().toLowerCase();
|
|
47
|
+
var rows = dtRows(table);
|
|
48
|
+
var shown = 0;
|
|
49
|
+
rows.forEach(function (row) {
|
|
50
|
+
var hit = needle === '' || (row.textContent || '').toLowerCase().indexOf(needle) !== -1;
|
|
51
|
+
if (hit) row.removeAttribute('data-ak-dt-miss');
|
|
52
|
+
else row.setAttribute('data-ak-dt-miss', '');
|
|
53
|
+
if (hit && !row.hidden) shown += 1;
|
|
54
|
+
});
|
|
55
|
+
var total = rows.length;
|
|
56
|
+
var noun = total === 1 ? ' row' : ' rows';
|
|
57
|
+
var count = q('[data-ak-dt-count]', block);
|
|
58
|
+
if (count) count.textContent = shown === total ? total + noun : shown + ' of ' + total + noun;
|
|
59
|
+
var empty = q('[data-ak-dt-empty]', block);
|
|
60
|
+
if (empty) empty.hidden = shown !== 0;
|
|
61
|
+
if (speak) announce(shown + ' of ' + total + noun + ' shown');
|
|
62
|
+
}
|
|
63
|
+
function fitDataTables() {
|
|
64
|
+
qa('[data-ak-data-table][data-ak-sticky]').forEach(function (block) {
|
|
65
|
+
var wrap = q('.ak-table-wrap', block);
|
|
66
|
+
if (!wrap) return;
|
|
67
|
+
// Measure as a scroller; a table that fits needs no sideways scroll, so its
|
|
68
|
+
// frame stops being a scroll container and the header can stick to the page.
|
|
69
|
+
block.removeAttribute('data-ak-dt-fits');
|
|
70
|
+
if (wrap.scrollWidth <= wrap.clientWidth + 1) block.setAttribute('data-ak-dt-fits', '');
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function wireDataTables() {
|
|
74
|
+
var blocks = qa('[data-ak-data-table]');
|
|
75
|
+
blocks.forEach(function (block) {
|
|
76
|
+
var table = q('table', block);
|
|
77
|
+
if (!table) return;
|
|
78
|
+
dtHeads(table).forEach(function (head, index) {
|
|
79
|
+
var button = doc.createElement('button');
|
|
80
|
+
button.type = 'button';
|
|
81
|
+
button.className = 'ak-dt-sort';
|
|
82
|
+
while (head.firstChild) button.appendChild(head.firstChild);
|
|
83
|
+
var icon = doc.createElement('span');
|
|
84
|
+
icon.className = 'ak-dt-sort-icon';
|
|
85
|
+
icon.setAttribute('aria-hidden', 'true');
|
|
86
|
+
button.appendChild(icon);
|
|
87
|
+
head.appendChild(button);
|
|
88
|
+
button.addEventListener('click', function () { sortDataTable(table, index); }, false);
|
|
89
|
+
});
|
|
90
|
+
var input = q('[data-ak-dt-search]', block);
|
|
91
|
+
if (input) {
|
|
92
|
+
input.addEventListener('input', function () { searchDataTable(block, table, input.value, true); }, false);
|
|
93
|
+
if (input.value) searchDataTable(block, table, input.value, false);
|
|
94
|
+
}
|
|
95
|
+
block.setAttribute('data-ak-table-ready', '');
|
|
96
|
+
});
|
|
97
|
+
if (!blocks.length) return;
|
|
98
|
+
fitDataTables();
|
|
99
|
+
var pending = false;
|
|
100
|
+
window.addEventListener('resize', function () {
|
|
101
|
+
if (pending) return;
|
|
102
|
+
pending = true;
|
|
103
|
+
window.requestAnimationFrame(function () { pending = false; fitDataTables(); });
|
|
104
|
+
}, false);
|
|
105
|
+
}`;
|
|
106
|
+
//# sourceMappingURL=data-table-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-runtime.js","sourceRoot":"","sources":["../../../src/blocks/data-table/data-table-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FhC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature sheet for the data table. It builds on the base table frame
|
|
3
|
+
* (`.ak-table-wrap`, `th`, `td`, `.ak-num`), adding the search bar, sort
|
|
4
|
+
* buttons, typed cells, the sticky header and the card layout on phones.
|
|
5
|
+
*
|
|
6
|
+
* Every control is hidden until the runtime marks the block ready, and print
|
|
7
|
+
* hides them again and shows every row, so the table reads completely without
|
|
8
|
+
* scripts and on paper.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DATA_TABLE_CSS: string;
|
|
11
|
+
//# sourceMappingURL=data-table-styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-styles.d.ts","sourceRoot":"","sources":["../../../src/blocks/data-table/data-table-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4EH,eAAO,MAAM,cAAc,QAAgE,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature sheet for the data table. It builds on the base table frame
|
|
3
|
+
* (`.ak-table-wrap`, `th`, `td`, `.ak-num`), adding the search bar, sort
|
|
4
|
+
* buttons, typed cells, the sticky header and the card layout on phones.
|
|
5
|
+
*
|
|
6
|
+
* Every control is hidden until the runtime marks the block ready, and print
|
|
7
|
+
* hides them again and shows every row, so the table reads completely without
|
|
8
|
+
* scripts and on paper.
|
|
9
|
+
*/
|
|
10
|
+
import { TRANSITION, UNIT } from '../../render/style-units.js';
|
|
11
|
+
const ROOT = '.ak-data-table';
|
|
12
|
+
const SR_ONLY = 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0';
|
|
13
|
+
const TOOLS = `${ROOT}{display:flex;flex-direction:column;gap:${UNIT(1.5)}}
|
|
14
|
+
${ROOT} .ak-table-wrap{position:relative}
|
|
15
|
+
${ROOT}:not([data-ak-table-ready]) .ak-dt-tools{display:none}
|
|
16
|
+
${ROOT} .ak-dt-tools{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:${UNIT(1)} ${UNIT(2)}}
|
|
17
|
+
${ROOT} .ak-dt-search{display:flex;align-items:center;gap:.6em;flex:1 1 240px;max-width:360px}
|
|
18
|
+
${ROOT} .ak-dt-search input{flex:1 1 auto;min-width:0;font:inherit;font-size:.94rem;min-height:40px;padding:.45em .9em;border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);background:var(--ak-color-surface);color:var(--ak-color-text);box-shadow:inset 0 1px 2px color-mix(in srgb,var(--ak-color-text) 6%,transparent);${TRANSITION}}
|
|
19
|
+
${ROOT} .ak-dt-search input::placeholder{color:var(--ak-color-text-muted);opacity:.85}
|
|
20
|
+
${ROOT} .ak-dt-search input:hover{border-color:color-mix(in srgb,var(--ak-color-text) 30%,var(--ak-color-border))}
|
|
21
|
+
${ROOT} .ak-dt-search input:focus-visible{outline:0;border-color:var(--ak-color-accent);box-shadow:var(--ak-ring)}
|
|
22
|
+
${ROOT} .ak-dt-count{margin:0;font-family:var(--ak-font-mono);font-size:.72rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ak-color-text-muted);font-variant-numeric:tabular-nums}
|
|
23
|
+
${ROOT} .ak-dt-empty{margin:0;padding:${UNIT(2)};text-align:center;color:var(--ak-color-text-muted);border:var(--ak-border-width) dashed var(--ak-color-border);border-radius:var(--ak-radius-medium)}
|
|
24
|
+
${ROOT} .ak-dt-empty[hidden]{display:none}
|
|
25
|
+
${ROOT} tbody tr[data-ak-dt-miss]{display:none}`;
|
|
26
|
+
const SORT = `${ROOT} .ak-dt-sort{display:inline-flex;align-items:center;gap:.45em;font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;background:none;border:0;padding:0;margin:0;cursor:pointer;white-space:nowrap;${TRANSITION}}
|
|
27
|
+
${ROOT} th.ak-num .ak-dt-sort{flex-direction:row-reverse}
|
|
28
|
+
${ROOT} .ak-dt-sort:hover,${ROOT} th[aria-sort] .ak-dt-sort{color:var(--ak-color-text)}
|
|
29
|
+
${ROOT} .ak-dt-sort-icon{display:inline-block;width:1em;text-align:center;color:var(--ak-color-text-muted);opacity:.55}
|
|
30
|
+
${ROOT} .ak-dt-sort-icon::before{content:"\\2195"}
|
|
31
|
+
${ROOT} th[aria-sort] .ak-dt-sort-icon{color:var(--ak-color-accent);opacity:1}
|
|
32
|
+
${ROOT} th[aria-sort="ascending"] .ak-dt-sort-icon::before{content:"\\2191"}
|
|
33
|
+
${ROOT} th[aria-sort="descending"] .ak-dt-sort-icon::before{content:"\\2193"}`;
|
|
34
|
+
const CELLS = `${ROOT} .ak-dt-center{text-align:center}
|
|
35
|
+
${ROOT} .ak-dt-nowrap{white-space:nowrap}
|
|
36
|
+
${ROOT} tbody th[scope="row"]{font-weight:600;white-space:nowrap}
|
|
37
|
+
${ROOT} td a{overflow-wrap:anywhere}
|
|
38
|
+
${ROOT} .ak-dt-progress{display:inline-flex;align-items:center;gap:.65em;white-space:nowrap}
|
|
39
|
+
${ROOT} meter{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:5.5em;height:.5em;border:0;border-radius:999px;background:color-mix(in srgb,var(--ak-color-text) 9%,var(--ak-color-surface));overflow:hidden;vertical-align:middle}
|
|
40
|
+
${ROOT} meter::-webkit-meter-bar{height:.5em;border:0;border-radius:999px;background:color-mix(in srgb,var(--ak-color-text) 9%,var(--ak-color-surface))}
|
|
41
|
+
${ROOT} meter::-webkit-meter-optimum-value,${ROOT} meter::-webkit-meter-suboptimum-value,${ROOT} meter::-webkit-meter-even-less-good-value{border-radius:999px;background:linear-gradient(90deg,color-mix(in srgb,var(--ak-color-accent) 62%,transparent),var(--ak-color-accent))}
|
|
42
|
+
${ROOT} meter::-moz-meter-bar{border-radius:999px;background:linear-gradient(90deg,color-mix(in srgb,var(--ak-color-accent) 62%,transparent),var(--ak-color-accent))}
|
|
43
|
+
${ROOT} .ak-dt-spark{display:inline-block;width:6.5em;height:1.6em;vertical-align:middle;overflow:visible}
|
|
44
|
+
${ROOT} .ak-dt-spark-area{fill:color-mix(in srgb,var(--ak-color-accent) 14%,transparent)}
|
|
45
|
+
${ROOT} .ak-dt-spark-line{fill:none;stroke:var(--ak-color-accent);stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}`;
|
|
46
|
+
/**
|
|
47
|
+
* Sticky header, above the card breakpoint only. A frame that has to scroll
|
|
48
|
+
* sideways is the header's scroll container, so the header sticks to the page
|
|
49
|
+
* only once the runtime finds the table fits and clips the frame instead.
|
|
50
|
+
*/
|
|
51
|
+
const STICKY = `@media (min-width:561px){${ROOT}[data-ak-sticky] thead th{position:sticky;top:0;z-index:1;box-shadow:inset 0 calc(var(--ak-border-width) * -1) 0 var(--ak-color-border)}${ROOT}[data-ak-sticky][data-ak-dt-fits] .ak-table-wrap{overflow:clip}}`;
|
|
52
|
+
/** At 560px and below every row becomes a card of labelled values. */
|
|
53
|
+
const CARDS = `@media (max-width:560px){${ROOT} .ak-table-wrap{overflow:visible;border:0;border-radius:0;background:none;box-shadow:none;animation:none}
|
|
54
|
+
${ROOT} table,${ROOT} tbody,${ROOT} tbody tr,${ROOT} tbody td,${ROOT} tbody th{display:block;width:auto;min-width:0}
|
|
55
|
+
${ROOT} tbody tr[hidden]{display:none}
|
|
56
|
+
${ROOT} thead{${SR_ONLY}}
|
|
57
|
+
${ROOT}[data-ak-table-ready] thead{position:static;width:auto;height:auto;margin:0 0 ${UNIT(1)};overflow:visible;clip:auto;white-space:normal;display:block}
|
|
58
|
+
${ROOT}[data-ak-table-ready] thead tr{display:flex;flex-wrap:wrap;gap:${UNIT(0.75)}}
|
|
59
|
+
${ROOT}[data-ak-table-ready] thead th{padding:0;border:0;background:none;box-shadow:none}
|
|
60
|
+
${ROOT}[data-ak-table-ready] .ak-dt-sort{min-height:44px;padding:0 .9em;border:var(--ak-border-width) solid var(--ak-color-border);border-radius:999px;background:var(--ak-color-surface)}
|
|
61
|
+
${ROOT}[data-ak-table-ready] th[aria-sort] .ak-dt-sort{border-color:color-mix(in srgb,var(--ak-color-accent) 45%,var(--ak-color-border))}
|
|
62
|
+
${ROOT} tbody tr{margin:0 0 ${UNIT(1.5)};padding:${UNIT(0.5)} ${UNIT(2)};border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);background:var(--ak-fill);box-shadow:var(--ak-elevation-card)}
|
|
63
|
+
${ROOT} tbody tr:hover{background:var(--ak-fill)}
|
|
64
|
+
${ROOT} tbody tr > *{display:flex;align-items:center;justify-content:space-between;gap:${UNIT(2)};padding:.6em 0;text-align:right;min-width:0;overflow-wrap:anywhere}
|
|
65
|
+
${ROOT} tbody tr > *:not(:last-child){border-bottom:var(--ak-border-width) solid var(--ak-color-border)}
|
|
66
|
+
${ROOT} tbody tr > *::before{content:attr(data-label);flex:none;max-width:45%;text-align:left;font-family:var(--ak-font-mono);font-size:.7rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--ak-color-text-muted)}
|
|
67
|
+
${ROOT} tbody th[scope="row"]{justify-content:flex-start;text-align:left;font-family:var(--ak-font-heading);font-size:1.02rem}
|
|
68
|
+
${ROOT} tbody th[scope="row"]::before{display:none}
|
|
69
|
+
${ROOT} .ak-dt-search{max-width:none}
|
|
70
|
+
${ROOT} .ak-dt-search input{min-height:44px}}`;
|
|
71
|
+
const NARROW = `@media (max-width:768px) and (min-width:561px){${ROOT}[data-ak-table-ready] thead th{padding-top:0;padding-bottom:0}${ROOT} .ak-dt-sort{min-height:44px}${ROOT} .ak-dt-search input{min-height:44px}}`;
|
|
72
|
+
const PRINT = `@media print{${ROOT} .ak-dt-tools,${ROOT} .ak-dt-empty,${ROOT} .ak-dt-sort-icon{display:none!important}${ROOT} tbody tr[data-ak-dt-miss]{display:table-row!important}${ROOT} thead th{position:static!important}${ROOT} tbody tr{break-inside:avoid}}`;
|
|
73
|
+
export const DATA_TABLE_CSS = [TOOLS, SORT, CELLS, STICKY, NARROW, CARDS, PRINT].join('\n');
|
|
74
|
+
//# sourceMappingURL=data-table-styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-styles.js","sourceRoot":"","sources":["../../../src/blocks/data-table/data-table-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAE9B,MAAM,OAAO,GACX,6HAA6H,CAAC;AAEhI,MAAM,KAAK,GAAG,GAAG,IAAI,2CAA2C,IAAI,CAAC,GAAG,CAAC;EACvE,IAAI;EACJ,IAAI;EACJ,IAAI,kGAAkG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;EACxH,IAAI;EACJ,IAAI,oWAAoW,UAAU;EAClX,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,kCAAkC,IAAI,CAAC,CAAC,CAAC;EAC7C,IAAI;EACJ,IAAI,0CAA0C,CAAC;AAEjD,MAAM,IAAI,GAAG,GAAG,IAAI,wNAAwN,UAAU;EACpP,IAAI;EACJ,IAAI,sBAAsB,IAAI;EAC9B,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,wEAAwE,CAAC;AAE/E,MAAM,KAAK,GAAG,GAAG,IAAI;EACnB,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,uCAAuC,IAAI,0CAA0C,IAAI;EAC7F,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,0HAA0H,CAAC;AAEjI;;;;GAIG;AACH,MAAM,MAAM,GAAG,4BAA4B,IAAI,2IAA2I,IAAI,kEAAkE,CAAC;AAEjQ,sEAAsE;AACtE,MAAM,KAAK,GAAG,4BAA4B,IAAI;EAC5C,IAAI,UAAU,IAAI,UAAU,IAAI,aAAa,IAAI,aAAa,IAAI;EAClE,IAAI;EACJ,IAAI,UAAU,OAAO;EACrB,IAAI,iFAAiF,IAAI,CAAC,CAAC,CAAC;EAC5F,IAAI,kEAAkE,IAAI,CAAC,IAAI,CAAC;EAChF,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,wBAAwB,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;EACrE,IAAI;EACJ,IAAI,mFAAmF,IAAI,CAAC,CAAC,CAAC;EAC9F,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,wCAAwC,CAAC;AAE/C,MAAM,MAAM,GAAG,kDAAkD,IAAI,iEAAiE,IAAI,gCAAgC,IAAI,wCAAwC,CAAC;AAEvN,MAAM,KAAK,GAAG,gBAAgB,IAAI,iBAAiB,IAAI,iBAAiB,IAAI,4CAA4C,IAAI,0DAA0D,IAAI,uCAAuC,IAAI,gCAAgC,CAAC;AAEtQ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data table block: a typed, sortable and searchable table bound to a dataset.
|
|
3
|
+
*
|
|
4
|
+
* The compiler owns the behaviors: sorting is on every column, search appears
|
|
5
|
+
* past 10 rows (unless a filter-bar targets the table), the header sticks past
|
|
6
|
+
* 12, and phones get labelled cards. The
|
|
7
|
+
* emitted table is complete without scripts, in the authored (and
|
|
8
|
+
* transformed) row order.
|
|
9
|
+
*/
|
|
10
|
+
import type { BlockModule } from '../../registry/block-module.js';
|
|
11
|
+
/** Search appears when a table has more rows than this. */
|
|
12
|
+
export declare const SEARCH_THRESHOLD = 10;
|
|
13
|
+
/** The header sticks when a table has more rows than this. */
|
|
14
|
+
export declare const STICKY_THRESHOLD = 12;
|
|
15
|
+
export declare const DATA_TABLE_FEATURE = "data-table";
|
|
16
|
+
export declare const dataTableBlock: BlockModule;
|
|
17
|
+
//# sourceMappingURL=data-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../src/blocks/data-table/data-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAqBlE,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AA0H/C,eAAO,MAAM,cAAc,EAAE,WA+B5B,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data table block: a typed, sortable and searchable table bound to a dataset.
|
|
3
|
+
*
|
|
4
|
+
* The compiler owns the behaviors: sorting is on every column, search appears
|
|
5
|
+
* past 10 rows (unless a filter-bar targets the table), the header sticks past
|
|
6
|
+
* 12, and phones get labelled cards. The
|
|
7
|
+
* emitted table is complete without scripts, in the authored (and
|
|
8
|
+
* transformed) row order.
|
|
9
|
+
*/
|
|
10
|
+
import { fieldValue } from '../../data/dataset-types.js';
|
|
11
|
+
import { anchorProps, define, list, OPTIONAL_TITLE, str } from '../../registry/define-helpers.js';
|
|
12
|
+
import { element, filterRowAttributes, nodeAttributes, stringProp, titleHeader, } from '../../render/block-helpers.js';
|
|
13
|
+
import { escapeText, renderAttributes } from '../../render/escape.js';
|
|
14
|
+
import { FILTER_BAR_TYPE } from '../controls/control-shared.js';
|
|
15
|
+
import { alignClass, renderCell, sortValue } from './data-table-cells.js';
|
|
16
|
+
import { checkDataTable } from './data-table-check.js';
|
|
17
|
+
import { COLUMN_SCHEMA, MAX_COLUMNS, resolveColumns, } from './data-table-columns.js';
|
|
18
|
+
/** Search appears when a table has more rows than this. */
|
|
19
|
+
export const SEARCH_THRESHOLD = 10;
|
|
20
|
+
/** The header sticks when a table has more rows than this. */
|
|
21
|
+
export const STICKY_THRESHOLD = 12;
|
|
22
|
+
export const DATA_TABLE_FEATURE = 'data-table';
|
|
23
|
+
const NUMERIC_TEXT = /^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i;
|
|
24
|
+
/** Compare two raw cell values the way the sort runtime does. */
|
|
25
|
+
function compareRaw(a, b, numeric) {
|
|
26
|
+
if (numeric)
|
|
27
|
+
return Number(a) - Number(b);
|
|
28
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The column the rows already arrive sorted by, so the header can say so. The
|
|
32
|
+
* transform itself does not reach the IR, so this reads the order from the
|
|
33
|
+
* rows: the first column whose values (at least 3 rows, no empty cell, two or
|
|
34
|
+
* more distinct values) run in one direction. Whatever it reports is true of
|
|
35
|
+
* the emitted rows.
|
|
36
|
+
*/
|
|
37
|
+
function initialSort(rows, columns) {
|
|
38
|
+
const marks = new Map();
|
|
39
|
+
if (rows.length < 3)
|
|
40
|
+
return marks;
|
|
41
|
+
for (const [index, column] of columns.entries()) {
|
|
42
|
+
const values = rows.map((row) => sortValue(fieldValue(row, column.key)));
|
|
43
|
+
if (values.some((value) => value === undefined))
|
|
44
|
+
continue;
|
|
45
|
+
const raw = values;
|
|
46
|
+
const numeric = raw.every((value) => NUMERIC_TEXT.test(value));
|
|
47
|
+
let ascending = true;
|
|
48
|
+
let descending = true;
|
|
49
|
+
for (let position = 1; position < raw.length; position += 1) {
|
|
50
|
+
const order = compareRaw(raw[position - 1], raw[position], numeric);
|
|
51
|
+
if (order > 0)
|
|
52
|
+
ascending = false;
|
|
53
|
+
if (order < 0)
|
|
54
|
+
descending = false;
|
|
55
|
+
}
|
|
56
|
+
if (ascending === descending)
|
|
57
|
+
continue;
|
|
58
|
+
marks.set(index, ascending ? 'ascending' : 'descending');
|
|
59
|
+
return marks;
|
|
60
|
+
}
|
|
61
|
+
return marks;
|
|
62
|
+
}
|
|
63
|
+
function caption(node) {
|
|
64
|
+
const title = stringProp(node, 'title');
|
|
65
|
+
const text = stringProp(node, 'caption');
|
|
66
|
+
// A visible heading already names the table: the caption then only speaks,
|
|
67
|
+
// unless it says something the heading does not.
|
|
68
|
+
if (text === '' && title === '')
|
|
69
|
+
return '';
|
|
70
|
+
if (text === '' || text === title)
|
|
71
|
+
return `<caption class="ak-sr">${escapeText(title)}</caption>`;
|
|
72
|
+
return `<caption>${escapeText(text)}</caption>`;
|
|
73
|
+
}
|
|
74
|
+
function tools(node, rows) {
|
|
75
|
+
const label = stringProp(node, 'title', 'table');
|
|
76
|
+
// Node ids are unique on the page, so the input id is too.
|
|
77
|
+
const id = `${node.id}-search`;
|
|
78
|
+
return [
|
|
79
|
+
'<div class="ak-dt-tools">',
|
|
80
|
+
`<label${renderAttributes({ class: 'ak-dt-search', for: id })}><span class="ak-sr">Search ${escapeText(label)}</span>`,
|
|
81
|
+
`<input${renderAttributes({ id, type: 'search', placeholder: 'Search rows', autocomplete: 'off', 'data-ak-dt-search': true })} /></label>`,
|
|
82
|
+
`<p class="ak-dt-count" data-ak-dt-count>${rows} rows</p>`,
|
|
83
|
+
'</div>',
|
|
84
|
+
].join('');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* True when a filter-bar on the page targets this table. The bar then owns row
|
|
88
|
+
* filtering (it offers its own search child), so the table emits no search box
|
|
89
|
+
* of its own: two independent filters over the same rows would fight, the
|
|
90
|
+
* last one to run winning. Decided at compile time from the IR.
|
|
91
|
+
*/
|
|
92
|
+
function filteredByBar(node, context) {
|
|
93
|
+
return context.ir.nodes.some((other) => other.type === FILTER_BAR_TYPE && other.props.target === node.id);
|
|
94
|
+
}
|
|
95
|
+
function render(node, context) {
|
|
96
|
+
const columns = resolveColumns(node);
|
|
97
|
+
const rows = node.data?.rows ?? [];
|
|
98
|
+
const sorted = initialSort(rows, columns);
|
|
99
|
+
const head = columns
|
|
100
|
+
.map((column, index) => `<th${renderAttributes({
|
|
101
|
+
scope: 'col',
|
|
102
|
+
class: alignClass(column),
|
|
103
|
+
'aria-sort': sorted.get(index),
|
|
104
|
+
})}>${escapeText(column.label)}</th>`)
|
|
105
|
+
.join('');
|
|
106
|
+
const body = rows
|
|
107
|
+
.map((row) => `<tr${renderAttributes(filterRowAttributes(row))}>${columns
|
|
108
|
+
.map((column, index) => renderCell(column, row, index === 0))
|
|
109
|
+
.join('')}</tr>`)
|
|
110
|
+
.join('');
|
|
111
|
+
const searchable = rows.length > SEARCH_THRESHOLD && !filteredByBar(node, context);
|
|
112
|
+
const empty = rows.length === 0
|
|
113
|
+
? '<p class="ak-dt-empty">No rows.</p>'
|
|
114
|
+
: searchable
|
|
115
|
+
? '<p class="ak-dt-empty" data-ak-dt-empty hidden>No rows match the search.</p>'
|
|
116
|
+
: '';
|
|
117
|
+
return element('section', nodeAttributes(node, {
|
|
118
|
+
class: 'ak-block ak-data-table',
|
|
119
|
+
'data-ak-data-table': true,
|
|
120
|
+
'data-ak-sticky': rows.length > STICKY_THRESHOLD,
|
|
121
|
+
}), [
|
|
122
|
+
titleHeader(node),
|
|
123
|
+
searchable ? tools(node, rows.length) : '',
|
|
124
|
+
`<div class="ak-table-wrap"><table>${caption(node)}<thead><tr>${head}</tr></thead><tbody>${body}</tbody></table></div>`,
|
|
125
|
+
empty,
|
|
126
|
+
].join(''));
|
|
127
|
+
}
|
|
128
|
+
export const dataTableBlock = {
|
|
129
|
+
definition: define({
|
|
130
|
+
type: 'data-table',
|
|
131
|
+
kind: 'semantic',
|
|
132
|
+
category: 'data',
|
|
133
|
+
tags: ['table', 'dataset', 'sort', 'filter', 'metrics'],
|
|
134
|
+
useCases: ['benchmark results', 'run history', 'ranked metrics', 'status inventory'],
|
|
135
|
+
purpose: 'Typed, sortable, searchable table of dataset rows.',
|
|
136
|
+
summary: 'Data table: typed columns (number, percent, badge, link, progress, sparkline), sort, search.',
|
|
137
|
+
data: { required: true, description: 'Rows to list; each column reads one field.' },
|
|
138
|
+
filterable: true,
|
|
139
|
+
props: {
|
|
140
|
+
title: OPTIONAL_TITLE,
|
|
141
|
+
caption: str({
|
|
142
|
+
maxLength: 200,
|
|
143
|
+
description: 'Table caption; spoken only when it repeats the title.',
|
|
144
|
+
}),
|
|
145
|
+
columns: list(COLUMN_SCHEMA, {
|
|
146
|
+
minItems: 1,
|
|
147
|
+
maxItems: MAX_COLUMNS,
|
|
148
|
+
description: 'Omitted: the first 8 data fields.',
|
|
149
|
+
}),
|
|
150
|
+
...anchorProps,
|
|
151
|
+
},
|
|
152
|
+
runtimeFeatures: [DATA_TABLE_FEATURE],
|
|
153
|
+
a11y: 'A real <table> with column and row headers and a caption; sort buttons set aria-sort and announce the order; search announces the row count.',
|
|
154
|
+
serializer: 'Serializes to its columns and data binding, never to rendered rows.',
|
|
155
|
+
}),
|
|
156
|
+
render,
|
|
157
|
+
check: checkDataTable,
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=data-table.js.map
|