@iyulab/modern-app 0.28.1 β†’ 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,47 @@
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
+
27
+ ## [0.28.2] - 2026-09-27
28
+
29
+ ### Fixed
30
+
31
+ - **Long route screens keep the bottom gutter again.** Since 0.23.0 the `main-content` wrapper was
32
+ fixed to the height of the content area, so a screen taller than that overflowed the wrapper and
33
+ the scroll container dropped its bottom padding: scrolled to the end, the content sat flush on the
34
+ bottom edge. The wrapper now passes the height down *and* grows with the content
35
+ (`display: grid; min-height: 100%` β€” the same rule as `u-outlet`). Screens that fill the area
36
+ (`height: 100%`) are unchanged; with app notices shown, a filling screen gets the height below
37
+ them. If you worked around this with `u-sidebar-layout::part(main-content) { … }`, you can remove it.
38
+ ⚠ Do not set `align-content` on `::part(main-content)` β€” the height hand-down relies on its default.
39
+
40
+ ### Documentation
41
+
42
+ - The layout reference now says that `part="main"` already has a 32px gutter and is the scroll
43
+ container β€” route screens should not add their own outer padding β€” and how to change it.
44
+
3
45
  ## [0.28.1] - 2026-09-24
4
46
 
5
47
  ### Fixed
@@ -207,8 +207,24 @@ var t = e`
207
207
  outline: none;
208
208
  }
209
209
 
210
+ /*
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
+ * ν•œκ³„λ‘œ λ‘”λ‹€(κ³΅μ§€λŠ” λ“œλ¬Όκ³  μž κΉμ΄λ‹€).
225
+ */
210
226
  .main-content {
211
- height: 100%;
227
+ display: contents;
212
228
  }
213
229
 
214
230
  /*
@@ -263,6 +279,11 @@ var t = e`
263
279
  * 경계에 걸리지 μ•Šκ³ , μ˜€λ²„λ ˆμ΄κ°€ μ—΄λ¦° μ±„λ‘œ μΌμ–΄λ‚˜λŠ” 라우트 μ „ν™˜μ„ 계속 λ³΄κ³ ν•œλ‹€.
264
280
  */
265
281
  :host(:state(overlay)) .main-content {
282
+ /* μŒ“μž„ λ§₯락은 μƒμžκ°€ μžˆμ–΄μ•Ό 생긴닀 β€” μ˜€λ²„λ ˆμ΄κ°€ μ—΄λ¦° λ™μ•ˆλ§Œ μƒμžλ₯Ό λ‘”λ‹€(본문은 inert 이고
283
+ μ˜€λ²„λ ˆμ΄ μ•„λž˜μ— μžˆλ‹€). height: 100% 라 μ±„μš°λŠ” 화면은 κ·ΈλŒ€λ‘œμ΄κ³ , 흐름 ν™”λ©΄μ˜ 끝 κ±°ν„°λ§Œ κ·Έλ™μ•ˆ
284
+ λΉ μ§„λ‹€. */
285
+ display: block;
286
+ height: 100%;
266
287
  isolation: isolate;
267
288
  }
268
289
 
@@ -343,9 +364,6 @@ var t = e`
343
364
  padding: 0;
344
365
  overflow: visible;
345
366
  }
346
- .main-content {
347
- height: auto;
348
- }
349
367
  :host(:state(overlay)) .main-content {
350
368
  display: none;
351
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.1",
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` β€” 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 |
@@ -287,6 +287,49 @@ the console. Give that container a height β€” for screen only, so printing is no
287
287
  }
288
288
  ```
289
289
 
290
+ ## Route content area
291
+
292
+ `part="main"` is the **scroll container** for route content, and it already has a **32px gutter**
293
+ (`padding: var(--u-space-3xl, 32px)`) on every side. **Route screens should not add their own outer
294
+ padding** to `:host` β€” the gutters add up (32 + 16 = 48px), and they start to differ from screen
295
+ to screen.
296
+
297
+ To change or remove the gutter, override `main` β€” either through `layout.styles` or the part:
298
+
299
+ ```ts
300
+ layout: { type: 'sidebar', styles: { main: { padding: '0' } } } // full-bleed
301
+ ```
302
+
303
+ ```css
304
+ u-sidebar-layout::part(main) { padding: 24px; }
305
+ ```
306
+
307
+ ⚠ `layout.styles` values are inline styles, so they also apply on print media (see [Printing](#printing));
308
+ use `::part(main)` inside `@media screen` if the change is for the screen only.
309
+
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:
313
+
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 |
319
+
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.
324
+
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.
332
+
290
333
  ## Printing
291
334
 
292
335
  On print media the shell drops its app chrome and lets the content flow across pages: the