@superdangerous/app-framework 4.15.8 → 4.16.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superdangerous/app-framework",
3
- "version": "4.15.8",
3
+ "version": "4.16.0",
4
4
  "description": "Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -240,14 +240,14 @@ export function DataTable<T>({
240
240
  return (
241
241
  <TooltipProvider>
242
242
  <>
243
- {/* Table with scroll container and border */}
244
- <div className="overflow-x-auto border rounded-lg">
243
+ {/* Table with scroll container and border - supports both horizontal and vertical scroll with sticky header */}
244
+ <div className="overflow-auto border rounded-lg max-h-[calc(100vh-16rem)]">
245
245
  <Table
246
246
  style={getTableStyle()}
247
247
  className={cn('resizable-table sticky-actions-table', className)}
248
248
  >
249
- <TableHeader>
250
- <TableRow onContextMenu={handleHeaderContextMenu}>
249
+ <TableHeader className="sticky top-0 z-20 bg-muted">
250
+ <TableRow onContextMenu={handleHeaderContextMenu} className="border-t-0">
251
251
  {columnOrder.map((colKey) => {
252
252
  // Select column (sticky on left)
253
253
  if (colKey === 'select' && selectable) {
@@ -311,7 +311,7 @@ export function DataTable<T>({
311
311
  colSpan={columnOrder.length + (actionsColumn ? 1 : 0)}
312
312
  className="!p-0 h-32"
313
313
  >
314
- <div className="sticky left-0 w-screen max-w-full h-full bg-white flex justify-center items-center">
314
+ <div className="sticky left-0 w-screen max-w-full h-full bg-background flex justify-center items-center">
315
315
  <div className="flex items-center gap-2 text-muted-foreground">
316
316
  <Loader2 className="h-5 w-5 animate-spin" />
317
317
  Loading...
@@ -328,7 +328,7 @@ export function DataTable<T>({
328
328
  <TableRow
329
329
  key={rowId}
330
330
  className={cn(
331
- 'cursor-pointer bg-white hover:bg-muted/50',
331
+ 'group cursor-pointer bg-background hover:bg-muted/50',
332
332
  isSelected && 'bg-primary/5',
333
333
  rowClassName?.(item)
334
334
  )}
@@ -348,7 +348,8 @@ export function DataTable<T>({
348
348
  key="select"
349
349
  className={cn(
350
350
  'sticky-select-cell w-10 sticky left-0 z-10 relative after:absolute after:right-0 after:top-0 after:bottom-0 after:w-px after:bg-border',
351
- isSelected ? 'bg-primary/5' : 'bg-white'
351
+ 'bg-background group-hover:bg-muted/50',
352
+ isSelected && 'bg-primary/5 group-hover:bg-primary/10'
352
353
  )}
353
354
  onClick={(e) => e.stopPropagation()}
354
355
  >
@@ -391,7 +392,8 @@ export function DataTable<T>({
391
392
  <TableCell
392
393
  className={cn(
393
394
  'sticky right-0 z-10 text-center relative before:absolute before:left-0 before:top-0 before:bottom-0 before:w-px before:bg-border',
394
- isSelected ? 'bg-primary/5' : 'bg-white'
395
+ 'bg-background group-hover:bg-muted/50',
396
+ isSelected && 'bg-primary/5 group-hover:bg-primary/10'
395
397
  )}
396
398
  style={{ width: actionsColumnWidth, minWidth: actionsColumnWidth, maxWidth: actionsColumnWidth }}
397
399
  onClick={(e) => e.stopPropagation()}
@@ -409,7 +411,7 @@ export function DataTable<T>({
409
411
 
410
412
  {/* Empty state - rendered outside table for proper positioning */}
411
413
  {!loading && pagination.paginatedData.length === 0 && (
412
- <div className="empty-state-container flex-1 flex items-center justify-center bg-white">
414
+ <div className="empty-state-container flex-1 flex items-center justify-center bg-background">
413
415
  {emptyState || <span className="block text-center text-muted-foreground py-8">No data</span>}
414
416
  </div>
415
417
  )}