dataface 0.1.2__py3-none-any.whl

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 (455) hide show
  1. d3_format/__init__.py +14 -0
  2. d3_format/errors.py +19 -0
  3. d3_format/format.py +551 -0
  4. d3_format/spec.py +159 -0
  5. dataface/DATAFACE_SYNTAX.md +1135 -0
  6. dataface/__init__.py +93 -0
  7. dataface/_docs_site.py +20 -0
  8. dataface/_install_hint.py +26 -0
  9. dataface/agent_api/__init__.py +79 -0
  10. dataface/agent_api/_init_templates/__init__.py +0 -0
  11. dataface/agent_api/_init_templates/agents_dft_snippet.md +26 -0
  12. dataface/agent_api/_init_templates/dataface.yml +15 -0
  13. dataface/agent_api/_init_templates/faces-dataface.yml +144 -0
  14. dataface/agent_api/_init_templates/index.md +24 -0
  15. dataface/agent_api/_paths.py +118 -0
  16. dataface/agent_api/_project_agents_md.py +43 -0
  17. dataface/agent_api/_session_store.py +486 -0
  18. dataface/agent_api/_state.py +28 -0
  19. dataface/agent_api/chat.py +221 -0
  20. dataface/agent_api/dashboards.py +257 -0
  21. dataface/agent_api/describe.py +366 -0
  22. dataface/agent_api/describe_query.py +120 -0
  23. dataface/agent_api/docs/__init__.py +25 -0
  24. dataface/agent_api/docs/_loader.py +292 -0
  25. dataface/agent_api/docs/yaml-reference.md +2757 -0
  26. dataface/agent_api/file_refs.py +118 -0
  27. dataface/agent_api/init.py +126 -0
  28. dataface/agent_api/inspect.py +128 -0
  29. dataface/agent_api/mcp_install.py +170 -0
  30. dataface/agent_api/query.py +274 -0
  31. dataface/agent_api/schema.py +658 -0
  32. dataface/agent_api/schema_search.py +284 -0
  33. dataface/agent_api/search.py +270 -0
  34. dataface/agent_api/skill_install.py +141 -0
  35. dataface/agent_api/skill_render.py +90 -0
  36. dataface/agent_api/skills.py +293 -0
  37. dataface/agent_api/surface_aliases.yaml +128 -0
  38. dataface/agent_api/validate.py +175 -0
  39. dataface/agent_api/validate_query.py +84 -0
  40. dataface/ai/__init__.py +39 -0
  41. dataface/ai/agent.py +139 -0
  42. dataface/ai/context.py +45 -0
  43. dataface/ai/events.py +62 -0
  44. dataface/ai/external_mcp.py +610 -0
  45. dataface/ai/generate_sql.py +96 -0
  46. dataface/ai/llm.py +403 -0
  47. dataface/ai/mcp/__init__.py +51 -0
  48. dataface/ai/mcp/server.py +289 -0
  49. dataface/ai/memories.py +85 -0
  50. dataface/ai/prompts.py +177 -0
  51. dataface/ai/schema_context.py +138 -0
  52. dataface/ai/skills/before-after-comparison/SKILL.md +102 -0
  53. dataface/ai/skills/before-after-comparison/examples/before-after-comparison.yml +24 -0
  54. dataface/ai/skills/dashboard-build/SKILL.md +212 -0
  55. dataface/ai/skills/dashboard-build/examples/_smoke.yml +15 -0
  56. dataface/ai/skills/dashboard-design/SKILL.md +182 -0
  57. dataface/ai/skills/dashboard-review/SKILL.md +113 -0
  58. dataface/ai/skills/dashboard-structural-review/SKILL.md +173 -0
  59. dataface/ai/skills/dashboard-visual-review/SKILL.md +139 -0
  60. dataface/ai/skills/dataface-mcp-setup/SKILL.md +177 -0
  61. dataface/ai/skills/dataface-troubleshooting/SKILL.md +225 -0
  62. dataface/ai/skills/drill-down-link/SKILL.md +112 -0
  63. dataface/ai/skills/drill-down-link/examples/drill-down-link.yml +27 -0
  64. dataface/ai/skills/faceted-small-multiples/SKILL.md +116 -0
  65. dataface/ai/skills/faceted-small-multiples/examples/faceted-small-multiples.yml +33 -0
  66. dataface/ai/skills/filter-bar-with-variables/SKILL.md +105 -0
  67. dataface/ai/skills/filter-bar-with-variables/examples/filter-bar-with-variables.yml +49 -0
  68. dataface/ai/skills/kpi-row/SKILL.md +101 -0
  69. dataface/ai/skills/kpi-row/examples/kpi-row.yml +55 -0
  70. dataface/ai/skills/report-design/SKILL.md +184 -0
  71. dataface/ai/skills/single-metric-bignum/SKILL.md +90 -0
  72. dataface/ai/skills/single-metric-bignum/examples/single-metric-bignum.yml +27 -0
  73. dataface/ai/skills/table-heavy-ops-dashboard/SKILL.md +114 -0
  74. dataface/ai/skills/table-heavy-ops-dashboard/examples/table-heavy-ops-dashboard.yml +48 -0
  75. dataface/ai/skills/time-series-trend/SKILL.md +93 -0
  76. dataface/ai/skills/time-series-trend/examples/time-series-trend.yml +26 -0
  77. dataface/ai/skills/top-n-with-detail/SKILL.md +98 -0
  78. dataface/ai/skills/top-n-with-detail/examples/top-n-with-detail.yml +45 -0
  79. dataface/ai/skills/two-by-two-grid-overview/SKILL.md +78 -0
  80. dataface/ai/skills/two-by-two-grid-overview/examples/two-by-two-grid-overview.yml +64 -0
  81. dataface/ai/tool_schemas.py +132 -0
  82. dataface/ai/tools/__init__.py +312 -0
  83. dataface/ai/yaml_utils.py +57 -0
  84. dataface/cli/__init__.py +3 -0
  85. dataface/cli/_console.py +48 -0
  86. dataface/cli/_error_format.py +83 -0
  87. dataface/cli/_extras.py +190 -0
  88. dataface/cli/_json_output.py +8 -0
  89. dataface/cli/_parsing.py +17 -0
  90. dataface/cli/_version_info.py +56 -0
  91. dataface/cli/commands/__init__.py +3 -0
  92. dataface/cli/commands/_agent_input.py +205 -0
  93. dataface/cli/commands/_agent_server.py +115 -0
  94. dataface/cli/commands/chat.py +645 -0
  95. dataface/cli/commands/describe.py +107 -0
  96. dataface/cli/commands/docs.py +131 -0
  97. dataface/cli/commands/extension.py +179 -0
  98. dataface/cli/commands/init.py +240 -0
  99. dataface/cli/commands/inspect.py +94 -0
  100. dataface/cli/commands/mcp_init.py +167 -0
  101. dataface/cli/commands/query.py +386 -0
  102. dataface/cli/commands/render.py +291 -0
  103. dataface/cli/commands/schema.py +411 -0
  104. dataface/cli/commands/search.py +49 -0
  105. dataface/cli/commands/serve.py +114 -0
  106. dataface/cli/commands/skills.py +133 -0
  107. dataface/cli/commands/skills_init.py +161 -0
  108. dataface/cli/commands/validate.py +63 -0
  109. dataface/cli/main.py +1501 -0
  110. dataface/core/__init__.py +75 -0
  111. dataface/core/compile/__init__.py +244 -0
  112. dataface/core/compile/_jinja_helpers.py +78 -0
  113. dataface/core/compile/channel.py +222 -0
  114. dataface/core/compile/chart_focus.py +101 -0
  115. dataface/core/compile/chart_resolved.py +169 -0
  116. dataface/core/compile/chart_type_detection.py +489 -0
  117. dataface/core/compile/chart_update.py +261 -0
  118. dataface/core/compile/colors.py +64 -0
  119. dataface/core/compile/compiler.py +904 -0
  120. dataface/core/compile/config.py +823 -0
  121. dataface/core/compile/custom_chart_types.py +208 -0
  122. dataface/core/compile/data_table_attachment.py +1287 -0
  123. dataface/core/compile/detect.py +110 -0
  124. dataface/core/compile/errors.py +302 -0
  125. dataface/core/compile/filter_injection.py +319 -0
  126. dataface/core/compile/introspection.py +527 -0
  127. dataface/core/compile/jinja.py +511 -0
  128. dataface/core/compile/labels_env.py +52 -0
  129. dataface/core/compile/markdown.py +154 -0
  130. dataface/core/compile/meta.py +388 -0
  131. dataface/core/compile/models/__init__.py +0 -0
  132. dataface/core/compile/models/chart/__init__.py +0 -0
  133. dataface/core/compile/models/chart/authored.py +2137 -0
  134. dataface/core/compile/models/chart/compiled.py +398 -0
  135. dataface/core/compile/models/config.py +347 -0
  136. dataface/core/compile/models/face/__init__.py +0 -0
  137. dataface/core/compile/models/face/authored.py +659 -0
  138. dataface/core/compile/models/face/compiled.py +522 -0
  139. dataface/core/compile/models/factories.py +201 -0
  140. dataface/core/compile/models/markers.py +40 -0
  141. dataface/core/compile/models/palette.py +36 -0
  142. dataface/core/compile/models/primitives.py +415 -0
  143. dataface/core/compile/models/query/__init__.py +0 -0
  144. dataface/core/compile/models/query/authored.py +246 -0
  145. dataface/core/compile/models/query/compiled.py +710 -0
  146. dataface/core/compile/models/refs.py +137 -0
  147. dataface/core/compile/models/source.py +611 -0
  148. dataface/core/compile/models/style/__init__.py +0 -0
  149. dataface/core/compile/models/style/authored.py +481 -0
  150. dataface/core/compile/models/style/compiled.py +3399 -0
  151. dataface/core/compile/models/style/merged.py +1682 -0
  152. dataface/core/compile/models/theme.py +362 -0
  153. dataface/core/compile/models/variable/__init__.py +0 -0
  154. dataface/core/compile/models/variable/authored.py +254 -0
  155. dataface/core/compile/models/vega_lite/__init__.py +0 -0
  156. dataface/core/compile/models/vega_lite/config.py +510 -0
  157. dataface/core/compile/models/vega_lite/contracts.py +171 -0
  158. dataface/core/compile/normalize_charts.py +494 -0
  159. dataface/core/compile/normalize_layout.py +1000 -0
  160. dataface/core/compile/normalize_queries.py +297 -0
  161. dataface/core/compile/normalize_variables.py +489 -0
  162. dataface/core/compile/normalizer.py +543 -0
  163. dataface/core/compile/palette.py +1100 -0
  164. dataface/core/compile/parameterized.py +658 -0
  165. dataface/core/compile/parser.py +228 -0
  166. dataface/core/compile/schema.py +20 -0
  167. dataface/core/compile/schema_renderers/__init__.py +0 -0
  168. dataface/core/compile/schema_renderers/json_schema.py +163 -0
  169. dataface/core/compile/schema_renderers/prompt.py +152 -0
  170. dataface/core/compile/schema_renderers/vscode_schema.py +301 -0
  171. dataface/core/compile/sizing.py +2126 -0
  172. dataface/core/compile/sources.py +518 -0
  173. dataface/core/compile/sql_authoring_lint.py +56 -0
  174. dataface/core/compile/style_cascade.py +471 -0
  175. dataface/core/compile/typography.py +299 -0
  176. dataface/core/compile/validator.py +301 -0
  177. dataface/core/compile/variables.py +53 -0
  178. dataface/core/compile/vega_config.py +98 -0
  179. dataface/core/compile/vega_lite/__init__.py +6 -0
  180. dataface/core/compile/vega_lite/validation.py +95 -0
  181. dataface/core/compile/yaml_error_formatter.py +838 -0
  182. dataface/core/connections.py +38 -0
  183. dataface/core/dashboard.py +358 -0
  184. dataface/core/defaults/default_config.yml +101 -0
  185. dataface/core/defaults/palettes/categorical/category-10-dark.yml +32 -0
  186. dataface/core/defaults/palettes/categorical/category-10-light.yml +43 -0
  187. dataface/core/defaults/palettes/categorical/category-10.yml +31 -0
  188. dataface/core/defaults/palettes/categorical/category-6-tonal-blue.yml +22 -0
  189. dataface/core/defaults/palettes/categorical/category-6-tonal-brown.yml +29 -0
  190. dataface/core/defaults/palettes/categorical/category-6-tonal-green.yml +20 -0
  191. dataface/core/defaults/palettes/categorical/category-6-tonal-orange.yml +21 -0
  192. dataface/core/defaults/palettes/categorical/category-6-tonal-purple.yml +20 -0
  193. dataface/core/defaults/palettes/categorical/editorial-10-dark.yml +32 -0
  194. dataface/core/defaults/palettes/categorical/editorial-10.yml +40 -0
  195. dataface/core/defaults/palettes/categorical/hero-6.yml +17 -0
  196. dataface/core/defaults/palettes/categorical/single-blue.yml +11 -0
  197. dataface/core/defaults/palettes/categorical/tableau.yml +20 -0
  198. dataface/core/defaults/palettes/data/xkcd_colors.json +3803 -0
  199. dataface/core/defaults/palettes/diverging/blue-red.yml +25 -0
  200. dataface/core/defaults/palettes/diverging/coolwarm.yml +24 -0
  201. dataface/core/defaults/palettes/diverging/crimson-green.yml +23 -0
  202. dataface/core/defaults/palettes/diverging/orange-teal.yml +23 -0
  203. dataface/core/defaults/palettes/diverging/sunset.yml +24 -0
  204. dataface/core/defaults/palettes/scaffold/dft-creams.yml +38 -0
  205. dataface/core/defaults/palettes/scaffold/dft-grays.yml +53 -0
  206. dataface/core/defaults/palettes/sequential/amber.yml +22 -0
  207. dataface/core/defaults/palettes/sequential/blue.yml +22 -0
  208. dataface/core/defaults/palettes/sequential/brown.yml +22 -0
  209. dataface/core/defaults/palettes/sequential/gray.yml +22 -0
  210. dataface/core/defaults/palettes/sequential/green.yml +22 -0
  211. dataface/core/defaults/palettes/sequential/purple.yml +22 -0
  212. dataface/core/defaults/palettes/sequential/rust.yml +22 -0
  213. dataface/core/defaults/palettes/sequential/teal.yml +22 -0
  214. dataface/core/defaults/palettes/tone/negative.yml +32 -0
  215. dataface/core/defaults/palettes/tone/positive.yml +22 -0
  216. dataface/core/defaults/palettes/tone/warning.yml +22 -0
  217. dataface/core/defaults/themes/_base.yaml +786 -0
  218. dataface/core/defaults/themes/bi.yaml +16 -0
  219. dataface/core/defaults/themes/carbong100.yaml +41 -0
  220. dataface/core/defaults/themes/cream.yaml +122 -0
  221. dataface/core/defaults/themes/dark.yaml +40 -0
  222. dataface/core/defaults/themes/diagnostics-title-angle-extreme.yaml +9 -0
  223. dataface/core/defaults/themes/diagnostics-title-baseline-extreme.yaml +9 -0
  224. dataface/core/defaults/themes/diagnostics-title-baseline.yaml +24 -0
  225. dataface/core/defaults/themes/diagnostics-title-center.yaml +8 -0
  226. dataface/core/defaults/themes/diagnostics-title-color-extreme.yaml +24 -0
  227. dataface/core/defaults/themes/diagnostics-title-font-extreme.yaml +25 -0
  228. dataface/core/defaults/themes/diagnostics-title-left.yaml +8 -0
  229. dataface/core/defaults/themes/diagnostics-title-offset-extreme.yaml +9 -0
  230. dataface/core/defaults/themes/diagnostics-title-size-extreme.yaml +24 -0
  231. dataface/core/defaults/themes/diagnostics-title-weight-extreme.yaml +24 -0
  232. dataface/core/defaults/themes/editorial.yaml +147 -0
  233. dataface/core/defaults/themes/light.yaml +30 -0
  234. dataface/core/defaults/themes/looker.yaml +17 -0
  235. dataface/core/defaults/themes/stark.yaml +134 -0
  236. dataface/core/errors/__init__.py +67 -0
  237. dataface/core/errors/codes_compile.py +56 -0
  238. dataface/core/errors/codes_execute.py +177 -0
  239. dataface/core/errors/codes_render.py +106 -0
  240. dataface/core/errors/codes_unknown.py +15 -0
  241. dataface/core/errors/hints.py +74 -0
  242. dataface/core/errors/registry.py +42 -0
  243. dataface/core/errors/structured.py +92 -0
  244. dataface/core/execute/__init__.py +91 -0
  245. dataface/core/execute/adapters/__init__.py +49 -0
  246. dataface/core/execute/adapters/adapter_registry.py +400 -0
  247. dataface/core/execute/adapters/base.py +245 -0
  248. dataface/core/execute/adapters/csv_adapter.py +239 -0
  249. dataface/core/execute/adapters/dbt_adapter.py +283 -0
  250. dataface/core/execute/adapters/dbt_adapter_factory.py +212 -0
  251. dataface/core/execute/adapters/dbt_macro_loader.py +95 -0
  252. dataface/core/execute/adapters/dbt_utils.py +150 -0
  253. dataface/core/execute/adapters/http_adapter.py +224 -0
  254. dataface/core/execute/adapters/metricflow_adapter.py +94 -0
  255. dataface/core/execute/adapters/schema_resolver_adapter.py +144 -0
  256. dataface/core/execute/adapters/sql_adapter.py +710 -0
  257. dataface/core/execute/adapters/values_adapter.py +58 -0
  258. dataface/core/execute/batch.py +744 -0
  259. dataface/core/execute/cache_backend.py +135 -0
  260. dataface/core/execute/cache_keys.py +66 -0
  261. dataface/core/execute/dbt_jinja.py +21 -0
  262. dataface/core/execute/dialects/__init__.py +121 -0
  263. dataface/core/execute/dialects/athena.py +75 -0
  264. dataface/core/execute/dialects/base.py +302 -0
  265. dataface/core/execute/dialects/bigquery.py +38 -0
  266. dataface/core/execute/dialects/databricks.py +68 -0
  267. dataface/core/execute/dialects/duckdb.py +35 -0
  268. dataface/core/execute/dialects/mysql.py +68 -0
  269. dataface/core/execute/dialects/postgres.py +39 -0
  270. dataface/core/execute/dialects/redshift.py +12 -0
  271. dataface/core/execute/dialects/snowflake.py +51 -0
  272. dataface/core/execute/dialects/sqlserver.py +92 -0
  273. dataface/core/execute/duckdb_cache.py +712 -0
  274. dataface/core/execute/duckdb_config.py +26 -0
  275. dataface/core/execute/errors.py +213 -0
  276. dataface/core/execute/executor.py +1249 -0
  277. dataface/core/execute/parallel.py +162 -0
  278. dataface/core/execute/setup_sql.py +58 -0
  279. dataface/core/execute/source_registry.py +72 -0
  280. dataface/core/execute/source_resolver.py +255 -0
  281. dataface/core/execute/sql_guard.py +387 -0
  282. dataface/core/execute/sql_literals.py +199 -0
  283. dataface/core/fonts.py +52 -0
  284. dataface/core/inspect/__init__.py +32 -0
  285. dataface/core/inspect/cache_factory.py +98 -0
  286. dataface/core/inspect/db_types.py +162 -0
  287. dataface/core/inspect/dbt_schema.py +96 -0
  288. dataface/core/inspect/defaults.yml +37 -0
  289. dataface/core/inspect/fanout_risk.py +109 -0
  290. dataface/core/inspect/manifest_utils.py +77 -0
  291. dataface/core/inspect/partials/categorical.yml +40 -0
  292. dataface/core/inspect/partials/date.yml +40 -0
  293. dataface/core/inspect/partials/numeric.yml +55 -0
  294. dataface/core/inspect/partition_types.py +38 -0
  295. dataface/core/inspect/query_validator.py +975 -0
  296. dataface/core/inspect/renderer.py +354 -0
  297. dataface/core/inspect/resolver.py +808 -0
  298. dataface/core/inspect/search.py +461 -0
  299. dataface/core/inspect/sources/__init__.py +32 -0
  300. dataface/core/inspect/sources/dbt.py +738 -0
  301. dataface/core/inspect/sources/duckdb_utils.py +66 -0
  302. dataface/core/inspect/templates/__init__.py +1 -0
  303. dataface/core/inspect/templates/categorical_column.yml +196 -0
  304. dataface/core/inspect/templates/charts.yml +109 -0
  305. dataface/core/inspect/templates/date_column.yml +248 -0
  306. dataface/core/inspect/templates/model.yml +138 -0
  307. dataface/core/inspect/templates/numeric_column.yml +261 -0
  308. dataface/core/inspect/templates/quality.yml +80 -0
  309. dataface/core/inspect/templates/string_column.yml +263 -0
  310. dataface/core/project_roots.py +165 -0
  311. dataface/core/render/__init__.py +87 -0
  312. dataface/core/render/board_links.py +176 -0
  313. dataface/core/render/chart/__init__.py +27 -0
  314. dataface/core/render/chart/arc_attached_table.py +251 -0
  315. dataface/core/render/chart/artifacts.py +16 -0
  316. dataface/core/render/chart/callout.py +225 -0
  317. dataface/core/render/chart/decisions.py +358 -0
  318. dataface/core/render/chart/geo.py +700 -0
  319. dataface/core/render/chart/kpi.py +916 -0
  320. dataface/core/render/chart/labels.py +76 -0
  321. dataface/core/render/chart/pipeline.py +818 -0
  322. dataface/core/render/chart/presentation.py +36 -0
  323. dataface/core/render/chart/profile.py +3438 -0
  324. dataface/core/render/chart/render_single.py +347 -0
  325. dataface/core/render/chart/renderers.py +193 -0
  326. dataface/core/render/chart/rendering.py +565 -0
  327. dataface/core/render/chart/serialization.py +90 -0
  328. dataface/core/render/chart/spark.py +496 -0
  329. dataface/core/render/chart/spark_bar.py +370 -0
  330. dataface/core/render/chart/spec_builders.py +154 -0
  331. dataface/core/render/chart/standard_renderer.py +2645 -0
  332. dataface/core/render/chart/table.py +2957 -0
  333. dataface/core/render/chart/table_support.py +1452 -0
  334. dataface/core/render/chart/tick_values.py +66 -0
  335. dataface/core/render/chart/time_unit_detect.py +809 -0
  336. dataface/core/render/chart/title_overflow.py +157 -0
  337. dataface/core/render/chart/type_inference.py +122 -0
  338. dataface/core/render/chart/validation.py +99 -0
  339. dataface/core/render/chart/vega_lite.py +125 -0
  340. dataface/core/render/chart/vega_lite_types.py +268 -0
  341. dataface/core/render/chart/vl_field_maps.py +346 -0
  342. dataface/core/render/chart_interactivity.py +24 -0
  343. dataface/core/render/control_registry.py +287 -0
  344. dataface/core/render/converters/__init__.py +24 -0
  345. dataface/core/render/converters/chart.py +276 -0
  346. dataface/core/render/converters/html.py +98 -0
  347. dataface/core/render/converters/pdf.py +40 -0
  348. dataface/core/render/converters/png.py +41 -0
  349. dataface/core/render/errors.py +144 -0
  350. dataface/core/render/face_api.py +160 -0
  351. dataface/core/render/faces.py +1194 -0
  352. dataface/core/render/font_measurement.py +48 -0
  353. dataface/core/render/font_support.py +197 -0
  354. dataface/core/render/fonts/DFTSansTabular-Regular.ttf +0 -0
  355. dataface/core/render/fonts/DFTSansTabular-Regular.woff2 +0 -0
  356. dataface/core/render/fonts/DFTSerifOldstyleProportional-Regular.ttf +0 -0
  357. dataface/core/render/fonts/DFTSerifOldstyleTabular-Regular.ttf +0 -0
  358. dataface/core/render/fonts/InterVariable.ttf +0 -0
  359. dataface/core/render/fonts/InterVariable.woff2 +0 -0
  360. dataface/core/render/fonts/NOTO_COLOR_EMOJI_LICENSE.txt +93 -0
  361. dataface/core/render/fonts/NOTO_EMOJI_LICENSE.txt +93 -0
  362. dataface/core/render/fonts/NotoColorEmoji-Regular.ttf +0 -0
  363. dataface/core/render/fonts/NotoColorEmoji-Regular.woff2 +0 -0
  364. dataface/core/render/fonts/NotoEmoji-Regular.ttf +0 -0
  365. dataface/core/render/fonts/NotoEmoji-Regular.woff2 +0 -0
  366. dataface/core/render/fonts/SOURCE_CODE_PRO_LICENSE.txt +93 -0
  367. dataface/core/render/fonts/SOURCE_SERIF_4_LICENSE.txt +98 -0
  368. dataface/core/render/fonts/SourceCodePro-Regular.ttf +0 -0
  369. dataface/core/render/fonts/SourceSerif4-Regular.ttf +0 -0
  370. dataface/core/render/fonts/_emoji_font_face.css +43 -0
  371. dataface/core/render/fonts/source-serif-4-variable-latin.woff2 +0 -0
  372. dataface/core/render/format_utils.py +329 -0
  373. dataface/core/render/geo_defaults.yml +28 -0
  374. dataface/core/render/json_format.py +146 -0
  375. dataface/core/render/layout_sizing.py +865 -0
  376. dataface/core/render/layouts.py +541 -0
  377. dataface/core/render/markdown_defaults.yml +16 -0
  378. dataface/core/render/missing_vars_prompt.py +79 -0
  379. dataface/core/render/placeholder.py +389 -0
  380. dataface/core/render/render_result.py +14 -0
  381. dataface/core/render/renderer.py +467 -0
  382. dataface/core/render/script_embedding.py +16 -0
  383. dataface/core/render/svg_utils.py +212 -0
  384. dataface/core/render/template_loader.py +69 -0
  385. dataface/core/render/templates/controls/_styles.css +606 -0
  386. dataface/core/render/templates/controls/checkbox.html +16 -0
  387. dataface/core/render/templates/controls/date.html +16 -0
  388. dataface/core/render/templates/controls/number.html +19 -0
  389. dataface/core/render/templates/controls/readonly.html +9 -0
  390. dataface/core/render/templates/controls/select.html +21 -0
  391. dataface/core/render/templates/controls/slider.html +22 -0
  392. dataface/core/render/templates/controls/text.html +16 -0
  393. dataface/core/render/templates/scripts/chart_interactivity.js +191 -0
  394. dataface/core/render/templates/scripts/variables.js +976 -0
  395. dataface/core/render/templates/svg/grid_pattern.svg +3 -0
  396. dataface/core/render/templates/svg/styles.css +51 -0
  397. dataface/core/render/terminal.py +311 -0
  398. dataface/core/render/terminal_charts.py +563 -0
  399. dataface/core/render/terminal_defaults.yml +2 -0
  400. dataface/core/render/terminal_layouts.py +299 -0
  401. dataface/core/render/terminal_text.py +31 -0
  402. dataface/core/render/text/__init__.py +1 -0
  403. dataface/core/render/text/case.py +113 -0
  404. dataface/core/render/text_format.py +129 -0
  405. dataface/core/render/utils.py +106 -0
  406. dataface/core/render/variable_controls.py +946 -0
  407. dataface/core/render/variable_input_refinement.py +140 -0
  408. dataface/core/render/warnings/__init__.py +15 -0
  409. dataface/core/render/warnings/bar_color_1_to_1_with_x.py +80 -0
  410. dataface/core/render/warnings/base.py +44 -0
  411. dataface/core/render/warnings/fanout_risk.py +15 -0
  412. dataface/core/render/warnings/from_query_diagnostic.py +56 -0
  413. dataface/core/render/warnings/missing_join_predicate.py +13 -0
  414. dataface/core/render/warnings/query_parse_error.py +14 -0
  415. dataface/core/render/warnings/query_returned_zero_rows.py +42 -0
  416. dataface/core/render/warnings/reaggregation.py +14 -0
  417. dataface/core/render/warnings/registry.py +45 -0
  418. dataface/core/render/warnings/suppression.py +46 -0
  419. dataface/core/render/warnings/temporal_single_point.py +63 -0
  420. dataface/core/render/warnings/unreferenced_chart.py +15 -0
  421. dataface/core/render/warnings/y_encoding_mostly_null.py +76 -0
  422. dataface/core/render/yaml_format.py +167 -0
  423. dataface/core/resolve_face.py +195 -0
  424. dataface/core/schema/__init__.py +0 -0
  425. dataface/core/schema/guidance.py +151 -0
  426. dataface/core/scoped_paths.py +59 -0
  427. dataface/core/serve/__init__.py +14 -0
  428. dataface/core/serve/bootstrap.py +39 -0
  429. dataface/core/serve/embedded.py +57 -0
  430. dataface/core/serve/port.py +129 -0
  431. dataface/core/serve/server.py +938 -0
  432. dataface/core/serve/templates/__init__.py +0 -0
  433. dataface/core/serve/templates/directory.yml +6 -0
  434. dataface/core/serve/templates/error.html.j2 +217 -0
  435. dataface/core/utils.py +121 -0
  436. dataface/core/validate.py +64 -0
  437. dataface/integrations/__init__.py +0 -0
  438. dataface/integrations/highlighting.py +351 -0
  439. dataface/integrations/markdown.py +537 -0
  440. dataface/py.typed +0 -0
  441. dataface-0.1.2.dist-info/METADATA +375 -0
  442. dataface-0.1.2.dist-info/RECORD +455 -0
  443. dataface-0.1.2.dist-info/WHEEL +4 -0
  444. dataface-0.1.2.dist-info/entry_points.txt +2 -0
  445. dataface-0.1.2.dist-info/licenses/LICENSE +202 -0
  446. mdsvg/__init__.py +168 -0
  447. mdsvg/fonts.py +656 -0
  448. mdsvg/images.py +299 -0
  449. mdsvg/parser.py +629 -0
  450. mdsvg/playground.py +284 -0
  451. mdsvg/py.typed +2 -0
  452. mdsvg/renderer.py +1623 -0
  453. mdsvg/style.py +355 -0
  454. mdsvg/types.py +200 -0
  455. mdsvg/utils.py +86 -0
@@ -0,0 +1,16 @@
1
+ # Unified theme: bi
2
+ # Business-intelligence variant. Body reads as content (inherits from the
3
+ # face default); header reads as apparatus — small, semibold, subtly
4
+ # de-emphasized color. Use when the table should feel like a reporting
5
+ # app rather than editorial content. Extends stark, adding
6
+ # only the header treatment.
7
+
8
+ extends: stark
9
+ style:
10
+ charts:
11
+ table:
12
+ header:
13
+ font:
14
+ size: 11
15
+ weight: '600'
16
+ color: dft-grays.heading
@@ -0,0 +1,41 @@
1
+ # Unified theme: carbong100
2
+
3
+ extends: dark
4
+ style:
5
+ background: '#161616'
6
+ charts:
7
+ marks:
8
+ area:
9
+ opacity: 0.2
10
+ line:
11
+ stroke:
12
+ width: 2
13
+ axis:
14
+ label:
15
+ font:
16
+ color: '#c6c6c6'
17
+ size: &size_label 12
18
+ title:
19
+ font:
20
+ color: &color_light '#f4f4f4'
21
+ size: *size_label
22
+ weight: normal
23
+ legend:
24
+ label:
25
+ font:
26
+ color: *color_light
27
+ size: *size_label
28
+ title:
29
+ font:
30
+ color: *color_light
31
+ size: *size_label
32
+ palette:
33
+ - '#8a3ffc'
34
+ - '#33b1ff'
35
+ - '#007d79'
36
+ - '#ff7eb6'
37
+ - '#fa4d56'
38
+ - '#fff1f1'
39
+ title:
40
+ font:
41
+ color: *color_light
@@ -0,0 +1,122 @@
1
+ # Unified theme: cream
2
+ # The shipped `default` theme on a cream surface. Chart chrome is wired through
3
+ # the dft-creams.* palette so axis grids, ticks, labels, and mark strokes sit
4
+ # on the cream canvas instead of inheriting the gray defaults from `stark`.
5
+
6
+ extends: editorial
7
+ style:
8
+ background: dft-creams.canvas
9
+ # Outer page canvas behind the face — match the face background so the cream
10
+ # tone reads as a single surface instead of a card on a gray page.
11
+ page:
12
+ background: dft-creams.canvas
13
+ muted: dft-creams.muted
14
+ font:
15
+ color: dft-creams.ink
16
+ title:
17
+ # Face title color is one step lighter than `heading` (the structural
18
+ # default from stark). Same softening pattern the `default` theme applies
19
+ # with dft-grays.inactive — keeps the face title authoritative without
20
+ # competing with the chart titles below it in the title-inline band.
21
+ font:
22
+ color: dft-creams.inactive
23
+ subtitle:
24
+ font:
25
+ color: dft-creams.subtitle
26
+ border:
27
+ color: dft-creams.border
28
+ text:
29
+ font:
30
+ color: dft-creams.ink
31
+ charts:
32
+ # bar.border.color now tracks theme.background via self-reference at the
33
+ # default-theme level (see stark.yaml), so the cream knockout
34
+ # falls out of theme.background = cream-025 automatically. No explicit
35
+ # override needed here.
36
+ marks:
37
+ rule:
38
+ stroke:
39
+ color: dft-creams.ink
40
+ tick:
41
+ stroke:
42
+ color: dft-creams.ink
43
+ text:
44
+ font:
45
+ color: dft-creams.heading
46
+ axis:
47
+ domain:
48
+ color: dft-creams.grid
49
+ grid:
50
+ color: dft-creams.grid
51
+ zero:
52
+ color: dft-creams.subtitle
53
+ ticks:
54
+ color: dft-creams.grid
55
+ label:
56
+ font:
57
+ color: dft-creams.muted
58
+ title:
59
+ font:
60
+ color: dft-creams.heading
61
+ # axis_x cascades from axis — no overrides needed.
62
+ axis_y:
63
+ grid:
64
+ color: dft-creams.grid-emphasis # softer grid for the value axis (overrides default gray)
65
+ ticks:
66
+ color: dft-creams.grid-emphasis
67
+ axis_quantitative:
68
+ grid:
69
+ color: dft-creams.grid-emphasis
70
+ ticks:
71
+ color: dft-creams.grid-emphasis
72
+ legend:
73
+ label:
74
+ font:
75
+ color: dft-creams.muted
76
+ title:
77
+ font:
78
+ color: dft-creams.heading
79
+ table:
80
+ border:
81
+ color: dft-creams.border
82
+ header:
83
+ font:
84
+ color: dft-creams.heading
85
+ row:
86
+ stripe:
87
+ color: dft-creams.surface-subtle
88
+ paginator:
89
+ # Cream-scaffold variant of the default gray ramp — same three-tier
90
+ # contrast, warm-canvas colours.
91
+ color_active: dft-creams.ink
92
+ color_inactive: dft-creams.inactive
93
+ color_disabled: dft-creams.disabled
94
+ spark:
95
+ # Spark progress track was renamed to `bar` upstream (single
96
+ # horizontal bar with optional track in `bar-normalize`).
97
+ bar:
98
+ background: dft-creams.border
99
+ data_table:
100
+ font:
101
+ color: dft-creams.muted
102
+ divider:
103
+ color: dft-creams.muted
104
+ label:
105
+ font:
106
+ color: dft-creams.muted
107
+ variables:
108
+ font:
109
+ color: dft-creams.muted
110
+ placeholder:
111
+ # Cream-toned hint for warm-canvas themes (overrides stark's
112
+ # gray disabled token so unselected text stays in the cream ramp).
113
+ font:
114
+ color: dft-creams.disabled
115
+ border:
116
+ color: dft-creams.grid-emphasis
117
+ input:
118
+ border:
119
+ color: dft-creams.border
120
+ # Cream-toned rail so the daterange popover feels like it sits on the
121
+ # editorial canvas rather than wearing a gray-50 patch on cream.
122
+ popover_rail_background: dft-creams.surface-subtle
@@ -0,0 +1,40 @@
1
+ # Unified theme: dark
2
+
3
+ extends: stark
4
+ style:
5
+ charts:
6
+ legend:
7
+ label:
8
+ font:
9
+ color: '#aaaaaa'
10
+ title:
11
+ font:
12
+ color: &color_title_text '#cccccc'
13
+ table:
14
+ header:
15
+ background: '#252538'
16
+ font:
17
+ color: &color_text_light '#eaeaea'
18
+ row:
19
+ stripe:
20
+ color: '#1f1f30'
21
+ background: '#1a1a2e'
22
+ font:
23
+ color: *color_text_light
24
+ title:
25
+ font:
26
+ color: *color_title_text
27
+ border:
28
+ color: '#333344'
29
+ variables:
30
+ font:
31
+ color: *color_title_text
32
+ border:
33
+ color: '#444455'
34
+ input:
35
+ background: '#2a2a3e'
36
+ # Input border tracks the surrounding strip border on dark theme;
37
+ # default theme collapsed this to ink which would read too dark
38
+ # against the navy canvas.
39
+ border:
40
+ color: '#444455'
@@ -0,0 +1,9 @@
1
+ # Unified theme: diagnostics-title-angle-extreme
2
+
3
+ extends: light
4
+
5
+ style:
6
+ title:
7
+ position:
8
+ anchor: start
9
+ angle: -90
@@ -0,0 +1,9 @@
1
+ # Unified theme: diagnostics-title-baseline-extreme
2
+
3
+ extends: light
4
+
5
+ style:
6
+ title:
7
+ position:
8
+ anchor: start
9
+ baseline: bottom
@@ -0,0 +1,24 @@
1
+ # Unified theme: diagnostics-title-baseline
2
+
3
+ extends: light
4
+ style:
5
+ charts:
6
+ axis:
7
+ label:
8
+ font:
9
+ color: dft-grays.muted
10
+ title:
11
+ font:
12
+ color: dft-grays.heading
13
+ legend:
14
+ label:
15
+ font:
16
+ color: dft-grays.muted
17
+ title:
18
+ font:
19
+ color: dft-grays.heading
20
+ title:
21
+ font:
22
+ color: dft-grays.ink
23
+ weight: 400
24
+ size: 14
@@ -0,0 +1,8 @@
1
+ # Unified theme: diagnostics-title-center
2
+
3
+ extends: light
4
+
5
+ style:
6
+ title:
7
+ position:
8
+ anchor: middle
@@ -0,0 +1,24 @@
1
+ # Unified theme: diagnostics-title-color-extreme
2
+
3
+ extends: light
4
+ style:
5
+ charts:
6
+ axis:
7
+ label:
8
+ font:
9
+ color: dft-grays.muted
10
+ title:
11
+ font:
12
+ color: dft-grays.heading
13
+ legend:
14
+ label:
15
+ font:
16
+ color: dft-grays.muted
17
+ title:
18
+ font:
19
+ color: dft-grays.heading
20
+ title:
21
+ font:
22
+ color: '#00a651'
23
+ weight: 400
24
+ size: 14
@@ -0,0 +1,25 @@
1
+ # Unified theme: diagnostics-title-font-extreme
2
+
3
+ extends: light
4
+ style:
5
+ charts:
6
+ axis:
7
+ label:
8
+ font:
9
+ color: dft-grays.muted
10
+ title:
11
+ font:
12
+ color: dft-grays.heading
13
+ legend:
14
+ label:
15
+ font:
16
+ color: dft-grays.muted
17
+ title:
18
+ font:
19
+ color: dft-grays.heading
20
+ title:
21
+ font:
22
+ color: dft-grays.ink
23
+ family: Courier New
24
+ weight: 400
25
+ size: 14
@@ -0,0 +1,8 @@
1
+ # Unified theme: diagnostics-title-left
2
+
3
+ extends: light
4
+
5
+ style:
6
+ title:
7
+ position:
8
+ anchor: start
@@ -0,0 +1,9 @@
1
+ # Unified theme: diagnostics-title-offset-extreme
2
+
3
+ extends: light
4
+
5
+ style:
6
+ title:
7
+ position:
8
+ anchor: start
9
+ offset: 40
@@ -0,0 +1,24 @@
1
+ # Unified theme: diagnostics-title-size-extreme
2
+
3
+ extends: light
4
+ style:
5
+ charts:
6
+ axis:
7
+ label:
8
+ font:
9
+ color: dft-grays.muted
10
+ title:
11
+ font:
12
+ color: dft-grays.heading
13
+ legend:
14
+ label:
15
+ font:
16
+ color: dft-grays.muted
17
+ title:
18
+ font:
19
+ color: dft-grays.heading
20
+ title:
21
+ font:
22
+ color: dft-grays.ink
23
+ weight: 400
24
+ size: 22
@@ -0,0 +1,24 @@
1
+ # Unified theme: diagnostics-title-weight-extreme
2
+
3
+ extends: light
4
+ style:
5
+ charts:
6
+ axis:
7
+ label:
8
+ font:
9
+ color: dft-grays.muted
10
+ title:
11
+ font:
12
+ color: dft-grays.heading
13
+ legend:
14
+ label:
15
+ font:
16
+ color: dft-grays.muted
17
+ title:
18
+ font:
19
+ color: dft-grays.heading
20
+ title:
21
+ font:
22
+ color: dft-grays.ink
23
+ weight: 100
24
+ size: 14
@@ -0,0 +1,147 @@
1
+ # Unified theme: editorial
2
+ # The shipped Dataface default. Serif-forward titles, multi-step gray scaffold
3
+ # ladder, steel-blue accent — the "editorial voice" applied on top of the
4
+ # `stark` structural root. Pick `stark` directly to opt out of the refined
5
+ # hierarchy; pick `cream` for the same voice on a warm canvas.
6
+
7
+ extends: stark
8
+ style:
9
+ # Editorial palette — gray scaffold + steel-blue accent in place of
10
+ # the brighter stark accent/muted.
11
+ muted: dft-grays.muted
12
+ accent: '#2d74b3'
13
+ # Face/card border — subtle gray when a face opts into a visible border.
14
+ # `stark` collapses this to ink (gray-80); `editorial` restores the
15
+ # editorial soft separator.
16
+ border:
17
+ color: dft-grays.border
18
+ # Prose ink — gray-90, restored from `stark`'s ink collapse.
19
+ font:
20
+ color: dft-grays.ink
21
+ text:
22
+ font:
23
+ family: "'Source Serif 4', Georgia, 'Times New Roman', serif"
24
+ color: dft-grays.ink
25
+ title:
26
+ # Serif headlines — the editorial voice the `editorial` theme adds on top
27
+ # of `stark`. Source Serif 4 is the editorial face; chart-title
28
+ # typography is width-driven (see core/compile/typography.py) and reads
29
+ # this family for medium/wide chart cards.
30
+ #
31
+ # Color: one step lighter than `heading` (the stark default). The
32
+ # title-inline band puts the face title on the same horizontal row as
33
+ # the variable filters; softening the title from `heading` to
34
+ # `inactive` keeps the title authoritative without competing with the
35
+ # chart titles below it.
36
+ font:
37
+ family: "'Source Serif 4', Georgia, 'Times New Roman', serif"
38
+ color: dft-grays.inactive
39
+ subtitle:
40
+ font:
41
+ color: dft-grays.subtitle
42
+ charts:
43
+ # Editorial default categorical palette — succeeds category-10 (the
44
+ # stark value). Blue-led, muted across the board, designed
45
+ # for cycling so 1-5 series charts stay quiet by default. See
46
+ # dataface/src/dataface/core/defaults/palettes/categorical/editorial-10.yml.
47
+ palette: editorial-10
48
+ axis:
49
+ label:
50
+ font:
51
+ color: dft-grays.muted
52
+ title:
53
+ font:
54
+ color: dft-grays.heading
55
+ grid:
56
+ color: dft-grays.grid
57
+ zero:
58
+ color: dft-grays.subtitle
59
+ ticks:
60
+ color: dft-grays.grid
61
+ domain:
62
+ color: dft-grays.grid
63
+ axis_y:
64
+ grid:
65
+ color: dft-grays.grid-emphasis
66
+ ticks:
67
+ color: dft-grays.grid-emphasis
68
+ axis_quantitative:
69
+ grid:
70
+ color: dft-grays.grid-emphasis
71
+ ticks:
72
+ color: dft-grays.grid-emphasis
73
+ # Enforce sparse y-axis tick density: 6 ticks max instead of VL's
74
+ # "as many as fit" default (~20 on a 0–4000 range). The renderer
75
+ # converts this to explicit tickValues so VL respects the target.
76
+ count: 6
77
+ legend:
78
+ label:
79
+ font:
80
+ color: dft-grays.muted
81
+ title:
82
+ font:
83
+ color: dft-grays.heading
84
+ # Editorial direction: prefer direct labeling over a legend.
85
+ # Per-chart `legend.disable: false` still wins for charts that
86
+ # genuinely want a legend.
87
+ disable: true
88
+ kpi:
89
+ # KPI value font is a serif on editorial themes — narrative type
90
+ # for the headline number while the body and support-row stay on
91
+ # the tabular sans (kpi.font.family from stark).
92
+ value:
93
+ font:
94
+ family: "'Source Serif 4', Georgia, 'Times New Roman', serif"
95
+ bar:
96
+ legend:
97
+ disable: false
98
+ line:
99
+ endpoint_labels:
100
+ visible: true
101
+ area:
102
+ endpoint_labels:
103
+ visible: true
104
+ pie:
105
+ total:
106
+ value:
107
+ font:
108
+ color: dft-grays.ink
109
+ label:
110
+ font:
111
+ color: dft-grays.subtitle
112
+ marks:
113
+ text:
114
+ font:
115
+ color: dft-grays.heading
116
+ rule:
117
+ stroke:
118
+ color: dft-grays.ink
119
+ tick:
120
+ stroke:
121
+ color: dft-grays.ink
122
+ data_table:
123
+ font:
124
+ color: dft-grays.muted
125
+ label:
126
+ font:
127
+ color: dft-grays.muted
128
+ divider:
129
+ color: dft-grays.muted
130
+ table:
131
+ header:
132
+ font:
133
+ color: dft-grays.heading
134
+ variables:
135
+ # Variable-strip labels track the muted gray rather than the
136
+ # cooler #666666 stark uses.
137
+ font:
138
+ color: dft-grays.muted
139
+ # Variable-strip input border — subtle gray separator. `stark` collapses
140
+ # this to ink (gray-80); `editorial` restores the soft separator.
141
+ border:
142
+ color: dft-grays.grid-emphasis
143
+ input:
144
+ # Input-field border (subtle gray). `stark` collapses this to ink;
145
+ # `editorial` keeps the soft separator.
146
+ border:
147
+ color: '#e0e0e0'
@@ -0,0 +1,30 @@
1
+ # Unified theme: light
2
+
3
+ extends: stark
4
+ style:
5
+ background: dft-grays.canvas
6
+ # Subtle gray face/card border — light theme preserves the pre-stark soft
7
+ # separator instead of inheriting the stark default ink.
8
+ border:
9
+ color: dft-grays.border
10
+ font:
11
+ color: dft-grays.ink
12
+ title:
13
+ font:
14
+ color: &color_title dft-grays.heading
15
+ charts:
16
+ table:
17
+ header:
18
+ font:
19
+ color: *color_title
20
+ variables:
21
+ font:
22
+ color: dft-grays.muted
23
+ border:
24
+ color: dft-grays.grid-emphasis
25
+ input:
26
+ background: dft-grays.canvas
27
+ # Soft separator on input fields (matches the strip border); default
28
+ # theme collapsed this to ink and light keeps the pre-stark soft posture.
29
+ border:
30
+ color: '#e0e0e0'
@@ -0,0 +1,17 @@
1
+ # Unified theme: looker
2
+ # Variant for Looker-migrated dashboards. Wider canvas (1440px) so dense
3
+ # multi-column tables and side-by-side tiles get the horizontal room a Looker
4
+ # dashboard typically uses without blowing out the page. Table headers pick
5
+ # up a slightly bolder weight (600) to match Looker's header treatment.
6
+ # Header ink colour, body / cell / header font sizes all inherit from
7
+ # stark (which is itself dense at 11px). Extends stark.
8
+
9
+ extends: stark
10
+ style:
11
+ board:
12
+ width: 1440.0
13
+ charts:
14
+ table:
15
+ header:
16
+ font:
17
+ weight: '600'