@iyulab/modern-app 0.28.2 β†’ 0.29.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,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.29.0] - 2026-09-27
4
+
5
+ ### Fixed
6
+
7
+ - πŸ”΄ **A filling screen with a long table works again β€” do not use 0.28.2.** 0.28.2 made the
8
+ `main-content` wrapper a grid box with `min-height: 100%` to keep the bottom gutter on long
9
+ screens. A grid track is sized from its item's content, and during that sizing a screen's
10
+ `height: 100%` counts as `auto` β€” so a screen that fills the area with a table holding more rows
11
+ than fit (a toolbar plus `flex: 1; min-height: 0`) grew to every row, and the table never
12
+ scrolled. The wrapper now creates no box at all (`display: contents`), and neither does the
13
+ outlet (`@iyulab/router` 0.16.0, now required): route content sits directly in the scroll
14
+ container, which is the only arrangement where filling screens, filling screens with long tables
15
+ and long flowing screens all behave β€” including the bottom gutter 0.28.2 set out to restore.
16
+
17
+ ### Changed
18
+
19
+ - `::part(main-content)` no longer takes box styling (`padding`, `background`, `border`) outside
20
+ the overlay; style `::part(main)` or the screen instead. While the overlay is open it becomes a
21
+ box at the area's height β€” the overlay's stacking boundary β€” as before.
22
+ - With an app notice showing, a screen that fills the area overflows by the notice's height (as in
23
+ 0.28.1). 0.28.2 avoided that only by breaking long tables; the two kinds of screen cannot be told
24
+ apart in CSS.
25
+ - Requires `@iyulab/router` `^0.16.0`, where `<u-outlet>` also has no box.
26
+
3
27
  ## [0.28.2] - 2026-09-27
4
28
 
5
29
  ### Fixed
@@ -206,7 +206,7 @@ var O = class extends i {
206
206
  <div class="main" part="main" scrollable tabindex="-1" @keydown=${this._handleMainKeydown}>
207
207
  <u-progress-bar part="progress"></u-progress-bar>
208
208
 
209
- <div class="main-content ${this.hasNotice ? "has-notice" : ""}" part="main-content" ?inert=${this.hasOverlay}>
209
+ <div class="main-content" part="main-content" ?inert=${this.hasOverlay}>
210
210
  <div class="notices ${this.hasNotice ? "" : "empty"}" part="notices">
211
211
  <slot name="notice" @slotchange=${this.handleNoticeSlotChange}></slot>
212
212
  </div>
@@ -208,29 +208,23 @@ var t = e`
208
208
  }
209
209
 
210
210
  /*
211
- * 라우트 본문을 κ°μ‹ΈλŠ” 래퍼. λ™μ‹œμ— 두 κ°€μ§€μ—¬μ•Ό ν•œλ‹€:
212
- * β‘΄ 높이λ₯Ό Β«λ¬Όλ €μ€€λ‹€Β» β€” μžμ†(아웃렛 β†’ ν™”λ©΄)의 height: 100% κ°€ μ—¬κΈ°μ„œ ν’€λ¦°λ‹€.
213
- * β‘΅ λ„˜μΉ˜λŠ” ν™”λ©΄κ³Ό Β«ν•¨κ»˜ μžλž€λ‹€Β» β€” .main 은 슀크둀 μ˜μ—­μ˜ 끝 padding 을 in-flow
214
- * μžμ‹(= 이 래퍼) 뒀에 λΆ™μ΄λ―€λ‘œ, λž˜νΌκ°€ 화면보닀 μž‘κ²Œ κ³ μ •λ˜λ©΄ 화면이 래퍼 λ°–μœΌλ‘œ
215
- * λ„˜μΉ˜κ³  슀크둀 끝의 μ•„λž˜ κ±°ν„°κ°€ 사라진닀.
216
- * height: 100% λŠ” β‘΄λ§Œ, min-height: 100% 단독은 β‘΅λ§Œ μ€€λ‹€(λ°±λΆ„μœ¨ λ†’μ΄λŠ” λΆ€λͺ¨μ˜ Β«heightΒ»
217
- * κ°€ λͺ…μ‹œλμ„ λ•Œλ§Œ ν’€λ¦°λ‹€ β€” μ΅œμ†Ÿκ°’μ€ κ·Έ 쑰건이 μ•„λ‹ˆλ‹€). grid 만 λ‘˜μ„ ν•¨κ»˜ μ€€λ‹€: κ·Έλ¦¬λ“œ
218
- * ν•­λͺ©μ˜ κΈ°λ³Έ stretch λŠ” λ°±λΆ„μœ¨ 해석이 μ•„λ‹ˆλΌ Β«μ˜μ—­ μ±„μš°κΈ°Β» 라 ⑴이 μ„±λ¦½ν•˜κ³ , νŠΈλž™ 높이가
219
- * auto 라 β‘΅λŒ€λ‘œ μžλž€λ‹€. 아웃렛(:where(u-outlet))이 같은 κ·œμΉ™μ„ μ“΄λ‹€.
220
- * ⚠align-content λ₯Ό μ„ μ–Έν•˜μ§€ 말 것 β€” κ·œμΉ™μ΄ κΈ°λ³Έκ°’ normal(= auto νŠΈλž™ 늘리기)에 κΈ°λŒ„λ‹€.
211
+ * 라우트 본문을 κ°μ‹ΈλŠ” 래퍼 β€” ν‰μ†Œμ—λŠ” Β«μƒμžλ₯Ό λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€Β»(display: contents).
212
+ *
213
+ * 높이가 μ •ν•΄μ§„ 슀크둀 μ»¨ν…Œμ΄λ„ˆ(.main) μ•ˆμ—μ„œ 라우트 화면은 μ„Έ ν˜•νƒœλ‹€: ⑴채움(height: 100%)
214
+ * ②채움-큼(μ±„μš°λ˜ μ•ˆμ˜ ν‘œκ°€ λ·°ν¬νŠΈλ³΄λ‹€ λ§Žμ€ 행을 자기 μ•ˆμ—μ„œ κ΅΄λ¦°λ‹€) ③흐름(κΈΈμ–΄μ§€κ³  .main 이
215
+ * μŠ€ν¬λ‘€ν•œλ‹€). 사이에 μƒμžκ°€ 있으면 μ…‹ 쀑 ν•˜λ‚˜κ°€ λ°˜λ“œμ‹œ κΉ¨μ§„λ‹€(μ‹€μΈ‘):
216
+ * Β· height: 100% β†’ μƒμžκ°€ λͺ» λ°•ν˜€ β‘Άμ˜ 화면이 λ°–μœΌλ‘œ λ„˜μΉ˜κ³ , .main 은 끝 padding 을 in-flow
217
+ * μžμ‹(= 이 래퍼) 뒀에 λΆ™μ΄λ―€λ‘œ 슀크둀 끝의 κ±°ν„°κ°€ 사라진닀.
218
+ * Β· grid + min-height: 100% β†’ ③은 λ˜μ§€λ§Œ νŠΈλž™μ΄ ν•­λͺ©μ˜ λ‚΄μš© 크기둜 작히고 κ·Έ 계산 λ™μ•ˆ
219
+ * height: 100% λŠ” auto 둜 μ·¨κΈ‰λ˜μ–΄, β‘΅μ˜ ν‘œκ°€ λͺ¨λ“  ν–‰ λ†’μ΄λ‘œ μžλž€λ‹€.
220
+ * μƒμžκ°€ μ—†μœΌλ©΄ 화면이 .main 을 직접 λ°›λŠ”λ‹€. 아웃렛(u-outlet)도 같은 이유둜 μƒμžκ°€ μ—†λ‹€.
221
+ *
222
+ * βš κ³΅μ§€(slot="notice")κ°€ 있으면 μ±„μš°λŠ” 화면은 κ·Έ λ†’μ΄λ§ŒνΌ λ„˜μΉœλ‹€ β€” κ³΅μ§€λŠ” λ³Έλ¬Έ μœ„ 흐름 μ•ˆμ—
223
+ * 있고, μ±„μš°λŠ” ν™”λ©΄μ˜ height: 100% λŠ” 곡지λ₯Ό λͺ¨λ₯Έλ‹€. 두 ν˜•νƒœλ₯Ό CSS 둜 κ°€λ₯Ό 수 μ—†μ–΄ μ•Œλ €μ§„
224
+ * ν•œκ³„λ‘œ λ‘”λ‹€(κ³΅μ§€λŠ” λ“œλ¬Όκ³  μž κΉμ΄λ‹€).
221
225
  */
222
226
  .main-content {
223
- display: grid;
224
- min-height: 100%;
225
- }
226
- /*
227
- * 곡지가 있으면 κ·Έ 행은 λ‚΄μš© λ†’μ΄λ‘œ λ¬ΆλŠ”λ‹€. λŠ˜λ¦¬κΈ°λŠ” max 크기가 auto 인 νŠΈλž™μ—λ§Œ
228
- * μ μš©λ˜λ―€λ‘œ max-content 행은 λŠ˜μ–΄λ‚˜μ§€ μ•Šκ³ , λ‚¨λŠ” λ†’μ΄λŠ” λ’€λ”°λ₯΄λŠ” λ³Έλ¬Έ 행이 λ°›λŠ”λ‹€.
229
- * 곡지가 μ—†μœΌλ©΄(.notices κ°€ display: none) 이 κ·œμΉ™λ„ μ—†μ–΄μ•Ό ν•œλ‹€ β€” 있으면 본문의 첫
230
- * μžμ‹μ΄ 이 행에 앉아 μ±„μš°κΈ°λ₯Ό μžƒλŠ”λ‹€.
231
- */
232
- .main-content.has-notice {
233
- grid-template-rows: max-content;
227
+ display: contents;
234
228
  }
235
229
 
236
230
  /*
@@ -285,6 +279,11 @@ var t = e`
285
279
  * 경계에 걸리지 μ•Šκ³ , μ˜€λ²„λ ˆμ΄κ°€ μ—΄λ¦° μ±„λ‘œ μΌμ–΄λ‚˜λŠ” 라우트 μ „ν™˜μ„ 계속 λ³΄κ³ ν•œλ‹€.
286
280
  */
287
281
  :host(:state(overlay)) .main-content {
282
+ /* μŒ“μž„ λ§₯락은 μƒμžκ°€ μžˆμ–΄μ•Ό 생긴닀 β€” μ˜€λ²„λ ˆμ΄κ°€ μ—΄λ¦° λ™μ•ˆλ§Œ μƒμžλ₯Ό λ‘”λ‹€(본문은 inert 이고
283
+ μ˜€λ²„λ ˆμ΄ μ•„λž˜μ— μžˆλ‹€). height: 100% 라 μ±„μš°λŠ” 화면은 κ·ΈλŒ€λ‘œμ΄κ³ , 흐름 ν™”λ©΄μ˜ 끝 κ±°ν„°λ§Œ κ·Έλ™μ•ˆ
284
+ λΉ μ§„λ‹€. */
285
+ display: block;
286
+ height: 100%;
288
287
  isolation: isolate;
289
288
  }
290
289
 
@@ -365,12 +364,6 @@ var t = e`
365
364
  padding: 0;
366
365
  overflow: visible;
367
366
  }
368
- /* μΈμ‡„λŠ” μͺ½ λ‚˜λˆ”μ΄ 흐름을 따라야 ν•˜λ―€λ‘œ grid λ₯Ό ν’€κ³  높이λ₯Ό λ‚΄μš©μ— λ§‘κΈ΄λ‹€
369
- (μ•„μ›ƒλ ›μ˜ 인쇄 κ·œμΉ™κ³Ό 같은 이유 β€” grid μƒμž μ•ˆ 끝 블둝 여백이 μͺ½ 경계λ₯Ό λ„˜λŠ”λ‹€). */
370
- .main-content {
371
- display: block;
372
- min-height: 0;
373
- }
374
367
  :host(:state(overlay)) .main-content {
375
368
  display: none;
376
369
  }
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.28.2",
4
+ "version": "0.29.0",
5
5
  "keywords": [
6
6
  "iyulab",
7
7
  "web-framework",
@@ -59,7 +59,7 @@
59
59
  "test:react-types": "tsc -p tsconfig.react-smoke.json"
60
60
  },
61
61
  "dependencies": {
62
- "@iyulab/router": "^0.15.1",
62
+ "@iyulab/router": "^0.16.0",
63
63
  "i18next": "^26.3.6",
64
64
  "lit": "^3.3.3"
65
65
  },
@@ -260,7 +260,7 @@ Parts available for `styles` overrides on the root layout:
260
260
  | `sidebar-main` | Scrollable main nav area |
261
261
  | `sidebar-footer` | Pinned footer area |
262
262
  | `main` | Main content area (the scroll container) |
263
- | `main-content` | Wrapper holding route content inside `main` β€” passes the height down and grows with long content (see [Route content area](#route-content-area)); the shell puts `inert` here while the overlay is open |
263
+ | `main-content` | Wrapper holding route content inside `main` β€” creates no box, so route content sits directly in `main` (see [Route content area](#route-content-area)); the shell puts `inert` here while the overlay is open, and gives it a box then as the overlay's stacking boundary |
264
264
  | `progress` | Top progress bar |
265
265
  | `overlay` | Route-independent overlay panel above `main` |
266
266
  | `overlay-close` | Overlay's close button |
@@ -307,17 +307,28 @@ u-sidebar-layout::part(main) { padding: 24px; }
307
307
  ⚠ `layout.styles` values are inline styles, so they also apply on print media (see [Printing](#printing));
308
308
  use `::part(main)` inside `@media screen` if the change is for the screen only.
309
309
 
310
- Inside it, `part="main-content"` wraps the route content and does two things at once:
310
+ Inside it, the route content sits **directly** in that scroll container: neither
311
+ `part="main-content"` nor `<u-outlet>` creates a box (`display: contents`). That is what lets all
312
+ three kinds of screen work:
311
313
 
312
- - **passes the height down** β€” a screen that fills the area (`height: 100%`, or a layout such as
313
- `u-master-detail-layout`) resolves against the area minus its gutters;
314
- - **grows with long content** β€” a screen taller than the area scrolls inside `main` and keeps the
315
- bottom gutter at the end of the scroll.
314
+ | Screen | Behaviour |
315
+ |---|---|
316
+ | **Fills the area** β€” `height: 100%`, or a layout such as `u-master-detail-layout` | gets the area minus its gutters |
317
+ | **Fills the area, more content than fits** β€” a toolbar plus a table with `flex: 1; min-height: 0` and more rows than the viewport | stays at the area's height; the table scrolls inside itself |
318
+ | **Flows** β€” a form or document taller than the area | `main` scrolls, and the bottom gutter stays at the end of the scroll |
316
319
 
317
- App notices (`slot="notice"`) sit at the top of this wrapper at their own height; a filling screen
318
- gets the height that remains below them.
320
+ Any box in between breaks one of them β€” a box pinned at `height: 100%` loses the bottom gutter on
321
+ flowing screens, and a grid box with `min-height: 100%` grows a filling screen to every row of its
322
+ table. So `::part(main-content)` accepts no box styling (`padding`, `background`, `border` do
323
+ nothing); style `::part(main)` or the screen instead.
319
324
 
320
- ⚠ Do not set `align-content` on `::part(main-content)` β€” the height hand-down relies on its default.
325
+ ⚠ **App notices push a filling screen down.** Notices (`slot="notice"`) sit at the top of the
326
+ content at their own height, and a screen's `height: 100%` does not know about them, so while a
327
+ notice shows, a filling screen overflows by the notice's height. The two kinds of screen cannot be
328
+ told apart in CSS; notices are rare and short-lived.
329
+
330
+ While the overlay is open, `part="main-content"` becomes a box at the area's height, because a
331
+ stacking context needs one β€” route content is inert and under the overlay then.
321
332
 
322
333
  ## Printing
323
334