@invopop/popui 0.1.4-beta.44 → 0.1.4-beta.46

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.
@@ -22,9 +22,9 @@ export function createSelectionColumn() {
22
22
  enableSorting: false,
23
23
  enableHiding: false,
24
24
  enableResizing: false,
25
- size: 52,
26
- minSize: 52,
27
- maxSize: 52
25
+ size: 40,
26
+ minSize: 40,
27
+ maxSize: 40
28
28
  };
29
29
  }
30
30
  /**
@@ -7,7 +7,7 @@
7
7
  let { table, filters, frozenColumns, onFreezeColumn, disabled = false }: { table: Table<TData>; filters?: Snippet; frozenColumns: Set<string>; onFreezeColumn: (columnId: string) => void; disabled?: boolean } = $props()
8
8
  </script>
9
9
 
10
- <div class={clsx('flex items-center justify-between px-4 py-3', {
10
+ <div class={clsx('flex items-center justify-between px-4 py-2.5', {
11
11
  'pointer-events-none opacity-30': disabled
12
12
  })}>
13
13
  {#if filters}
@@ -78,6 +78,7 @@ export interface DataTableProps<TData> {
78
78
  initialSortDirection?: TableSortBy;
79
79
  initialFrozenColumns?: string[];
80
80
  initialColumnOrder?: string[];
81
+ initialColumnVisibility?: Record<string, boolean>;
81
82
  pageSizeOptions?: number[];
82
83
  emptyState?: Omit<EmptyStateProps, 'children' | 'check'>;
83
84
  onRowClick?: (row: TData) => void;
@@ -96,6 +97,7 @@ export interface DataTableProps<TData> {
96
97
  onFreezeChange?: (columnId: string) => void;
97
98
  onColumnResize?: (columnSizes: Record<string, number>) => void;
98
99
  onColumnOrderChange?: (columnOrder: string[]) => void;
100
+ onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;
99
101
  getRowClassName?: (row: TData) => string;
100
102
  getRowState?: (row: TData) => {
101
103
  isSuccess?: boolean;
@@ -45,6 +45,7 @@
45
45
  initialSortDirection,
46
46
  initialFrozenColumns = [],
47
47
  initialColumnOrder = [],
48
+ initialColumnVisibility = {},
48
49
  emptyState = {
49
50
  iconSource: Search,
50
51
  title: 'No results',
@@ -65,6 +66,7 @@
65
66
  onFreezeChange,
66
67
  onColumnResize,
67
68
  onColumnOrderChange,
69
+ onColumnVisibilityChange,
68
70
  getRowClassName,
69
71
  getRowState,
70
72
  children
@@ -74,7 +76,7 @@
74
76
  const enablePagination = !disablePagination
75
77
 
76
78
  let rowSelection = $state<RowSelectionState>({})
77
- let columnVisibility = $state<VisibilityState>({})
79
+ let columnVisibility = $state<VisibilityState>(initialColumnVisibility)
78
80
  let sorting = $state<SortingState>(
79
81
  initialSortColumn && initialSortDirection
80
82
  ? [{ id: initialSortColumn, desc: initialSortDirection === 'desc' }]
@@ -151,6 +153,13 @@
151
153
  }
152
154
  })
153
155
 
156
+ // Track column visibility changes
157
+ $effect(() => {
158
+ if (onColumnVisibilityChange && Object.keys(columnVisibility).length > 0) {
159
+ onColumnVisibilityChange(columnVisibility)
160
+ }
161
+ })
162
+
154
163
  const table = setupTable({
155
164
  getData: () => data,
156
165
  getColumns: () => columns,
@@ -393,7 +402,7 @@
393
402
  })}
394
403
  <div
395
404
  class={cn(
396
- 'absolute inset-0 flex items-center bg-background group-hover/row:bg-background-default-secondary group-data-[state=selected]/row:bg-background-selected group-data-[state=selected]/row:group-hover/row:bg-background-selected group-data-[state=error]/row:bg-background-critical group-data-[state=error]/row:group-hover/row:bg-background-critical group-data-[state=success]/row:bg-background-selected group-data-[state=success]/row:group-hover/row:bg-background-selected group-data-[focused=true]/row:bg-background-default-secondary px-3',
405
+ 'absolute inset-0 flex items-center bg-background group-hover/row:bg-background-default-secondary group-data-[state=selected]/row:bg-background-selected group-data-[state=selected]/row:group-hover/row:bg-background-selected group-data-[state=error]/row:bg-background-critical group-data-[state=error]/row:group-hover/row:bg-background-critical group-data-[state=success]/row:bg-background-selected group-data-[state=success]/row:group-hover/row:bg-background-selected group-data-[focused=true]/row:bg-background-default-secondary px-3 shadow-[inset_0_-1px_0_0_var(--color-border)]',
397
406
  align === 'right' ? 'justify-end' : '',
398
407
  { 'pl-4': isFirst, 'pr-4': isLast, 'border-r border-border': isFrozen && isLastFrozen }
399
408
  )}
@@ -600,13 +609,14 @@
600
609
  data-state={dataState}
601
610
  data-row-index={rowIndex}
602
611
  data-focused={focusedRowIndex === rowIndex ? 'true' : undefined}
603
- class={cn(clsx('border-b border-border', {
612
+ class={cn(clsx('shadow-[inset_0_-1px_0_0_var(--color-border)]', {
604
613
  'cursor-pointer': onRowClick
605
614
  }), getRowClassName?.(row.original as TData))}
606
615
  onclick={() => onRowClick?.(row.original as TData)}
607
616
  >
608
617
  {#each row.getVisibleCells() as cell, index (cell.id)}
609
618
  {@const visibleCells = row.getVisibleCells()}
619
+ {@const allCells = row.getAllCells()}
610
620
  {@const isLastScrollable = index === visibleCells.length - 2}
611
621
  {@const firstDataColumnIndex = visibleCells.findIndex(
612
622
  (c) => c.column.id !== 'select' && c.column.id !== 'actions'
@@ -615,9 +625,9 @@
615
625
  {@const isFirstCell = index === 0}
616
626
  {@const isLastCell = index === visibleCells.length - 1}
617
627
  {@const isFrozen = frozenColumns.has(cell.column.id)}
618
- {@const lastFrozenColumnId = visibleCells.map(c => c.column).reverse().find(col => frozenColumns.has(col.id))?.id}
628
+ {@const lastFrozenColumnId = allCells.map(c => c.column).reverse().find(col => frozenColumns.has(col.id))?.id}
619
629
  {@const isLastFrozen = isFrozen && cell.column.id === lastFrozenColumnId}
620
- {@const frozenOffset = isFrozen ? calculateFrozenOffset(cell.column.id, visibleCells.map(c => c.column)) : 0}
630
+ {@const frozenOffset = isFrozen ? calculateFrozenOffset(cell.column.id, allCells.map(c => c.column)) : 0}
621
631
  <Table.Cell
622
632
  style={getCellStyle(cell, isLastScrollable, isFrozen, frozenOffset)}
623
633
  class={getCellClasses(
@@ -13,7 +13,7 @@
13
13
  bind:this={ref}
14
14
  data-slot="table-head"
15
15
  class={cn(
16
- 'text-foreground-default-secondary text-base font-normal text-left align-middle [&:has([role=checkbox])]:p-0 [&:has(button)]:p-0 px-3 bg-background',
16
+ 'text-foreground-default-secondary text-base font-normal text-left align-middle [&:has([role=checkbox])]:p-0 [&:has(button)]:p-0 px-3 bg-background shadow-[inset_0_-1px_0_0_var(--color-border)]',
17
17
  className
18
18
  )}
19
19
  {...restProps}
@@ -15,7 +15,7 @@
15
15
  <thead
16
16
  bind:this={ref}
17
17
  data-slot="table-header"
18
- class={cn('sticky top-0 z-20 [&_tr]:border-b [&_tr]:border-border bg-background', className)}
18
+ class={cn('sticky top-0 z-20 bg-background', className)}
19
19
  onclick={bubble('click')}
20
20
  onkeydown={bubble('keydown')}
21
21
  >
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@invopop/popui",
3
3
  "license": "MIT",
4
- "version": "0.1.4-beta.44",
4
+ "version": "0.1.4-beta.46",
5
5
  "repository": {
6
6
  "url": "https://github.com/invopop/popui"
7
7
  },