From fd20f2a21277872acd41cc08eca2669a160fba2e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 24 Feb 2026 03:53:07 +0000
Subject: [PATCH 1/9] Initial plan
From 36d8e61d93fa4e65cc3c37f3e09b9ea01e7a0091 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 24 Feb 2026 04:08:25 +0000
Subject: [PATCH 2/9] feat: replace hardcoded gray colors with theme tokens,
add global font-family and --config-panel-width CSS variable
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
---
packages/components/src/index.css | 4 ++++
packages/fields/src/widgets/GridField.tsx | 18 +++++++++---------
packages/plugin-report/src/ReportRenderer.tsx | 8 ++++----
3 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/packages/components/src/index.css b/packages/components/src/index.css
index d3b0b1e59..29399256c 100644
--- a/packages/components/src/index.css
+++ b/packages/components/src/index.css
@@ -74,11 +74,15 @@
--radius: 0.5rem;
+ --config-panel-width: 280px;
+
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;
--chart-4: 43 74% 66%;
--chart-5: 27 87% 67%;
+
+ font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
}
.dark {
diff --git a/packages/fields/src/widgets/GridField.tsx b/packages/fields/src/widgets/GridField.tsx
index 658ee41a5..a629d32e0 100644
--- a/packages/fields/src/widgets/GridField.tsx
+++ b/packages/fields/src/widgets/GridField.tsx
@@ -12,39 +12,39 @@ export function GridField({ value, field, readonly, ...props }: FieldWidgetProps
const columns = gridField?.columns || [];
if (!value || !Array.isArray(value)) {
- return -;
+ return -;
}
if (readonly) {
return (
- {value.length} rows
+ {value.length} rows
);
}
// Simple read-only table view
return (
-
+
-
+
{columns.map((col: any, idx: number) => (
|
{col.label || col.name}
|
))}
-
+
{value.slice(0, 5).map((row: any, rowIdx: number) => (
-
+
{columns.map((col: any, colIdx: number) => (
- |
+ |
{row[col.name] != null ? String(row[col.name]) : '-'}
|
))}
@@ -54,7 +54,7 @@ export function GridField({ value, field, readonly, ...props }: FieldWidgetProps
{value.length > 5 && (
-
+
Showing 5 of {value.length} rows
)}
diff --git a/packages/plugin-report/src/ReportRenderer.tsx b/packages/plugin-report/src/ReportRenderer.tsx
index 0c603948f..826297369 100644
--- a/packages/plugin-report/src/ReportRenderer.tsx
+++ b/packages/plugin-report/src/ReportRenderer.tsx
@@ -54,7 +54,7 @@ export const ReportRenderer: React.FC
= ({ schema }) => {
}
return (
-
+
);
@@ -62,7 +62,7 @@ export const ReportRenderer: React.FC
= ({ schema }) => {
{/* Render Data Grid Section */}
{data && data.length > 0 && (
-
+
{(() => {
const GridComponent = showGrid ? (ComponentRegistry.get('aggrid') || ComponentRegistry.get('table')) : null;
return GridComponent ? (
@@ -78,7 +78,7 @@ export const ReportRenderer: React.FC
= ({ schema }) => {
// Simple Fallback Table if Grid plugin missing
-
+
{columns?.map((col: any) => (
| {col.headerName || col.label || col.field} |
@@ -87,7 +87,7 @@ export const ReportRenderer: React.FC = ({ schema }) => {
{data.map((row: any, i: number) => (
-
+
{columns?.map((col: any) => (
| {row[col.field]} |
))}
From eb0f176b5fabca2b4dd55fb8bc241a93300a803b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 24 Feb 2026 04:09:57 +0000
Subject: [PATCH 3/9] feat: sidebar active indicator bar, group label
separators, tooltip support, config panel separators and CSS variable width,
tab bar improvements
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
---
.../components/src/custom/config-panel-renderer.tsx | 6 ++++--
packages/components/src/ui/sidebar.tsx | 4 ++--
packages/layout/src/SidebarNav.tsx | 2 +-
packages/plugin-list/src/components/TabBar.tsx | 11 ++++++++---
4 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/packages/components/src/custom/config-panel-renderer.tsx b/packages/components/src/custom/config-panel-renderer.tsx
index be2284b4b..09ad8d212 100644
--- a/packages/components/src/custom/config-panel-renderer.tsx
+++ b/packages/components/src/custom/config-panel-renderer.tsx
@@ -12,6 +12,7 @@ import { X, Save, RotateCcw, ChevronRight } from 'lucide-react';
import { cn } from '../lib/utils';
import { Button } from '../ui/button';
+import { Separator } from '../ui/separator';
import { SectionHeader } from './section-header';
import { ConfigFieldRenderer } from './config-field-renderer';
import type { ConfigPanelSchema } from '../types/config-panel';
@@ -128,7 +129,7 @@ export function ConfigPanelRenderer({
aria-label={ariaLabel}
tabIndex={tabIndex}
className={cn(
- 'absolute inset-y-0 right-0 w-full sm:w-72 lg:w-80 sm:relative border-l bg-background flex flex-col shrink-0 z-20',
+ 'absolute inset-y-0 right-0 w-full sm:w-[var(--config-panel-width,280px)] sm:relative border-l bg-background flex flex-col shrink-0 z-20',
className,
)}
>
@@ -167,13 +168,14 @@ export function ConfigPanelRenderer({
{/* ── Scrollable sections ────────────────────────────── */}
- {schema.sections.map((section) => {
+ {schema.sections.map((section, sectionIdx) => {
if (section.visibleWhen && !section.visibleWhen(draft)) return null;
const sectionCollapsed = isCollapsed(section.key, section.defaultCollapsed);
return (
+ {sectionIdx > 0 &&
}
svg]:size-4 [&>svg]:shrink-0",
+ "flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0 border-t border-border/30 pt-3 mt-2 first:border-t-0 first:pt-0 first:mt-0",
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
className
)}
@@ -530,7 +530,7 @@ const SidebarMenuItem = React.forwardRef<
SidebarMenuItem.displayName = "SidebarMenuItem"
const sidebarMenuButtonVariants = cva(
- "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
+ "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 relative data-[active=true]:before:absolute data-[active=true]:before:left-0 data-[active=true]:before:top-1/2 data-[active=true]:before:-translate-y-1/2 data-[active=true]:before:h-4 data-[active=true]:before:w-[3px] data-[active=true]:before:rounded-full data-[active=true]:before:bg-primary",
{
variants: {
variant: {
diff --git a/packages/layout/src/SidebarNav.tsx b/packages/layout/src/SidebarNav.tsx
index 7a83d7fb2..70b0051b4 100644
--- a/packages/layout/src/SidebarNav.tsx
+++ b/packages/layout/src/SidebarNav.tsx
@@ -36,7 +36,7 @@ export function SidebarNav({ items, title = "Application", className, collapsibl
{items.map((item) => (
-
+
{item.icon && }
{item.title}
diff --git a/packages/plugin-list/src/components/TabBar.tsx b/packages/plugin-list/src/components/TabBar.tsx
index efc224ac5..254b5b1f1 100644
--- a/packages/plugin-list/src/components/TabBar.tsx
+++ b/packages/plugin-list/src/components/TabBar.tsx
@@ -87,7 +87,7 @@ export const TabBar: React.FC = ({
return (
@@ -97,9 +97,14 @@ export const TabBar: React.FC
= ({
return (