@iyulab/modern-app 0.47.0 → 0.48.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.
@@ -7,10 +7,10 @@ var t = e`
7
7
  flex-direction: row;
8
8
  width: 100%;
9
9
  height: 100%;
10
- /* 셸은 뷰포트보다 커지지 않는다 — 부모에 높이가 없으면 height: 100% 가 걸릴 곳이 없어 셸이
11
- 본문 길이로 커지고, 그러면 .main 대신 문서가 스크롤해 사이드바가 본문과 함께 밀려 나간다.
12
- 상한을 두면 본문은 언제나 .main 안에서 스크롤하고 크롬은 제자리에 있다. 부모가 뷰포트보다
13
- 낮은 높이를 주면 그 높이가 그대로 이긴다. */
10
+
11
+
12
+
13
+
14
14
  max-height: 100dvh;
15
15
  font-family: var(--u-font-base);
16
16
  overflow: hidden;
@@ -32,25 +32,25 @@ var t = e`
32
32
  height: 24px;
33
33
  width: auto;
34
34
  object-fit: contain;
35
- /* 호스트 하한(--u-target-size) — 그림은 24px 그대로, 누르는 상자만 여백으로 넓히고 같은 만큼 되돌려 배치는 그대로.
36
- 미설정이면 여백 0(종전). */
35
+
36
+
37
37
  --_logo-pad: max(0px, calc((var(--u-target-size, 0px) - 24px) / 2));
38
38
  box-sizing: content-box;
39
39
  padding: var(--_logo-pad);
40
40
  margin: calc(-1 * var(--_logo-pad));
41
41
  }
42
- /* 로고를 감싼 링크 — 인라인 기준선 여백이 생기지 않게 로고 상자에 딱 맞춘다. */
42
+
43
43
  .logo-link {
44
44
  display: inline-flex;
45
45
  align-items: center;
46
46
  }
47
47
 
48
- /*
49
- * ★단 배정은 «관측값 근사»가 아니라 «용도»로 한다 — 이 자리는 앱의 제목이다.
50
- * 종전 18px 은 스케일에 없는 값이었고, 같은 판정을 이미 u-dialog·u-drawer 제목에
51
- * 내린 적이 있다(L2-3, 18px → subtitle).
52
- * ⚠줄 박스는 바뀌지 않는다: 16 x 1.5 = 24px = 종전 line-height. 헤더 높이 불변.
53
- */
48
+
49
+
50
+
51
+
52
+
53
+
54
54
  .title {
55
55
  flex: 1;
56
56
  color: var(--u-txt-color, #212121);
@@ -63,17 +63,17 @@ var t = e`
63
63
  text-overflow: ellipsis;
64
64
  }
65
65
 
66
- /*
67
- * 토글러의 "테두리·배경 없음"은 마크업의 appearance="plain" 이 낸다.
68
- *
69
- * ★여기에 border/background 를 적는 것으로는 부족했다 — 이 규칙은 <u-button> **호스트**에만
70
- * 닿고, 테두리를 실제로 그리는 것은 그 섀도 루트 안의 <button> 이다(solid 기본값이
71
- * --btn-border-color: var(--btn-color) 로 그린다). 호스트만 재면 0px 이라 보이지도 않았다.
72
- * variant 를 명시해 컴포넌트가 스스로 투명하게 그리도록 한다.
73
- *
74
- * color: inherit 는 유지한다 — 헤더 색을 따라가게 하려는 의도이고 plain 의 기본 전경
75
- * (--u-txt-color)보다 이 레이아웃의 뜻이 앞선다.
76
- */
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
77
  .toggler {
78
78
  color: inherit;
79
79
  font-size: 20px;
@@ -83,7 +83,7 @@ var t = e`
83
83
  color: var(--u-txt-color-hover, #1565C0);
84
84
  }
85
85
 
86
- /* 본문 바로가기 — 포커스될 때만 보인다(보이지 않을 때는 자리도 차지하지 않는다). */
86
+
87
87
  .skip-link {
88
88
  position: absolute;
89
89
  top: 8px;
@@ -112,7 +112,7 @@ var t = e`
112
112
  outline: none;
113
113
  }
114
114
 
115
- /* Sidebar Container */
115
+
116
116
  .sidebar {
117
117
  position: relative;
118
118
  z-index: var(--u-layer-shell, 1000);
@@ -120,22 +120,22 @@ var t = e`
120
120
  flex-direction: column;
121
121
  justify-content: space-between;
122
122
  gap: 8px;
123
- /* 높이는 백분율이 아니라 flex 의 stretch 로 받는다 — 셸의 높이가 «부모의 확정 높이» 가 아니라
124
- max-height 상한에서 나오면 height: 100% 는 풀리지 않아(auto) 사이드바가 메뉴 길이로 커지고,
125
- 셸의 overflow: hidden 이 아래쪽 계정 영역을 잘라 닿을 수 없게 된다. 늘어난 항목의 높이는
126
- 그 경우에도 셸의 (상한으로 잘린) 높이다. .main-region 과 같은 해법이다. 떠 있는 상태
127
- (modal · mobile*)는 절대배치라 top/bottom 으로 채운다. */
123
+
124
+
125
+
126
+
127
+
128
128
  min-height: 0;
129
- /* --u-panel-bg-color 가 아니라 --u-bg-color-raised — 사이드바는 카드·메뉴류의
130
- "떠 있는 패널"이 아니라 상시 크롬이고, 그 구분이 정확히 두 토큰이 갈리는 지점이다
131
- (light.css 293~298행 참조). 미설정 시 페이지(--u-bg-color)와 같은 흰색으로 앉아
132
- 사이드바·페이지·카드 삼중 무구분을 만들던 종전 폴백을 대체한다. */
129
+
130
+
131
+
132
+
133
133
  background: var(--app-sidebar-bg, var(--u-bg-color-raised, #FAFAFA));
134
134
  color: var(--app-sidebar-fg, var(--u-txt-color, #212121));
135
135
  border-right: 1px solid var(--u-border-color, #E0E0E0);
136
136
  transition: all var(--u-duration-slow, 320ms) ease;
137
137
  }
138
- /* Sidebar states */
138
+
139
139
  .sidebar[state="default"] {
140
140
  width: var(--app-sidebar-width, 260px);
141
141
  }
@@ -171,7 +171,7 @@ var t = e`
171
171
  transform: translateY(0);
172
172
  }
173
173
 
174
- /* Mobile Header */
174
+
175
175
  .mobile-header {
176
176
  position: relative;
177
177
  z-index: calc(var(--u-layer-shell, 1000) + 1);
@@ -187,7 +187,7 @@ var t = e`
187
187
  user-select: none;
188
188
  }
189
189
 
190
- /* Sidebar Header */
190
+
191
191
  .sidebar-header {
192
192
  display: flex;
193
193
  flex-direction: row;
@@ -199,10 +199,10 @@ var t = e`
199
199
  user-select: none;
200
200
  }
201
201
 
202
- /* Sidebar Main Menu */
202
+
203
203
  .sidebar-main {
204
204
  flex: 1;
205
- /* 열 방향 flex 항목의 자동 최소 높이는 내용 길이다 — 0 으로 풀어야 남는 높이 안에서 스크롤한다. */
205
+
206
206
  min-height: 0;
207
207
  display: flex;
208
208
  flex-direction: column;
@@ -212,7 +212,7 @@ var t = e`
212
212
  overflow-y: auto;
213
213
  }
214
214
 
215
- /* Sidebar Footer */
215
+
216
216
  .sidebar-footer {
217
217
  display: flex;
218
218
  flex-direction: column;
@@ -224,31 +224,31 @@ var t = e`
224
224
  display: none;
225
225
  }
226
226
 
227
- /* Main Content
228
- * ★기본 패딩을 준다 — 라우트 콘텐츠가 뷰포트/사이드바 경계에 그대로 맞닿아 모든
229
- * 소비자가 같은 배선을 재구현하던 문제였다. 값은 이 라이브러리의 spacing 스케일
230
- * 상단 근처(3xl)에서 골랐다 — LOB 화면의 표준 여백으로 쓰기에 과하지 않은 최대값.
231
- * ⚠«패딩 박스» 기준 절대배치는 이 padding 의 영향을 받지 않는다 — 바로 아래
232
- * u-progress-bar 가 top/left/right:0 으로 여전히 테두리에 꽉 차게 붙는 이유다
233
- * (CSS 2.1 §10.6.4: 절대배치 자손의 containing block 은 가장 가까운 positioned
234
- * 조상의 «패딩 박스»이고, 그 경계는 조상 자신의 padding 값에 밀리지 않는다).
235
- * 풀블리드를 원하는 소비자는 layout.styles.main = { padding: '0' } 로 되돌린다. */
227
+
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
236
  .main-region {
237
237
  position: relative;
238
238
  flex: 1;
239
- /* flex item 의 자동 최소 크기는 콘텐츠 기준(.main 의 min-content)이다 — 이 래퍼는
240
- overflow 가 visible 이라 그 하한이 그대로 살아, flex-shrink 가 있어도 셸 밖으로
241
- 커진다. 그러면 .main 의 overflow: auto 가 한 번도 발동하지 않는다. 주축이 어느 쪽이든
242
- 같은 원인이라 두 축을 함께 푼다:
243
- · 높이 — :host([state="mobile"]) 은 flex-direction: column 이라 min-height 가 필요하다.
244
- 없으면 셸 전체가 콘텐츠 높이만큼 부풀어 오른다.
245
- · 너비 — 데스크톱(row)에서는 min-width 가 필요하다. 없으면 넓은 표 하나가 셸을
246
- 뷰포트 밖으로 밀어 오른쪽 열이 잘리고 가로 스크롤도 생기지 않는다. */
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
247
  min-height: 0;
248
248
  min-width: 0;
249
- /* .main 의 높이를 백분율이 아니라 flex 로 준다 — 셸의 높이가 «부모의 확정 높이» 가 아니라
250
- max-height 상한에서 나올 때 백분율은 풀리지 않는다(auto 로 떨어져 .main 이 본문 길이가 된다).
251
- 늘어난(stretch) 항목의 크기는 그 경우에도 이 래퍼에 정해진다. */
249
+
250
+
251
+
252
252
  display: flex;
253
253
  flex-direction: column;
254
254
  }
@@ -265,37 +265,37 @@ var t = e`
265
265
  outline: none;
266
266
  }
267
267
 
268
- /*
269
- * 라우트 본문을 감싸는 래퍼 — 평소에는 «상자를 만들지 않는다»(display: contents).
270
- *
271
- * 높이가 정해진 스크롤 컨테이너(.main) 안에서 라우트 화면은 세 형태다: ⑴채움(height: 100%)
272
- * ⑵채움-큼(채우되 안의 표가 뷰포트보다 많은 행을 자기 안에서 굴린다) ⑶흐름(길어지고 .main 이
273
- * 스크롤한다). 사이에 상자가 있으면 셋 중 하나가 반드시 깨진다(실측):
274
- * · height: 100% → 상자가 못 박혀 ⑶의 화면이 밖으로 넘치고, .main 은 끝 padding 을 in-flow
275
- * 자식(= 이 래퍼) 뒤에 붙이므로 스크롤 끝의 거터가 사라진다.
276
- * · grid + min-height: 100% → ⑶은 되지만 트랙이 항목의 내용 크기로 잡히고 그 계산 동안
277
- * height: 100% 는 auto 로 취급되어, ⑵의 표가 모든 행 높이로 자란다.
278
- * 상자가 없으면 화면이 .main 을 직접 받는다. 아웃렛(u-outlet)도 같은 이유로 상자가 없다.
279
- *
280
- * ⚠공지(slot="notice")가 있으면 채우는 화면은 그 높이만큼 넘친다 — 공지는 본문 위 흐름 안에
281
- * 있고, 채우는 화면의 height: 100% 는 공지를 모른다. 두 형태를 CSS 로 가를 수 없어 알려진
282
- * 한계로 둔다(공지는 드물고 잠깐이다).
283
- */
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
284
  .main-content {
285
285
  display: contents;
286
286
  }
287
287
 
288
- /*
289
- * 앱 수준 공지 스택 — 한 화면이 아니라 셸에 속한다.
290
- * 본문 맨 위 «흐름 안»에 둔다. 세 대안을 소비자가 먼저 실측해 기각했다:
291
- * · fixed → 본문을 덮는다.
292
- * · 셸 바깥 흐름 → 셸 높이에 더해져 이중 스크롤.
293
- * · .main 안 sticky → 좁은 화면에서 공지 둘이 상시 3할을 점유한다. 배너는
294
- * «막지 않는 것»이 값이라 상시 점유가 그 값을 깎는다.
295
- * .main-content 안에 있으므로 오버레이가 열리면 본문과 함께 inert 가 된다.
296
- * 폭은 스택이 정한다 — 공지(u-alert)는 자기 폭이 fit-content 라 문구 길이대로
297
- * 들쭉날쭉해진다. 배치 컨테이너의 결정이다.
298
- */
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
299
  .notices {
300
300
  display: flex;
301
301
  flex-direction: column;
@@ -310,36 +310,36 @@ var t = e`
310
310
  box-sizing: border-box;
311
311
  }
312
312
 
313
- /*
314
- * 오버레이가 열린 동안 «본문 영역»을 스태킹 컨텍스트로 만든다.
315
- *
316
- * 오버레이 틀은 z-index: 1 이고, 라우트 본문은 그보다 큰 z 를 일상적으로 쓴다 —
317
- * 데이터 그리드의 sticky 머리행·고정 열이 2~4 에 있다. .main 도 .main-region 도
318
- * 스태킹 컨텍스트를 만들지 않으므로 그것들과 오버레이 틀이 «같은 컨텍스트에서 직접
319
- * 겨루고», 본문이 이긴다 — 덮으라고 띄운 패널을 목록이 뚫고 나온다.
320
- *
321
- * ⚠값을 올리는 처방(z-index 를 50 으로)은 소비자의 z 어휘가 커지면 같은 경주를 다시
322
- * 한다. 경계를 세워야 한다.
323
- *
324
- * ⚠경계를 «어디에» 세우는가가 갈린다 — 넷을 픽셀 대조로 실측하고 골랐다:
325
- * · .overlay 자신을 컨텍스트로 → 자기 z 는 여전히 1 이라 바깥에서 3 에게 진다. ✗
326
- * · .main-region 을 컨텍스트로 → 본문과 오버레이를 «같은» 새 컨텍스트에 함께
327
- * 가두므로 그 안에서 순서가 그대로다. ✗
328
- * · .main / .main-content 를 «상시» 컨텍스트로 → 오버레이는 이기지만 본문 안의
329
- * position: fixed 팝오버가 사이드바(z 1000) 위로 못 올라간다(상시 동작 변경).
330
- * .main 쪽은 셸 자신의 진행 막대(z 100)까지 오버레이 아래로 내린다. ✗
331
- * · 이 규칙 — 오버레이가 열린 동안만 .main-content 를 컨텍스트로 → 세 축 모두 유지. ✓
332
- *
333
- * ⇒ 경계가 필요한 조건은 정확히 «오버레이가 열려 있다» 이고, 그때만 세운다. 닫혀 있으면
334
- * 겨룰 상대가 없다(.overlay.empty 는 display: none 이다).
335
- * ⚠ .main 이 아니라 .main-content 인 것도 의도다 — 가두는 대상은 «소비자의 라우트 본문»
336
- * 이지 셸 자신의 chrome 이 아니다. 진행 막대는 .main-content 밖(.main 직속)이라 이
337
- * 경계에 걸리지 않고, 오버레이가 열린 채로 일어나는 라우트 전환을 계속 보고한다.
338
- */
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
339
  :host(:state(overlay)) .main-content {
340
- /* 쌓임 맥락은 상자가 있어야 생긴다 — 오버레이가 열린 동안만 상자를 둔다(본문은 inert 이고
341
- 오버레이 아래에 있다). height: 100% 라 채우는 화면은 그대로이고, 흐름 화면의 끝 거터만 그동안
342
- 빠진다. */
340
+
341
+
342
+
343
343
  display: block;
344
344
  height: 100%;
345
345
  isolation: isolate;
@@ -383,7 +383,7 @@ var t = e`
383
383
  z-index: 2;
384
384
  }
385
385
 
386
- /* Backdrop for modal mode */
386
+
387
387
  .backdrop {
388
388
  position: absolute;
389
389
  z-index: 100;
@@ -394,14 +394,14 @@ var t = e`
394
394
  background: var(--u-overlay-bg-color, rgba(0, 0, 0, 0.5));
395
395
  }
396
396
 
397
- /*
398
- * 인쇄 — 화면의 «뷰포트를 채우는 고정 상자 + 스크롤하는 본문» 모델을 풀어 준다.
399
- * 그대로 두면 사이드바가 종이에 찍히고, 본문이 스크롤 컨테이너라 첫 쪽 높이 밖이 잘린다.
400
- * ★!important 를 쓰지 않는다 — 섀도 안의 important 선언은 바깥 ::part 의 important 보다 이겨
401
- * 소비자가 인쇄물에 크롬을 되살릴 길(::part(sidebar) 재정의)을 막는다. 대가로 config.styles 의
402
- * 인라인 스타일은 이 규칙보다 앞선다(그 자리에 높이·overflow 를 적는 소비자는 드물다).
403
- * ⚠본문 패딩도 푼다 — 종이의 여백은 @page 가 준다. 화면 여백이 그 위에 겹치면 폭을 잃는다.
404
- */
397
+
398
+
399
+
400
+
401
+
402
+
403
+
404
+
405
405
  @media print {
406
406
  :host {
407
407
  display: block;
@@ -415,8 +415,8 @@ var t = e`
415
415
  .main u-progress-bar {
416
416
  display: none;
417
417
  }
418
- /* block 으로 되돌린다 — flex 컨테이너는 자식의 여백 접힘을 막아, 화면 마지막 블록의 아래
419
- 여백이 종이 위에서 셸을 뚫고 접히지 못한다. */
418
+
419
+
420
420
  .main-region {
421
421
  display: block;
422
422
  height: auto;
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.47.0",
4
+ "version": "0.48.0",
5
5
  "keywords": [
6
6
  "iyulab",
7
7
  "web-framework",
@@ -60,7 +60,7 @@
60
60
  "test:react-types": "tsc -p tsconfig.react-smoke.json"
61
61
  },
62
62
  "dependencies": {
63
- "@iyulab/router": "^0.20.0",
63
+ "@iyulab/router": "^0.21.0",
64
64
  "i18next": "^26.3.6",
65
65
  "lit": "^3.3.3"
66
66
  },
@@ -156,7 +156,7 @@ language once, with `Locale.set()` — the primitives and `@iyulab/flex-table` f
156
156
  Register other languages, or your own wording, in the same namespace:
157
157
 
158
158
  ```typescript
159
- import { Locale } from '@iyulab/components';
159
+ import { Locale } from '@iyulab/components/dist/utilities/Locale.js'; // the barrel would register every component
160
160
  import { modernAppLocale } from '@iyulab/modern-app';
161
161
 
162
162
  Locale.set('ko'); // built-in Korean — nothing to register
@@ -170,9 +170,8 @@ modernAppLocale.register('ja', {
170
170
 
171
171
  A partial table is enough — untranslated keys fall back to English, and a registration for a
172
172
  built-in language overrides only the keys it gives. An element's own `locale`
173
- attribute overrides the active language for that element. `registerLocale`/`setDefaultLocale` still
174
- work but are deprecated: a `setDefaultLocale()` call takes precedence over `Locale` until it is
175
- called with `undefined`.
173
+ attribute overrides the active language for that element. The language is chosen in one place —
174
+ `Locale.set()` (the old `registerLocale`/`setDefaultLocale` were removed in 0.48.0).
176
175
 
177
176
  ---
178
177