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,25 @@
1
+ # Diverging palette — default blue-red
2
+ #
3
+
4
+ name: dft-div-blue-red
5
+ family: diverging
6
+ description: Default CVD-safe diverging. Blue (low) to red (high), light midpoint.
7
+ design_notes: |
8
+ Symmetric arms about midpoint at step 6. RdBu-family editorial posture.
9
+ Passes CVD under deut/prot/trit at common subset counts (N=3, N=5).
10
+
11
+ colors:
12
+ - "#002f55" # step 1 — low extreme (blue)
13
+ - "#00508a"
14
+ - "#2575b9"
15
+ - "#689bcc"
16
+ - "#a3c0dd"
17
+ - "#e4e4e4" # step 6 — midpoint (neutral light)
18
+ - "#dcb1a9"
19
+ - "#c88074"
20
+ - "#b04f41"
21
+ - "#852c21"
22
+ - "#590b05" # step 11 — high extreme (red)
23
+
24
+ # Diverging-specific: even-N subsets auto-skip the midpoint, odd-N include it.
25
+ # The resolver handles this — no per-palette YAML data needed.
@@ -0,0 +1,24 @@
1
+ # Diverging palette — Moreland 2009 coolwarm
2
+ #
3
+
4
+ name: dft-div-coolwarm
5
+ family: diverging
6
+ description: Moreland 2009 coolwarm. Deep blue through light gray to deep red — canonical scientific diverging.
7
+ design_notes: |
8
+ Referenced from Kenneth Moreland's 2009 paper "Diverging Color Maps for
9
+ Scientific Visualization". The canonical scientific visualization diverging
10
+ ramp, widely used in ParaView and VTK. Included for scientific data contexts.
11
+ Session 3 of M2 palette design.
12
+
13
+ colors:
14
+ - "#3b4cc0"
15
+ - "#5977e3"
16
+ - "#7b9ef0"
17
+ - "#a2c3f7"
18
+ - "#cedcf4"
19
+ - "#dddddd"
20
+ - "#f2cbb7"
21
+ - "#f09482"
22
+ - "#db6555"
23
+ - "#b40426"
24
+ - "#8b0000"
@@ -0,0 +1,23 @@
1
+ # Diverging palette — crimson-green (financial loss/gain)
2
+ #
3
+
4
+ name: dft-div-crimson-green
5
+ family: diverging
6
+ description: Crimson (low/loss) to green (high/gain). Session 3 red-green exploration D2 design.
7
+ design_notes: |
8
+ Hue pair H=355°/150° with light asymmetry (dark crimson + light green)
9
+ engineered to pass CVD where symmetric red-green normally fails. Paired
10
+ with icon/label in production use per R8 discipline.
11
+
12
+ colors:
13
+ - "#540a31"
14
+ - "#7f2a51"
15
+ - "#a94c75"
16
+ - "#c37e99"
17
+ - "#d9afbe"
18
+ - "#e4e4e4"
19
+ - "#a9caae"
20
+ - "#72ac7e"
21
+ - "#338f4e"
22
+ - "#0a6b31"
23
+ - "#00481d"
@@ -0,0 +1,23 @@
1
+ # Diverging palette — orange-teal (non-politically-loaded)
2
+ #
3
+
4
+ name: dft-div-orange-teal
5
+ family: diverging
6
+ description: Warm orange (low) to teal (high). Symmetric arms; fully CVD-safe. Non-politically-loaded.
7
+ design_notes: |
8
+ For contexts where red/blue carries unwanted political connotation.
9
+ Symmetric arms about step 6 midpoint. Passes CVD under deut/prot/trit.
10
+ Session 3 of M2 palette design.
11
+
12
+ colors:
13
+ - "#4c1f00"
14
+ - "#7d3700"
15
+ - "#ab561d"
16
+ - "#c38562"
17
+ - "#d9b39f"
18
+ - "#e4e4e4"
19
+ - "#96c8c4"
20
+ - "#47a8a2"
21
+ - "#00827d"
22
+ - "#005b57"
23
+ - "#003634"
@@ -0,0 +1,24 @@
1
+ # Diverging palette — Paul Tol sunset
2
+ #
3
+
4
+ name: dft-div-sunset
5
+ family: diverging
6
+ description: Paul Tol's sunset scheme, resampled to 11 stops. SRON-published CVD-safe diverging.
7
+ design_notes: |
8
+ Multi-hue diverging: teal → cyan → light → yellow → orange → red.
9
+ Referenced from Paul Tol (SRON) — well-studied CVD-safe diverging ramp.
10
+ Included for climate/atmospheric data contexts where it is conventional.
11
+ Session 3 of M2 palette design.
12
+
13
+ colors:
14
+ - "#125a56"
15
+ - "#17858f"
16
+ - "#48abcd"
17
+ - "#92c9ee"
18
+ - "#cee0ea"
19
+ - "#eceada"
20
+ - "#f4dc8f"
21
+ - "#ffb350"
22
+ - "#f77d36"
23
+ - "#e03b16"
24
+ - "#a01813"
@@ -0,0 +1,38 @@
1
+ # Scaffold palette — dft-creams (warm-canvas UI chrome)
2
+ #
3
+ # Cream-scaffold complement to dft-grays. Use on warm-canvas themes.
4
+ # Theme assigns chrome: dft-creams to get the cream ladder via the same
5
+ # alias vocabulary (chrome.ink, chrome.canvas, etc.) as dft-grays.
6
+ #
7
+ # Inherits the full alias graph from dft-grays via `extends:`. Integer
8
+ # aliases (canvas: 1, ink: 11, etc.) resolve against this palette's own
9
+ # colors array at resolve time — so chrome.ink → cream #2A2725, not gray #222222.
10
+ # Only cream-specific hex overrides are listed below.
11
+
12
+ name: dft-creams
13
+ extends: dft-grays
14
+ description: |
15
+ Warm cream-toned scaffold — UI structural framing for warm-canvas themes.
16
+ Eleven named steps from near-white (025) to near-black (90). Applied to
17
+ canvas backgrounds, borders, dividers, axis labels, table stripes, and
18
+ secondary text on editorial/print-styled themes.
19
+
20
+ colors:
21
+ - "#FAF7F0" # 1 canvas
22
+ - "#F5F2EB" # 2 surface-subtle
23
+ - "#E9E1D2" # 3 grid
24
+ - "#DDD3C0" # 4 border
25
+ - "#CEC1AB" # 5 grid-emphasis
26
+ - "#B2A691" # 6 disabled
27
+ - "#918878" # 7 subtitle
28
+ - "#6F685D" # 8 muted
29
+ - "#56504A" # 9 inactive
30
+ - "#403B37" # 10 heading
31
+ - "#2A2725" # 11 ink
32
+
33
+ aliases:
34
+ # Cream-specific terminal hex overrides — inherited integer ladder from dft-grays
35
+ fill-muted: "#e8e0d4"
36
+ separator: "#ddd3bf"
37
+ spark-empty: "#d9cebf"
38
+ accent: "#2d74b3"
@@ -0,0 +1,53 @@
1
+ # Scaffold palette — dft-grays (neutral gray UI chrome)
2
+ #
3
+ # Scaffolds are UI structural framing, NOT data encoding. They live in
4
+ # their own directory to make the taxonomy honest:
5
+ # palettes/sequential/ — data, ordered magnitude
6
+ # palettes/diverging/ — data, signed/around midpoint
7
+ # palettes/categorical/ — data, unordered categories
8
+ # palettes/scaffold/ — UI structure (canvas/borders/text/stripes)
9
+ # palettes/tone/ — UI roles (negative/warning/positive)
10
+ #
11
+ # Theme role: chrome. Address form: chrome.ink, chrome.canvas, etc.
12
+
13
+ name: dft-grays
14
+ description: |
15
+ Neutral gray scaffold — UI chrome. Eleven named steps from
16
+ near-white (025) to near-black (90). Applied to canvas backgrounds,
17
+ borders, dividers, axis labels, table stripes, and secondary text.
18
+ Pairs with dft-creams for warm-canvas themes.
19
+
20
+ colors:
21
+ - "#FAFAFA" # 1 canvas
22
+ - "#F7F8FA" # 2 surface-subtle
23
+ - "#EDEFF2" # 3 grid
24
+ - "#DFE1E5" # 4 border
25
+ - "#D0D3D9" # 5 grid-emphasis
26
+ - "#B0B2B8" # 6 disabled
27
+ - "#8A8C8F" # 7 subtitle
28
+ - "#626366" # 8 muted
29
+ - "#494A4C" # 9 inactive
30
+ - "#313233" # 10 heading
31
+ - "#222222" # 11 ink
32
+
33
+ aliases:
34
+ # UI ladder aliases — use these in new authoring
35
+ canvas: 1
36
+ surface-subtle: 2
37
+ grid: 3
38
+ border: 4
39
+ grid-emphasis: 5
40
+ disabled: 6
41
+ subtitle: 7
42
+ muted: 8
43
+ inactive: 9
44
+ heading: 10
45
+ ink: 11
46
+
47
+ # Extended UI aliases — terminal hex (themes themselves contain no hex)
48
+ canvas-stark: "#FFFFFF"
49
+ fill-muted: "#e5e7eb"
50
+ separator: "#e0e0e0"
51
+ spark-empty: "#d1d5db"
52
+ accent: "#3b82f6"
53
+ placeholder: "#666666"
@@ -0,0 +1,22 @@
1
+ # Sequential palette — amber
2
+ #
3
+ # Hand-authored 11-stop spine. Downsamples drive seq palette resolution.
4
+
5
+ name: dft-seq-amber
6
+ family: sequential
7
+ description: Single-hue amber (cream → honey → deep amber). Renamed from dft-seq-gold; mid-stops read as amber/honey rather than pure gold.
8
+ design_notes: |
9
+ Monotonic L* from 0.95 → 0.25. Hue anchored on cat-10 gold (H≈82.1°); c_max=0.12 (warm hues need more chroma to read as themselves). Session 8 retune + rename from dft-seq-gold.
10
+
11
+ colors:
12
+ - "#f6edde" # step 1 — lightest
13
+ - "#e8d5b2"
14
+ - "#d9bd8a"
15
+ - "#c8a565"
16
+ - "#b68e41"
17
+ - "#a2781a" # step 6 — mid
18
+ - "#8b6400"
19
+ - "#725200"
20
+ - "#5a4000"
21
+ - "#432f00"
22
+ - "#2e1f00" # step 11 — darkest
@@ -0,0 +1,22 @@
1
+ # Sequential palette — blue
2
+ #
3
+ # Hand-authored 11-stop spine. Downsamples drive seq palette resolution.
4
+
5
+ name: dft-seq-blue
6
+ family: sequential
7
+ description: Single-hue blue — default sequential. Sits between cat-10 blue and editorial-10 denim via chroma alone.
8
+ design_notes: |
9
+ Monotonic L* from 0.95 → 0.25. Hue anchored on cat-10 blue (H≈248.8°); c_max=0.11 (down from 0.13 to harmonize with editorial-10 themes). Session 8 retune.
10
+
11
+ colors:
12
+ - "#e4f0fc" # step 1 — lightest
13
+ - "#c1dbf5"
14
+ - "#9fc5eb"
15
+ - "#80b0de"
16
+ - "#649acf"
17
+ - "#4a85bc" # step 6 — mid
18
+ - "#3270a8"
19
+ - "#1b5b92"
20
+ - "#04477a"
21
+ - "#00345d"
22
+ - "#002341" # step 11 — darkest
@@ -0,0 +1,22 @@
1
+ # Sequential palette — brown
2
+ #
3
+ # Hand-authored 11-stop spine. Downsamples drive seq palette resolution.
4
+
5
+ name: dft-seq-brown
6
+ family: sequential
7
+ description: Low-chroma warm ramp (cream → tan → warm-brown). Pairs with the cream theme. Renamed from dft-seq-warm; hexes unchanged.
8
+ design_notes: |
9
+ Monotonic L* from 0.95 → 0.25. Low chroma to harmonize with dft-creams scaffold on warm-canvas themes. Renamed from dft-seq-warm in Session 8; hexes unchanged.
10
+
11
+ colors:
12
+ - "#f3eee6" # step 1 — lightest
13
+ - "#e7d3cb"
14
+ - "#d6baad"
15
+ - "#c4a391"
16
+ - "#b08d76"
17
+ - "#9b785e" # step 6 — mid
18
+ - "#856447"
19
+ - "#6e5233"
20
+ - "#584020"
21
+ - "#422f11"
22
+ - "#341911" # step 11 — darkest
@@ -0,0 +1,22 @@
1
+ # Sequential palette — gray
2
+ #
3
+ # Hand-authored 11-stop spine. Downsamples drive seq palette resolution.
4
+
5
+ name: dft-seq-gray
6
+ family: sequential
7
+ description: Pure gray — magnitude without hue connotation. Renamed from dft-seq-neutral; hexes unchanged.
8
+ design_notes: |
9
+ Monotonic L* from 0.95 → 0.25, chroma=0 (pure achromatic). Use when data magnitude must not imply hue meaning. Renamed from dft-seq-neutral in Session 8; hexes unchanged.
10
+
11
+ colors:
12
+ - "#eeeeee" # step 1 — lightest
13
+ - "#d7d7d7"
14
+ - "#c1c1c1"
15
+ - "#ababab"
16
+ - "#959595"
17
+ - "#808080" # step 6 — mid
18
+ - "#6c6c6c"
19
+ - "#585858"
20
+ - "#454545"
21
+ - "#333333"
22
+ - "#222222" # step 11 — darkest
@@ -0,0 +1,22 @@
1
+ # Sequential palette — green
2
+ #
3
+ # Hand-authored 11-stop spine. Downsamples drive seq palette resolution.
4
+
5
+ name: dft-seq-green
6
+ family: sequential
7
+ description: Single-hue green. Sits between cat-10 green and editorial-10 sage via chroma alone.
8
+ design_notes: |
9
+ Monotonic L* from 0.95 → 0.25. Hue anchored on cat-10 green (H≈161.3°); c_max=0.10 (down from 0.13). Session 8 retune.
10
+
11
+ colors:
12
+ - "#e4f3ea" # step 1 — lightest
13
+ - "#c0e1cf"
14
+ - "#9eceb4"
15
+ - "#7eba9b"
16
+ - "#60a684"
17
+ - "#44926e" # step 6 — mid
18
+ - "#287d59"
19
+ - "#086946"
20
+ - "#005336"
21
+ - "#003e27"
22
+ - "#002a19" # step 11 — darkest
@@ -0,0 +1,22 @@
1
+ # Sequential palette — purple
2
+ #
3
+ # Hand-authored 11-stop spine. Downsamples drive seq palette resolution.
4
+
5
+ name: dft-seq-purple
6
+ family: sequential
7
+ description: Single-hue purple. Sits between cat-10 purple and editorial-10 plum via chroma alone.
8
+ design_notes: |
9
+ Monotonic L* from 0.95 → 0.25. Hue anchored on cat-10 purple (H≈319.1°); c_max=0.11 (down from 0.13). Session 8 retune.
10
+
11
+ colors:
12
+ - "#f5eaf8" # step 1 — lightest
13
+ - "#e5ceeb"
14
+ - "#d4b3dd"
15
+ - "#c29acd"
16
+ - "#af82bb"
17
+ - "#9b6ba8" # step 6 — mid
18
+ - "#875694"
19
+ - "#72427e"
20
+ - "#5c3068"
21
+ - "#471f51"
22
+ - "#32113a" # step 11 — darkest
@@ -0,0 +1,22 @@
1
+ # Sequential palette — rust
2
+ #
3
+ # Hand-authored 11-stop spine. Downsamples drive seq palette resolution.
4
+
5
+ name: dft-seq-rust
6
+ family: sequential
7
+ description: Single-hue rust (cream-peach → terracotta → deep rust). Renamed from dft-seq-orange; mid-stops read as rust/terracotta rather than vivid orange.
8
+ design_notes: |
9
+ Monotonic L* from 0.95 → 0.25. Hue anchored on cat-10 orange (H≈41.0°); c_max=0.12. Session 8 retune + rename from dft-seq-orange.
10
+
11
+ colors:
12
+ - "#fdeae3" # step 1 — lightest
13
+ - "#f6cdbe"
14
+ - "#ebb29d"
15
+ - "#dd977d"
16
+ - "#cc7e61"
17
+ - "#b96648" # step 6 — mid
18
+ - "#a45030"
19
+ - "#8d3c1b"
20
+ - "#752907"
21
+ - "#5a1b00"
22
+ - "#3e1000" # step 11 — darkest
@@ -0,0 +1,22 @@
1
+ # Sequential palette — teal
2
+ #
3
+ # Hand-authored 11-stop spine. Downsamples drive seq palette resolution.
4
+
5
+ name: dft-seq-teal
6
+ family: sequential
7
+ description: Single-hue teal/turquoise. Anchored between cat-10 cyan and editorial-10 teal; replaces dft-seq-cyan.
8
+ design_notes: |
9
+ Monotonic L* from 0.95 → 0.25. Hue=205° (between editorial-10 teal at 194° and cat-10 cyan at 210°); c_max=0.11. New palette in Session 8.
10
+
11
+ colors:
12
+ - "#dff3f5" # step 1 — lightest
13
+ - "#b5e1e6"
14
+ - "#8cced6"
15
+ - "#64bac4"
16
+ - "#3aa6b2"
17
+ - "#00919d" # step 6 — mid
18
+ - "#007a85"
19
+ - "#00646d"
20
+ - "#004f56"
21
+ - "#003b40"
22
+ - "#00272b" # step 11 — darkest
@@ -0,0 +1,32 @@
1
+ # Tone palette — negative
2
+ #
3
+ # Six named role slots. No LUT, no interpolation.
4
+ # Users reference slots directly: negative.solid, negative.text, etc.
5
+
6
+ name: negative
7
+ description: |
8
+ Critical errors, destructive actions, negative/loss states.
9
+ Western learned color convention: red = stop/bad/attention.
10
+ Session 4 of M2 palette design.
11
+
12
+ design_notes: |
13
+ H=22° warm red (shifted slightly from pure red H=15° so light bg/subtle
14
+ slots read as warm-peach rather than pink). L=0.42 for solid — balanced
15
+ against positive.solid for CVD ΔE discipline (see r8_validation below).
16
+ All 6 slots designed so canonical pairs (text-on-bg, solid-on-white) pass
17
+ WCAG AA. Must be paired with icon + label; color alone is insufficient.
18
+
19
+ aliases:
20
+ bg: "#ffedec" # very light peach tint for surface backgrounds
21
+ subtle: "#ffdbd8" # hover-on-bg or secondary fill
22
+ border: "#e79491" # mid-tone divider / outline
23
+ solid: "#94001e" # canonical "this is negative" fill
24
+ solid-hover: "#6e0014" # darker variant for button hover state
25
+ text: "#4b000a" # AA-contrast text color on .bg and on white
26
+
27
+ r8_validation:
28
+ pair: "negative.solid ↔ positive.solid"
29
+ cvd_pass: true
30
+ note: |
31
+ ΔE under deut/prot/trit all pass R8 threshold. CVD checker is the
32
+ practical test; ΔL is the proxy. Ship with color + icon + label.
@@ -0,0 +1,22 @@
1
+ # Tone palette — positive
2
+ #
3
+ # Six named role slots. No LUT, no interpolation.
4
+
5
+ name: positive
6
+ description: |
7
+ Confirmed successful actions, gains, completions.
8
+ Western learned color convention: green = go/good/safe.
9
+ Session 4 of M2 palette design.
10
+
11
+ design_notes: |
12
+ Blue-shifted green (H=155°), not pure green (H=135°). Picked so negative.solid
13
+ ↔ positive.solid pass CVD ΔE. solid L=0.55 matches category-10 green L≈0.57.
14
+ Paired with icon + label in production use.
15
+
16
+ aliases:
17
+ bg: "#e3f8e9" # very light green background
18
+ subtle: "#cff2da" # secondary fill / hover-on-bg
19
+ border: "#82cb9b" # mid-tone divider / outline
20
+ solid: "#00884d" # canonical "all good" fill
21
+ solid-hover: "#006d3c" # darker variant for button hover state
22
+ text: "#003e20" # AA-contrast text color on .bg and on white
@@ -0,0 +1,22 @@
1
+ # Tone palette — warning
2
+ #
3
+ # Six named role slots. No LUT, no interpolation.
4
+
5
+ name: warning
6
+ description: |
7
+ Pay attention — something needs input, but nothing's broken.
8
+ Western learned color convention: amber/gold = caution/slow.
9
+ Session 4 of M2 palette design.
10
+
11
+ design_notes: |
12
+ H=72° — midpoint of exploration candidates W2 and W3. Selected after
13
+ user feedback that H=60° read too yellow and H=90° too green. Slots
14
+ tuned for WCAG AA pairing (text-on-bg, solid-on-white).
15
+
16
+ aliases:
17
+ bg: "#fff3e5" # very light cream-amber background
18
+ subtle: "#ffe7ca" # secondary fill / hover-on-bg
19
+ border: "#f0b871" # mid-tone divider / outline
20
+ solid: "#e69812" # canonical "pay attention" fill
21
+ solid-hover: "#c68100" # darker variant for button hover state
22
+ text: "#643f00" # AA-contrast text color on .bg and on white