@freegridjs/core 0.8.1 → 1.0.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/LICENSE CHANGED
@@ -25,7 +25,8 @@ This license covers the FreeGrid software, including the packages @freegridjs/co
25
25
  erp.example.com) needs its own Company License. Applications without a domain (desktop
26
26
  apps, intranets reached by address) count as one domain per installation site.
27
27
  - The fee is KRW 200,000 per domain per year. The license is valid for one year from the
28
- date it is issued and may be renewed.
28
+ date it is issued and may be renewed. A perpetual Company License costs KRW 400,000 per
29
+ domain, paid once, and does not expire.
29
30
  - A license key is provided with each Company License. Setting the key removes the
30
31
  console notice described in section 5.
31
32
 
@@ -61,6 +62,7 @@ FreeGrid 라이선스 (요약, 한국어)
61
62
  회사 라이선스가 필요합니다. 30일 동안은 평가 목적으로 라이선스 없이 써 볼 수 있습니다.
62
63
  - 도메인 1개(www 포함) 기준 연 200,000원이며, 발급일로부터 1년간 유효하고
63
64
  갱신할 수 있습니다. 서브도메인(예: erp.example.com)은 별도로 요금이 책정됩니다.
65
+ - 영구 라이선스는 도메인 1개 기준 400,000원을 한 번 결제하며 만료되지 않습니다.
64
66
  - 라이선스마다 키를 발급하며, 키를 설정하면 콘솔 안내가 사라집니다.
65
67
  - 모든 사용자: 저작권과 이 라이선스 문구를 유지해야 하며, 소프트웨어 자체를 판매하거나
66
68
  별도 그리드 라이브러리로 재배포할 수 없고, 라이선스 확인을 제거하거나 키를 다른
package/README.md CHANGED
@@ -4,15 +4,18 @@ A fast data grid for the web, free for personal use. Docs and live demos: **http
4
4
 
5
5
  - 100,000+ rows with row and column virtualization
6
6
  - Pinned columns, multi-level headers, resize and drag to reorder
7
- - Multi-sort, text / number / date / set filters, quick search
8
- - Column chooser and side bar, autosize, save and restore layouts
7
+ - Multi-sort, text / number / date / set filters, a filter row, two conditions per column and an advanced filter across columns, quick search
8
+ - Column chooser and side bar, autosize, collapsible column groups, row numbers, tooltips, density; save and restore whole views (getState / setState)
9
9
  - Summary rows (top or bottom, pinned or scrolling)
10
10
  - Row selection, keyboard navigation, light / dark and Korean-style themes, font settings
11
- - 7 languages: English, 한국어, 简体中文, 日本語, Español, Français, Deutsch
12
- - Editing, validation, undo; Excel copy/paste, cell ranges, fill handle, merged cells
13
- - Row grouping, tree data, master/detail, row drag; pagination and server-side rows
14
- - Excel (.xlsx) and CSV export and import; pivot tables and SVG charts
15
- - Zero dependencies. React: [`@freegridjs/react`](https://www.npmjs.com/package/@freegridjs/react) · Vue: [`@freegridjs/vue`](https://www.npmjs.com/package/@freegridjs/vue)
11
+ - 14 languages: English, 한국어, 简体中文, 繁體中文, 日本語, Tiếng Việt, ไทย, Bahasa Indonesia, Español, Português, Français, Deutsch, Italiano, Русский
12
+ - Editing (cell or whole row), validation, unique values, formulas, undo; Excel copy/cut/paste, several cell ranges, fill handle, merged cells
13
+ - Live updates by id with flashing cells (applyTransaction)
14
+ - Row grouping with group checkboxes, tree data with lazy children, master/detail, row drag between grids; pagination, server-side rows and server-side grouping
15
+ - Excel (.xlsx, several sheets, cell styles) and CSV export and import, printing; pivot tables, SVG charts and sparklines
16
+ - Server helpers for Spring Boot and eGovFrame (restDatasource, loadData, saveChanges) with Java examples
17
+ - Accessibility (ARIA grid), Shadow DOM, right-to-left, card view for phones
18
+ - Zero dependencies. React: [`@freegridjs/react`](https://www.npmjs.com/package/@freegridjs/react) · Vue: [`@freegridjs/vue`](https://www.npmjs.com/package/@freegridjs/vue) · Svelte: [`@freegridjs/svelte`](https://www.npmjs.com/package/@freegridjs/svelte) · Angular: [`@freegridjs/angular`](https://www.npmjs.com/package/@freegridjs/angular)
16
19
 
17
20
  ```bash
18
21
  npm i @freegridjs/core
@@ -39,17 +42,17 @@ The container needs a height. Languages: `import ko from '@freegridjs/core/local
39
42
  ### CDN
40
43
 
41
44
  ```html
42
- <link rel="stylesheet" href="https://unpkg.com/@freegridjs/core@0/dist/cdn/freegrid.css">
43
- <script src="https://unpkg.com/@freegridjs/core@0/dist/cdn/freegrid.min.js"></script>
45
+ <link rel="stylesheet" href="https://unpkg.com/@freegridjs/core@1/dist/cdn/freegrid.css">
46
+ <script src="https://unpkg.com/@freegridjs/core@1/dist/cdn/freegrid.min.js"></script>
44
47
  <script>FreeGrid.createGrid(el, { columns, data, locale: 'ko' });</script>
45
48
  ```
46
49
 
47
50
  ## License
48
51
 
49
- Free for personal use. Company use needs a domain license: KRW 200,000 per domain per year
52
+ Free for personal use. Company use needs a domain license: KRW 200,000 per domain per year, or KRW 400,000 once (perpetual)
50
53
  (each subdomain is licensed separately). See https://freegrid.app/pricing/ and the LICENSE file.
51
54
 
52
- 개인은 무료, 회사는 도메인당 연 20만 원이며, 서브도메인은 별도로 요금이 책정됩니다. 자세한 내용은 https://freegrid.app/pricing/
55
+ 개인은 무료, 회사는 도메인당 연 20만 원 또는 영구 40만 원이며, 서브도메인은 별도로 요금이 책정됩니다. 자세한 내용은 https://freegrid.app/pricing/
53
56
 
54
57
  ```js
55
58
  import { setLicenseKey } from '@freegridjs/core';
@@ -419,3 +419,52 @@ textarea.fg-editor-control { padding-top: 8px; resize: none; }
419
419
  .fg-card-line { display: grid; grid-template-columns: minmax(80px, 38%) 1fr; gap: 10px; align-items: center; height: var(--fg-card-line, 27px); }
420
420
  .fg-card-label { color: var(--fg-muted); font-size: .92em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
421
421
  .fg-card-value { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
422
+
423
+ /* row numbers */
424
+ .fg-cell-rownum, .fg-header-rownum { justify-content: center; color: var(--fg-muted); font-variant-numeric: tabular-nums; cursor: default; }
425
+ .fg-cell-rownum { background: var(--fg-header-bg); }
426
+
427
+ /* filter row */
428
+ .fg-filter-row { position: relative; border-top: 1px solid var(--fg-border); will-change: transform; }
429
+ .fg-filter-cell { position: absolute; top: 0; box-sizing: border-box; display: flex; align-items: center; padding: 3px 4px; border-right: 1px solid var(--fg-border); }
430
+ .fg-filter-input { width: 100%; height: 100%; min-width: 0; box-sizing: border-box; border: 1px solid var(--fg-border); border-radius: 4px; padding: 0 6px; background: var(--fg-bg); color: var(--fg-fg); font: inherit; font-size: .92em; }
431
+ .fg-filter-input:focus { outline: 2px solid var(--fg-focus); outline-offset: -1px; }
432
+ .fg-filter-input::placeholder { color: var(--fg-muted); opacity: .7; }
433
+ .fg-filter-active .fg-filter-input { border-color: var(--fg-accent); }
434
+ .fg-filter-bad.fg-filter-input { border-color: #dc2626; }
435
+ .fg-rtl .fg-filter-cell { transform: scaleX(-1); direction: rtl; }
436
+
437
+ /* tooltips */
438
+ .fg-tooltip { position: fixed; z-index: 1000; max-width: 360px; padding: 6px 9px; border-radius: 6px; background: #1f2430; color: #fff; font-size: 12px; line-height: 1.45; white-space: pre-wrap; word-break: break-word; pointer-events: none; box-shadow: 0 4px 14px rgba(0, 0, 0, .18); }
439
+ .fg-tooltip.fg-theme-dark { background: #e6e9f0; color: #11141b; }
440
+
441
+ /* cells changed by applyTransaction */
442
+ .fg-cell-flash { animation: fg-flash 1s ease-out; }
443
+ @keyframes fg-flash { from { background: color-mix(in srgb, var(--fg-accent) 35%, transparent); } to { background: transparent; } }
444
+ @media (prefers-reduced-motion: reduce) { .fg-cell-flash { animation: none; outline: 1px solid var(--fg-accent); outline-offset: -1px; } }
445
+
446
+ /* editType 'row': the row being edited */
447
+ .fg-row-editing { box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--fg-accent) 45%, transparent); background: color-mix(in srgb, var(--fg-accent) 5%, var(--fg-bg)); }
448
+
449
+ /* collapsible column groups */
450
+ .fg-colgroup-toggle { margin-left: 6px; width: 18px; height: 18px; padding: 0; border: 1px solid var(--fg-border); border-radius: 4px; background: var(--fg-bg); color: var(--fg-muted); font: 600 12px/1 var(--fg-font); cursor: pointer; flex: none; }
451
+ .fg-colgroup-toggle:hover { color: var(--fg-fg); border-color: var(--fg-muted); }
452
+
453
+ /* two conditions in a column filter */
454
+ .fg-filter-cond { display: flex; flex-direction: column; gap: 6px; }
455
+ .fg-filter-join { display: flex; gap: 14px; padding: 2px 2px 0; font-size: .92em; color: var(--fg-muted); }
456
+ .fg-filter-join label { display: flex; align-items: center; gap: 4px; cursor: pointer; }
457
+
458
+ /* autoHeight: grow with the rows */
459
+ .fg-root.fg-auto-height { height: auto; }
460
+ .fg-auto-height .fg-main, .fg-auto-height .fg-grid { flex: none; }
461
+ .fg-auto-height .fg-body { flex: none; min-height: 0; }
462
+ .fg-auto-height .fg-body-pane-center { overflow-y: hidden; }
463
+
464
+ .fg-sparkline { display: block; overflow: visible; }
465
+
466
+ .fg-overlay.fg-overlay-custom { pointer-events: auto; }
467
+
468
+ /* density */
469
+ .fg-density-compact { --fg-cell-px: 7px; }
470
+ .fg-density-comfortable { --fg-cell-px: 14px; }