@wallarm-org/design-system 0.16.5 → 0.16.6-rc-fix-AS-582-table-experience.1

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.
@@ -9,7 +9,7 @@ import { Td } from "../primitives/index.js";
9
9
  import { useTableContext } from "../TableContext/index.js";
10
10
  import { TableMasterCellActions } from "../TableMasterCellActions.js";
11
11
  const TableBodyCell = ({ cell, colSpan, className, disablePinnedShadow })=>{
12
- const { allLeafColumns } = useTableContext();
12
+ const { allLeafColumns, masterColumnId } = useTableContext();
13
13
  const testId = useTestId('body-cell');
14
14
  const column = cell.column;
15
15
  const isPinned = column.getIsPinned();
@@ -19,7 +19,7 @@ const TableBodyCell = ({ cell, colSpan, className, disablePinnedShadow })=>{
19
19
  const { canDnd, setNodeRef, dndStyle } = useColumnDnd(column);
20
20
  const pinningStyles = getPinningStyles(column);
21
21
  const lastLeft = isLastPinnedLeft(column, allLeafColumns, column.id);
22
- const isCut = meta?.resizeType === 'cut';
22
+ const isCut = column.id === masterColumnId || meta?.resizeType === 'cut';
23
23
  const content = flexRender(cell.column.columnDef.cell, cell.getContext());
24
24
  const hasActions = !!meta?.renderActions;
25
25
  const [actionsWidth, setActionsWidth] = useState(0);
@@ -1,4 +1,5 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../utils/cn.js";
2
3
  import { useTestId } from "../../utils/testId.js";
3
4
  import { THead, Tr } from "./primitives/index.js";
4
5
  import { useTableContext } from "./TableContext/index.js";
@@ -8,7 +9,7 @@ const TableHead = ()=>{
8
9
  const testId = useTestId('head');
9
10
  const hasTextDescription = table.getAllLeafColumns().some((col)=>col.columnDef.meta?.description?.type === 'text');
10
11
  return /*#__PURE__*/ jsx(THead, {
11
- className: "sticky top-0 z-30 h-32",
12
+ className: cn('sticky top-0 z-30', hasTextDescription ? 'h-48' : 'h-32'),
12
13
  "data-testid": testId,
13
14
  children: table.getHeaderGroups().map((headerGroup)=>/*#__PURE__*/ jsx(Tr, {
14
15
  children: headerGroup.headers.map((header)=>/*#__PURE__*/ jsx(TableHeadCell, {
@@ -17,7 +17,7 @@ const TableMasterCellActions = ({ children, onWidthChange })=>{
17
17
  ]);
18
18
  return /*#__PURE__*/ jsx("div", {
19
19
  ref: ref,
20
- className: cn('absolute top-0 right-0 h-full', 'flex items-start pt-6 pr-6 pl-4 gap-2'),
20
+ className: cn('absolute top-0 right-0 h-full bg-bg-surface-2', 'before:absolute before:inset-0 before:pointer-events-none before:transition-colors', 'group-hover/row:before:bg-states-primary-hover', 'group-data-[selected]/row:before:bg-states-primary-active', 'group-data-[selected]/row:group-hover/row:before:bg-states-primary-hover', 'flex items-start pt-6 pr-6 pl-4 gap-2'),
21
21
  children: children
22
22
  });
23
23
  };
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useEffect, useMemo, useState } from "react";
2
+ import { useMemo, useState } from "react";
3
3
  import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
4
4
  import { SortableContext, arrayMove, sortableKeyboardCoordinates, verticalListSortingStrategy } from "@dnd-kit/sortable";
5
5
  import { isEqual } from "lodash-es";
@@ -15,25 +15,14 @@ import { TABLE_EXPAND_COLUMN_ID, TABLE_SELECT_COLUMN_ID } from "../lib/index.js"
15
15
  import { useTableContext } from "../TableContext/index.js";
16
16
  import { TableSettingsMenuItem } from "./TableSettingsMenuItem.js";
17
17
  const DEFAULT_HEADER_HEIGHT = 34;
18
+ const HEADER_HEIGHT_WITH_DESCRIPTION = 50;
18
19
  const TableSettingsMenu = ()=>{
19
20
  const testId = useTestId('settings-menu');
20
21
  const ctx = useTableContext();
21
- const { table, visibilityEnabled, columnDndEnabled, defaultColumnVisibility, defaultColumnOrder, alwaysPinnedLeft, masterColumnId, theadRef } = ctx;
22
+ const { table, visibilityEnabled, columnDndEnabled, defaultColumnVisibility, defaultColumnOrder, alwaysPinnedLeft, masterColumnId } = ctx;
23
+ const hasTextDescription = table.getAllLeafColumns().some((col)=>col.columnDef.meta?.description?.type === 'text');
22
24
  const [search, setSearch] = useState('');
23
25
  const [menuOpen, setMenuOpen] = useState(false);
24
- const [theadHeight, setTheadHeight] = useState(void 0);
25
- useEffect(()=>{
26
- const el = theadRef.current;
27
- if (!el) return;
28
- const ro = new ResizeObserver((entries)=>{
29
- const entry = entries[0];
30
- if (entry) setTheadHeight(entry.contentRect.height);
31
- });
32
- ro.observe(el);
33
- return ()=>ro.disconnect();
34
- }, [
35
- theadRef
36
- ]);
37
26
  const allColumns = table.getAllLeafColumns().filter((col)=>col.id !== TABLE_SELECT_COLUMN_ID && col.id !== TABLE_EXPAND_COLUMN_ID);
38
27
  const filteredColumns = useMemo(()=>{
39
28
  if (!search) return allColumns;
@@ -88,7 +77,7 @@ const TableSettingsMenu = ()=>{
88
77
  "data-testid": testId,
89
78
  className: cn('absolute top-0 right-0 z-30', 'flex items-start', 'bg-bg-light-primary border rounded-tr-12 border-border-primary-light', 'pl-6 pr-4 py-4', 'rounded-tr-12'),
90
79
  style: {
91
- height: theadHeight ? `${theadHeight + 1}px` : DEFAULT_HEADER_HEIGHT
80
+ height: hasTextDescription ? HEADER_HEIGHT_WITH_DESCRIPTION : DEFAULT_HEADER_HEIGHT
92
81
  },
93
82
  children: /*#__PURE__*/ jsxs(Tooltip, {
94
83
  disabled: menuOpen,
@@ -236,9 +236,10 @@ const securityColumns = [
236
236
  /*#__PURE__*/ jsx(OverflowTooltipTrigger, {
237
237
  asChild: true,
238
238
  children: /*#__PURE__*/ jsx(Link, {
239
- size: "md",
239
+ size: "sm",
240
240
  type: "table",
241
- weight: "medium",
241
+ weight: "regular",
242
+ href: "#",
242
243
  children: row.original.objectName
243
244
  })
244
245
  }),
@@ -283,7 +284,8 @@ const securityColumns = [
283
284
  size: 220,
284
285
  enableSorting: true,
285
286
  meta: {
286
- sortType: 'text'
287
+ sortType: 'text',
288
+ resizeType: 'cut'
287
289
  },
288
290
  cell: ({ getValue })=>/*#__PURE__*/ jsx(InlineCodeSnippet, {
289
291
  code: getValue(),
@@ -296,7 +298,8 @@ const securityColumns = [
296
298
  size: 130,
297
299
  enableSorting: true,
298
300
  meta: {
299
- sortType: 'text'
301
+ sortType: 'text',
302
+ resizeType: 'cut'
300
303
  },
301
304
  cell: ({ getValue })=>{
302
305
  const status = getValue();
@@ -314,7 +317,8 @@ const securityColumns = [
314
317
  size: 160,
315
318
  enableSorting: true,
316
319
  meta: {
317
- sortType: 'date'
320
+ sortType: 'date',
321
+ resizeType: 'cut'
318
322
  },
319
323
  cell: ({ getValue })=>/*#__PURE__*/ jsx(FormatDateTime, {
320
324
  value: getValue(),
@@ -341,7 +345,8 @@ const securityColumns = [
341
345
  size: 120,
342
346
  enableSorting: true,
343
347
  meta: {
344
- sortType: 'date'
348
+ sortType: 'date',
349
+ resizeType: 'cut'
345
350
  },
346
351
  cell: ({ getValue })=>/*#__PURE__*/ jsx(Text, {
347
352
  size: "sm",
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.16.4",
3
- "generatedAt": "2026-03-31T08:23:36.742Z",
2
+ "version": "0.16.5",
3
+ "generatedAt": "2026-03-31T14:32:34.371Z",
4
4
  "components": [
5
5
  {
6
6
  "name": "Alert",
@@ -24111,11 +24111,11 @@
24111
24111
  },
24112
24112
  {
24113
24113
  "name": "ColumnResizingWithPinning",
24114
- "code": "() => {\n const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({\n left: ['objectName'],\n });\n\n return (\n <Table\n className='max-w-800'\n data={securityEvents}\n columns={securityColumns}\n getRowId={row => row.id}\n columnSizing={columnSizing}\n onColumnSizingChange={setColumnSizing}\n columnPinning={columnPinning}\n onColumnPinningChange={setColumnPinning}\n />\n );\n}"
24114
+ "code": "() => {\n const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({\n left: ['objectName'],\n });\n\n return (\n <Table\n className='max-w-920'\n data={securityEvents}\n columns={securityColumns}\n getRowId={row => row.id}\n columnSizing={columnSizing}\n onColumnSizingChange={setColumnSizing}\n columnPinning={columnPinning}\n onColumnPinningChange={setColumnPinning}\n />\n );\n}"
24115
24115
  },
24116
24116
  {
24117
24117
  "name": "ColumnPinning",
24118
- "code": "() => {\n const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({\n left: ['objectName'],\n });\n\n return (\n <Table\n className='max-w-800'\n data={securityEvents}\n columns={securityColumns}\n getRowId={row => row.id}\n columnPinning={columnPinning}\n onColumnPinningChange={setColumnPinning}\n />\n );\n}"
24118
+ "code": "() => {\n const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({\n left: ['objectName'],\n });\n\n return (\n <Table\n className='max-w-920'\n data={securityEvents}\n columns={securityColumns}\n getRowId={row => row.id}\n columnPinning={columnPinning}\n onColumnPinningChange={setColumnPinning}\n />\n );\n}"
24119
24119
  },
24120
24120
  {
24121
24121
  "name": "ColumnDragAndDrop",
@@ -24167,7 +24167,7 @@
24167
24167
  },
24168
24168
  {
24169
24169
  "name": "MasterCellWithActions",
24170
- "code": "() => {\n const [sorting, setSorting] = useState<TableSortingState>([]);\n const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n () =>\n securityColumns.map((col, i) =>\n i === 0\n ? {\n ...col,\n meta: {\n ...col.meta,\n size: 400,\n resizeType: 'resize',\n renderActions: (row: { original: SecurityEvent }) => (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant='ghost'\n color='neutral'\n size='small'\n onClick={() => alert(`Preview: ${row.original.objectName}`)}\n aria-label='Preview'\n >\n <PanelRight />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Preview</TooltipContent>\n </Tooltip>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant='ghost' color='neutral' size='small' aria-label='More'>\n <Ellipsis />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem\n onSelect={() => navigator.clipboard.writeText(row.original.objectName)}\n >\n <DropdownMenuItemIcon>\n <Copy />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Copy name</DropdownMenuItemText>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => alert(`Filter: ${row.original.objectName}`)}\n >\n <DropdownMenuItemIcon>\n <Filter />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Show only</DropdownMenuItemText>\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => alert(`Exclude: ${row.original.objectName}`)}\n >\n <DropdownMenuItemIcon>\n <FilterX />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Exclude</DropdownMenuItemText>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n ),\n },\n }\n : col,\n ),\n [],\n );\n\n return (\n <Table\n className='max-w-800'\n data={securityEvents}\n columns={columns}\n getRowId={row => row.id}\n sorting={sorting}\n onSortingChange={setSorting}\n columnSizing={columnSizing}\n onColumnSizingChange={setColumnSizing}\n />\n );\n}"
24170
+ "code": "() => {\n const [sorting, setSorting] = useState<TableSortingState>([]);\n const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n () =>\n securityColumns.map((col, i) =>\n i === 0\n ? {\n ...col,\n meta: {\n ...col.meta,\n size: 400,\n resizeType: 'resize',\n renderActions: (row: { original: SecurityEvent }) => (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant='ghost'\n color='neutral'\n size='small'\n onClick={() => alert(`Preview: ${row.original.objectName}`)}\n aria-label='Preview'\n >\n <PanelRight />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Preview</TooltipContent>\n </Tooltip>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant='ghost' color='neutral' size='small' aria-label='More'>\n <Ellipsis />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem\n onSelect={() => navigator.clipboard.writeText(row.original.objectName)}\n >\n <DropdownMenuItemIcon>\n <Copy />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Copy name</DropdownMenuItemText>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => alert(`Filter: ${row.original.objectName}`)}\n >\n <DropdownMenuItemIcon>\n <Filter />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Show only</DropdownMenuItemText>\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => alert(`Exclude: ${row.original.objectName}`)}\n >\n <DropdownMenuItemIcon>\n <FilterX />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Exclude</DropdownMenuItemText>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n ),\n },\n }\n : col,\n ),\n [],\n );\n\n return (\n <Table\n className='max-w-920'\n data={securityEvents}\n columns={columns}\n getRowId={row => row.id}\n sorting={sorting}\n onSortingChange={setSorting}\n columnSizing={columnSizing}\n onColumnSizingChange={setColumnSizing}\n />\n );\n}"
24171
24171
  },
24172
24172
  {
24173
24173
  "name": "FullFeatured",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wallarm-org/design-system",
3
- "version": "0.16.5",
3
+ "version": "0.16.6-rc-fix-AS-582-table-experience.1",
4
4
  "description": "Core design system library with React components and Storybook documentation",
5
5
  "publishConfig": {
6
6
  "access": "public",