comins-table 0.1.7 → 0.1.8

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/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.1.8 - 2026-08-28
6
+
7
+ - Added responsive left/right Column Pinning for leaf Columns and atomic Header Groups, including persisted pin intent, position locking, resize-aware sticky offsets, wider-side inner-block demotion with a 48px center budget, opaque Header/Body/Skeleton/Summary surfaces, and Summary `colSpan` zone splitting while keeping full-width structural Rows non-sticky.
8
+ - Added application-created Cross-Table Drag Coordinators for flat and grouped Rows and complete Group bundles, target-owned permission and reject/overwrite conflict callbacks, persistent empty Groups, immutable atomic source/target results, destination focus recovery, duplicate registration fail-closed behavior, and target-only vertical edge auto-scroll.
9
+ - Added matching Korean/English Playground routes and public guides for Column Pinning and Cross-Table Row/Group Drag, including model ownership, supported combinations, destructive overwrite semantics, layout persistence, and responsive behavior.
10
+ - Added non-blocking pointer-adjacent `Duplicate ID` rejection feedback with a reusable internal Tooltip Surface, restrained target outline, viewport collision handling, accessible live status, renderer/duration/disable controls, CSS theme tokens, and structured `onTransferRejected` notifications.
11
+ - Corrected the Column Pinning Playground to guarantee observable horizontal overflow, and capped direct resize of effective pinned Columns and Header Groups at the 48px center budget so the active pinned surface no longer demotes beneath scrolling content.
12
+ - Moved the single native horizontal scrollbar to the bottom of the complete Table, after Summary when configured, while preserving Body wheel input, vertical virtualization, synchronized Header/Body/Summary scrolling, and a visible final Row boundary when native scrollbar chrome auto-hides.
13
+ - Corrected the bottom scrollbar range to use the Body's actual horizontal viewport width across native scrollbar layouts, so direct rail input reaches the final horizontal content without desynchronizing Header, Body, or Summary.
14
+
5
15
  ## 0.1.7 - 2026-08-27
6
16
 
7
17
  - Added controlled client-side Column Filtering with text, number, UTC calendar-day date, and boolean operators; application-owned Filter/open-popover state; semantic Header controls; filtered sorting, pagination, virtualization, Summary, and Row Grouping projection; explicit Group preservation; Row Drag and remote/Tree exclusions; and matching Korean/English Playground documentation.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Comins Table
2
2
 
3
- Comins Table is a controlled React data table for data-heavy application screens, with virtualized rendering, precise selection, movable headers, controlled Column Filtering, Row Grouping and Row Expand Details, Summary Row aggregation, Tree Grid data, built-in component cells, and framework-independent core helpers.
3
+ Comins Table is a controlled React data table for data-heavy application screens, with virtualized rendering, precise selection, movable and pinned headers, controlled Column Filtering, Row Grouping and Row Expand Details, Cross-Table Row/Group Drag, Summary Row aggregation, Tree Grid data, built-in component cells, and framework-independent core helpers.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/comins-table)](https://www.npmjs.com/package/comins-table)
6
6
  [![TypeScript declarations](https://img.shields.io/npm/types/comins-table)](https://www.npmjs.com/package/comins-table)
@@ -15,7 +15,7 @@ Comins Table is a controlled React data table for data-heavy application screens
15
15
  | --- | --- |
16
16
  | Controlled data | Application-owned `data`, CRUD helpers, `onChangeData`, pagination, sorting, and layout callbacks |
17
17
  | Rendering and scale | Fixed-height virtualization with a tested 100,000-row route, infinite scroll, append-mode lazy loading, loading, and empty states |
18
- | Interaction | Accessible single and opt-in multi-column Header sorting, controlled Column Filtering, resize, 6-pixel horizontal column reorder with source placeholder, Row and Cell selection, ranges, clipboard, and context menu callbacks |
18
+ | Interaction | Accessible single and opt-in multi-column Header sorting, controlled Column Filtering, resize, responsive Column Pinning, 6-pixel horizontal column reorder, Cross-Table Row/Group Drag, Row and Cell selection, ranges, clipboard, and context menu callbacks |
19
19
  | Data structure | Controlled client-side flat Row Grouping, flat Row Expand Details, Summary Row aggregation, and controlled Tree Grid expand/fold |
20
20
  | Custom UI | Cell/Header renderers, built-in button/input/checkbox/radio/select/toggle/progress/menu/Virtual List components, and CSS-variable themes |
21
21
 
@@ -136,6 +136,10 @@ A left-button mouse interaction activates column movement after a 6-pixel horizo
136
136
 
137
137
  Use `getColumnLayout()` and `setColumnLayout()` through the Ref API, or `serializeCominsColumnLayout()` and `applyCominsColumnLayout()` from `comins-table/core`, to persist and restore order, widths, and visibility.
138
138
 
139
+ Set `pinned: "left"` or `pinned: "right"` on a Column or Header Group to keep its atomic block visible during horizontal scrolling and lock its configured position. Direct resize of an effective pinned block stops before it would consume the 48px center budget and demote itself; independent container resize can still temporarily demote inner pinned blocks without changing the persisted layout intent. Header, Body, Skeleton, and Summary use the same offsets; Group Rows and Row Details remain full-width non-sticky cells. See the [Column Pinning guide](https://github.com/kim1124/comins-table/blob/main/docs/user/22-column-pinning.md) and [`/examples/column-pinning`](http://127.0.0.1:4002/examples/column-pinning).
140
+
141
+ When columns overflow horizontally, Comins Table renders one native horizontal scrollbar at the bottom of the complete Table. A configured Summary Row stays above that scrollbar, while Body trackpad or Shift-wheel input and direct scrollbar input keep Header, Body, and Summary `scrollLeft` synchronized.
142
+
139
143
  ## Rows, Cells, And Selection
140
144
 
141
145
  Rows expose click, double-click, keyboard, and context-menu callbacks. Cells expose the corresponding Cell callbacks plus `format`, `renderer`, and props hooks.
@@ -174,6 +178,16 @@ Each synthetic Group Row is one full-width colspan Cell with a distinct neutral-
174
178
 
175
179
  Synthetic Group Rows never masquerade as `TData`: ordinary Row/Cell callbacks, selection, Clipboard, Cell renderers, formatters, and Row Detail remain leaf-only. Row Grouping supports fixed-height virtualization and grouped leaf Row Detail, but cannot be combined with pagination, infinite/lazy loading, or Tree Grid. Multi-depth grouping remains deferred.
176
180
 
181
+ ## Cross-Table Row And Group Drag
182
+
183
+ See the [Cross-Table Drag guide](https://github.com/kim1124/comins-table/blob/main/docs/user/23-cross-table-drag.md) and run the [`/examples/cross-table-drag`](http://127.0.0.1:4002/examples/cross-table-drag) Playground route.
184
+
185
+ Create a `createCominsTableTransferCoordinator()` and pass the same Coordinator, `scope`, and unique `tableId` through `tableTransfer` to participating Tables. Existing Row Drag moves one Row between compatible flat or grouped Tables. Group Drag moves the Group plus every member Row; moving the last Row preserves the empty source Group, while moving a Group removes it from the source model.
186
+
187
+ Duplicate IDs reject by default. A rejected duplicate displays a post-drop, pointer-adjacent `Duplicate ID` Tooltip and a restrained target Table outline without intercepting pointer events. The target can replace the Tooltip body through `rejectionFeedback.renderTooltip`, change its duration, disable default feedback, and customize its CSS variables. `Coordinator.onTransferRejected` receives the structured duplicate conflict for application Toasts or logging.
188
+
189
+ The target can reject through `canTransfer` or explicitly return `"overwrite"` from `resolveConflict`; Group overwrite replaces the complete target Group bundle and never merges it. The Coordinator emits one immutable source/target result, and the application applies both controlled models atomically. Cross-Table Transfer is unavailable with Tree Grid, Column Filtering, Infinite Scroll, and Lazy Load.
190
+
177
191
  ## Column Filtering
178
192
 
179
193
  See the [Column Filtering guide](https://github.com/kim1124/comins-table/blob/main/docs/user/21-column-filtering.md) and run the [`/examples/column-filtering`](http://127.0.0.1:4002/examples/column-filtering) Playground route.
package/dist/clipboard.js CHANGED
@@ -1,2 +1,2 @@
1
- import { copyCominsCell as e, copyCominsCellRange as t, copyCominsRow as n, fillCominsCellRange as r, pasteCominsCell as i, pasteCominsCellRange as a, pasteCominsRow as o } from "./core.js";
2
- export { e as copyCominsCell, t as copyCominsCellRange, n as copyCominsRow, r as fillCominsCellRange, i as pasteCominsCell, a as pasteCominsCellRange, o as pasteCominsRow };
1
+ import { M as e, N as t, P as n, c as r, o as i, p as a, s as o } from "./core-BF1H3EEK.js";
2
+ export { i as copyCominsCell, o as copyCominsCellRange, r as copyCominsRow, a as fillCominsCellRange, e as pasteCominsCell, t as pasteCominsCellRange, n as pasteCominsRow };
@@ -0,0 +1,25 @@
1
+ export type CominsColumnPinned = "left" | "right";
2
+ export type CominsColumnPinningBlock = {
3
+ columnIds: readonly string[];
4
+ columnWidths: readonly number[];
5
+ id: string;
6
+ pinned?: CominsColumnPinned;
7
+ };
8
+ export type CominsResolvedPinnedColumn = {
9
+ boundary?: boolean;
10
+ offset?: number;
11
+ pinned?: CominsColumnPinned;
12
+ };
13
+ export type CominsResolvedColumnPinning = {
14
+ columns: ReadonlyMap<string, CominsResolvedPinnedColumn>;
15
+ orderedColumnIds: readonly string[];
16
+ };
17
+ export type CominsColumnPinningSpanFragment = CominsResolvedPinnedColumn & {
18
+ colSpan: number;
19
+ startIndex: number;
20
+ };
21
+ export declare function normalizeCominsColumnPinned(value: unknown): CominsColumnPinned | undefined;
22
+ export declare function resolveCominsColumnPinning(blocks: readonly CominsColumnPinningBlock[], containerWidth: number): CominsResolvedColumnPinning;
23
+ export declare function getCominsPinnedBlockResizeMaxWidth(blocks: readonly CominsColumnPinningBlock[], resolved: CominsResolvedColumnPinning, blockId: string, containerWidth: number, minimumCenterWidth?: number): number | undefined;
24
+ export declare function getCominsColumnPinningSpanFragments(resolved: CominsResolvedColumnPinning, startIndex: number, colSpan: number): CominsColumnPinningSpanFragment[];
25
+ //# sourceMappingURL=column-pinning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-pinning.d.ts","sourceRoot":"","sources":["../src/column-pinning.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACzD,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,0BAA0B,GAAG;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAE1F;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,wBAAwB,EAAE,EAC3C,cAAc,EAAE,MAAM,GACrB,2BAA2B,CAoF7B;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,SAAS,wBAAwB,EAAE,EAC3C,QAAQ,EAAE,2BAA2B,EACrC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,kBAAkB,SAAK,GACtB,MAAM,GAAG,SAAS,CA+BpB;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,2BAA2B,EACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,+BAA+B,EAAE,CA+BnC"}