Skip to content

Commit 89455cf

Browse files
Copilothotlong
andcommitted
feat: add relative date formatting, enhance table header styling with muted background and uppercase tracking
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent eb0f176 commit 89455cf

3 files changed

Lines changed: 38 additions & 8 deletions

File tree

packages/components/src/renderers/complex/data-table.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -624,18 +624,18 @@ const DataTableRenderer = ({ schema }: { schema: DataTableSchema }) => {
624624
<div className="rounded-md border flex-1 min-h-0 overflow-auto relative bg-background [-webkit-overflow-scrolling:touch] shadow-[inset_-8px_0_8px_-8px_rgba(0,0,0,0.08)]">
625625
<Table>
626626
{caption && <TableCaption>{caption}</TableCaption>}
627-
<TableHeader className="sticky top-0 bg-background z-10 shadow-sm">
627+
<TableHeader className="sticky top-0 bg-muted/30 z-10">
628628
<TableRow>
629629
{selectable && (
630-
<TableHead className={cn("w-12 bg-background", frozenColumns > 0 && "sticky left-0 z-20")}>
630+
<TableHead className={cn("w-12 bg-muted/30", frozenColumns > 0 && "sticky left-0 z-20")}>
631631
<Checkbox
632632
checked={allPageRowsSelected ? true : somePageRowsSelected ? 'indeterminate' : false}
633633
onCheckedChange={handleSelectAll}
634634
/>
635635
</TableHead>
636636
)}
637637
{showRowNumbers && (
638-
<TableHead className={cn("w-12 bg-background text-center", frozenColumns > 0 && "sticky z-20")} style={frozenColumns > 0 ? { left: selectable ? 48 : 0 } : undefined}>
638+
<TableHead className={cn("w-12 bg-muted/30 text-center", frozenColumns > 0 && "sticky z-20")} style={frozenColumns > 0 ? { left: selectable ? 48 : 0 } : undefined}>
639639
<span className="text-xs text-muted-foreground">#</span>
640640
</TableHead>
641641
)}
@@ -664,7 +664,7 @@ const DataTableRenderer = ({ schema }: { schema: DataTableSchema }) => {
664664
isDragOver && 'border-l-2 border-primary',
665665
col.align === 'right' && 'text-right',
666666
col.align === 'center' && 'text-center',
667-
'relative group bg-background',
667+
'relative group bg-muted/30',
668668
isFrozen && 'sticky z-20',
669669
isFrozen && index === frozenColumns - 1 && 'border-r-2 border-border shadow-[2px_0_4px_-2px_rgba(0,0,0,0.1)]',
670670
)}
@@ -692,7 +692,7 @@ const DataTableRenderer = ({ schema }: { schema: DataTableSchema }) => {
692692
{col.headerIcon && (
693693
<span className="text-muted-foreground flex-shrink-0">{col.headerIcon}</span>
694694
)}
695-
<span>{col.header}</span>
695+
<span className="text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70">{col.header}</span>
696696
{sortable && col.sortable !== false && getSortIcon(col.accessorKey)}
697697
</div>
698698
{resizableColumns && col.resizable !== false && (
@@ -707,7 +707,7 @@ const DataTableRenderer = ({ schema }: { schema: DataTableSchema }) => {
707707
);
708708
})}
709709
{rowActions && (
710-
<TableHead className="w-24 text-right bg-background">Actions</TableHead>
710+
<TableHead className="w-24 text-right bg-muted/30">Actions</TableHead>
711711
)}
712712
</TableRow>
713713
</TableHeader>

packages/fields/src/index.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ export function formatDate(value: string | Date, style?: string): string {
119119
const year = String(date.getFullYear()).slice(-2);
120120
return `${month} ${day}, '${year}`;
121121
}
122+
123+
if (style === 'relative') {
124+
return formatRelativeDate(date);
125+
}
122126

123127
// Default format: MMM DD, YYYY
124128
return date.toLocaleDateString('en-US', {
@@ -128,6 +132,32 @@ export function formatDate(value: string | Date, style?: string): string {
128132
});
129133
}
130134

135+
/**
136+
* Format date as relative time (e.g., "2 days ago", "Today", "Overdue 3d")
137+
*/
138+
export function formatRelativeDate(value: string | Date): string {
139+
if (!value) return '-';
140+
const date = typeof value === 'string' ? new Date(value) : value;
141+
if (isNaN(date.getTime())) return '-';
142+
143+
const now = new Date();
144+
const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate());
145+
const startOfDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
146+
const diffMs = startOfDate.getTime() - startOfToday.getTime();
147+
const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));
148+
149+
if (diffDays === 0) return 'Today';
150+
if (diffDays === 1) return 'Tomorrow';
151+
if (diffDays === -1) return 'Yesterday';
152+
if (diffDays < -1) {
153+
const absDays = Math.abs(diffDays);
154+
if (absDays <= 30) return `${absDays} days ago`;
155+
return formatDate(date);
156+
}
157+
if (diffDays > 1 && diffDays <= 30) return `In ${diffDays} days`;
158+
return formatDate(date);
159+
}
160+
131161
/**
132162
* Format datetime value
133163
*/

packages/plugin-grid/src/VirtualGrid.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export const VirtualGrid: React.FC<VirtualGridProps> = ({
8484
<div className={className}>
8585
{/* Header */}
8686
<div
87-
className={`grid border-b sticky top-0 bg-background z-10 ${headerClassName}`}
87+
className={`grid border-b sticky top-0 bg-muted/30 z-10 ${headerClassName}`}
8888
style={{
8989
gridTemplateColumns: columns
9090
.map((col) => col.width || '1fr')
@@ -94,7 +94,7 @@ export const VirtualGrid: React.FC<VirtualGridProps> = ({
9494
{columns.map((column, index) => (
9595
<div
9696
key={index}
97-
className={`px-4 py-2 font-semibold text-sm ${
97+
className={`px-4 py-2 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/70 ${
9898
column.align === 'center'
9999
? 'text-center'
100100
: column.align === 'right'

0 commit comments

Comments
 (0)