mirror of
https://github.com/hanzoai/insights.git
synced 2026-11-02 14:32:45 +00:00
bin/debrand renames text. A brand is also geometry and a hex triple, and neither is a name, so the rename walked straight past both: the upstream wordmark sat on the OAuth consent screens, the toolbar error page and the 2FA template drawn as vector paths, and inside index.html as a data URI that printed the logo into every visitor's browser console. `--check` was green through all of it. So the marks are now refused directly. check_marks() reads the three upstream hues in every spelling they are written in here -- `#1d4aff`, `%231D4AFF` inside a data URI, the 8-digit alpha form, and the decimal `(245, 78, 0)` that a hex grep cannot see -- plus two path segments that identify the wordmark even after its fills are recoloured, because recolouring it does not debrand it. The hue match is bounded by non-hex on both sides so the 64-char checksums in the lockfiles are not false failures, with `%23` spelled out as the exception since it ends in a hex digit. Exemptions go in CONTENT_ALLOWLIST with a reason, as they already do for names; no second check script. The decimal spelling immediately found four files no hex grep had reported: two toolbar pills whose drop shadow was a fixed brand blue under a var(--primary-3000) background, a clickmap overlay, and a snapshot-history glow frozen at the old accent's value. The tree it now refuses is clean. Decoration collapses to ink, reusing what the fork already decided rather than inventing a hue: base.scss kept the three brand slots and zeroed their saturation (#333 / #8f8f8f / #ccc), and --data-color-1 is already #3d3d3d, so the quill token palette, the charts fallback and the MCP palette converge on it instead of drifting from it. Where the artwork itself was upstream's -- the 2FA template, the MCP app logo, the OAuth region picker, the Stripe app icon and the five billing plan badges -- it is replaced by the mark in frontend/public/icons/safari-pinned-tab.svg. Someone else's product mark keeps someone else's colours: the vendor logos under frontend/public/services are untouched, the Hedgebox fixtures use Hedgebox's own declared accent, and the livestream country palette stays chromatic because it is data encoding, not decoration. .stylelintignore gains the generated quill dist, which has never been stylelint-clean and cannot be made so without editing generated output.
441 lines
29 KiB
JSON
441 lines
29 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"properties": {
|
|
"dashboards": {
|
|
"description": "Dashboard IDs this insight should belong to. This is a full replacement — always include all existing dashboard IDs when adding a new one.",
|
|
"items": {
|
|
"type": "number"
|
|
},
|
|
"type": "array"
|
|
},
|
|
"description": {
|
|
"anyOf": [
|
|
{
|
|
"maxLength": 400,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"description": "Human-readable summary of what the insight shows. Max 400 characters (longer values are rejected)."
|
|
},
|
|
"favorited": {
|
|
"type": "boolean"
|
|
},
|
|
"name": {
|
|
"anyOf": [
|
|
{
|
|
"maxLength": 400,
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"query": {
|
|
"anyOf": [
|
|
{
|
|
"properties": {
|
|
"kind": {
|
|
"const": "InsightVizNode",
|
|
"default": "InsightVizNode",
|
|
"type": "string"
|
|
},
|
|
"source": {
|
|
"additionalProperties": {},
|
|
"description": "Product analtycs query objects like TrendsQuery, FunnelsQuery, RetentionQuery, PathsQuery, StickinessQuery, LifecycleQuery",
|
|
"propertyNames": {
|
|
"type": "string"
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"required": ["source"],
|
|
"type": "object"
|
|
},
|
|
{
|
|
"properties": {
|
|
"chartSettings": {
|
|
"description": "Chart configuration. Ignored when `display` is `ActionsTable` or `BoldNumber`.",
|
|
"properties": {
|
|
"goalLines": {
|
|
"description": "Horizontal goal lines drawn across the chart.",
|
|
"items": {
|
|
"properties": {
|
|
"label": {
|
|
"description": "Label rendered next to the goal line.",
|
|
"type": "string"
|
|
},
|
|
"value": {
|
|
"description": "Y-axis value at which the goal line is drawn.",
|
|
"type": "number"
|
|
}
|
|
},
|
|
"required": ["label", "value"],
|
|
"type": "object"
|
|
},
|
|
"type": "array"
|
|
},
|
|
"leftYAxisSettings": {
|
|
"description": "Settings for the left Y axis.",
|
|
"properties": {
|
|
"label": {
|
|
"description": "Label rendered beside this Y axis.",
|
|
"type": "string"
|
|
},
|
|
"scale": {
|
|
"description": "Scale used for this Y axis.",
|
|
"enum": ["linear", "logarithmic"],
|
|
"type": "string"
|
|
},
|
|
"showGridLines": {
|
|
"description": "Show grid lines for this Y axis.",
|
|
"type": "boolean"
|
|
},
|
|
"showTicks": {
|
|
"description": "Show tick labels on this Y axis.",
|
|
"type": "boolean"
|
|
},
|
|
"startAtZero": {
|
|
"description": "Whether this Y axis should start at zero.",
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"rightYAxisSettings": {
|
|
"description": "Settings for the right Y axis. Only applies when a Y series uses `settings.display.yAxisPosition: \"right\"`.",
|
|
"properties": {
|
|
"label": {
|
|
"description": "Label rendered beside this Y axis.",
|
|
"type": "string"
|
|
},
|
|
"scale": {
|
|
"description": "Scale used for this Y axis.",
|
|
"enum": ["linear", "logarithmic"],
|
|
"type": "string"
|
|
},
|
|
"showGridLines": {
|
|
"description": "Show grid lines for this Y axis.",
|
|
"type": "boolean"
|
|
},
|
|
"showTicks": {
|
|
"description": "Show tick labels on this Y axis.",
|
|
"type": "boolean"
|
|
},
|
|
"startAtZero": {
|
|
"description": "Whether this Y axis should start at zero.",
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"seriesBreakdownColumn": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"description": "Column that splits a single Y series into multiple colored series — e.g. breaking down a line chart by `country`. Set to `null` or omit to disable."
|
|
},
|
|
"showLegend": {
|
|
"description": "Show the chart legend.",
|
|
"type": "boolean"
|
|
},
|
|
"showNullsAsZero": {
|
|
"description": "Replace null aggregation results with zero.",
|
|
"type": "boolean"
|
|
},
|
|
"showTotalRow": {
|
|
"description": "Show a total summing all Y series. Applies to line, bar, and area charts.",
|
|
"type": "boolean"
|
|
},
|
|
"showValuesOnSeries": {
|
|
"description": "Render each data point's value as a label directly on the series.",
|
|
"type": "boolean"
|
|
},
|
|
"stackBars100": {
|
|
"description": "Stack bars to 100% of the total. Only meaningful with `ActionsStackedBar`.",
|
|
"type": "boolean"
|
|
},
|
|
"xAxis": {
|
|
"description": "Column used as the X axis. Typically a time bucket or categorical column.",
|
|
"properties": {
|
|
"column": {
|
|
"description": "Name of a column returned by the SQL query to map onto this axis.",
|
|
"type": "string"
|
|
},
|
|
"settings": {
|
|
"description": "Optional series settings. Only applies to Y-axis series.",
|
|
"properties": {
|
|
"display": {
|
|
"description": "Display settings for a plotted Y series.",
|
|
"properties": {
|
|
"color": {
|
|
"description": "Custom color for this series as a hex string (e.g. `#3d3d3d`).",
|
|
"type": "string"
|
|
},
|
|
"displayType": {
|
|
"description": "Override how this individual series is rendered, independent of the chart-level `display` type. Use this to mix series types — e.g. plot one series as `bar` and overlay another as `line`. `auto` follows the chart-level display type.",
|
|
"enum": ["auto", "line", "bar", "area"],
|
|
"type": "string"
|
|
},
|
|
"label": {
|
|
"description": "Custom label for this series, shown in the legend and tooltips instead of the column name.",
|
|
"type": "string"
|
|
},
|
|
"trendLine": {
|
|
"description": "Draw a linear trend line for this series. Only meaningful for line, bar, and area charts.",
|
|
"type": "boolean"
|
|
},
|
|
"yAxisPosition": {
|
|
"description": "Which Y axis this numeric series should use. Use `right` for a secondary Y axis.",
|
|
"enum": ["left", "right"],
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"formatting": {
|
|
"description": "Number-formatting settings for the values on this axis or series.",
|
|
"properties": {
|
|
"decimalPlaces": {
|
|
"description": "Number of decimal places to display.",
|
|
"type": "number"
|
|
},
|
|
"prefix": {
|
|
"description": "Text prepended to each value (e.g. `$`).",
|
|
"type": "string"
|
|
},
|
|
"style": {
|
|
"description": "Number formatting style.\n- `none` — no formatting.\n- `number` — thousands separators (e.g. `1,234`).\n- `short` — abbreviated large numbers (e.g. `1.2k`, `3.4M`).\n- `percent` — render the value as a percentage.",
|
|
"enum": ["none", "number", "short", "percent"],
|
|
"type": "string"
|
|
},
|
|
"suffix": {
|
|
"description": "Text appended to each value (e.g. `%` or ` ms`).",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"required": ["column"],
|
|
"type": "object"
|
|
},
|
|
"xAxisLabel": {
|
|
"description": "Label rendered under the X axis.",
|
|
"type": "string"
|
|
},
|
|
"yAxis": {
|
|
"description": "One or more numeric columns plotted as Y series.",
|
|
"items": {
|
|
"properties": {
|
|
"column": {
|
|
"description": "Name of a column returned by the SQL query to map onto this axis.",
|
|
"type": "string"
|
|
},
|
|
"settings": {
|
|
"description": "Optional series settings. Only applies to Y-axis series.",
|
|
"properties": {
|
|
"display": {
|
|
"description": "Display settings for a plotted Y series.",
|
|
"properties": {
|
|
"color": {
|
|
"description": "Custom color for this series as a hex string (e.g. `#3d3d3d`).",
|
|
"type": "string"
|
|
},
|
|
"displayType": {
|
|
"description": "Override how this individual series is rendered, independent of the chart-level `display` type. Use this to mix series types — e.g. plot one series as `bar` and overlay another as `line`. `auto` follows the chart-level display type.",
|
|
"enum": ["auto", "line", "bar", "area"],
|
|
"type": "string"
|
|
},
|
|
"label": {
|
|
"description": "Custom label for this series, shown in the legend and tooltips instead of the column name.",
|
|
"type": "string"
|
|
},
|
|
"trendLine": {
|
|
"description": "Draw a linear trend line for this series. Only meaningful for line, bar, and area charts.",
|
|
"type": "boolean"
|
|
},
|
|
"yAxisPosition": {
|
|
"description": "Which Y axis this numeric series should use. Use `right` for a secondary Y axis.",
|
|
"enum": ["left", "right"],
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"formatting": {
|
|
"description": "Number-formatting settings for the values on this axis or series.",
|
|
"properties": {
|
|
"decimalPlaces": {
|
|
"description": "Number of decimal places to display.",
|
|
"type": "number"
|
|
},
|
|
"prefix": {
|
|
"description": "Text prepended to each value (e.g. `$`).",
|
|
"type": "string"
|
|
},
|
|
"style": {
|
|
"description": "Number formatting style.\n- `none` — no formatting.\n- `number` — thousands separators (e.g. `1,234`).\n- `short` — abbreviated large numbers (e.g. `1.2k`, `3.4M`).\n- `percent` — render the value as a percentage.",
|
|
"enum": ["none", "number", "short", "percent"],
|
|
"type": "string"
|
|
},
|
|
"suffix": {
|
|
"description": "Text appended to each value (e.g. `%` or ` ms`).",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"required": ["column"],
|
|
"type": "object"
|
|
},
|
|
"type": "array"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"display": {
|
|
"description": "Visualization type. Defaults to `ActionsTable` when omitted.\n\nGuidance:\n- Single-value result (one numeric column, one row) → `BoldNumber`.\n- Time series → `ActionsLineGraph` or `ActionsAreaGraph`.\n- Categorical proportions → `ActionsPie`.\n- Categorical comparison → `ActionsBar` or `ActionsStackedBar`.\n- Two-dimensional aggregation → `TwoDimensionalHeatmap`.\n- Otherwise → `ActionsTable`.",
|
|
"enum": [
|
|
"ActionsTable",
|
|
"BoldNumber",
|
|
"ActionsLineGraph",
|
|
"ActionsBar",
|
|
"ActionsPie",
|
|
"ActionsStackedBar",
|
|
"ActionsAreaGraph",
|
|
"TwoDimensionalHeatmap"
|
|
],
|
|
"type": "string"
|
|
},
|
|
"kind": {
|
|
"const": "DataVisualizationNode",
|
|
"default": "DataVisualizationNode",
|
|
"type": "string"
|
|
},
|
|
"source": {
|
|
"additionalProperties": {},
|
|
"description": "InsightsQL query object that produces the rows to visualize.",
|
|
"propertyNames": {
|
|
"type": "string"
|
|
},
|
|
"type": "object"
|
|
},
|
|
"tableSettings": {
|
|
"description": "Table configuration. Only applies when `display` is `ActionsTable` or omitted.",
|
|
"properties": {
|
|
"columns": {
|
|
"description": "Columns to display and their order. Omit to show every column returned by the query.",
|
|
"items": {
|
|
"properties": {
|
|
"column": {
|
|
"description": "Name of a column returned by the SQL query to map onto this axis.",
|
|
"type": "string"
|
|
},
|
|
"settings": {
|
|
"description": "Optional series settings. Only applies to Y-axis series.",
|
|
"properties": {
|
|
"display": {
|
|
"description": "Display settings for a plotted Y series.",
|
|
"properties": {
|
|
"color": {
|
|
"description": "Custom color for this series as a hex string (e.g. `#3d3d3d`).",
|
|
"type": "string"
|
|
},
|
|
"displayType": {
|
|
"description": "Override how this individual series is rendered, independent of the chart-level `display` type. Use this to mix series types — e.g. plot one series as `bar` and overlay another as `line`. `auto` follows the chart-level display type.",
|
|
"enum": ["auto", "line", "bar", "area"],
|
|
"type": "string"
|
|
},
|
|
"label": {
|
|
"description": "Custom label for this series, shown in the legend and tooltips instead of the column name.",
|
|
"type": "string"
|
|
},
|
|
"trendLine": {
|
|
"description": "Draw a linear trend line for this series. Only meaningful for line, bar, and area charts.",
|
|
"type": "boolean"
|
|
},
|
|
"yAxisPosition": {
|
|
"description": "Which Y axis this numeric series should use. Use `right` for a secondary Y axis.",
|
|
"enum": ["left", "right"],
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"formatting": {
|
|
"description": "Number-formatting settings for the values on this axis or series.",
|
|
"properties": {
|
|
"decimalPlaces": {
|
|
"description": "Number of decimal places to display.",
|
|
"type": "number"
|
|
},
|
|
"prefix": {
|
|
"description": "Text prepended to each value (e.g. `$`).",
|
|
"type": "string"
|
|
},
|
|
"style": {
|
|
"description": "Number formatting style.\n- `none` — no formatting.\n- `number` — thousands separators (e.g. `1,234`).\n- `short` — abbreviated large numbers (e.g. `1.2k`, `3.4M`).\n- `percent` — render the value as a percentage.",
|
|
"enum": ["none", "number", "short", "percent"],
|
|
"type": "string"
|
|
},
|
|
"suffix": {
|
|
"description": "Text appended to each value (e.g. `%` or ` ms`).",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"required": ["column"],
|
|
"type": "object"
|
|
},
|
|
"type": "array"
|
|
},
|
|
"pinnedColumns": {
|
|
"description": "Column names to pin to the left of the table.",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"type": "array"
|
|
},
|
|
"transpose": {
|
|
"description": "Transpose rows and columns.",
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"required": ["source"],
|
|
"type": "object"
|
|
}
|
|
]
|
|
},
|
|
"tags": {
|
|
"items": {},
|
|
"type": "array"
|
|
}
|
|
},
|
|
"required": ["query"],
|
|
"type": "object"
|
|
}
|