tsgrid-ui 2.3.0 → 2.4.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 +51 -0
- package/dist/tsgrid-ui.css +2 -2
- package/dist/tsgrid-ui.d.ts +25 -59
- package/dist/tsgrid-ui.es6.js +1494 -1469
- package/dist/tsgrid-ui.es6.js.map +1 -0
- package/dist/tsgrid-ui.es6.min.js +600 -0
- package/dist/tsgrid-ui.js +1494 -1470
- package/dist/tsgrid-ui.min.css +2 -2
- package/dist/tsgrid-ui.min.js +625 -0
- package/package.json +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,57 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to **TsGrid UI** will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## v2.4.0 — 2026-05-13
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Minified bundles** — new `dist/tsgrid-ui.min.js` (CJS, IIFE-wrapped) and `dist/tsgrid-ui.es6.min.js` (ESM). ~46% smaller than non-min counterparts (~508 KB vs ~947 KB). Non-min bundles remain the default for debugging; minified are opt-in by direct path.
|
|
10
|
+
- **ESM sourcemap** — `dist/tsgrid-ui.es6.js.map` shipped alongside the ESM bundle for consumer debugging. CJS sourcemap intentionally omitted (incompatible with the legacy IIFE wrapper rewrite).
|
|
11
|
+
- **ESLint enforcement of INV-8** — new `no-restricted-syntax` rule scoped to `src/tsutils-*.ts` blocks `arguments.length` (codifies the delegator-trap discovered in v2.1 / fixed in v2.3 into the lint gate).
|
|
12
|
+
|
|
13
|
+
### Refactor
|
|
14
|
+
|
|
15
|
+
Decomposed the **DOM cluster** (8 methods, ~397 LOC) out of `TsUtils` into a new leaf module `src/tsutils-dom.ts` — **no breaking changes**, public API preserved. Class methods remain; bodies are now one-line delegators routing to pure functions in the sibling module.
|
|
16
|
+
|
|
17
|
+
- `src/tsutils-dom.ts` — `transition`, `lock`, `unlock`, `getSize`, `getStrDimentions`, `getStrWidth`, `getStrHeight`, `bindEvents` extracted as stateless functions (~234 LOC). Zero `this.X` references in function bodies (INV-9); no import from `tsbase.ts` (INV-4 leaf rule).
|
|
18
|
+
- `TsLockOptions` interface moved to `tsutils-dom.ts` and re-exported via `tsutils.ts` barrel (TsCloneOptions / TsMessageOptions pattern). Public API unchanged.
|
|
19
|
+
- `lock()` internal `this.unlock(...)` call → direct module-level `unlock()` call (R-DOM-1 mitigation).
|
|
20
|
+
- `getStrDimentions()` internal `this.encodeTags(...)` → import `_encodeTags` from `tsutils-string.js` (R-DOM-2 mitigation).
|
|
21
|
+
- `src/tsutils.ts` shrinks from ~1,602 → ~1,470 LOC. **NET REPO DELTA: −18 LOC** (397 removed inline, 234 + 25 added in dom + delegators).
|
|
22
|
+
|
|
23
|
+
`TsUtils` singleton shape and all ~49+ call sites: **UNCHANGED**. SEMVER MINOR. BC verdict: NONE.
|
|
24
|
+
|
|
25
|
+
### Improved (type)
|
|
26
|
+
|
|
27
|
+
- `TsUtils.getStrDimentions(str, styles): { width: number; height: number }`, `TsUtils.getStrWidth(str, styles): number`, `TsUtils.getStrHeight(str, styles): number` — return types narrowed from accidental `any` to explicit `number`. **Type improvement, runtime-equivalent**; no behavior change. Consumers using strict tsconfig settings will see the tighter types (all previously valid call sites remain valid — `any → number` is a strict refinement).
|
|
28
|
+
|
|
29
|
+
### Internal
|
|
30
|
+
|
|
31
|
+
- `@internal` JSDoc + tsup `stripInternal: true` for private surface (`_msgDeps`/`_confirmDeps`/`_promptDeps`, plus `TsFormatterExtra`/`TsFormatter`/`TsTimeResult`). `dist/tsgrid-ui.d.ts` reduced ~1.07% (93,567 → 92,564 B). Larger reductions deferred to v2.5+ (root cause: `TsFormatter`/`TsTimeResult` referenced inline in public method signatures, so tsc re-emits them).
|
|
32
|
+
- `scripts/wrap-legacy.mjs` regex generalized to match esbuild's minified `module.exports=ui(_i);` form (anchors removed) — handles both `tsgrid-ui.js` and `tsgrid-ui.min.js` (R-WRAP-1 mitigation).
|
|
33
|
+
|
|
34
|
+
### Tests
|
|
35
|
+
|
|
36
|
+
- Added 27 unit tests (197 → 224) covering DOM cluster (lock/unlock/getSize/getStrDimentions/getStrWidth/getStrHeight/bindEvents). `transition` covered by Playwright smoke only (jsdom cannot observe CSS animations).
|
|
37
|
+
|
|
38
|
+
### Bundle
|
|
39
|
+
|
|
40
|
+
Non-min delta vs v2.3.0 baseline:
|
|
41
|
+
- `dist/tsgrid-ui.js`: 946,684 → 946,553 B (−0.014%)
|
|
42
|
+
- `dist/tsgrid-ui.es6.js`: 944,836 → 944,746 B (−0.010%)
|
|
43
|
+
|
|
44
|
+
New minified artifacts:
|
|
45
|
+
- `dist/tsgrid-ui.min.js`: ~509 KB (−46.3% vs non-min)
|
|
46
|
+
- `dist/tsgrid-ui.es6.min.js`: ~508 KB (−46.3%)
|
|
47
|
+
|
|
48
|
+
All within ±2% gate. PASSED.
|
|
49
|
+
|
|
50
|
+
### BC
|
|
51
|
+
|
|
52
|
+
Net-additive (new artifacts + type narrowing). Public method signatures: byte-identical for transition/lock/unlock/getSize/bindEvents. `getStrWidth/Height/getStrDimentions` types narrowed `any → number` (strict superset; no runtime change). SEMVER MINOR. BC verdict: NONE.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
5
56
|
## v2.3.0 — 2026-05-13
|
|
6
57
|
|
|
7
58
|
### Refactor
|
package/dist/tsgrid-ui.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* tsgrid-ui 1.0.x (nightly) (5/13/2026,
|
|
1
|
+
/* tsgrid-ui 1.0.x (nightly) (5/13/2026, 7:24:54 PM) (c) 2014 vitmalina@gmail.com, (c) 2026 DaverSoGT — MIT */
|
|
2
2
|
/**
|
|
3
3
|
* TODO:
|
|
4
4
|
* - remove default styling, only keep tsg-* styles
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
@font-face {
|
|
11
11
|
font-family: "tsgrid-font";
|
|
12
|
-
src: url("data:application/x-font-woff;charset=utf-8;base64,
|
|
12
|
+
src: url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff");
|
|
13
13
|
font-weight: normal;
|
|
14
14
|
font-style: normal;
|
|
15
15
|
}
|
package/dist/tsgrid-ui.d.ts
CHANGED
|
@@ -182,8 +182,6 @@ interface TsEventPayload<TDetail = unknown> {
|
|
|
182
182
|
isCancelled: boolean;
|
|
183
183
|
/** Reference to the widget that triggered this event. CIRCULAR — do not serialize. */
|
|
184
184
|
owner: unknown;
|
|
185
|
-
/** @internal — Promise resolved when listeners settle; do not depend on shape. */
|
|
186
|
-
complete?: Promise<unknown>;
|
|
187
185
|
}
|
|
188
186
|
interface TsEventData {
|
|
189
187
|
type?: string | null;
|
|
@@ -374,6 +372,27 @@ interface TsMessageOptions {
|
|
|
374
372
|
[key: string]: unknown;
|
|
375
373
|
}
|
|
376
374
|
|
|
375
|
+
/**
|
|
376
|
+
* TsUtils DOM sub-module — Phase 5b of v2.4 SDD.
|
|
377
|
+
* DAG position: leaf module (no tsbase/tsutils imports).
|
|
378
|
+
*
|
|
379
|
+
* Imports: ./tsutils-string.js (_encodeTags), ./tsutils-type-guards.js (_isInt),
|
|
380
|
+
* ./tsutils-data.js (_extend), ./query.js (query, Query), DOM globals only.
|
|
381
|
+
* 4-space indent convention.
|
|
382
|
+
*
|
|
383
|
+
* INV-4: MUST NOT import from tsbase.ts or tsutils.ts.
|
|
384
|
+
* INV-8: No arguments.length usage.
|
|
385
|
+
* INV-9: No this.X in exported function bodies.
|
|
386
|
+
*/
|
|
387
|
+
/** Options for TsUtils.lock() — moved from tsutils.ts (Phase 5a of v2.4 SDD) */
|
|
388
|
+
interface TsLockOptions {
|
|
389
|
+
msg?: string | number;
|
|
390
|
+
spinner?: boolean;
|
|
391
|
+
opacity?: number;
|
|
392
|
+
bgColor?: string;
|
|
393
|
+
onClick?: () => void;
|
|
394
|
+
}
|
|
395
|
+
|
|
377
396
|
/**
|
|
378
397
|
* Part of TsUi 2.0 library
|
|
379
398
|
* - Dependencies: mQuery, TsUtils, TsBase, TsLocale
|
|
@@ -433,29 +452,6 @@ interface TsUISettings {
|
|
|
433
452
|
locale?: string;
|
|
434
453
|
[key: string]: unknown;
|
|
435
454
|
}
|
|
436
|
-
/** Extra data passed to grid cell formatters */
|
|
437
|
-
interface TsFormatterExtra {
|
|
438
|
-
value: unknown;
|
|
439
|
-
params?: unknown;
|
|
440
|
-
record?: unknown;
|
|
441
|
-
[key: string]: unknown;
|
|
442
|
-
}
|
|
443
|
-
/** Signature of a grid-cell formatter function */
|
|
444
|
-
type TsFormatter = (record: TsFormatterExtra, extra?: TsFormatterExtra) => string;
|
|
445
|
-
/** Options for TsUtils.lock() */
|
|
446
|
-
interface TsLockOptions {
|
|
447
|
-
msg?: string | number;
|
|
448
|
-
spinner?: boolean;
|
|
449
|
-
opacity?: number;
|
|
450
|
-
bgColor?: string;
|
|
451
|
-
onClick?: () => void;
|
|
452
|
-
}
|
|
453
|
-
/** Return value from TsUtils.isTime() when retTime === true */
|
|
454
|
-
interface TsTimeResult {
|
|
455
|
-
hours: number;
|
|
456
|
-
minutes: number;
|
|
457
|
-
seconds: number;
|
|
458
|
-
}
|
|
459
455
|
|
|
460
456
|
/** A normalized menu item */
|
|
461
457
|
interface TsMenuItem {
|
|
@@ -512,25 +508,6 @@ declare class Utils {
|
|
|
512
508
|
transition(div_old: HTMLElement, div_new: HTMLElement, type: string, callBack?: () => void): Promise<void>;
|
|
513
509
|
lock(box: unknown, options?: TsLockOptions | string, ...rest: unknown[]): void;
|
|
514
510
|
unlock(box: unknown, speed?: number): void;
|
|
515
|
-
/**
|
|
516
|
-
* Constructs the MessageDeps object for the _message() delegator.
|
|
517
|
-
* Called once per message() invocation — captures `this` at call time.
|
|
518
|
-
* Per design §C.5 / §C.2.
|
|
519
|
-
*/
|
|
520
|
-
private _msgDeps;
|
|
521
|
-
/**
|
|
522
|
-
* Constructs the ConfirmDeps object for the _confirm() delegator.
|
|
523
|
-
* Per design §C.3.
|
|
524
|
-
* normButtons closure: uses inline lambda that binds this.lang and this.settings
|
|
525
|
-
* at call time — preserving the call-time timing semantics (design §C.3 caveat).
|
|
526
|
-
*/
|
|
527
|
-
private _confirmDeps;
|
|
528
|
-
/**
|
|
529
|
-
* Constructs the PromptDeps object for the _prompt() delegator.
|
|
530
|
-
* Per design §C.3.
|
|
531
|
-
* lang is bound at call time so deps.lang('Ok') uses current locale.
|
|
532
|
-
*/
|
|
533
|
-
private _promptDeps;
|
|
534
511
|
/**
|
|
535
512
|
* Opens a context message, similar in parameters as TsPopup.open()
|
|
536
513
|
*
|
|
@@ -617,11 +594,11 @@ declare class Utils {
|
|
|
617
594
|
notify(text: string | Record<string, unknown>, options?: Record<string, unknown>): Promise<void>;
|
|
618
595
|
getSize(el: unknown, type: string): number;
|
|
619
596
|
getStrDimentions(str: string, styles?: string, raw?: boolean): {
|
|
620
|
-
width:
|
|
621
|
-
height:
|
|
597
|
+
width: number;
|
|
598
|
+
height: number;
|
|
622
599
|
};
|
|
623
|
-
getStrWidth(str: string, styles?: string, raw?: boolean):
|
|
624
|
-
getStrHeight(str: string, styles?: string, raw?: boolean):
|
|
600
|
+
getStrWidth(str: string, styles?: string, raw?: boolean): number;
|
|
601
|
+
getStrHeight(str: string, styles?: string, raw?: boolean): number;
|
|
625
602
|
execTemplate(str: any, replace_obj: any): any;
|
|
626
603
|
marker(el: any, items: any, options?: any): unknown;
|
|
627
604
|
lang(phrase: string, params?: Record<string, string | number> | boolean): string;
|
|
@@ -1509,17 +1486,6 @@ declare class TsLayout extends TsBase {
|
|
|
1509
1486
|
*
|
|
1510
1487
|
* @module types
|
|
1511
1488
|
*/
|
|
1512
|
-
/**
|
|
1513
|
-
* Creates a branded (nominal) type from a base type K and brand tag T.
|
|
1514
|
-
*
|
|
1515
|
-
* @example
|
|
1516
|
-
* type UserId = Brand<number, 'UserId'>
|
|
1517
|
-
*
|
|
1518
|
-
* @internal
|
|
1519
|
-
*/
|
|
1520
|
-
type Brand<K, T> = K & {
|
|
1521
|
-
readonly __brand: T;
|
|
1522
|
-
};
|
|
1523
1489
|
/**
|
|
1524
1490
|
* A record identifier value — the `recid` field used across TsGrid records.
|
|
1525
1491
|
* Can be either a string or a number at runtime; branded to prevent mixing
|