fix: Resolve heatmap axis sorting and borderColor issues

- Fix undefined borderColor error by providing fallback to 'transparent'
- Fix axis sorting by using correct camelCase field names (sortXAxis/sortYAxis)
- Fix sorting direction logic by using endsWith('asc') instead of includes('asc')
- Fix TypeScript errors by removing unused import and handling undefined groupby
- All heatmap tests now passing

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
diff --git a/.claude_rc b/.claude_rc
new file mode 100644
index 0000000..cba4108
--- /dev/null
+++ b/.claude_rc
@@ -0,0 +1,40 @@
+# Claude Code RC for issue34531
+
+This is a claudette-managed Apache Superset development environment.
+
+## Project: issue34531
+- Worktree Path: /Users/evan_1/.claudette/worktrees/issue34531
+- Frontend Port: 9003
+- Frontend URL: http://localhost:9003
+
+## Quick Commands
+
+Start services:
+```bash
+claudette docker up
+```
+
+Access frontend:
+```bash
+open http://localhost:9003
+```
+
+Run tests:
+```bash
+# Backend
+pytest tests/unit_tests/
+
+# Frontend
+cd superset-frontend && npm test
+```
+
+## Environment Details
+- Python venv: `.venv/` (auto-activated in claudette shell)
+- Node modules: `superset-frontend/node_modules/`
+- Docker prefix: `issue34531_`
+
+## Development Tips
+- Always use `claudette shell` to work in this project
+- Run `pre-commit run --all-files` before committing
+- Use `claudette docker` instead of docker-compose directly
+- The frontend dev server runs on port 9003 to avoid conflicts
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Heatmap/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Heatmap/transformProps.ts
index 2133157..3dc60e2 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Heatmap/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Heatmap/transformProps.ts
@@ -19,7 +19,6 @@
 import {
   GenericDataType,
   NumberFormats,
-  QueryFormColumn,
   getColumnLabel,
   getMetricLabel,
   getSequentialSchemeRegistry,
@@ -100,13 +99,13 @@
     yAxisFormat,
     xAxisTimeFormat,
     currencyFormat,
-    sort_x_axis: sortXAxis,
-    sort_y_axis: sortYAxis,
+    sortXAxis,
+    sortYAxis,
   } = formData;
   const metricLabel = getMetricLabel(metric);
   const xAxisLabel = getColumnLabel(xAxis);
   // groupby is overridden to be a single value
-  const yAxisLabel = getColumnLabel(groupby as unknown as QueryFormColumn);
+  const yAxisLabel = getColumnLabel(groupby?.[0] || '');
   const { data, colnames, coltypes } = queriesData[0];
   const { columnFormats = {}, currencyFormats = {} } = datasource;
   const colorColumn = normalized ? 'rank' : metricLabel;
@@ -160,7 +159,7 @@
     }
 
     const isMetricSort = sortConfig.includes('value');
-    const isAscending = sortConfig.includes('asc');
+    const isAscending = sortConfig.endsWith('asc');
 
     if (isMetricSort) {
       // Create a map of axis value to metric sum for sorting by metric
@@ -236,10 +235,12 @@
         },
       },
       itemStyle: {
-        borderColor: addAlpha(
-          rgbToHex(borderColor.r, borderColor.g, borderColor.b),
-          borderColor.a,
-        ),
+        borderColor: borderColor
+          ? addAlpha(
+              rgbToHex(borderColor.r, borderColor.g, borderColor.b),
+              borderColor.a,
+            )
+          : 'transparent',
         borderWidth,
       },
       emphasis: {