@iyulab/modern-app 0.18.8 → 0.18.10

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,34 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.18.10] - 2026-09-01
4
+
5
+ ### Fixed
6
+
7
+ - **`0.18.9`'s `JSX.IntrinsicElements` fix didn't actually reach consumers who
8
+ deep-import these components** (`import '@iyulab/modern-app/dist/components/
9
+ MasterDetailLayout.js'` and similar for `InfoField`/`PageHeader`/`EmptyState`/
10
+ `GroupBox`/`InfoSection`/`ActionBar`). The augmentation lived in a separate
11
+ file pulled in only via a side-effect-only type import, which the
12
+ declaration bundler stripped from each component's published `.d.ts` as
13
+ "unused". Each component's JSX augmentation now lives directly in its own
14
+ source file instead, so it survives declaration bundling regardless of
15
+ import path. Verified against the actual published tarball this time
16
+ (`npm pack`), not just the local workspace.
17
+
18
+ ## [0.18.9] - 2026-08-31
19
+
20
+ ### Fixed
21
+
22
+ - **JSX couldn't type-check `InfoField`, `PageHeader`, `EmptyState`, `GroupBox`,
23
+ `InfoSection`, `ActionBar`, or `MasterDetailLayout` in a `.tsx` consumer** —
24
+ these seven have no `/react` wrapper by design (plain
25
+ String/Number/Boolean properties work as a raw custom element in JSX on
26
+ both React 18 and 19), but only `HTMLElementTagNameMap` was declared for
27
+ them; `JSX.IntrinsicElements`, what `.tsx` actually checks against, never
28
+ was. Every one of them failed `TS2339` the moment a consumer wrote it in
29
+ JSX. Declared now, and pulled in from each component file itself (not just
30
+ the barrel), so a deep import for tree-shaking still sees it.
31
+
3
32
  ## [0.18.8] - 2026-08-30
4
33
 
5
34
  ### Fixed
@@ -1,4 +1,5 @@
1
1
  import { StyledElement } from '../internals/StyledElement.js';
2
+ import { default as React } from 'react';
2
3
  type ElementParts = 'host' | 'danger' | 'main';
3
4
  /**
4
5
  * 푸터 액션 바 — 상세·편집 화면 맨 아래의 같은 골격.
@@ -42,4 +43,13 @@ declare global {
42
43
  'u-action-bar': ActionBar;
43
44
  }
44
45
  }
46
+ declare module 'react' {
47
+ namespace JSX {
48
+ interface IntrinsicElements {
49
+ 'u-action-bar': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
50
+ sticky?: boolean;
51
+ };
52
+ }
53
+ }
54
+ }
45
55
  export {};
@@ -1,4 +1,5 @@
1
1
  import { StyledElement } from '../internals/StyledElement.js';
2
+ import { default as React } from 'react';
2
3
  type ElementParts = 'host' | 'icon' | 'title' | 'description' | 'actions';
3
4
  /**
4
5
  * 빈 상태 — 목록·검색 결과가 비었을 때.
@@ -49,4 +50,16 @@ declare global {
49
50
  'u-empty-state': EmptyState;
50
51
  }
51
52
  }
53
+ declare module 'react' {
54
+ namespace JSX {
55
+ interface IntrinsicElements {
56
+ 'u-empty-state': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
57
+ variant?: 'no-data' | 'no-results';
58
+ title?: string;
59
+ description?: string;
60
+ locale?: string;
61
+ };
62
+ }
63
+ }
64
+ }
52
65
  export {};
@@ -1,4 +1,5 @@
1
1
  import { StyledElement } from '../internals/StyledElement.js';
2
+ import { default as React } from 'react';
2
3
  type ElementParts = 'host' | 'header' | 'title' | 'actions' | 'body';
3
4
  /**
4
5
  * 그룹 박스 — 제목이 붙은 카드. LOB 상세 화면의 기본 단위다.
@@ -40,4 +41,15 @@ declare global {
40
41
  'u-group-box': GroupBox;
41
42
  }
42
43
  }
44
+ declare module 'react' {
45
+ namespace JSX {
46
+ interface IntrinsicElements {
47
+ 'u-group-box': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
48
+ title?: string;
49
+ divider?: boolean;
50
+ flush?: boolean;
51
+ };
52
+ }
53
+ }
54
+ }
43
55
  export {};
@@ -1,4 +1,5 @@
1
1
  import { StyledElement } from '../internals/StyledElement.js';
2
+ import { default as React } from 'react';
2
3
  type ElementParts = 'host' | 'label' | 'value' | 'trend';
3
4
  export type InfoFieldFormat = 'number' | 'currency' | 'date';
4
5
  export type InfoFieldSize = 'default' | 'lg';
@@ -92,4 +93,24 @@ declare global {
92
93
  'u-info-field': InfoField;
93
94
  }
94
95
  }
96
+ declare module 'react' {
97
+ namespace JSX {
98
+ interface IntrinsicElements {
99
+ 'u-info-field': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
100
+ label?: string;
101
+ value?: string;
102
+ blank?: string;
103
+ numeric?: boolean;
104
+ format?: InfoFieldFormat;
105
+ currency?: string;
106
+ size?: InfoFieldSize;
107
+ trend?: InfoFieldTrend;
108
+ /** 프로퍼티는 `trendLabel`이지만 Lit 기본 속성명 규칙(소문자화, kebab
109
+ * 아님)상 실제 HTML 속성명은 `trendlabel`이다. */
110
+ trendlabel?: string;
111
+ tone?: InfoFieldTone;
112
+ };
113
+ }
114
+ }
115
+ }
95
116
  export {};
@@ -1,4 +1,5 @@
1
1
  import { StyledElement } from '../internals/StyledElement.js';
2
+ import { default as React } from 'react';
2
3
  type ElementParts = 'host' | 'grid';
3
4
  /**
4
5
  * 정보 섹션 — `u-info-field` 들의 반응형 그리드.
@@ -28,4 +29,13 @@ declare global {
28
29
  'u-info-section': InfoSection;
29
30
  }
30
31
  }
32
+ declare module 'react' {
33
+ namespace JSX {
34
+ interface IntrinsicElements {
35
+ 'u-info-section': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
36
+ min?: number | string;
37
+ };
38
+ }
39
+ }
40
+ }
31
41
  export {};
@@ -1,5 +1,6 @@
1
1
  import { PropertyValues } from 'lit';
2
2
  import { StyledElement } from '../internals/StyledElement.js';
3
+ import { default as React } from 'react';
3
4
  type ElementParts = 'host' | 'master' | 'divider' | 'detail' | 'detail-close';
4
5
  /**
5
6
  * master›detail 반응형 split-pane 셸.
@@ -67,4 +68,15 @@ declare global {
67
68
  'u-master-detail-layout': MasterDetailLayout;
68
69
  }
69
70
  }
71
+ declare module 'react' {
72
+ namespace JSX {
73
+ interface IntrinsicElements {
74
+ 'u-master-detail-layout': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
75
+ 'master-size'?: string;
76
+ 'overlay-breakpoint'?: number | string;
77
+ locale?: string;
78
+ };
79
+ }
80
+ }
81
+ }
70
82
  export {};
@@ -1,4 +1,5 @@
1
1
  import { StyledElement } from '../internals/StyledElement.js';
2
+ import { default as React } from 'react';
2
3
  type ElementParts = 'host' | 'back' | 'heading' | 'title' | 'subtitle' | 'status' | 'actions';
3
4
  /**
4
5
  * 페이지 헤더 — 모든 LOB 화면 최상단의 같은 골격.
@@ -50,4 +51,17 @@ declare global {
50
51
  'u-page-header': PageHeader;
51
52
  }
52
53
  }
54
+ declare module 'react' {
55
+ namespace JSX {
56
+ interface IntrinsicElements {
57
+ 'u-page-header': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
58
+ title?: string;
59
+ subtitle?: string;
60
+ back?: string;
61
+ 'back-label'?: string;
62
+ locale?: string;
63
+ };
64
+ }
65
+ }
66
+ }
53
67
  export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@iyulab/modern-app",
3
3
  "description": "web-framework by iyulab based on lit-element",
4
- "version": "0.18.8",
4
+ "version": "0.18.10",
5
5
  "keywords": [
6
6
  "iyulab",
7
7
  "web-framework",
@@ -51,6 +51,7 @@
51
51
  }
52
52
  },
53
53
  "scripts": {
54
+ "preversion": "node -e \"if(require('fs').existsSync('../../scripts/preversion-check.mjs'))require('child_process').execFileSync('node',['../../scripts/preversion-check.mjs'],{stdio:'inherit'})\"",
54
55
  "test": "vitest run",
55
56
  "test:watch": "vitest",
56
57
  "start": "vite",