@chengxianglibra/dsh-data-analysis 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +83 -34
  2. package/lib/bin/environment.js +1 -1
  3. package/lib/bin/presentation-lint.js +21 -0
  4. package/lib/bridges.js +2 -2
  5. package/lib/client/credentials/create-datasource.js +67 -0
  6. package/lib/client/credentials/install.js +191 -0
  7. package/lib/client/credentials/model.js +494 -0
  8. package/lib/client/credentials/styles.js +17 -0
  9. package/lib/client/workspace-header-action.js +11 -0
  10. package/lib/client.js +1133 -736
  11. package/lib/compatibility.js +1 -1
  12. package/lib/datasource/authoring.js +70 -0
  13. package/lib/datasource/bridge-programs.js +30 -18
  14. package/lib/datasource/bridge.js +100 -8
  15. package/lib/datasource/index.js +3 -2
  16. package/lib/datasource/python.js +115 -0
  17. package/lib/datasource/resolver-program.js +112 -0
  18. package/lib/datasource/rpc.js +88 -0
  19. package/lib/datasource/service.js +687 -0
  20. package/lib/datasource/shell-env.js +2 -333
  21. package/lib/datasource/test.js +24 -51
  22. package/lib/environment/binding.js +54 -9
  23. package/lib/environment/runtime.js +89 -78
  24. package/lib/environment/subprocess.js +6 -1
  25. package/lib/environment/summary.js +3 -3
  26. package/lib/environment/workspace.js +5 -0
  27. package/lib/index.js +1 -1
  28. package/lib/plugin.js +168 -51
  29. package/lib/presentation/assets/portable.js +606 -0
  30. package/lib/presentation/assets/static.js +945 -0
  31. package/lib/presentation/build/index.js +71 -0
  32. package/lib/presentation/commit.js +156 -0
  33. package/lib/presentation/contracts/charts.js +476 -0
  34. package/lib/presentation/contracts/editing.js +58 -0
  35. package/lib/presentation/contracts/index.js +651 -0
  36. package/lib/presentation/contracts/interaction.js +62 -0
  37. package/lib/presentation/contracts/types.js +15 -0
  38. package/lib/presentation/contracts/values.js +28 -0
  39. package/lib/presentation/delivery.js +56 -0
  40. package/lib/presentation/files.js +83 -0
  41. package/lib/presentation/index.js +6 -0
  42. package/lib/presentation/lint.js +46 -0
  43. package/lib/presentation/projection/files.js +85 -0
  44. package/lib/presentation/projection/index.js +195 -0
  45. package/lib/presentation/projection/program.js +144 -0
  46. package/lib/presentation/projection/sql-code.js +79 -0
  47. package/lib/presentation/receipt.js +34 -0
  48. package/lib/presentation/reports.js +122 -0
  49. package/lib/presentation/rpc.js +148 -0
  50. package/lib/presentation/tool.js +122 -0
  51. package/lib/python-execution-contracts.js +1 -0
  52. package/lib/python-execution.js +232 -0
  53. package/lib/semantic-browser/contracts.js +80 -0
  54. package/lib/semantic-browser/definition.js +64 -0
  55. package/lib/semantic-browser/program.js +119 -0
  56. package/lib/semantic-browser/service.js +72 -0
  57. package/lib/semantic-reference/bridge.js +118 -0
  58. package/lib/semantic-reference/contracts.js +113 -0
  59. package/lib/semantic-reference/index.js +3 -0
  60. package/lib/semantic-reference/rpc.js +122 -0
  61. package/lib/semantic-reference/search.js +94 -0
  62. package/lib/semantic-reference/usage.js +143 -0
  63. package/lib/types/bridges.d.ts +2 -2
  64. package/lib/types/client/credentials/create-datasource.d.ts +5 -0
  65. package/lib/types/client/credentials/install.d.ts +1 -0
  66. package/lib/types/client/credentials/model.d.ts +59 -0
  67. package/lib/types/client/credentials/styles.d.ts +1 -0
  68. package/lib/types/client/presentation/ask-dsh.d.ts +9 -0
  69. package/lib/types/client/presentation/chart-explorer.d.ts +12 -0
  70. package/lib/types/client/presentation/chart-geometry.d.ts +30 -0
  71. package/lib/types/client/presentation/chart-renderer.d.ts +10 -0
  72. package/lib/types/client/presentation/chart-specials.d.ts +10 -0
  73. package/lib/types/client/presentation/chart-styles.d.ts +1 -0
  74. package/lib/types/client/presentation/chart-tooltip.d.ts +13 -0
  75. package/lib/types/client/presentation/chart-view.d.ts +23 -0
  76. package/lib/types/client/presentation/copy-context.d.ts +5 -0
  77. package/lib/types/client/presentation/delivery-model.d.ts +54 -0
  78. package/lib/types/client/presentation/delivery.d.ts +77 -0
  79. package/lib/types/client/presentation/editor-controls.d.ts +12 -0
  80. package/lib/types/client/presentation/global-filters.d.ts +6 -0
  81. package/lib/types/client/presentation/host-entry.d.ts +12 -0
  82. package/lib/types/client/presentation/icons.d.ts +4 -0
  83. package/lib/types/client/presentation/install.d.ts +15 -0
  84. package/lib/types/client/presentation/markdown.d.ts +5 -0
  85. package/lib/types/client/presentation/model.d.ts +62 -0
  86. package/lib/types/client/presentation/reader.d.ts +11 -0
  87. package/lib/types/client/presentation/source-code-model.d.ts +16 -0
  88. package/lib/types/client/presentation/source-code.d.ts +11 -0
  89. package/lib/types/client/presentation/source-dialog.d.ts +13 -0
  90. package/lib/types/client/presentation/source-facts.d.ts +20 -0
  91. package/lib/types/client/presentation/source-format.d.ts +5 -0
  92. package/lib/types/client/presentation/source-highlight.d.ts +7 -0
  93. package/lib/types/client/presentation/sources.d.ts +13 -0
  94. package/lib/types/client/presentation/styles.d.ts +1 -0
  95. package/lib/types/client/presentation/table.d.ts +12 -0
  96. package/lib/types/client/presentation/use-element-width.d.ts +5 -0
  97. package/lib/types/client/workspace-header-action.d.ts +7 -0
  98. package/lib/types/client.d.ts +4 -122
  99. package/lib/types/compatibility.d.ts +2 -2
  100. package/lib/types/datasource/authoring.d.ts +25 -0
  101. package/lib/types/datasource/bridge.d.ts +21 -3
  102. package/lib/types/datasource/index.d.ts +3 -5
  103. package/lib/types/datasource/python.d.ts +4 -0
  104. package/lib/types/datasource/resolver-program.d.ts +6 -0
  105. package/lib/types/datasource/rpc.d.ts +4 -0
  106. package/lib/types/datasource/service.d.ts +112 -0
  107. package/lib/types/datasource/shell-env.d.ts +0 -29
  108. package/lib/types/datasource/test.d.ts +6 -29
  109. package/lib/types/environment/binding.d.ts +5 -1
  110. package/lib/types/environment/errors.d.ts +1 -1
  111. package/lib/types/environment/runtime.d.ts +5 -5
  112. package/lib/types/environment/types.d.ts +13 -2
  113. package/lib/types/index.d.ts +1 -1
  114. package/lib/types/plugin.d.ts +11 -5
  115. package/lib/types/presentation/build/index.d.ts +11 -0
  116. package/lib/types/presentation/commit.d.ts +4 -0
  117. package/lib/types/presentation/contracts/charts.d.ts +13 -0
  118. package/lib/types/presentation/contracts/editing.d.ts +8 -0
  119. package/lib/types/presentation/contracts/index.d.ts +11 -0
  120. package/lib/types/presentation/contracts/interaction.d.ts +8 -0
  121. package/lib/types/presentation/contracts/types.d.ts +252 -0
  122. package/lib/types/presentation/contracts/values.d.ts +9 -0
  123. package/lib/types/presentation/delivery.d.ts +3 -0
  124. package/lib/types/presentation/files.d.ts +7 -0
  125. package/lib/types/presentation/index.d.ts +6 -0
  126. package/lib/types/presentation/lint.d.ts +13 -0
  127. package/lib/types/presentation/projection/files.d.ts +2 -0
  128. package/lib/types/presentation/projection/index.d.ts +20 -0
  129. package/lib/types/presentation/projection/program.d.ts +2 -0
  130. package/lib/types/presentation/projection/sql-code.d.ts +2 -0
  131. package/lib/types/presentation/receipt.d.ts +14 -0
  132. package/lib/types/presentation/reports.d.ts +5 -0
  133. package/lib/types/presentation/rpc.d.ts +24 -0
  134. package/lib/types/presentation/tool.d.ts +12 -0
  135. package/lib/types/python-execution-contracts.d.ts +10 -0
  136. package/lib/types/python-execution.d.ts +10 -0
  137. package/lib/types/semantic-browser/contracts.d.ts +40 -0
  138. package/lib/types/semantic-browser/definition.d.ts +20 -0
  139. package/lib/types/semantic-browser/program.d.ts +2 -0
  140. package/lib/types/semantic-browser/service.d.ts +20 -0
  141. package/lib/types/semantic-reference/bridge.d.ts +11 -0
  142. package/lib/types/semantic-reference/contracts.d.ts +51 -0
  143. package/lib/types/semantic-reference/index.d.ts +3 -0
  144. package/lib/types/semantic-reference/rpc.d.ts +15 -0
  145. package/lib/types/semantic-reference/search.d.ts +10 -0
  146. package/lib/types/semantic-reference/usage.d.ts +43 -0
  147. package/package.json +43 -19
  148. package/python/presentation-kit/dist/dsh_data_analysis_presentation_kit-1.1.0-py3-none-any.whl +0 -0
  149. package/skills/dsh-data-analysis-presentation/SKILL.md +24 -0
  150. package/skills/dsh-data-analysis-presentation/references/chart-examples.md +18 -0
  151. package/skills/dsh-data-analysis-presentation/references/charts.md +55 -0
  152. package/skills/dsh-data-analysis-presentation/references/examples/artifact.draft.json +27 -0
  153. package/skills/dsh-data-analysis-presentation/references/examples/charts-bins.dataset.json +33 -0
  154. package/skills/dsh-data-analysis-presentation/references/examples/charts-boxes.dataset.json +45 -0
  155. package/skills/dsh-data-analysis-presentation/references/examples/charts-composition.dataset.json +33 -0
  156. package/skills/dsh-data-analysis-presentation/references/examples/charts-funnel.dataset.json +27 -0
  157. package/skills/dsh-data-analysis-presentation/references/examples/charts-precision.dataset.json +21 -0
  158. package/skills/dsh-data-analysis-presentation/references/examples/charts-series.dataset.json +58 -0
  159. package/skills/dsh-data-analysis-presentation/references/examples/charts-shares.dataset.json +33 -0
  160. package/skills/dsh-data-analysis-presentation/references/examples/charts-waterfall.dataset.json +44 -0
  161. package/skills/dsh-data-analysis-presentation/references/examples/charts.draft.json +392 -0
  162. package/skills/dsh-data-analysis-presentation/references/examples/comparison-selected.dataset.json +24 -0
  163. package/skills/dsh-data-analysis-presentation/references/examples/comparison-summary.dataset.json +22 -0
  164. package/skills/dsh-data-analysis-presentation/references/examples/comparison.dataset.json +18 -0
  165. package/skills/dsh-data-analysis-presentation/references/examples/comparison.draft.json +79 -0
  166. package/skills/dsh-data-analysis-presentation/references/examples/computed-sources.draft.json +35 -0
  167. package/skills/dsh-data-analysis-presentation/references/examples/computed.dataset.json +12 -0
  168. package/skills/dsh-data-analysis-presentation/references/examples/computed.draft.json +57 -0
  169. package/skills/dsh-data-analysis-presentation/references/examples/interaction-detail.dataset.json +30 -0
  170. package/skills/dsh-data-analysis-presentation/references/examples/interaction-summary.dataset.json +22 -0
  171. package/skills/dsh-data-analysis-presentation/references/examples/interaction.draft.json +278 -0
  172. package/skills/dsh-data-analysis-presentation/references/examples/source-only.draft.json +19 -0
  173. package/skills/dsh-data-analysis-presentation/references/examples/write-charts.py +73 -0
  174. package/skills/dsh-data-analysis-presentation/references/examples/write-comparison.py +42 -0
  175. package/skills/dsh-data-analysis-presentation/references/examples/write-computed.py +21 -0
  176. package/skills/dsh-data-analysis-presentation/references/examples/write-interaction.py +33 -0
  177. package/skills/dsh-data-analysis-presentation/references/examples.md +42 -0
  178. package/skills/dsh-data-analysis-presentation/references/interaction.md +56 -0
  179. package/skills/dsh-data-analysis-presentation/references/narrative.md +37 -0
  180. package/skills/dsh-data-analysis-presentation/references/schema.md +138 -0
  181. package/lib/datasource/access.js +0 -60
  182. package/lib/datasource/credentials.js +0 -24
  183. package/lib/evidence/bridge-program.js +0 -153
  184. package/lib/evidence/bridge.js +0 -166
  185. package/lib/evidence/index.js +0 -2
  186. package/lib/evidence/sources.js +0 -263
  187. package/lib/types/datasource/access.d.ts +0 -27
  188. package/lib/types/evidence/bridge.d.ts +0 -40
  189. package/lib/types/evidence/index.d.ts +0 -4
  190. package/lib/types/evidence/sources.d.ts +0 -57
  191. package/python/report-kit/dist/dsh_data_analysis_report_kit-3.0.0-py3-none-any.whl +0 -0
  192. package/skills/dsh-data-analysis-report/SKILL.md +0 -57
  193. package/skills/dsh-data-analysis-report/assets/marivo-artifact.js +0 -113
  194. package/skills/dsh-data-analysis-report/assets/marivo-session-dag.js +0 -1201
  195. package/skills/dsh-data-analysis-report/assets/report-data.js +0 -449
@@ -0,0 +1 @@
1
+ export declare const credentialStyles = "\n.mc-input-heading{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 12px;min-width:0}.mc-input-name{font-weight:500;color:var(--mc-text);overflow-wrap:anywhere}.mc-input-description{flex:1 1 200px;min-width:0;font-size:11px;line-height:1.6;color:var(--mc-muted);overflow-wrap:anywhere}\n.mc-dialog{--mc-bg:var(--dsw-alias-surface-primary,#fff);--mc-soft:var(--dsw-alias-interactive-bg-hover,#f5f7f9);--mc-text:var(--dsw-alias-label-primary,#182a33);--mc-muted:var(--dsw-alias-label-secondary,#627580);--mc-border:var(--dsw-alias-border-l2,#dce4e8);--mc-accent:#087b70;--mc-tint:#eaf6f2;--mc-danger:#b04436;--mc-warning:#886217;color:var(--mc-text);background:var(--mc-bg);border:1px solid var(--mc-border);border-radius:16px;width:calc(100vw - 48px);max-width:1060px;height:min(760px,calc(100dvh - 64px));max-height:calc(100dvh - 32px);padding:0;box-shadow:0 28px 100px #0003;pointer-events:auto;font:14px/1.55 system-ui,sans-serif;overflow:hidden}\n.mc-dialog::backdrop{background:#102a3a66;backdrop-filter:blur(4px)}\n.mc-dialog *{box-sizing:border-box}.mc-shell{height:100%;display:flex;flex-direction:column}.mc-dialog button,.mc-dialog input,.mc-dialog select{font:inherit;color:inherit}.mc-dialog button{cursor:pointer;border:1px solid var(--mc-border);border-radius:8px;padding:7px 12px;background:var(--mc-bg);line-height:1.5}.mc-dialog button:hover{background:var(--mc-soft)}.mc-dialog button:disabled{cursor:default;opacity:.5}.mc-dialog :focus-visible{outline:2px solid var(--mc-accent);outline-offset:3px}.mc-dialog select,.mc-dialog input{border:1px solid var(--mc-border);border-radius:8px;background:var(--mc-bg);padding:9px 10px;max-width:100%;min-width:0}.mc-dialog select{width:100%}.mc-dialog button.mc-primary{color:#fff;background:var(--mc-accent);border-color:var(--mc-accent)}.mc-dialog button.mc-primary:hover{filter:brightness(.93)}.mc-dialog button.mc-danger{color:var(--mc-danger)}.mc-dialog button.mc-quiet{border-color:transparent;background:transparent;color:var(--mc-muted)}.mc-dialog button.mc-quiet:hover{background:var(--mc-soft)}\n.mc-header{display:flex;align-items:center;gap:14px;padding:22px 26px;border-bottom:1px solid var(--mc-border);flex:none}.mc-header-mark{display:grid;place-items:center;width:42px;height:42px;border:1px solid var(--mc-border);border-radius:12px;background:var(--mc-soft);color:var(--mc-accent);flex:none}.mc-header-copy{flex:1;min-width:0}.mc-header h2{font-size:20px;line-height:1.4;margin:0 0 4px;font-weight:650}.mc-header p{margin:0;font-size:12px;color:var(--mc-muted)}.mc-dialog .mc-close{display:grid;place-items:center;padding:8px;border:0;background:transparent;color:var(--mc-muted)}\n.mc-columns{display:grid;grid-template-columns:244px minmax(0,1fr);flex:1;min-height:0}.mc-nav{display:flex;flex-direction:column;gap:24px;padding:22px 16px;background:var(--mc-soft);border-right:1px solid var(--mc-border);overflow:auto}.mc-workspace-label{display:block;font-size:12px;font-weight:600;color:var(--mc-muted);margin-bottom:8px}.mc-nav-heading{display:flex;align-items:center;justify-content:space-between;margin:0 0 10px;padding:0 4px;font-size:12px;color:var(--mc-muted)}.mc-nav-heading h3{font-size:inherit;font-weight:600;margin:0}.mc-nav-heading button{padding:4px}.mc-datasources{list-style:none;padding:0;margin:0;display:grid;gap:6px}.mc-dialog .mc-datasource{display:flex;align-items:start;gap:10px;width:100%;padding:12px 10px;border:1px solid transparent;background:transparent;text-align:left}.mc-dialog .mc-datasource[aria-pressed=true]{border-color:var(--mc-border);background:var(--mc-bg);box-shadow:0 2px 5px #102a3a05}.mc-datasource>svg{margin-top:2px;flex:none;color:var(--mc-muted)}.mc-datasource[aria-pressed=true]>svg{color:var(--mc-accent)}.mc-datasource-copy{min-width:0;display:grid;gap:4px}.mc-datasource-name{font-size:13px;font-weight:600;overflow-wrap:anywhere}.mc-datasource-status{font-size:11px;color:var(--mc-muted);display:flex;align-items:center;gap:5px}.mc-dot{width:6px;height:6px;background:var(--mc-muted);border-radius:50%;flex:none}.mc-dot[data-ready=true]{background:var(--mc-accent)}.mc-dot[data-ready=false]{background:#c58a26}\n.mc-main{min-width:0;overflow:auto;display:flex;flex-direction:column}.mc-form{display:flex;flex-direction:column;flex:1;min-width:0}.mc-form-body{padding:26px 30px;flex:1}.mc-detail-heading{display:flex;align-items:start;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:22px}.mc-eyebrow{font-size:11px;color:var(--mc-muted);margin:0 0 5px}.mc-detail-heading h3{font-size:22px;font-weight:650;line-height:1.4;margin:0;overflow-wrap:anywhere}.mc-badge{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--mc-border);border-radius:6px;padding:3px 7px;font-size:11px;white-space:nowrap;color:var(--mc-muted)}.mc-badge[data-ready=true]{color:var(--mc-accent);background:var(--mc-tint);border-color:transparent}.mc-badge[data-ready=false]{color:var(--mc-warning)}\n.mc-section-heading{font-size:13px;font-weight:600;margin:0 0 12px}.mc-properties{margin:0 0 24px;min-width:0}.mc-property-list{margin:0;border:1px solid var(--mc-border);border-radius:12px;overflow:hidden}.mc-property{display:grid;grid-template-columns:minmax(0,140px) minmax(0,1fr);gap:16px;padding:12px 18px;align-items:start}.mc-property+.mc-property{border-top:1px solid var(--mc-border)}.mc-property dt{font-size:12px;color:var(--mc-muted);overflow-wrap:anywhere}.mc-property dd{margin:0;min-width:0;font-size:12px;white-space:pre-wrap;overflow-wrap:anywhere}.mc-property pre{font:12px/1.6 ui-monospace,monospace;white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.mc-property-json{max-height:240px;overflow:auto}\n.mc-fields{border:1px solid var(--mc-border);border-radius:12px;overflow:hidden;margin:0 0 14px}.mc-field{min-width:0;border:0;padding:18px;margin:0}.mc-field+.mc-field{border-top:1px solid var(--mc-border)}.mc-field-header{display:flex;align-items:start;gap:12px;justify-content:space-between}.mc-field-title{min-width:0}.mc-field-title h4{font-size:13px;margin:0 0 4px;font-weight:600;overflow-wrap:anywhere}.mc-field-title p{margin:0;font-size:11px;color:var(--mc-muted);overflow-wrap:anywhere}.mc-field-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;flex:none}.mc-dialog .mc-field-actions button{font-size:12px;padding:5px 9px}.mc-secret-input{display:grid;gap:7px;margin-top:14px;font-size:12px;color:var(--mc-muted)}.mc-secret-input input{width:100%;color:var(--mc-text)}.mc-field-note{font-size:11px;color:var(--mc-muted);margin:10px 0 0;overflow-wrap:anywhere}.mc-confirm{margin-top:12px;padding:12px;border:1px solid var(--mc-border);border-radius:8px;background:var(--mc-soft);display:flex;align-items:center;flex-wrap:wrap;gap:8px;font-size:12px}.mc-confirm p{flex-basis:100%;margin:0}.mc-note{font-size:12px;color:var(--mc-muted);margin:12px 0;overflow-wrap:anywhere}\n.mc-test{margin-top:24px;padding-top:20px;border-top:1px solid var(--mc-border)}.mc-test-heading{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:12px}.mc-test-heading h4{margin:0;font-size:13px}.mc-test-heading time{font-size:11px;color:var(--mc-muted)}.mc-result{border-radius:9px;padding:12px 14px;background:var(--mc-tint);color:var(--mc-accent);font-size:12px}.mc-result[data-tone=error]{background:var(--mc-soft);color:var(--mc-danger)}.mc-result[data-tone=stale]{background:var(--mc-soft);color:var(--mc-muted)}.mc-result-title{display:flex;align-items:center;gap:7px;font-weight:600;font-size:13px}.mc-result p{margin:6px 0 0}.mc-result details{margin-top:9px}.mc-result summary{cursor:pointer}.mc-result pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:180px;overflow:auto;font:12px/1.6 ui-monospace,monospace}.mc-empty-test{font-size:12px;color:var(--mc-muted);margin:0}\n.mc-form-footer{padding:16px 30px;border-top:1px solid var(--mc-border);background:var(--mc-bg);position:sticky;bottom:0;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.mc-form-footer button{font-size:13px}.mc-form-footer .mc-cancel{margin-left:auto}.mc-alert{margin:16px 30px 0;padding:12px 14px;border-radius:8px;font-size:12px;background:var(--mc-soft);color:var(--mc-danger);white-space:pre-wrap;overflow-wrap:anywhere}.mc-request-status{margin:0 0 18px;padding:12px 14px;border-radius:9px;background:var(--mc-soft);font-size:12px}.mc-request-status p{margin:4px 0 0;color:var(--mc-muted)}.mc-requests{padding:12px 20px;border-bottom:1px solid var(--mc-border);display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px}.mc-requests button{font-size:12px}.mc-pending-entry{font:inherit;font-size:12px;cursor:pointer;border:1px solid currentColor;border-radius:7px;padding:5px 9px;background:transparent;color:inherit}\n.mc-activity{padding:14px 30px;background:var(--mc-soft);border-top:1px solid var(--mc-border)}.mc-activity-heading{font-size:12px;color:var(--mc-muted);margin:0 0 8px}.mc-activity-list{display:flex;gap:6px;flex-wrap:wrap}.mc-activity-list button{font-size:12px}.mc-activity-list button[aria-pressed=true]{border-color:var(--mc-accent);color:var(--mc-accent)}.mc-progress{font-size:12px;margin-top:10px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.mc-progress p{margin:0}.mc-progress button{font-size:12px;margin-left:auto}.mc-operation-note{font-size:12px;margin-top:12px;color:var(--mc-muted)}.mc-operation-note p{margin:6px 0}.mc-operation-note[data-error=true]{color:var(--mc-danger)}.mc-empty{padding:64px 28px;text-align:center;color:var(--mc-muted);margin:auto}.mc-empty>svg{margin-bottom:10px;opacity:.65}.mc-empty h3{font-size:15px;color:var(--mc-text);margin:0 0 8px}.mc-empty p{font-size:12px;margin:0}.mc-loading{padding:18px 30px;font-size:12px;color:var(--mc-muted)}\n@media(prefers-color-scheme:dark){.mc-dialog{--mc-bg:var(--dsw-alias-surface-primary,#182127);--mc-soft:var(--dsw-alias-interactive-bg-hover,#202d34);--mc-text:var(--dsw-alias-label-primary,#e4edf1);--mc-muted:var(--dsw-alias-label-secondary,#9baeb9);--mc-border:var(--dsw-alias-border-l2,#35464f);--mc-accent:#39b8a8;--mc-tint:#153d39;--mc-danger:#ef998b;--mc-warning:#d6b778}.mc-dialog button.mc-primary{color:#102a29}}\n@media(max-width:700px){.mc-property{grid-template-columns:minmax(0,1fr);gap:5px;padding:12px 14px}}\n@media(max-width:700px){.mc-dialog{width:calc(100vw - 16px);height:calc(100dvh - 16px);max-height:calc(100dvh - 16px);border-radius:12px}.mc-header{padding:16px;gap:10px}.mc-header-mark{display:none}.mc-header h2{font-size:18px}.mc-columns{display:flex;flex-direction:column;overflow:auto}.mc-nav{flex:none;padding:14px 16px;gap:14px;overflow:visible;border-right:0;border-bottom:1px solid var(--mc-border)}.mc-workspace-label{font-size:11px;margin-bottom:5px}.mc-nav select{padding:7px 10px}.mc-nav-heading{margin-bottom:5px}.mc-datasources{display:flex;overflow-x:auto;padding:2px;gap:6px}.mc-datasources li{flex:0 0 auto;max-width:240px}.mc-dialog .mc-datasource{padding:9px 10px}.mc-datasource-name{font-size:12px}.mc-main{overflow:visible;flex:1;flex-shrink:0}.mc-form-body{padding:22px 18px}.mc-detail-heading h3{font-size:20px}.mc-field{padding:14px}.mc-field-header{flex-wrap:wrap;gap:10px}.mc-field-actions{margin-left:auto}.mc-form-footer{padding:14px 18px;position:static}.mc-form-footer .mc-cancel{margin-left:0}.mc-alert{margin:14px 18px 0}.mc-activity{padding:14px 18px}.mc-test-heading{align-items:start;flex-wrap:wrap}.mc-close{align-self:start}.mc-empty{padding:32px 18px}.mc-requests{padding:12px 16px}}\n";
@@ -0,0 +1,9 @@
1
+ import type { ISessions, IWorkspaces } from '@deepseek-ai/dsh-client-runtime/client';
2
+ import type { IConversation } from '@deepseek-ai/dsh-client-ui-conversation/client';
3
+ export interface AskDshHost {
4
+ sessions: Pick<ISessions, 'list' | 'scope'>;
5
+ workspaces: Pick<IWorkspaces, 'list'>;
6
+ conversation: Pick<IConversation, 'input'>;
7
+ }
8
+ /** Append through the Host's public draft path; never submit or serialize references. */
9
+ export declare function appendPresentationContext(host: AskDshHost, sessionId: string, workspaceId: string, context: string): void;
@@ -0,0 +1,12 @@
1
+ import type { TypedDataset } from '../../presentation/contracts/types.ts';
2
+ import { type ChartExploration } from './chart-view.ts';
3
+ import { type ChartBlock } from './model.ts';
4
+ /** Native fields keep this page-local editor keyboard accessible without hiding the live chart. */
5
+ export declare function ChartExplorer({ block, data, state, onChange, onClose, restoreFocusTo, }: {
6
+ block: ChartBlock;
7
+ data: TypedDataset;
8
+ state: ChartExploration;
9
+ onChange: (state: ChartExploration) => void;
10
+ onClose: () => void;
11
+ restoreFocusTo?: HTMLElement;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1,30 @@
1
+ import type { ChartView } from '../../presentation/contracts/charts.ts';
2
+ import type { TypedDataset } from '../../presentation/contracts/types.ts';
3
+ export declare const CHART_COLORS: string[];
4
+ /** Coordinate conversion only. The immutable source cell remains the tooltip authority. */
5
+ export declare function chartCoordinate(data: TypedDataset, view: ChartView, rowIndex: number, field: string): number | null;
6
+ export declare function seriesAppearance(view: ChartView, field: string, index: number): {
7
+ color: string;
8
+ lineStyle: "solid" | "dashed" | "dotted";
9
+ dash: string | undefined;
10
+ };
11
+ /** Stack offsets are drawing geometry, never a derived dataset or a normalization. */
12
+ export declare function stackCoordinates(values: readonly (number | null)[]): ([number, number] | null)[];
13
+ /** Includes zero; a zero-only or empty scale still has a nonzero drawing extent. */
14
+ export declare function drawingDomain(values: readonly (number | null)[]): [number, number];
15
+ /** Keep Recharts/d3 internal subtraction and interpolation in a finite numeric range. */
16
+ export declare function numericDrawingAxis(values: readonly (number | null)[]): {
17
+ divisor: number;
18
+ domain: [number, number];
19
+ };
20
+ /** Dividing first avoids overflow for valid finite domains spanning -1e308 to 1e308. */
21
+ export declare function drawingScale(domain: readonly [number, number], from: number, to: number): (value: number) => number;
22
+ export declare function domainTicks(domain: readonly [number, number]): number[];
23
+ /** Angles stay bound to the full authored snapshot, including omitted/filtered slices. */
24
+ export declare function shareIntervals(shares: readonly (number | null)[]): ({
25
+ start: number;
26
+ end: number;
27
+ } | null)[];
28
+ export declare function donutPath(start: number, end: number, cx: number, cy: number, radius?: number): string;
29
+ export declare function showValueLabels(view: ChartView, count: number): boolean;
30
+ export declare function pointIsDrawable(value: unknown, cx: number | undefined, cy: number | undefined): boolean;
@@ -0,0 +1,10 @@
1
+ import type { DocumentDataset } from '../../presentation/contracts/types.ts';
2
+ import { type ChartBlock, type ReaderMode } from './model.ts';
3
+ export declare function ChartRenderer({ dataset, block, mode, hidden: controlledHidden, onHiddenChange, rowIndices, }: {
4
+ dataset: DocumentDataset;
5
+ block: ChartBlock;
6
+ mode: ReaderMode;
7
+ hidden?: readonly string[];
8
+ onHiddenChange?: (hidden: string[]) => void;
9
+ rowIndices?: readonly number[];
10
+ }): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import type { DocumentDataset } from '../../presentation/contracts/types.ts';
2
+ import { type ChartBlock } from './model.ts';
3
+ export declare const SPECIAL_CHARTS: Set<string>;
4
+ export declare function SpecialChart({ dataset, block, rowIndices, visible, title, }: {
5
+ dataset: DocumentDataset;
6
+ block: ChartBlock;
7
+ rowIndices: readonly number[];
8
+ visible: ReadonlySet<string>;
9
+ title: string;
10
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const CHART_STYLES = "\n.pr-special-frame { position:relative; min-width:0; margin:0 }\n.pr-special-scroll { overflow-x:auto; padding-bottom:4px; max-width:100% }\n.pr-special-chart { display:block; color:var(--pr-text); overflow:visible; font-size:12px; font-variant-numeric:tabular-nums }\n.pr-special-chart text { fill:var(--pr-text) }\n.pr-special-chart .pr-axis-tick { fill:var(--pr-chart-muted) }\n.pr-special-chart [data-chart-mark]:focus { outline:2px solid var(--pr-accent); outline-offset:3px }\n.pr-special-tooltip { position:absolute; top:0; left:0; z-index:2; max-width:100%; pointer-events:none }\n.pr-chart-sparkline { height:128px }\n.pr-chart-role { color:var(--pr-muted); font-size:11px }\n.pr-chart-label { fill:var(--pr-text); font-size:11px }\n.pr-special-chart .pr-chart-label { paint-order:stroke; stroke:var(--pr-bg); stroke-width:3px; stroke-linejoin:round }\n.pr-color-key { display:flex; gap:12px; flex-wrap:wrap; font-size:12px; color:var(--pr-muted); margin:8px 0 }\n.pr-color-key span { display:inline-flex; align-items:center; gap:5px }\n";
@@ -0,0 +1,13 @@
1
+ import type { DocumentDataset } from '../../presentation/contracts/types.ts';
2
+ import { type ChartBlock } from './model.ts';
3
+ export declare function exactChartDescription(dataset: DocumentDataset, block: ChartBlock, rowIndex: number, visible?: ReadonlySet<string>): {
4
+ id: string;
5
+ label: string;
6
+ value: string;
7
+ }[];
8
+ export declare function ExactTooltip({ dataset, block, rowIndex, visible, }: {
9
+ dataset: DocumentDataset;
10
+ block: ChartBlock;
11
+ rowIndex: number;
12
+ visible?: ReadonlySet<string>;
13
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,23 @@
1
+ import { type ChartOptions, type ChartView } from '../../presentation/contracts/charts.ts';
2
+ import type { TypedDataset } from '../../presentation/contracts/types.ts';
3
+ import type { ChartBlock } from './model.ts';
4
+ /** Page-local state only: the authored block and snapshot are never modified. */
5
+ export interface ChartExploration {
6
+ view: ChartView;
7
+ hidden: string[];
8
+ preparedViewId?: string;
9
+ }
10
+ export declare function savedChartView(block: ChartBlock & {
11
+ label?: string;
12
+ }): ChartView;
13
+ export declare function initialChartExploration(block: ChartBlock): ChartExploration;
14
+ export declare function exploredChartBlock(block: ChartBlock, state?: ChartExploration): ChartBlock;
15
+ export declare function chartViewError(view: ChartView, dataset: TypedDataset): string | undefined;
16
+ /** Reference lines were authored for the original fields; new bindings need new declarations. */
17
+ export declare function withChartX(view: ChartView, x: string): ChartView;
18
+ export declare function withChartSeries(view: ChartView, y: string[]): ChartView;
19
+ type SeriesStyle = NonNullable<ChartOptions['series']>[string];
20
+ /** Clearing a selector removes its declaration, including for prototype-named column IDs. */
21
+ export declare function withChartSeriesStyle<Key extends keyof SeriesStyle>(view: ChartView, field: string, key: Key, value: SeriesStyle[Key]): ChartView;
22
+ export declare function changeChartView(state: ChartExploration, view: ChartView, preparedViewId?: string | undefined): ChartExploration;
23
+ export {};
@@ -0,0 +1,5 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function CopyContext({ text, children, }: {
3
+ text: string;
4
+ children: (copy: (restoreFocusTo: HTMLElement) => void) => ReactNode;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,54 @@
1
+ import { type PresentationEdits } from '../../presentation/contracts/editing.ts';
2
+ import { type PresentationDocument, type PresentationReceipt } from '../../presentation/contracts/index.ts';
3
+ import { type PresentationDelivery } from '../../presentation/receipt.ts';
4
+ export interface PresentationRpc {
5
+ call(channel: string, endpoint: string, payload: unknown, signal: AbortSignal): Promise<unknown>;
6
+ }
7
+ export type PresentationAsset = 'presentation.json' | 'index.html';
8
+ export interface PresentationDeliveryState {
9
+ readonly receipts: Readonly<Record<string, PresentationReceipt>>;
10
+ readonly resolvedReceipt?: PresentationReceipt;
11
+ readonly editing?: {
12
+ edits: PresentationEdits;
13
+ undo: PresentationEdits[];
14
+ redo: PresentationEdits[];
15
+ };
16
+ readonly saving?: boolean;
17
+ readonly editError?: string;
18
+ readonly open: boolean;
19
+ readonly delivery?: PresentationDelivery;
20
+ readonly loading: boolean;
21
+ readonly downloading: boolean;
22
+ readonly document?: PresentationDocument;
23
+ readonly error?: string;
24
+ readonly downloadError?: string;
25
+ readonly notice?: string;
26
+ }
27
+ export type SavePresentationHtml = (bytes: Uint8Array, filename: string) => void;
28
+ /** Download verified bytes as an attachment; never insert generated HTML in the Host DOM. */
29
+ export declare function savePresentationHtml(bytes: Uint8Array, filename: string): void;
30
+ /** Check the exact receipt-bound bytes before either parsing JSON or downloading HTML. */
31
+ export declare function verifyPresentationAsset(value: unknown, receipt: PresentationReceipt, asset: PresentationAsset): Promise<Uint8Array>;
32
+ export declare const reportKey: (receipt: PresentationReceipt) => string;
33
+ /** Host file actions and editor state; never an Agent or data-source execution path. */
34
+ export declare class PresentationDeliveryModel {
35
+ #private;
36
+ constructor(rpc: PresentationRpc, save?: SavePresentationHtml);
37
+ getSnapshot: () => PresentationDeliveryState;
38
+ subscribe: (listener: () => void) => () => void;
39
+ preview(delivery: PresentationDelivery, sessionId: string, workspaceId: string): Promise<void>;
40
+ show(delivery: PresentationDelivery, sessionId: string, workspaceId: string): Promise<void>;
41
+ get dirty(): boolean;
42
+ beginEdit(): void;
43
+ changeEdits(edits: PresentationEdits): void;
44
+ undoEdit(): void;
45
+ redoEdit(): void;
46
+ cancelEdit(): void;
47
+ saveEdit(): Promise<void>;
48
+ download(delivery: PresentationDelivery, sessionId: string, workspaceId: string, displayed?: boolean): Promise<void>;
49
+ contextChanged(sessionId: string, workspaceId: string): void;
50
+ unavailable(message?: string): void;
51
+ close(): void;
52
+ resetConnection(): void;
53
+ dispose(): void;
54
+ }
@@ -0,0 +1,77 @@
1
+ import type { ChatConversationViewNode, ConversationNodeContext } from '@deepseek-ai/dsh-client-runtime/client';
2
+ import { type PresentationDelivery } from '../../presentation/receipt.ts';
3
+ export declare const PRESENTATION_TURN_DATA_KEY = "marivo-presentation-delivery";
4
+ export interface PresentationTurnDelivery {
5
+ readonly seq: number;
6
+ readonly delivery: PresentationDelivery;
7
+ }
8
+ export interface PresentationTurnData {
9
+ readonly deliveries: readonly PresentationTurnDelivery[];
10
+ }
11
+ interface PresentationTurnState extends PresentationTurnData {
12
+ readonly turn: number;
13
+ readonly calls: ReadonlyMap<string, string>;
14
+ }
15
+ declare module '@deepseek-ai/dsh-client-runtime/client' {
16
+ interface ConversationTurnDataMap {
17
+ 'marivo-presentation-delivery': PresentationTurnData;
18
+ }
19
+ }
20
+ declare module '@deepseek-ai/dsh-client-ui-conversation/client' {
21
+ interface ChatNodeDataMap {
22
+ 'marivo-presentation-delivery': PresentationTurnData;
23
+ }
24
+ }
25
+ export declare function presentationDeliveryIdentity(delivery: PresentationDelivery): string;
26
+ /** Code Mode carries the same envelope as Native metadata, inside one durable block. */
27
+ export declare function parsePresentationDurableContent(value: unknown): PresentationDelivery | null;
28
+ /** Calls are collected only from this Harness-owned Turn, including the Code root call. */
29
+ export declare function presentationDeliveryFromEvent(value: unknown, calls: ReadonlyMap<string, string>, turn: number): PresentationTurnDelivery | null;
30
+ export declare const marivoPresentationDeliveryDefinition: {
31
+ kind: string;
32
+ target: string;
33
+ match(value: unknown): {
34
+ id: string;
35
+ role: "start" | "update";
36
+ } | null;
37
+ start(_context: unknown, match: {
38
+ event: any;
39
+ }): PresentationTurnState;
40
+ update(context: {
41
+ state: PresentationTurnState;
42
+ }, match: {
43
+ event: any;
44
+ }): PresentationTurnState;
45
+ buildLocationData(context: {
46
+ state?: PresentationTurnState;
47
+ }, scope: string): {
48
+ kind: "turn";
49
+ turn: number;
50
+ key: "marivo-presentation-delivery";
51
+ value: Readonly<{
52
+ deliveries: readonly PresentationTurnDelivery[];
53
+ }>;
54
+ } | null;
55
+ buildViewNode(context: ConversationNodeContext<PresentationTurnState>): {
56
+ key: string;
57
+ id: string;
58
+ kind: string;
59
+ target: "chat";
60
+ anchorSeq: number;
61
+ location: {
62
+ readonly kind: "turn";
63
+ readonly turn: import("@deepseek-ai/dsh-client-runtime/client").TurnLocation;
64
+ } | {
65
+ readonly kind: "step";
66
+ readonly turn: import("@deepseek-ai/dsh-client-runtime/client").TurnLocation;
67
+ readonly step: import("@deepseek-ai/dsh-client-runtime/client").StepLocation;
68
+ };
69
+ visibility: "visible";
70
+ data: Readonly<{
71
+ deliveries: readonly PresentationTurnDelivery[];
72
+ }>;
73
+ } | null;
74
+ };
75
+ /** Session identity comes from the Host's keyed Chat slot, never from an event field. */
76
+ export declare function presentationsForNode(node: ChatConversationViewNode, sessionId: string): PresentationDelivery[];
77
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { PresentationEdits } from '../../presentation/contracts/editing.ts';
2
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
3
+ export interface ReaderEditing {
4
+ edits: PresentationEdits;
5
+ onChange: (edits: PresentationEdits) => void;
6
+ disabled?: boolean;
7
+ }
8
+ export declare function CellEditor({ block, document, editing, }: {
9
+ block: PresentationBlock;
10
+ document: PresentationDocument;
11
+ editing: ReaderEditing;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { PresentationInteraction } from '../../presentation/contracts/types.ts';
2
+ export declare function GlobalFilterControls({ interaction, selection, onChange, }: {
3
+ interaction: PresentationInteraction;
4
+ selection: Record<string, string>;
5
+ onChange: (selection: Record<string, string>) => void;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { PresentationDocument } from '../../presentation/contracts/types.ts';
3
+ import type { ReaderEditing } from './editor-controls.tsx';
4
+ import type { OpenSemanticRef } from './source-facts.ts';
5
+ /** Host integrations supply only outer actions; document interpretation stays shared. */
6
+ export declare function HostPresentationReader({ document, actions, editing, onOpenSemanticRef, onAskDsh, }: {
7
+ document: PresentationDocument;
8
+ editing?: ReaderEditing;
9
+ actions?: ReactNode;
10
+ onOpenSemanticRef?: OpenSemanticRef;
11
+ onAskDsh?: (context: string) => void;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare function CopyIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
3
+ export declare function MoreIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
4
+ export declare function CloseIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ export declare function PresentationCards({ matched, sessionId, workspaces, model }: {
2
+ matched: any;
3
+ sessionId: any;
4
+ workspaces: any;
5
+ model: any;
6
+ }): import("react").JSX.Element | null;
7
+ export declare function PresentationOverlay({ model, sessionId, workspaceId, workspaceUnavailable, openSemanticObject, onAskDsh, }: {
8
+ model: any;
9
+ sessionId: any;
10
+ workspaceId: any;
11
+ workspaceUnavailable?: boolean | undefined;
12
+ openSemanticObject: any;
13
+ onAskDsh: any;
14
+ }): import("react").JSX.Element | null;
15
+ export declare function installPresentation(ctx: any, rpc: any, openSemanticObject: any): void;
@@ -0,0 +1,5 @@
1
+ export declare function safeMarkdownHref(value: string): string | undefined;
2
+ export declare function Markdown({ text, depth }: {
3
+ text: string;
4
+ depth?: number;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,62 @@
1
+ import { type ChartView } from '../../presentation/contracts/charts.ts';
2
+ import type { Cell, DatasetColumn, DocumentDataset, PresentationBlock, PresentationDocument, SourceSnapshot, TypedDataset } from '../../presentation/contracts/types.ts';
3
+ import type { ChartExploration } from './chart-view.ts';
4
+ export type ReaderMode = 'interactive' | 'static';
5
+ export type ChartBlock = Extract<PresentationBlock, {
6
+ kind: 'chart';
7
+ }>;
8
+ export type MetricBlock = Extract<PresentationBlock, {
9
+ kind: 'metric';
10
+ }>;
11
+ export declare const TABLE_PAGE_SIZE = 20;
12
+ export declare function cellText(value: Cell, column: DatasetColumn): string;
13
+ export declare function valueWithUnit(value: Cell, column: DatasetColumn): string;
14
+ /** Add grouping separators only; never round, rescale, or convert exact decimal text. */
15
+ export declare function metricText(value: Cell, column: DatasetColumn): string;
16
+ /** A stable explicit timezone keeps portable and Host metadata equally readable. */
17
+ export declare function snapshotDate(value: string): string;
18
+ export declare function columnLabel(column: DatasetColumn): string;
19
+ /** Axis labels are compact coordinates; tooltips and tables retain exact source text. */
20
+ export declare function formatAxisTick(value: number): string;
21
+ export declare function formatCategoryTick(value: string): string;
22
+ export declare function datasetById(document: PresentationDocument, id: string): DocumentDataset;
23
+ export declare function columnIndex(dataset: TypedDataset, id: string): number;
24
+ export declare function selectMetric(dataset: TypedDataset, block: MetricBlock, rowIndices?: readonly number[]): {
25
+ column: DatasetColumn;
26
+ value: string | number | boolean;
27
+ comparisons: {
28
+ label: string;
29
+ reference: {
30
+ value: string | number | boolean;
31
+ sign: number | undefined;
32
+ text: string;
33
+ } | undefined;
34
+ delta: {
35
+ value: string | number | boolean;
36
+ sign: number | undefined;
37
+ text: string;
38
+ } | undefined;
39
+ relative: {
40
+ value: string | number | boolean;
41
+ sign: number | undefined;
42
+ text: string;
43
+ } | undefined;
44
+ sign: number | undefined;
45
+ tone: string;
46
+ }[];
47
+ };
48
+ export declare function compareDecimalText(first: string, second: string): number;
49
+ export declare function sortedRowIndices(dataset: TypedDataset, sort?: {
50
+ columnId: string;
51
+ direction: 'ascending' | 'descending';
52
+ }): number[];
53
+ export declare function datasetScope(dataset: TypedDataset): string;
54
+ export interface ChartRow {
55
+ rowIndex: number;
56
+ xLabel: string;
57
+ [key: string]: number | string | null;
58
+ }
59
+ export declare function chartRows(dataset: TypedDataset, block: ChartView, rowIndices?: readonly number[]): ChartRow[];
60
+ export declare function chartTitle(dataset: TypedDataset, block: ChartView): string;
61
+ export declare function selectedSources(document: PresentationDocument, ids: string[]): SourceSnapshot[];
62
+ export declare function followUpContext(document: PresentationDocument, savedBlock: PresentationBlock, exploration?: ChartExploration, selection?: Record<string, string>): string;
@@ -0,0 +1,11 @@
1
+ import type { PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ import { type ReaderEditing } from './editor-controls.tsx';
3
+ import { type ReaderMode } from './model.ts';
4
+ import type { OpenSemanticRef } from './source-facts.ts';
5
+ export declare function PresentationReader({ document, mode, editing, onOpenSemanticRef, onAskDsh, }: {
6
+ document: PresentationDocument;
7
+ mode?: ReaderMode;
8
+ editing?: ReaderEditing;
9
+ onOpenSemanticRef?: OpenSemanticRef;
10
+ onAskDsh?: (context: string) => void;
11
+ }): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ export type SourceTab = 'overview' | 'preview' | 'code';
3
+ export declare function sourceTabs(hasDataset: boolean): SourceTab[];
4
+ export declare function sourceTabForKey(tabs: readonly SourceTab[], current: SourceTab, key: string): SourceTab | undefined;
5
+ interface CodeEntry {
6
+ key: string;
7
+ language: 'python' | 'sql';
8
+ text: string;
9
+ authorAssociated: boolean;
10
+ }
11
+ /** Read only the selected cell binding; prepared views are separate, unselected bindings. */
12
+ export declare function sourceCodeFacts(document: PresentationDocument, block?: PresentationBlock): {
13
+ entries: CodeEntry[];
14
+ notices: string[];
15
+ };
16
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ export declare function SourceCode({ document, block, interactive, }: {
3
+ document: PresentationDocument;
4
+ block?: PresentationBlock;
5
+ interactive?: boolean;
6
+ }): import("react").JSX.Element;
7
+ /** Native disclosures remain usable in saved HTML with JavaScript disabled. */
8
+ export declare function SourceCodeSummary({ document, block, }: {
9
+ document: PresentationDocument;
10
+ block?: PresentationBlock;
11
+ }): import("react").JSX.Element | import("react").JSX.Element[];
@@ -0,0 +1,13 @@
1
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ import type { OpenSemanticRef } from './source-facts.ts';
3
+ export declare function SourceDialog({ document, block, onClose, restoreFocusTo, rowIndices, filterKey, filterSummary, explored, onOpenSemanticRef, }: {
4
+ document: PresentationDocument;
5
+ block: PresentationBlock;
6
+ onClose: () => void;
7
+ restoreFocusTo?: HTMLElement | null;
8
+ rowIndices?: readonly number[];
9
+ filterKey?: string;
10
+ filterSummary?: string;
11
+ explored?: boolean;
12
+ onOpenSemanticRef?: OpenSemanticRef;
13
+ }): import("react").JSX.Element;
@@ -0,0 +1,20 @@
1
+ import type { SourceSnapshot } from '../../presentation/contracts/types.ts';
2
+ import { type SemanticRef } from '../../semantic-reference/contracts.ts';
3
+ export type OpenSemanticRef = (ref: SemanticRef) => void;
4
+ export declare function sourceSemanticRef(kind: string, path: string): SemanticRef | undefined;
5
+ interface SemanticGroup {
6
+ kind: string;
7
+ paths: string[];
8
+ }
9
+ /** Read only the fields already projected into the saved source snapshot. */
10
+ export declare function sourceOverviewFacts(source: SourceSnapshot): {
11
+ createdAt: string | undefined;
12
+ semanticGroups: SemanticGroup[];
13
+ issues: {
14
+ kind: string;
15
+ severity?: string;
16
+ }[];
17
+ notices: string[];
18
+ };
19
+ export declare function semanticKindLabel(kind: string): string;
20
+ export {};
@@ -0,0 +1,5 @@
1
+ /** Presentation-only formatting; never execute code or change the saved snapshot. */
2
+ export declare function formatSource(text: string, language: 'python' | 'sql'): {
3
+ text: string;
4
+ formatted: boolean;
5
+ };
@@ -0,0 +1,7 @@
1
+ export interface SourceToken {
2
+ text: string;
3
+ offset: number;
4
+ color?: string;
5
+ }
6
+ /** Local, synchronous highlighting also works in the scripts-disabled HTML fallback. */
7
+ export declare function highlightSource(text: string, language: 'python' | 'sql'): SourceToken[];
@@ -0,0 +1,13 @@
1
+ import type { PresentationBlock, PresentationDocument, SourceSnapshot } from '../../presentation/contracts/types.ts';
2
+ import { type OpenSemanticRef } from './source-facts.ts';
3
+ export declare function blockSources(document: PresentationDocument, block?: PresentationBlock): SourceSnapshot[];
4
+ export declare function SourceOverview({ document, block, onOpenSemanticRef, }: {
5
+ document: PresentationDocument;
6
+ block?: PresentationBlock;
7
+ onOpenSemanticRef?: OpenSemanticRef;
8
+ }): import("react").JSX.Element;
9
+ /** Compact native disclosure for reading the saved report without JavaScript. */
10
+ export declare function SourceSummary({ document, block, }: {
11
+ document: PresentationDocument;
12
+ block?: PresentationBlock;
13
+ }): import("react").JSX.Element | null;
@@ -0,0 +1 @@
1
+ export declare const PRESENTATION_STYLES = "\n.pr-reader {\n --pr-bg:#fff; --pr-soft:#f7f7f8; --pr-text:#242424; --pr-muted:#666;\n --pr-code-keyword:#8a3294; --pr-code-string:#216b43; --pr-code-number:#995119; --pr-code-function:#285d9e;\n --pr-border:#e5e5e7; --pr-accent:#3567b7; --pr-warning:#805b20;\n --pr-chart-1:#286dee; --pr-chart-2:#ba7039; --pr-chart-3:#548878;\n --pr-chart-muted:#96969b; --pr-chart-grid:rgba(13,13,13,.06); --pr-chart-hover:rgba(13,13,13,.03); --pr-chart-4:#8d6cb0; --pr-chart-5:#b46379; --pr-chart-6:#727c38;\n box-sizing:border-box; margin:0 auto; padding:48px clamp(20px,4%,64px); width:100%; max-width:none; min-width:0;\n color:var(--pr-text); background:var(--pr-bg); font:16px/1.65 system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;\n overflow-wrap:anywhere; color-scheme:light;\n}\n.pr-reader * { box-sizing:border-box }\n.pr-reader h1,.pr-reader h2,.pr-reader h3,.pr-reader h4 { line-height:1.4; font-weight:600; text-wrap:balance }\n.pr-reader h1 { font-size:30px; margin:0 0 12px; letter-spacing:-.025em }\n.pr-reader h2 { font-size:21px; margin:0 0 16px }\n.pr-reader h3 { font-size:17px; margin:0 0 12px }\n.pr-reader p { margin:10px 0 }\n.pr-reader button,.pr-reader select,.pr-reader textarea { font:inherit; color:inherit }\n.pr-reader button,.pr-reader select { border:1px solid var(--pr-border); border-radius:8px; background:var(--pr-bg); padding:6px 10px; max-width:100% }\n.pr-reader button { cursor:pointer }\n.pr-reader button:hover { background:var(--pr-soft) }\n.pr-reader button:disabled { opacity:.45; cursor:default }\n.pr-reader :focus-visible { outline:3px solid var(--pr-accent); outline-offset:3px }\n.pr-reader a { color:var(--pr-accent); text-decoration:underline; text-underline-offset:3px }\n.pr-reader summary { cursor:pointer; color:var(--pr-muted); padding:8px 0; font-size:13px }\n.pr-reader summary:hover { color:var(--pr-text) }\n.pr-reader details[open]>summary { margin-bottom:8px }\n.pr-muted { color:var(--pr-muted); font-size:13px }\n.pr-header { padding-bottom:28px; margin-bottom:32px; border-bottom:1px solid var(--pr-border) }\n.pr-blocks { display:flex; flex-direction:column; gap:32px }\n.pr-block { min-width:0; position:relative }\n.pr-block-markdown { padding:0; width:100% }\n.pr-block-chart { padding:0; border:0; border-radius:0 }\n.pr-block-chart>h2 { font-size:17px }\n.pr-chart-row { display:flex; flex-direction:column; gap:32px; min-width:0 }\n.pr-chart-row>.pr-block-chart { width:100% }\n.pr-reader[data-mode=interactive] .pr-chart-row { flex-direction:row; flex-wrap:wrap; align-items:flex-start }\n.pr-reader[data-mode=interactive] .pr-chart-row>.pr-block-chart { flex:1 1 calc((100% - 32px)/2); min-width:min(100%,560px); max-width:100% }\n.pr-reader[data-mode=interactive] .pr-chart-row>.pr-block-chart[data-chart-layout=wide] { min-width:min(100%,720px) }\n.pr-metric-group { display:flex; flex-wrap:wrap; gap:16px; min-width:0 }\n.pr-metric-group>.pr-block-metric { flex:1 1 240px; min-width:min(100%,240px); max-width:min(100%,480px) }\n.pr-block-metric { border:1px solid var(--pr-border); border-radius:14px; padding:20px; display:flex; flex-direction:column; gap:4px }\n.pr-block-metric h2 { font-size:13px; font-weight:500; color:var(--pr-muted); margin:0 }\n.pr-metric-value { font-size:clamp(24px,3vw,32px); font-variant-numeric:tabular-nums; font-weight:600; line-height:1.35; letter-spacing:-.025em }\n.pr-metric-value { white-space:nowrap; overflow-x:auto; max-width:100% }\n.pr-metric-comparisons { display:grid; gap:12px; margin-top:auto; padding-top:12px }\n.pr-metric-comparison { display:flex; flex-wrap:wrap; gap:4px 10px; border-top:1px solid var(--pr-border); padding-top:10px; font-size:13px; font-variant-numeric:tabular-nums }\n.pr-metric-comparison>.pr-muted { flex-basis:100% }\n.pr-metric-change { display:flex; flex-wrap:wrap; gap:4px 8px }\n.pr-metric-change-positive { color:#167044 }\n.pr-metric-change-negative { color:#b42318 }\n.pr-metric-change-neutral { color:var(--pr-muted) }\n.pr-notice { color:var(--pr-warning); font-size:13px; border-left:2px solid currentColor; padding-left:12px }\n.pr-empty { padding:24px; text-align:center; color:var(--pr-muted); background:var(--pr-soft); border-radius:8px }\n.pr-markdown p { white-space:pre-wrap }\n.pr-markdown pre { max-width:100%; overflow:auto; background:var(--pr-soft); padding:16px; border-radius:8px; font:13px/1.65 ui-monospace,monospace }\n.pr-markdown code { font-family:ui-monospace,monospace; font-size:.9em; background:var(--pr-soft); padding:2px 4px; border-radius:3px }\n.pr-markdown pre code { padding:0 }\n.pr-markdown blockquote { border-left:3px solid var(--pr-border); padding-left:18px; margin:16px 0; color:var(--pr-muted) }\n.pr-markdown hr { border:0; border-top:1px solid var(--pr-border); margin:24px 0 }\n.pr-markdown ul,.pr-markdown ol { padding-left:24px }\n.pr-markdown li+li { margin-top:6px }\n.pr-table-scroll { max-width:100%; overflow:auto }\n.pr-table table { border-collapse:collapse; min-width:100%; font-size:13px }\n.pr-table caption { text-align:left; font-size:12px; color:var(--pr-muted); padding:8px 12px }\n.pr-table th,.pr-table td { padding:12px; text-align:left; border-bottom:1px solid var(--pr-border); vertical-align:top; white-space:pre-wrap; overflow-wrap:anywhere; min-width:90px; max-width:400px }\n.pr-table th { font-weight:500; color:var(--pr-muted) }\n.pr-table th button { position:relative; font-weight:500; padding:0; text-align:inherit; border:0; background:transparent; border-radius:0 }\n.pr-table th.pr-numeric { text-align:right }\n.pr-sort-indicator { position:absolute; left:calc(100% + 3px); top:0; font-size:11px; line-height:inherit }\n.pr-table tbody tr:hover { background:var(--pr-soft) }\n.pr-table td.pr-numeric { text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap }\n.pr-table td[data-cell-null=true] { color:var(--pr-muted) }\n.pr-pagination { display:flex; gap:12px; align-items:center; justify-content:flex-end; flex-wrap:wrap; margin-top:12px; font-size:12px }\n.pr-diagnostics { margin:0 0 28px; padding:16px; background:var(--pr-soft); border-radius:10px; font-size:13px }\n.pr-diagnostics h2 { font-size:14px; margin:0 }\n.pr-diagnostics ul { padding-left:20px }\n.pr-legend { display:flex; flex-wrap:wrap; gap:8px 16px; margin:8px 0 0; justify-content:center }\n.pr-legend button { display:flex; align-items:center; gap:7px; font-size:12px; border:0; padding:4px 0; background:transparent }\n.pr-legend button[aria-pressed=false] { opacity:.5; text-decoration:line-through }\n.pr-swatch { display:inline-block; width:9px; height:9px; border-radius:50%; flex-shrink:0 }\n.pr-chart { margin:0; width:100%; min-width:0; height:320px }\n.pr-chart svg { overflow:visible }\n.pr-chart-group+.pr-chart-group { margin-top:24px }\n.pr-chart .recharts-cartesian-axis-tick-value { font-variant-numeric:tabular-nums }\n.pr-tooltip { padding:10px 13px; border:1px solid var(--pr-border); border-radius:10px; background:var(--pr-bg); color:var(--pr-text); font-size:12px; box-shadow:0 4px 18px #0001; max-width:min(420px,80vw) }\n.pr-tooltip dl { margin:5px 0 0 }\n.pr-tooltip dl>div { display:flex; flex-wrap:wrap; justify-content:space-between; gap:6px 20px }\n.pr-tooltip dt { color:var(--pr-muted) }\n.pr-tooltip dd { margin:0; font-variant-numeric:tabular-nums; overflow-wrap:anywhere }\n\n.pr-cell-toolbar { position:absolute; top:0; right:0; display:flex; align-items:center; gap:4px; z-index:2 }\n.pr-block-metric>.pr-cell-toolbar { top:12px; right:12px }\n.pr-block-metric>h2,.pr-block-chart>h2 { padding-right:32px }\n.pr-block-markdown .pr-markdown>:first-child { padding-right:40px }\n.pr-reader[data-mode=interactive] .pr-block-table { padding-top:30px }\n.pr-block-source>h2 { padding-right:40px }\n.pr-reader .pr-icon-button { display:inline-flex; align-items:center; justify-content:center; width:28px; height:28px; padding:5px; border:0; background:transparent; color:var(--pr-muted); border-radius:6px; flex-shrink:0 }\n.pr-reader .pr-icon-button:hover { background:var(--pr-soft); color:var(--pr-text) }\n.pr-icon-button svg { width:18px; height:18px; display:block }\n.pr-copy,.pr-cell-menu { position:relative; display:inline-flex; align-items:center }\n.pr-copy-status { position:absolute; right:0; top:calc(100% + 4px); white-space:nowrap; font-size:12px; background:var(--pr-bg); color:var(--pr-text); border-radius:5px }\n.pr-copy-status:not(:empty) { padding:4px 8px; border:1px solid var(--pr-border); box-shadow:0 2px 8px #0001 }\n.pr-cell-menu-popup { position:absolute; right:0; top:calc(100% + 4px); min-width:136px; padding:4px; background:var(--pr-bg); border:1px solid var(--pr-border); border-radius:10px; box-shadow:0 6px 24px #0002; z-index:3 }\n.pr-cell-menu-popup>button { display:block; width:100%; border:0; border-radius:6px; text-align:left; font-size:13px; padding:8px 12px; white-space:nowrap }\n.pr-cell-menu-popup>button[aria-disabled=true] { color:var(--pr-muted); cursor:not-allowed }\n.pr-cell-menu-popup>button small { display:block; font-size:12px; font-weight:normal }\n.pr-source-dialog,.pr-dialog { color:var(--pr-text); background:var(--pr-bg); border:1px solid var(--pr-border); border-radius:24px; width:min(800px,calc(100vw - 48px)); max-width:none; max-height:min(760px,calc(100dvh - 48px)); margin:auto; padding:0; box-shadow:0 18px 70px #0003; font:14px/1.6 system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif; overflow:hidden }\n.pr-source-dialog[open],.pr-dialog[open] { display:flex; flex-direction:column }\n.pr-source-dialog-shell { display:flex; flex-direction:column; min-height:0; width:100% }\n.pr-reader .pr-source-dialog-context { font-size:13px; color:var(--pr-muted); margin:4px 0 0 }\n.pr-source-dialog::backdrop,.pr-dialog::backdrop { background:#0005 }\n.pr-source-dialog-header,.pr-dialog-header { display:flex; justify-content:space-between; align-items:center; gap:16px; padding:20px 24px 4px; flex-shrink:0 }\n.pr-source-dialog .pr-source-dialog-title,.pr-dialog-header h2 { font-size:24px; font-weight:500; margin:0 }\n.pr-reader .pr-source-dialog-close { width:32px; height:32px; border:0; padding:6px; background:transparent; color:var(--pr-muted); flex-shrink:0 }\n.pr-source-dialog-close svg { width:18px; height:18px }\n.pr-source-tabs { display:flex; gap:28px; padding:0 24px; border-bottom:1px solid var(--pr-border); flex-shrink:0 }\n.pr-reader .pr-source-tab { padding:14px 0; border:0; border-bottom:2px solid transparent; border-radius:0; background:transparent; color:var(--pr-muted); font-size:14px }\n.pr-reader .pr-source-tab[aria-selected=true] { color:var(--pr-text); border-bottom-color:var(--pr-text) }\n.pr-source-dialog-body { padding:20px 24px 24px; overflow:auto; min-height:0; overscroll-behavior:contain }\n.pr-source-overview { font-size:14px; min-width:0 }\n.pr-source-overview-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:20px 24px; margin:0 0 24px }\n.pr-source-overview-grid>div { min-width:0 }\n.pr-source-overview-grid dt { color:var(--pr-muted); font-size:13px; margin:0 0 4px }\n.pr-source-overview-label { color:var(--pr-muted); font-size:13px; font-weight:400; margin:0 0 4px }\n.pr-source-overview dd { margin:0; overflow-wrap:anywhere }\n.pr-source-fields { display:flex; flex-wrap:wrap; gap:4px 10px; list-style:none; padding:0; margin:0 }\n.pr-source-list { display:flex; flex-direction:column; gap:24px }\n.pr-source-card { min-width:0 }\n.pr-source-card+.pr-source-card { border-top:1px solid var(--pr-border); padding-top:20px }\n.pr-source-card h3 { font-size:14px; margin:0 0 12px; font-weight:500 }\n.pr-source-semantic-group { margin-top:16px }\n.pr-source-semantic-list { display:flex; flex-wrap:wrap; gap:6px; list-style:none; padding:0; margin:4px 0 16px }\n.pr-source-semantic-list>li { border:1px solid var(--pr-border); border-radius:14px; padding:2px 8px; overflow-wrap:anywhere; max-width:100%; font-size:13px }\n.pr-reader .pr-semantic-link { font:inherit; color:var(--pr-accent); background:none; border:0; padding:0; cursor:pointer; text-align:left; overflow-wrap:anywhere; text-decoration:underline; text-underline-offset:3px }\n.pr-reader .pr-semantic-link:focus-visible { outline:2px solid var(--pr-accent); outline-offset:3px; border-radius:3px }\n.pr-source-issues { margin:12px 0 0; color:var(--pr-warning); font-size:13px }\n.pr-source-summary { margin-top:32px; padding-top:16px; border-top:1px solid var(--pr-border) }\n.pr-source-summary>summary { font-size:14px }\n.pr-source-code { display:flex; flex-direction:column; gap:20px; min-width:0 }\n.pr-source-code-snippet { min-width:0 }\n.pr-source-code-header { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center; gap:8px; margin-bottom:8px }\n.pr-source-code-header h3 { margin:0; font-size:14px; font-weight:500 }\n.pr-source-code-copy { display:flex; flex-wrap:wrap; align-items:center; gap:8px; font-size:12px; color:var(--pr-muted) }\n.pr-reader .pr-source-code-note { margin:0 0 8px; font-size:12px; color:var(--pr-muted) }\n.pr-source-code-copy button { font-size:12px }\n.pr-source-code pre { margin:0; padding:14px 16px; border:1px solid var(--pr-border); border-radius:10px; background:var(--pr-soft); max-height:420px; overflow:auto; white-space:pre; tab-size:4; user-select:text; font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace }\n.pr-source-code-summary { margin-top:20px }\n.pr-source-code-summary>summary { margin-bottom:12px; font-size:14px }\n.pr-copy-dialog { max-width:640px; padding-bottom:24px; overflow:auto }\n.pr-copy-dialog>p,.pr-copy-dialog>label { margin:16px 24px }\n.pr-copy-dialog textarea { display:block; width:calc(100% - 48px); min-height:220px; max-height:50vh; margin:16px 24px 0; padding:12px; background:var(--pr-soft); color:var(--pr-text); border:1px solid var(--pr-border); border-radius:8px; font:13px/1.65 ui-monospace,monospace; resize:vertical }\n\n.pr-chart-explorer { margin:18px 0; padding:20px; border:1px solid var(--pr-border); border-radius:12px; background:var(--pr-soft); font-size:13px; min-width:0 }\n.pr-explorer-header { display:flex; justify-content:space-between; gap:12px; align-items:flex-start }\n.pr-explorer-header h3 { margin:0 }\n.pr-explorer-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr)); gap:14px; margin:14px 0 }\n.pr-explorer-grid>label { display:flex; flex-direction:column; gap:6px; min-width:0 }\n.pr-explorer-grid select { width:100%; min-width:0 }\n.pr-explorer-fields { border:0; border-top:1px solid var(--pr-border); padding:12px 0 0; margin:16px 0 0; min-width:0 }\n.pr-explorer-fields legend { font-weight:600; padding:0 8px 0 0 }\n.pr-explorer-series { display:flex; align-items:center; flex-wrap:wrap; gap:10px; margin:8px 0 }\n.pr-explorer-series label { display:flex; align-items:center; gap:6px }\n.pr-explorer-series input { accent-color:var(--pr-accent); min-width:16px; min-height:16px }\n.pr-explorer-visible { color:var(--pr-muted) }\n.pr-explorer-footer { margin-top:16px; display:flex; justify-content:flex-end }\n.pr-host-print { display:none }\n\n.pr-host { min-width:0 }\n.pr-host-actions { display:flex; gap:10px; justify-content:flex-end; padding:12px }\nbody[data-presentation-portable] { margin:0; background:#fff }\nhtml[data-presentation-ready=true] body[data-presentation-portable] #presentation-fallback { display:none }\n@media(prefers-color-scheme:dark) {\n body[data-presentation-portable] { background:#1c1c1f }\n .pr-reader { --pr-code-keyword:#d9a0e5; --pr-code-string:#99cda7; --pr-code-number:#ebbb8a; --pr-code-function:#9bbef3; --pr-bg:#1c1c1f; --pr-soft:#262629; --pr-text:#ededed; --pr-muted:#aaa; --pr-border:#39393e; --pr-accent:#91b7f3; --pr-warning:#e3bb70; --pr-chart-1:#8cb0ed; --pr-chart-2:#dbab7f; --pr-chart-3:#8ec0a9; --pr-chart-muted:#a0a0a6; --pr-chart-grid:rgba(255,255,255,.08); --pr-chart-hover:rgba(255,255,255,.04); --pr-chart-4:#b7a0d6; --pr-chart-5:#d99bb0; --pr-chart-6:#b8be86; color-scheme:dark }\n}\n.dark .pr-reader,[data-theme=dark] .pr-reader { --pr-code-keyword:#d9a0e5; --pr-code-string:#99cda7; --pr-code-number:#ebbb8a; --pr-code-function:#9bbef3; --pr-bg:#1c1c1f; --pr-soft:#262629; --pr-text:#ededed; --pr-muted:#aaa; --pr-border:#39393e; --pr-accent:#91b7f3; --pr-warning:#e3bb70; --pr-chart-1:#8cb0ed; --pr-chart-2:#dbab7f; --pr-chart-3:#8ec0a9; --pr-chart-muted:#a0a0a6; --pr-chart-grid:rgba(255,255,255,.08); --pr-chart-hover:rgba(255,255,255,.04); --pr-chart-4:#b7a0d6; --pr-chart-5:#d99bb0; --pr-chart-6:#b8be86; color-scheme:dark }\n.light .pr-reader,[data-theme=light] .pr-reader { --pr-bg:#fff; --pr-soft:#f7f7f8; --pr-text:#242424; --pr-muted:#666; --pr-border:#e5e5e7; --pr-accent:#3567b7; --pr-warning:#805b20; --pr-chart-1:#286dee; --pr-chart-2:#ba7039; --pr-chart-3:#548878; --pr-chart-muted:#96969b; --pr-chart-grid:rgba(13,13,13,.06); --pr-chart-hover:rgba(13,13,13,.03); --pr-chart-4:#8d6cb0; --pr-chart-5:#b46379; --pr-chart-6:#727c38; color-scheme:light }\n@media(max-width:640px) {\n .pr-reader { padding:28px 20px; font-size:15px }\n .pr-reader h1 { font-size:26px }\n .pr-block-markdown h2 { font-size:20px }\n .pr-blocks { gap:26px }\n .pr-source-dialog,.pr-dialog { width:calc(100vw - 24px); max-height:calc(100dvh - 24px); border-radius:18px }\n .pr-source-dialog-header,.pr-dialog-header { padding:16px 18px 4px }\n .pr-source-tabs { padding:0 18px }\n .pr-source-dialog-body { padding:18px }\n .pr-source-overview-grid { grid-template-columns:1fr; gap:16px }\n .pr-metric-group { gap:12px }\n .pr-block-metric { padding:16px }\n .pr-metric-value { font-size:25px }\n .pr-pagination { justify-content:space-between; gap:8px }\n .pr-tooltip { max-width:80vw }\n}\n@media(pointer:coarse) { .pr-reader summary,.pr-reader button { min-height:44px } .pr-reader .pr-icon-button { width:36px } .pr-block-metric>h2,.pr-block-chart>h2 { padding-right:44px } .pr-reader select,.pr-reader textarea { font-size:16px } }\n@media print {\n .pr-host-live { display:none!important }\n .pr-host-print { display:block!important }\n html[data-presentation-ready=true] body[data-presentation-portable] #presentation-fallback,body[data-presentation-portable] #presentation-fallback { display:block!important }\n body[data-presentation-portable] #reader,.pr-interactive { display:none!important }\n .pr-reader { --pr-bg:#fff; --pr-soft:#fff; --pr-text:#111; --pr-muted:#444; --pr-border:#bbb; --pr-accent:#222; --pr-warning:#333; max-width:none; padding:0; font-size:10pt; color-scheme:light }\n .pr-blocks { display:block }\n .pr-block { border:0; padding:12px 0; border-radius:0 }\n .pr-block-markdown { max-width:none }\n .pr-block-metric>h2,.pr-block-chart>h2,.pr-block-markdown .pr-markdown>:first-child { padding-right:0 }\n .pr-source-summary::details-content { content-visibility:visible }\n .pr-source-summary>* { display:block }\n .pr-source-code-summary { display:none!important }\n .pr-source-dialog,.pr-dialog { display:none!important }\n .pr-metric-group { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)) }\n .pr-metric-group>.pr-block-metric { min-width:0; max-width:none }\n .pr-reader[data-mode] .pr-chart-row { display:block }\n .pr-reader[data-mode] .pr-chart-row>.pr-block-chart { min-width:0; max-width:none }\n .pr-header { break-after:avoid }\n .pr-reader h1,.pr-reader h2,.pr-reader h3 { break-after:avoid }\n .pr-table-scroll { overflow:visible }\n .pr-table table { table-layout:fixed; width:100%; font-size:8pt }\n .pr-table caption { padding-left:5px; padding-right:5px }\n .pr-table th,.pr-table td { min-width:0; padding:5px; white-space:pre-wrap!important; overflow-wrap:anywhere }\n .pr-table tr { break-inside:avoid }\n .pr-table thead { display:table-header-group }\n .pr-reader pre { white-space:pre-wrap }\n}\n.pr-region-label{color:var(--pr-muted);font-size:12px;letter-spacing:.02em;margin:0!important}\n.pr-interaction-region{min-width:0}\n.pr-region-divider{border:0;border-top:1px solid var(--pr-border);margin:0;width:100%}\n@media print{.pr-region-divider{margin:20px 0}}\n.pr-interaction-header{margin-bottom:28px}.pr-interaction-header h2{margin-bottom:4px}.pr-interaction-header>.pr-muted{margin:4px 0 16px}\n.pr-filter-toolbar{border:0;padding:0;margin:0;min-width:0;display:flex;flex-wrap:wrap;gap:8px;align-items:center;position:relative;z-index:5}\n.pr-filter-menu{position:relative;min-width:0;max-width:100%}\n.pr-reader .pr-filter-trigger{display:flex;align-items:center;gap:8px;border-radius:999px;padding:5px 12px;min-height:34px;font-size:14px;line-height:22px;max-width:100%}\n.pr-filter-label{color:var(--pr-muted);flex-shrink:0}.pr-filter-value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}\n.pr-filter-popup{position:absolute;top:calc(100% + 6px);left:0;width:260px;max-width:calc(100vw - 80px);padding:8px;border:1px solid var(--pr-border);border-radius:12px;background:var(--pr-bg);box-shadow:0 8px 24px #0002;z-index:10;animation:pr-filter-in .12s ease-out}\n.pr-filter-popup input{width:100%;min-width:0;padding:8px 10px;border:1px solid var(--pr-border);border-radius:7px;background:var(--pr-bg);color:var(--pr-text);font:inherit;font-size:14px;margin-bottom:6px}\n.pr-filter-options{max-height:260px;overflow-y:auto}.pr-reader .pr-filter-options button{display:flex;justify-content:space-between;align-items:center;gap:12px;text-align:left;width:100%;border:0;border-radius:6px;padding:8px 10px;font-size:14px}\n.pr-filter-options button[aria-checked=true]{background:var(--pr-soft);font-weight:600}\n.pr-reader .pr-filter-reset{border:0;background:transparent;font-size:13px;color:var(--pr-muted)}\n.pr-reader .pr-filter-status{font-size:12px;color:var(--pr-muted);margin:12px 0 0}\n@keyframes pr-filter-in{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}\n@media(prefers-reduced-motion:reduce){.pr-filter-popup{animation:none}}\n@media(max-width:600px){.pr-filter-menu{width:100%}.pr-reader .pr-filter-trigger{width:100%;justify-content:space-between}.pr-filter-popup{width:100%;max-width:100%}}\n\n.pr-special-frame { position:relative; min-width:0; margin:0 }\n.pr-special-scroll { overflow-x:auto; padding-bottom:4px; max-width:100% }\n.pr-special-chart { display:block; color:var(--pr-text); overflow:visible; font-size:12px; font-variant-numeric:tabular-nums }\n.pr-special-chart text { fill:var(--pr-text) }\n.pr-special-chart .pr-axis-tick { fill:var(--pr-chart-muted) }\n.pr-special-chart [data-chart-mark]:focus { outline:2px solid var(--pr-accent); outline-offset:3px }\n.pr-special-tooltip { position:absolute; top:0; left:0; z-index:2; max-width:100%; pointer-events:none }\n.pr-chart-sparkline { height:128px }\n.pr-chart-role { color:var(--pr-muted); font-size:11px }\n.pr-chart-label { fill:var(--pr-text); font-size:11px }\n.pr-special-chart .pr-chart-label { paint-order:stroke; stroke:var(--pr-bg); stroke-width:3px; stroke-linejoin:round }\n.pr-color-key { display:flex; gap:12px; flex-wrap:wrap; font-size:12px; color:var(--pr-muted); margin:8px 0 }\n.pr-color-key span { display:inline-flex; align-items:center; gap:5px }\n\n\n.pr-cell-editor{border:1px solid var(--pr-border);border-radius:8px;padding:12px;margin:8px 0 16px;min-width:0;background:var(--pr-soft)}\n.pr-editor-actions{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px}.pr-cell-editor label{display:block}.pr-cell-editor textarea{display:block;width:100%;min-height:120px;resize:vertical}.pr-cell-editor input:not([type=checkbox]),.pr-report-title-editor input{display:block;width:100%;min-width:0}.pr-cell-editor button{margin:4px;padding:5px 9px}.pr-cell-editor .pr-editor-column{display:inline-flex;align-items:center;gap:6px;margin:4px 12px 4px 0}\n.pr-report-title-editor{display:block;font-weight:600}.pr-report-title-editor input{font:inherit;font-size:24px;padding:8px}\n.pr-cell-editor input,.pr-cell-editor textarea,.pr-report-title-editor input{font-family:inherit;color:var(--pr-text);background:var(--pr-bg);border:1px solid var(--pr-border);border-radius:5px;padding:6px;box-sizing:border-box}\n";
@@ -0,0 +1,12 @@
1
+ import type { TypedDataset } from '../../presentation/contracts/types.ts';
2
+ import { type ReaderMode } from './model.ts';
3
+ export declare function DatasetTable({ data, columns, mode, caption, showScope, showSelectionCount, rowIndices, filterKey, }: {
4
+ data: TypedDataset;
5
+ columns?: string[];
6
+ mode: ReaderMode;
7
+ caption: string;
8
+ showScope?: boolean;
9
+ showSelectionCount?: boolean;
10
+ rowIndices?: readonly number[];
11
+ filterKey?: string;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ /** Measure the containing block, retaining its last usable width while it is hidden. */
2
+ export declare function useElementWidth(minimum: number, initial: number): {
3
+ ref: import("react").RefObject<HTMLDivElement>;
4
+ width: number;
5
+ };
@@ -0,0 +1,7 @@
1
+ export declare function WorkspaceHeaderAction({ label, icon, disabled, title, onClick, }: {
2
+ label: string;
3
+ icon: 'semantic' | 'credentials';
4
+ disabled: boolean;
5
+ title?: string;
6
+ onClick: () => void;
7
+ }): import("react").JSX.Element;