@iyulab/flex-table 0.36.0 → 0.37.0

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,35 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.37.0] - 2026-09-20
4
+
5
+ ### Fixed
6
+
7
+ - **The column menu and the cell context menu stayed in English on a translated page.** 0.36.0 moved
8
+ the table's chrome text into a locale namespace, but the menus added in 0.35.0 were not part of
9
+ that move: their items, and the accessible name of the column-menu button, were written inline. On
10
+ a Korean page the same button therefore announced one language in its `title` and another in its
11
+ `aria-label`, and a screen-reader user heard English item names in the middle of a translated
12
+ grid — with no way to correct it, since the strings had no keys to register over. Every one of
13
+ those strings now goes through the namespace, including the cell context menu, the two menu
14
+ accessible names and the import drop target. Three keys name a column and carry a `{header}`
15
+ placeholder, so word order stays the translator's choice instead of being fixed by concatenation.
16
+ The built-in English wording is unchanged.
17
+
18
+ ### Documentation
19
+
20
+ - **The README no longer lists every message key by hand.** That paragraph had gone stale once
21
+ already, and a hand-copied list is the only part of this documentation that can: the exported
22
+ `FlexTableMessageKey` cannot. It now names the groups and points at the type, which your editor
23
+ completes and the compiler checks.
24
+
25
+ ### Added
26
+
27
+ - **The boolean filter's two options are translatable** (`booleanTrue` / `booleanFalse`). They read
28
+ `True` and `False` in every locale before this; the check and cross glyphs stay in the template,
29
+ since a symbol means the same thing in every language.
30
+ - **`t()` and the exported namespace now interpolate.** `FlexTableMessageKey` gains the menu keys
31
+ above; registering a partial table still merges, so existing registrations keep working untouched.
32
+
3
33
  ## [0.36.0] - 2026-09-17
4
34
 
5
35
  ### Added
package/README.md CHANGED
@@ -436,14 +436,25 @@ flexTableLocale.register('ja', {
436
436
  flexTableLocale.register('en', { replaceAll: 'Replace everything' }); // reword one string
437
437
  ```
438
438
 
439
- Keys cover the column header and menu (`showHiddenColumns`, `columnMenu`, `cellActions`,
440
- `noColumnsDefined`), cell comments (`addCommentPlaceholder`, `cancel`, `save`), the filter panel
441
- (`clear`, `blankCells`, `emptyOnly`, `nonEmptyOnly`, `blankAll`, `all`, `contains`, `startsWith`,
442
- `endsWith`, `wildcard`, `searchPlaceholder`, `valuePlaceholder`, `fromPlaceholder`,
443
- `toPlaceholder`) and find-and-replace (`findPlaceholder`, `findPrevious`, `findNext`, `matchCase`,
444
- `wholeCell`, `closeFind`, `replaceWithPlaceholder`, `replace`, `replaceAll`). `FlexTableMessageKey`
445
- is exported, so a missing or misspelled key is a type error rather than a string that silently falls
446
- back to its own name.
439
+ The keys are grouped by where they appear: the column header and its menu, the items inside that
440
+ menu, the cell context menu, cell comments, the filter panel, find-and-replace, and the import drop
441
+ target. **`FlexTableMessageKey` is the list** — it is exported, so your editor completes it and a
442
+ misspelled key is a type error rather than a string that silently falls back to its own name.
443
+
444
+ > This paragraph used to enumerate every key by hand. It went stale once, and a hand-copied list is
445
+ > the only thing here that can: the type cannot. If you want the full set, hover `FlexTableMessageKey`
446
+ > or open `src/locale.ts`.
447
+
448
+ Three of those keys name a column, and word order differs between languages, so they carry a
449
+ `{header}` placeholder rather than being assembled by concatenation:
450
+
451
+ ```ts
452
+ flexTableLocale.register('ja', {
453
+ columnMenuFor: '{header} の列メニュー', // the column menu button's accessible name
454
+ columnMenuRegion: '{header} 列', // the open menu's accessible name
455
+ showColumn: '{header} を表示', // "show this hidden neighbour again"
456
+ });
457
+ ```
447
458
 
448
459
  The filter operators `AND` and `OR` are not in the table, and neither are the glyphs that stand in
449
460
  for icons. They read the same in every language, and translating them makes them harder to
@@ -1018,7 +1018,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1018
1018
  alertNotice: "إشعار",
1019
1019
  alertMessage: "رسالة",
1020
1020
  remove: "إزالة",
1021
- closeTab: "إغلاق علامة التبويب"
1021
+ closeTab: "إغلاق علامة التبويب",
1022
+ breadcrumb: "مسار التنقل"
1022
1023
  },
1023
1024
  "../assets/locales/de.json": {
1024
1025
  valueMissing: "Dieses Feld ist erforderlich",
@@ -1058,7 +1059,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1058
1059
  alertNotice: "Hinweis",
1059
1060
  alertMessage: "Nachricht",
1060
1061
  remove: "Entfernen",
1061
- closeTab: "Tab schließen"
1062
+ closeTab: "Tab schließen",
1063
+ breadcrumb: "Navigationspfad"
1062
1064
  },
1063
1065
  "../assets/locales/en.json": {
1064
1066
  valueMissing: "This field is required",
@@ -1098,7 +1100,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1098
1100
  alertNotice: "Notice",
1099
1101
  alertMessage: "Message",
1100
1102
  remove: "Remove",
1101
- closeTab: "Close tab"
1103
+ closeTab: "Close tab",
1104
+ breadcrumb: "Breadcrumb"
1102
1105
  },
1103
1106
  "../assets/locales/es.json": {
1104
1107
  valueMissing: "Este campo es obligatorio",
@@ -1138,7 +1141,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1138
1141
  alertNotice: "Aviso",
1139
1142
  alertMessage: "Mensaje",
1140
1143
  remove: "Quitar",
1141
- closeTab: "Cerrar pestaña"
1144
+ closeTab: "Cerrar pestaña",
1145
+ breadcrumb: "Ruta de navegación"
1142
1146
  },
1143
1147
  "../assets/locales/fr.json": {
1144
1148
  valueMissing: "Ce champ est obligatoire",
@@ -1178,7 +1182,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1178
1182
  alertNotice: "Avis",
1179
1183
  alertMessage: "Message",
1180
1184
  remove: "Supprimer",
1181
- closeTab: "Fermer l'onglet"
1185
+ closeTab: "Fermer l'onglet",
1186
+ breadcrumb: "Fil d'Ariane"
1182
1187
  },
1183
1188
  "../assets/locales/id.json": {
1184
1189
  valueMissing: "Kolom ini wajib diisi",
@@ -1218,7 +1223,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1218
1223
  alertNotice: "Pemberitahuan",
1219
1224
  alertMessage: "Pesan",
1220
1225
  remove: "Hapus",
1221
- closeTab: "Tutup tab"
1226
+ closeTab: "Tutup tab",
1227
+ breadcrumb: "Navigasi remah roti"
1222
1228
  },
1223
1229
  "../assets/locales/ja.json": {
1224
1230
  valueMissing: "この項目は必須です",
@@ -1258,7 +1264,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1258
1264
  alertNotice: "通知",
1259
1265
  alertMessage: "メッセージ",
1260
1266
  remove: "削除",
1261
- closeTab: "タブを閉じる"
1267
+ closeTab: "タブを閉じる",
1268
+ breadcrumb: "パンくずリスト"
1262
1269
  },
1263
1270
  "../assets/locales/ko.json": {
1264
1271
  valueMissing: "필수 항목입니다",
@@ -1298,7 +1305,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1298
1305
  alertNotice: "알림",
1299
1306
  alertMessage: "메시지",
1300
1307
  remove: "제거",
1301
- closeTab: "탭 닫기"
1308
+ closeTab: "탭 닫기",
1309
+ breadcrumb: "탐색 경로"
1302
1310
  },
1303
1311
  "../assets/locales/pt-BR.json": {
1304
1312
  valueMissing: "Este campo é obrigatório",
@@ -1338,7 +1346,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1338
1346
  alertNotice: "Nota",
1339
1347
  alertMessage: "Mensagem",
1340
1348
  remove: "Remover",
1341
- closeTab: "Fechar aba"
1349
+ closeTab: "Fechar aba",
1350
+ breadcrumb: "Trilha de navegação"
1342
1351
  },
1343
1352
  "../assets/locales/ru.json": {
1344
1353
  valueMissing: "Это поле обязательно для заполнения",
@@ -1378,7 +1387,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1378
1387
  alertNotice: "Уведомление",
1379
1388
  alertMessage: "Сообщение",
1380
1389
  remove: "Удалить",
1381
- closeTab: "Закрыть вкладку"
1390
+ closeTab: "Закрыть вкладку",
1391
+ breadcrumb: "Навигационная цепочка"
1382
1392
  },
1383
1393
  "../assets/locales/th.json": {
1384
1394
  valueMissing: "จำเป็นต้องกรอกข้อมูลนี้",
@@ -1418,7 +1428,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1418
1428
  alertNotice: "ประกาศ",
1419
1429
  alertMessage: "ข้อความ",
1420
1430
  remove: "ลบ",
1421
- closeTab: "ปิดแท็บ"
1431
+ closeTab: "ปิดแท็บ",
1432
+ breadcrumb: "เส้นทางการนำทาง"
1422
1433
  },
1423
1434
  "../assets/locales/vi.json": {
1424
1435
  valueMissing: "Trường này là bắt buộc",
@@ -1458,7 +1469,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1458
1469
  alertNotice: "Lưu ý",
1459
1470
  alertMessage: "Thông báo",
1460
1471
  remove: "Xóa",
1461
- closeTab: "Đóng tab"
1472
+ closeTab: "Đóng tab",
1473
+ breadcrumb: "Đường dẫn điều hướng"
1462
1474
  },
1463
1475
  "../assets/locales/zh-CN.json": {
1464
1476
  valueMissing: "此项为必填项",
@@ -1498,7 +1510,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1498
1510
  alertNotice: "提示",
1499
1511
  alertMessage: "消息",
1500
1512
  remove: "移除",
1501
- closeTab: "关闭标签页"
1513
+ closeTab: "关闭标签页",
1514
+ breadcrumb: "面包屑导航"
1502
1515
  },
1503
1516
  "../assets/locales/zh-TW.json": {
1504
1517
  valueMissing: "此欄位為必填",
@@ -1538,7 +1551,8 @@ var b = new Map(Object.entries(/* #__PURE__ */ Object.assign({
1538
1551
  alertNotice: "提示",
1539
1552
  alertMessage: "訊息",
1540
1553
  remove: "移除",
1541
- closeTab: "關閉分頁"
1554
+ closeTab: "關閉分頁",
1555
+ breadcrumb: "麵包屑導覽"
1542
1556
  }
1543
1557
  })).map(([e, t]) => [(e.split("/").pop()?.replace(".json", "") || "").toLowerCase(), t])), x = /* @__PURE__ */ new Map();
1544
1558
  function S() {
@@ -1632,7 +1646,29 @@ O.register("en", {
1632
1646
  closeFind: "Close (Escape)",
1633
1647
  replaceWithPlaceholder: "Replace with...",
1634
1648
  replace: "Replace",
1635
- replaceAll: "Replace all"
1649
+ replaceAll: "Replace all",
1650
+ sortAscending: "Sort ascending",
1651
+ sortDescending: "Sort descending",
1652
+ filter: "Filter…",
1653
+ clearFilter: "Clear filter",
1654
+ hideColumn: "Hide column",
1655
+ showColumn: "Show: {header}",
1656
+ autoFitWidth: "Auto-fit width",
1657
+ wider: "Wider",
1658
+ narrower: "Narrower",
1659
+ columnMenuFor: "Column menu: {header}",
1660
+ columnMenuRegion: "{header} column",
1661
+ copy: "Copy",
1662
+ insertRowAbove: "Insert row above",
1663
+ insertRowBelow: "Insert row below",
1664
+ deleteRow: "Delete row",
1665
+ filterByThisValue: "Filter by this value",
1666
+ addComment: "Add Comment",
1667
+ editComment: "Edit Comment",
1668
+ deleteComment: "Delete Comment",
1669
+ booleanTrue: "True",
1670
+ booleanFalse: "False",
1671
+ dropFileToImport: "Drop file to import (.xlsx / .csv)"
1636
1672
  }), O.register("ko", {
1637
1673
  showHiddenColumns: "숨긴 열 보기",
1638
1674
  columnMenu: "열 메뉴",
@@ -1663,9 +1699,31 @@ O.register("en", {
1663
1699
  closeFind: "닫기 (Escape)",
1664
1700
  replaceWithPlaceholder: "바꿀 내용...",
1665
1701
  replace: "바꾸기",
1666
- replaceAll: "모두 바꾸기"
1702
+ replaceAll: "모두 바꾸기",
1703
+ sortAscending: "오름차순 정렬",
1704
+ sortDescending: "내림차순 정렬",
1705
+ filter: "필터…",
1706
+ clearFilter: "필터 지우기",
1707
+ hideColumn: "열 숨기기",
1708
+ showColumn: "{header} 보기",
1709
+ autoFitWidth: "너비 자동 맞춤",
1710
+ wider: "넓게",
1711
+ narrower: "좁게",
1712
+ columnMenuFor: "{header} 열 메뉴",
1713
+ columnMenuRegion: "{header} 열",
1714
+ copy: "복사",
1715
+ insertRowAbove: "위에 행 삽입",
1716
+ insertRowBelow: "아래에 행 삽입",
1717
+ deleteRow: "행 삭제",
1718
+ filterByThisValue: "이 값으로 필터",
1719
+ addComment: "메모 추가",
1720
+ editComment: "메모 편집",
1721
+ deleteComment: "메모 삭제",
1722
+ booleanTrue: "참",
1723
+ booleanFalse: "거짓",
1724
+ dropFileToImport: "가져올 파일을 놓으세요 (.xlsx / .csv)"
1667
1725
  });
1668
- var k = (e) => O.text(e);
1726
+ var k = (e, t) => O.text(e, t);
1669
1727
  //#endregion
1670
1728
  //#region src/core/selection.ts
1671
1729
  function ee(e) {
@@ -3565,7 +3623,7 @@ var q = {
3565
3623
  <button class="ft-column-menu-btn ${s ? "ft-filter-active" : ""}"
3566
3624
  type="button"
3567
3625
  title=${k("columnMenu")}
3568
- aria-label=${`Column menu: ${e.header}`}
3626
+ aria-label=${k("columnMenuFor", { header: e.header })}
3569
3627
  aria-haspopup="menu"
3570
3628
  aria-expanded=${this._headerMenu?.key === e.key ? "true" : "false"}
3571
3629
  @mousedown=${(e) => e.stopPropagation()}
@@ -3684,26 +3742,26 @@ var q = {
3684
3742
  }}>${t}</button>
3685
3743
  `;
3686
3744
  return i`
3687
- <div class="ft-header-menu" role="menu" aria-label=${`${o.header} column`}
3745
+ <div class="ft-header-menu" role="menu" aria-label=${k("columnMenuRegion", { header: o.header })}
3688
3746
  style="position: fixed; left: ${t}px; top: ${n}px; z-index: 200;"
3689
3747
  @mousedown=${(e) => e.stopPropagation()}
3690
3748
  @keydown=${(e) => this._onHeaderMenuKeydown(e)}>
3691
3749
  ${o.sortable === !1 ? a : i`
3692
- ${c("sort-asc", "Sort ascending", () => this._applySortFromMenu(e, "asc"))}
3693
- ${c("sort-desc", "Sort descending", () => this._applySortFromMenu(e, "desc"))}
3750
+ ${c("sort-asc", k("sortAscending"), () => this._applySortFromMenu(e, "asc"))}
3751
+ ${c("sort-desc", k("sortDescending"), () => this._applySortFromMenu(e, "desc"))}
3694
3752
  <div class="ft-header-menu-separator" role="separator"></div>
3695
3753
  `}
3696
3754
  ${this.showFilters ? i`
3697
- ${c("filter", "Filter…", () => this._openFilterFromMenu(e))}
3698
- ${s ? c("clear-filter", "Clear filter", () => this._clearColumnFilter(e)) : a}
3755
+ ${c("filter", k("filter"), () => this._openFilterFromMenu(e))}
3756
+ ${s ? c("clear-filter", k("clearFilter"), () => this._clearColumnFilter(e)) : a}
3699
3757
  <div class="ft-header-menu-separator" role="separator"></div>
3700
3758
  ` : a}
3701
- ${c("hide", "Hide column", () => this._setColumnHidden(e, !0))}
3702
- ${r.map((e) => c("show", i`Show: ${e.header}`, () => this._setColumnHidden(e.key, !1)))}
3759
+ ${c("hide", k("hideColumn"), () => this._setColumnHidden(e, !0))}
3760
+ ${r.map((e) => c("show", k("showColumn", { header: e.header }), () => this._setColumnHidden(e.key, !1)))}
3703
3761
  <div class="ft-header-menu-separator" role="separator"></div>
3704
- ${c("autofit", "Auto-fit width", () => this._autoFitColumn(e))}
3705
- ${c("wider", "Wider", () => this._resizeColumnBy(e, X), !0)}
3706
- ${c("narrower", "Narrower", () => this._resizeColumnBy(e, -20), !0)}
3762
+ ${c("autofit", k("autoFitWidth"), () => this._autoFitColumn(e))}
3763
+ ${c("wider", k("wider"), () => this._resizeColumnBy(e, X), !0)}
3764
+ ${c("narrower", k("narrower"), () => this._resizeColumnBy(e, -20), !0)}
3707
3765
  </div>
3708
3766
  `;
3709
3767
  }
@@ -3725,22 +3783,22 @@ var q = {
3725
3783
  style="position: fixed; left: ${n}px; top: ${r}px; z-index: 200;"
3726
3784
  @mousedown=${(e) => e.stopPropagation()}
3727
3785
  @keydown=${(e) => this._onMenuKeydown(e, ".ft-body-context-menu", l)}>
3728
- ${d("Copy", () => this._handleCopy(!1))}
3786
+ ${d(k("copy"), () => this._handleCopy(!1))}
3729
3787
  ${f}
3730
- ${d("Insert row above", () => this.addRow(void 0, t))}
3731
- ${d("Insert row below", () => this.addRow(void 0, t + 1))}
3732
- ${d("Delete row", () => this.deleteRows([t]), !0)}
3788
+ ${d(k("insertRowAbove"), () => this.addRow(void 0, t))}
3789
+ ${d(k("insertRowBelow"), () => this.addRow(void 0, t + 1))}
3790
+ ${d(k("deleteRow"), () => this.deleteRows([t]), !0)}
3733
3791
  ${f}
3734
- ${d("Hide column", () => this._setColumnHidden(o.key, !0))}
3792
+ ${d(k("hideColumn"), () => this._setColumnHidden(o.key, !0))}
3735
3793
  ${f}
3736
- ${d("Sort ascending ↑", () => this._applySortFromMenu(o.key, "asc"))}
3737
- ${d("Sort descending ↓", () => this._applySortFromMenu(o.key, "desc"))}
3794
+ ${d(`${k("sortAscending")} ↑`, () => this._applySortFromMenu(o.key, "asc"))}
3795
+ ${d(`${k("sortDescending")} ↓`, () => this._applySortFromMenu(o.key, "desc"))}
3738
3796
  ${f}
3739
- ${d("Filter by this value", () => this.setFilter(o.key, (e) => e === s))}
3740
- ${c ? d("Clear filter", () => this.removeFilter(o.key)) : a}
3797
+ ${d(k("filterByThisValue"), () => this.setFilter(o.key, (e) => e === s))}
3798
+ ${c ? d(k("clearFilter"), () => this.removeFilter(o.key)) : a}
3741
3799
  ${f}
3742
- ${d(u ? "Edit Comment" : "Add Comment", () => this._openCommentPopup(t, o.key, n, r))}
3743
- ${u ? d("Delete Comment", () => this.setComment(t, o.key, null), !0) : a}
3800
+ ${d(k(u ? "editComment" : "addComment"), () => this._openCommentPopup(t, o.key, n, r))}
3801
+ ${u ? d(k("deleteComment"), () => this.setComment(t, o.key, null), !0) : a}
3744
3802
  </div>
3745
3803
  `;
3746
3804
  }
@@ -4086,8 +4144,8 @@ var q = {
4086
4144
  e.key === "Escape" && (this._openFilterKey = null), e.stopPropagation();
4087
4145
  }}>
4088
4146
  <option value="all">${k("all")}</option>
4089
- <option value="true">\u2714 True</option>
4090
- <option value="false">\u2718 False</option>
4147
+ <option value="true">\u2714 ${k("booleanTrue")}</option>
4148
+ <option value="false">\u2718 ${k("booleanFalse")}</option>
4091
4149
  </select>
4092
4150
  ${this._renderEmptyFilterRow(e.key)}
4093
4151
  `;
@@ -4538,7 +4596,7 @@ var q = {
4538
4596
  `;
4539
4597
  }
4540
4598
  render() {
4541
- let e = this.visibleColumns, t = this.importEnabled && this._isDragOver ? i`<div class="ft-import-overlay">Drop file to import (.xlsx / .csv)</div>` : a, n = this.loading ? i`<div class="ft-loading-overlay"></div>` : a;
4599
+ let e = this.visibleColumns, t = this.importEnabled && this._isDragOver ? i`<div class="ft-import-overlay">${k("dropFileToImport")}</div>` : a, n = this.loading ? i`<div class="ft-loading-overlay"></div>` : a;
4542
4600
  if (e.length === 0) return i`${t}${n}<div class="ft-empty">${k("noColumnsDefined")}</div>`;
4543
4601
  let r = this.headerHeight, o = this._totalRowWidth, { start: s, end: c } = this.visibleColRange, l = [];
4544
4602
  for (let t = 0; t < e.length; t++) (e[t].pinned === "left" || e[t].pinned === "right") && (t < s || t >= c) && l.push(t);
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, o as r, r as i, t as a } from "./flex-table-D5FjaSJV.js";
1
+ import { a as e, i as t, n, o as r, r as i, t as a } from "./flex-table-BAQbidin.js";
2
2
  export { a as FlexTable, t as RowSelectionState, i as UndoStack, n as exportData, e as flexTableLocale, r as renderCell };
package/dist/locale.d.ts CHANGED
@@ -25,8 +25,8 @@
25
25
  * (아이콘 자리의 글리프)는 어느 로케일에서도 같은 것을 뜻하며, 번역하면 오히려 읽히지 않는다.
26
26
  * 그 판단은 «번역하지 않기로 한 것»이지 «빠뜨린 것»이 아니다.
27
27
  */
28
- export type FlexTableMessageKey = 'showHiddenColumns' | 'columnMenu' | 'cellActions' | 'noColumnsDefined' | 'addCommentPlaceholder' | 'cancel' | 'save' | 'clear' | 'blankCells' | 'emptyOnly' | 'nonEmptyOnly' | 'blankAll' | 'all' | 'contains' | 'startsWith' | 'endsWith' | 'wildcard' | 'searchPlaceholder' | 'valuePlaceholder' | 'fromPlaceholder' | 'toPlaceholder' | 'findPlaceholder' | 'findPrevious' | 'findNext' | 'matchCase' | 'wholeCell' | 'closeFind' | 'replaceWithPlaceholder' | 'replace' | 'replaceAll';
28
+ export type FlexTableMessageKey = 'showHiddenColumns' | 'columnMenu' | 'cellActions' | 'noColumnsDefined' | 'addCommentPlaceholder' | 'cancel' | 'save' | 'clear' | 'blankCells' | 'emptyOnly' | 'nonEmptyOnly' | 'blankAll' | 'all' | 'contains' | 'startsWith' | 'endsWith' | 'wildcard' | 'searchPlaceholder' | 'valuePlaceholder' | 'fromPlaceholder' | 'toPlaceholder' | 'findPlaceholder' | 'findPrevious' | 'findNext' | 'matchCase' | 'wholeCell' | 'closeFind' | 'replaceWithPlaceholder' | 'replace' | 'replaceAll' | 'sortAscending' | 'sortDescending' | 'filter' | 'clearFilter' | 'hideColumn' | 'showColumn' | 'autoFitWidth' | 'wider' | 'narrower' | 'columnMenuFor' | 'columnMenuRegion' | 'copy' | 'insertRowAbove' | 'insertRowBelow' | 'deleteRow' | 'filterByThisValue' | 'addComment' | 'editComment' | 'deleteComment' | 'booleanTrue' | 'booleanFalse' | 'dropFileToImport';
29
29
  /** 이 패키지의 chrome 문자열 묶음. 소비자가 `register()` 로 언어를 더하거나 문구를 덮을 수 있다. */
30
30
  export declare const flexTableLocale: import("@iyulab/components/dist/utilities/Locale.js").LocaleNamespace<FlexTableMessageKey>;
31
31
  /** 짧은 조회 별칭 — 렌더 코드가 읽히게 유지한다. */
32
- export declare const t: (key: FlexTableMessageKey) => string;
32
+ export declare const t: (key: FlexTableMessageKey, params?: Record<string, string | number>) => string;
package/dist/react.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e } from "./flex-table-D5FjaSJV.js";
1
+ import { t as e } from "./flex-table-BAQbidin.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.36.0",
3
+ "version": "0.37.0",
4
4
  "description": "A minimalist, input-centric data grid web component",
5
5
  "type": "module",
6
6
  "main": "./dist/flex-table.js",