CtrlK
BlogDocsLog inGet started
Tessl Logo

column-pinning

Pin columns into logical start, center, and end regions with columnPinningFeature and renderer-owned sticky CSS. Load for RTL offsets, z-index, backgrounds, overflow, widths, gaps, or overlaps.

64

Quality

78%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Fix and improve this skill with Tessl

tessl review fix ./packages/table-core/skills/column-pinning/SKILL.md
SKILL.md
Quality
Evals
Security

This skill builds on core, table-features, and column-sizing. Pinning partitions models; CSS creates the sticky visual result.

Setup

import {
  columnPinningFeature,
  columnSizingFeature,
  tableFeatures,
} from '@tanstack/table-core'

export const features = tableFeatures({
  columnSizingFeature,
  columnPinningFeature,
})
export const initialState = {
  columnPinning: { start: ['name'], end: ['actions'] },
}

Core Patterns

const style = (column: Column<any, any>) => ({
  position: column.getIsPinned() ? 'sticky' : 'relative',
  insetInlineStart:
    column.getIsPinned() === 'start'
      ? `${column.getStart('start')}px`
      : undefined,
  insetInlineEnd:
    column.getIsPinned() === 'end' ? `${column.getAfter('end')}px` : undefined,
  width: `${column.getSize()}px`,
  zIndex: column.getIsPinned() ? 1 : 0,
  background: 'Canvas',
})

Common Mistakes

[HIGH] Using physical v8 regions

Wrong: column.pin('left')

Correct: column.pin('start')

V9 uses logical start and end, including state and collection APIs.

Source: docs/framework/react/guide/migrating.md#column-pinning

[HIGH] Expecting sticky CSS automatically

Wrong: column.pin('start')

Correct: Object.assign(cell.style, style(column))

The feature only computes regions and offsets; the renderer owns positioning, backgrounds, overflow, and stacking.

Source: examples/react/column-pinning-sticky/src/main.tsx

[HIGH] Diverging rendered and model widths

Wrong: cell.style.width = 'auto'

Correct: cell.style.width = ${column.getSize()}px``

Sticky offsets use numeric sizes, so mismatched DOM widths create gaps or overlaps.

Source: docs/framework/react/guide/column-pinning.md#useful-column-pinning-apis

API Discovery

Inspect node_modules/@tanstack/table-core/dist/features/column-pinning/; use CSS logical properties for direction-aware rendering.

Repository
TanStack/table
Last updated
First committed

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.