@iyulab/flex-table 0.34.1 → 0.34.3

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
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.34.3] - 2026-09-13
4
+
5
+ ### Fixed
6
+
7
+ - **The "host has no height constraint" dev-mode warning was a complete no-op in every published
8
+ release** — the guard used `import.meta.env.DEV`, which Vite resolves statically at this
9
+ package's own build time, so the published dist always shipped with the check baked to `false`
10
+ and the warning body removed entirely by dead-code elimination. Replaced with
11
+ `process.env.NODE_ENV !== 'production'`, which survives this package's own build and is resolved
12
+ by each consumer's own bundler against its own dev/production build (see `@iyulab/components`
13
+ 1.40.3, which had the identical defect in its shared dev-warning helper).
14
+
15
+ ## [0.34.2] - 2026-09-13
16
+
17
+ ### Added
18
+
19
+ - **Development-mode warning when virtual scrolling is silently off.** With 200 or more rows and no
20
+ height constraint the host grows to fit every row, nothing scrolls, and every row is rendered —
21
+ the state the README's "100,000+ rows" premise does not cover. The grid now says so once
22
+ (`[@iyulab/flex-table]`, development builds only) and tells you to size the host so it becomes
23
+ the scroll container.
24
+
3
25
  ## [0.34.1] - 2026-09-10
4
26
 
5
27
  ### Changed
@@ -6,7 +6,7 @@ var l = r`
6
6
  /* --- Theme Variables (Light defaults) --- */
7
7
  :host {
8
8
  --ft-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9
- /* 밀도 스위치 진입점 — components 의 --u-density 를 그대로 읽는다(묶음 결정 DL-253-1). */
9
+ /* 밀도 스위치 진입점 — components 의 --u-density 를 그대로 읽는다. */
10
10
  --ft-font-size: var(--u-density, 14px);
11
11
 
12
12
  /* --- 치수·위계 축 (기본값 = 종전 렌더값) ---
@@ -33,7 +33,7 @@ var l = r`
33
33
  --ft-row-hover-bg: var(--u-bg-color-hover, #F5F5F5);
34
34
  /* ★홀수 행은 --ft-row-odd-bg(=raised) 위에 앉는다 — 짝수 행과 같은
35
35
  --ft-row-hover-bg(=전역 hover) 를 쓰면 다크에서 raised==hover 라 «올려도 아무
36
- 일도 안 일어난다»(§D-14, L2-11-1). --u-bg-color-raised-hover 는 다크에서
36
+ 일도 안 일어난다»(소비자 실측). --u-bg-color-raised-hover 는 다크에서
37
37
  color-mix 로 새로 계산되고, 라이트에서는 기존 hover 에 별칭된다(components
38
38
  light.css) — 두 테마 다 늘 선언돼 있으므로 폴백 리터럴은 시트 미로드 시에만
39
39
  쓰인다(다른 토큰들과 같은 관례). */
@@ -1513,9 +1513,9 @@ var J = {
1513
1513
  lt: "<",
1514
1514
  gte: "≥",
1515
1515
  lte: "≤"
1516
- }, Y = 120, X = 40, Z = 32, Q = 5, $ = class extends n {
1516
+ }, Y = 120, X = 40, Z = 32, Q = 5, xe = 200, $ = class extends n {
1517
1517
  constructor(...e) {
1518
- super(...e), this.columns = [], this._data = [], this._inUndoRedo = !1, this.clearUndoOnDataChange = !1, this.clearSelectionOnDataChange = !1, this._rowHeightFromCss = Z, this.showRowNumbers = !1, this.theme = void 0, this.maxRows = 0, this.editable = !0, this.showFilters = !1, this.showContextMenu = !1, this.frozenRows = 0, this.emptyMessage = "No data", this.noMatchingMessage = "No matching data", this.loading = !1, this.importEnabled = !1, this.selectable = !1, this.dataMode = "client", this.footerData = null, this.stylesheets = [], this._scrollTop = 0, this._scrollLeft = 0, this._viewportHeight = 0, this._viewportWidth = 0, this._colLeftOffsets = [], this._totalRowWidth = 0, this._baseStyleSheets = [], this._activeCell = null, this._editingCell = null, this._sortCriteria = [], this._selection = new x(), this._editing = new S(), this._rowSelection = new C(), this._undo = new E(), this._filters = [], this._filteredIndices = [], this._sortedIndices = [], this._openFilterKey = null, this._rowSelectionVersion = 0, this._lastCheckboxRowIndex = null, this._checkboxShiftPending = !1, this._autocompleteState = null, this._headerMenu = null, this._bodyContextMenu = null, this._commentPopup = null, this._viewDirty = !0, this._isDragging = !1, this._wasDrag = !1, this._resizing = null, this._resizeCleanup = null, this._wasHeaderDrag = !1, this._wasRowDrag = !1, this._colDrag = null, this._colDragIndicatorLeft = null, this._fillDrag = null, this._rowDrag = null, this._rowDragIndicatorY = null, this._findState = null, this._columnWidths = /* @__PURE__ */ new Map(), this._hostResizeObserver = null, this._comments = /* @__PURE__ */ new Map(), this._isDragOver = !1, this._onCommentPopupOutsideClick = () => {
1518
+ super(...e), this.columns = [], this._data = [], this._inUndoRedo = !1, this.clearUndoOnDataChange = !1, this.clearSelectionOnDataChange = !1, this._rowHeightFromCss = Z, this.showRowNumbers = !1, this.theme = void 0, this.maxRows = 0, this.editable = !0, this.showFilters = !1, this.showContextMenu = !1, this.frozenRows = 0, this.emptyMessage = "No data", this.noMatchingMessage = "No matching data", this.loading = !1, this.importEnabled = !1, this.selectable = !1, this.dataMode = "client", this.footerData = null, this.stylesheets = [], this._scrollTop = 0, this._scrollLeft = 0, this._viewportHeight = 0, this._viewportWidth = 0, this._colLeftOffsets = [], this._totalRowWidth = 0, this._baseStyleSheets = [], this._activeCell = null, this._editingCell = null, this._sortCriteria = [], this._selection = new x(), this._editing = new S(), this._rowSelection = new C(), this._undo = new E(), this._filters = [], this._filteredIndices = [], this._sortedIndices = [], this._openFilterKey = null, this._rowSelectionVersion = 0, this._lastCheckboxRowIndex = null, this._checkboxShiftPending = !1, this._autocompleteState = null, this._headerMenu = null, this._bodyContextMenu = null, this._commentPopup = null, this._viewDirty = !0, this._isDragging = !1, this._wasDrag = !1, this._resizing = null, this._resizeCleanup = null, this._wasHeaderDrag = !1, this._wasRowDrag = !1, this._colDrag = null, this._colDragIndicatorLeft = null, this._fillDrag = null, this._rowDrag = null, this._rowDragIndicatorY = null, this._findState = null, this._columnWidths = /* @__PURE__ */ new Map(), this._hostResizeObserver = null, this._comments = /* @__PURE__ */ new Map(), this._isDragOver = !1, this._warnedUnconstrained = !1, this._onCommentPopupOutsideClick = () => {
1519
1519
  this._commitCommentPopup();
1520
1520
  }, this._invalidCells = /* @__PURE__ */ new Map(), this._textFilterState = /* @__PURE__ */ new Map(), this._numberFilterState = /* @__PURE__ */ new Map(), this._dateFilterState = /* @__PURE__ */ new Map(), this._emptyFilterState = /* @__PURE__ */ new Map();
1521
1521
  }
@@ -2154,7 +2154,10 @@ var J = {
2154
2154
  }
2155
2155
  _measureViewport() {
2156
2156
  let e = this.clientHeight, t = this.clientWidth;
2157
- e !== this._viewportHeight && (this._viewportHeight = e), t !== this._viewportWidth && (this._viewportWidth = t);
2157
+ e !== this._viewportHeight && (this._viewportHeight = e), t !== this._viewportWidth && (this._viewportWidth = t), this._warnIfUnconstrained();
2158
+ }
2159
+ _warnIfUnconstrained() {
2160
+ this._warnedUnconstrained || process.env.NODE_ENV === "production" || this._visibleRowCount < xe || this.scrollHeight > this.clientHeight + 1 || (this._warnedUnconstrained = !0, console.warn(`[@iyulab/flex-table] ${this._visibleRowCount} rows but the host has no height constraint — it grew to fit every row, so virtual scrolling is off and all rows are rendered. Give the host a height (e.g. height: 400px, or flex: 1 1 auto with min-height: 0 inside a sized parent) so it becomes the scroll container.`));
2158
2161
  }
2159
2162
  _onScroll() {
2160
2163
  this._scrollTop = this.scrollTop, this._scrollLeft = this.scrollLeft;
@@ -330,6 +330,13 @@ export declare class FlexTable extends LitElement {
330
330
  private _toDataIndex;
331
331
  private _focusEditor;
332
332
  private _measureViewport;
333
+ private _warnedUnconstrained;
334
+ /**
335
+ * 개발 모드 사용 안내: 행이 많은데 호스트가 스크롤 컨테이너가 아니면 — 호스트가 내용
336
+ * 높이만큼 자라 스크롤할 것이 없으면 — 가상화가 꺼진 것이다. 오류가 없어 아무도 모른다.
337
+ * 한 번만, 개발 모드에서만. ResizeObserver 경로에서 불리지만 판정은 프로퍼티 둘을 읽는 것뿐이다.
338
+ */
339
+ private _warnIfUnconstrained;
333
340
  private _onScroll;
334
341
  private _onDocumentClick;
335
342
  private _onContextMenu;
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, r, t as i } from "./flex-table-hkmpmDxR.js";
1
+ import { a as e, i as t, n, r, t as i } from "./flex-table-BbeD49ly.js";
2
2
  export { i as FlexTable, t as RowSelectionState, r as UndoStack, n as exportData, e as renderCell };
package/dist/react.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e } from "./flex-table-hkmpmDxR.js";
1
+ import { t as e } from "./flex-table-BbeD49ly.js";
2
2
  import t from "react";
3
3
  import { createComponent as n } from "@lit/react";
4
4
  var r = n({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iyulab/flex-table",
3
- "version": "0.34.1",
3
+ "version": "0.34.3",
4
4
  "description": "A minimalist, input-centric data grid web component",
5
5
  "type": "module",
6
6
  "main": "./dist/flex-table.js",