@iyulab/modern-app 0.33.1 → 0.33.3

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,25 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.33.3] - 2026-10-05
4
+
5
+ ### Fixed
6
+
7
+ - **The sidebar stays on screen while a long screen scrolls.** The shell is now capped at the
8
+ viewport height (`max-height: 100dvh`), so route content always scrolls inside `part="main"`.
9
+ Before, a shell whose parent gave it no height grew to the length of the route content; the
10
+ document scrolled instead of `part="main"`, and the navigation and the sidebar footer scrolled off
11
+ the top with the content (the mobile header too). A parent that gives the shell a height lower
12
+ than the viewport still sets it.
13
+
14
+ ## [0.33.2] - 2026-10-03
15
+
16
+ ### Changed
17
+
18
+ - **Sidebar transitions follow the motion tokens**, so the sidebar's open/close, group expand and
19
+ hover transitions stop for users who prefer reduced motion (`--u-duration-*` from
20
+ `@iyulab/components` drops to zero under `prefers-reduced-motion: reduce`). The slide-in moves from
21
+ 300ms to the scale's `slow` step (320ms).
22
+
3
23
  ## [0.33.1] - 2026-09-30
4
24
 
5
25
  ### Fixed
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.151.0/helpers/esm/decorate.js
1
+ //#region \0@oxc-project+runtime@0.152.0/helpers/esm/decorate.js
2
2
  function e(e, t, n, r) {
3
3
  var i = arguments.length, a = i < 3 ? t : r === null ? r = Object.getOwnPropertyDescriptor(t, n) : r, o;
4
4
  if (typeof Reflect == "object" && typeof Reflect.decorate == "function") a = Reflect.decorate(e, t, n, r);
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.151.0/helpers/esm/decorateMetadata.js
1
+ //#region \0@oxc-project+runtime@0.152.0/helpers/esm/decorateMetadata.js
2
2
  function e(e, t) {
3
3
  if (typeof Reflect == "object" && typeof Reflect.metadata == "function") return Reflect.metadata(e, t);
4
4
  }
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { slotHasContent as r } from "../internals/slotted.js";
5
5
  import { styles as i } from "./ActionBar.styles.js";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { getLocaleStrings as r } from "../internals/locale.js";
5
5
  import { slotHasContent as i } from "../internals/slotted.js";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { slotHasContent as r } from "../internals/slotted.js";
5
5
  import { styles as i } from "./GroupBox.styles.js";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { styles as r } from "./InfoField.styles.js";
5
5
  import { html as i } from "lit";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { styles as r } from "./InfoSection.styles.js";
5
5
  import { html as i } from "lit";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { getLocaleStrings as r } from "../internals/locale.js";
5
5
  import { slotHasContent as i } from "../internals/slotted.js";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { getLocaleStrings as r } from "../internals/locale.js";
5
5
  import { slotHasContent as i } from "../internals/slotted.js";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { DEFAULT_NAV_ICON as r } from "../internals/nav-icon.js";
5
5
  import { styles as i } from "./SidebarButton.styles.js";
@@ -8,7 +8,7 @@ var t = e`
8
8
  background-color: transparent;
9
9
  border: none;
10
10
  border-radius: 8px;
11
- transition: all 0.2s ease;
11
+ transition: all var(--u-duration-normal, 220ms) ease;
12
12
  cursor: pointer;
13
13
  }
14
14
  :host(:hover) {
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { DEFAULT_NAV_ICON as r } from "../internals/nav-icon.js";
5
5
  import { SidebarLink as i } from "./SidebarLink.js";
@@ -22,7 +22,7 @@ var t = e`
22
22
  background-color: transparent;
23
23
  border: none;
24
24
  border-radius: 8px;
25
- transition: all 0.2s ease;
25
+ transition: all var(--u-duration-normal, 220ms) ease;
26
26
  cursor: pointer;
27
27
  }
28
28
  button[compact] {
@@ -71,7 +71,7 @@ var t = e`
71
71
  .caret {
72
72
  color: inherit;
73
73
  font-size: 16px !important;
74
- transition: transform 0.2s ease;
74
+ transition: transform var(--u-duration-normal, 220ms) ease;
75
75
  }
76
76
  .caret[collapsed] {
77
77
  transform: rotate(-90deg);
@@ -86,7 +86,7 @@ var t = e`
86
86
  border-left: 2px solid var(--u-border-color-weak, #EEEEEE);
87
87
  padding-left: 8px;
88
88
  overflow: hidden;
89
- transition: all 0.3s ease;
89
+ transition: all var(--u-duration-slow, 320ms) ease;
90
90
  }
91
91
  .items[collapsed] {
92
92
  margin-top: 0;
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { getLocaleStrings as r } from "../internals/locale.js";
5
5
  import { DEFAULT_NAV_ICON as i } from "../internals/nav-icon.js";
@@ -12,7 +12,7 @@ var t = e`
12
12
  color: var(--app-sidebar-fg, var(--u-txt-color, #212121));
13
13
  background-color: transparent;
14
14
  border-radius: 8px;
15
- transition: all 0.2s ease;
15
+ transition: all var(--u-duration-normal, 220ms) ease;
16
16
  cursor: pointer;
17
17
  }
18
18
  :host(:hover) {
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { styles as r } from "./SidebarSection.styles.js";
5
5
  import { html as i } from "lit";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
4
  import { getLocaleStrings as r } from "../internals/locale.js";
5
5
  import { styles as i } from "./Wizard.styles.js";
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
3
3
  import { property as n } from "lit/decorators.js";
4
4
  import { UElement as r } from "@iyulab/components/dist/components/UElement.js";
5
5
  //#region src/internals/StyledElement.ts
@@ -1,7 +1,7 @@
1
1
  import { app as e } from "../App.js";
2
2
  import { filterSidebarItems as t } from "./filterSidebarItems.js";
3
- import n from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorateMetadata.js";
4
- import r from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/decorate.js";
3
+ import n from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorateMetadata.js";
4
+ import r from "../_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
5
5
  import { StyledElement as i } from "../internals/StyledElement.js";
6
6
  import { getLocaleStrings as a } from "../internals/locale.js";
7
7
  import { slotHasContent as o } from "../internals/slotted.js";
@@ -7,6 +7,11 @@ var t = e`
7
7
  flex-direction: row;
8
8
  width: 100%;
9
9
  height: 100%;
10
+ /* 셸은 뷰포트보다 커지지 않는다 — 부모에 높이가 없으면 height: 100% 가 걸릴 곳이 없어 셸이
11
+ 본문 길이로 커지고, 그러면 .main 대신 문서가 스크롤해 사이드바가 본문과 함께 밀려 나간다.
12
+ 상한을 두면 본문은 언제나 .main 안에서 스크롤하고 크롬은 제자리에 있다. 부모가 뷰포트보다
13
+ 낮은 높이를 주면 그 높이가 그대로 이긴다. */
14
+ max-height: 100dvh;
10
15
  font-family: var(--u-font-base);
11
16
  overflow: hidden;
12
17
  }
@@ -117,7 +122,7 @@ var t = e`
117
122
  background: var(--app-sidebar-bg, var(--u-bg-color-raised, #FAFAFA));
118
123
  color: var(--app-sidebar-fg, var(--u-txt-color, #212121));
119
124
  border-right: 1px solid var(--u-border-color, #E0E0E0);
120
- transition: all 0.3s ease;
125
+ transition: all var(--u-duration-slow, 320ms) ease;
121
126
  }
122
127
  /* Sidebar states */
123
128
  .sidebar[state="default"] {
@@ -225,11 +230,17 @@ var t = e`
225
230
  뷰포트 밖으로 밀어 오른쪽 열이 잘리고 가로 스크롤도 생기지 않는다. */
226
231
  min-height: 0;
227
232
  min-width: 0;
233
+ /* .main 의 높이를 백분율이 아니라 flex 로 준다 — 셸의 높이가 «부모의 확정 높이» 가 아니라
234
+ max-height 상한에서 나올 때 백분율은 풀리지 않는다(auto 로 떨어져 .main 이 본문 길이가 된다).
235
+ 늘어난(stretch) 항목의 크기는 그 경우에도 이 래퍼에 정해진다. */
236
+ display: flex;
237
+ flex-direction: column;
228
238
  }
229
239
 
230
240
  .main {
231
241
  position: relative;
232
- height: 100%;
242
+ flex: 1 1 auto;
243
+ min-height: 0;
233
244
  padding: var(--u-space-3xl, 32px);
234
245
  background: var(--u-bg-color, #FFFFFF);
235
246
  overflow: auto;
@@ -327,7 +338,7 @@ var t = e`
327
338
  right: 0;
328
339
  opacity: 0;
329
340
  transform: translateY(-4px);
330
- transition: opacity 0.3s ease, transform 0.3s ease;
341
+ transition: opacity var(--u-duration-slow, 320ms) ease, transform var(--u-duration-slow, 320ms) ease;
331
342
  pointer-events: none;
332
343
  }
333
344
  .main u-progress-bar[visible] {
@@ -377,6 +388,7 @@ var t = e`
377
388
  :host {
378
389
  display: block;
379
390
  height: auto;
391
+ max-height: none;
380
392
  overflow: visible;
381
393
  }
382
394
  .sidebar,
@@ -385,7 +397,10 @@ var t = e`
385
397
  .main u-progress-bar {
386
398
  display: none;
387
399
  }
400
+ /* block 으로 되돌린다 — flex 컨테이너는 자식의 여백 접힘을 막아, 화면 마지막 블록의 아래
401
+ 여백이 종이 위에서 셸을 뚫고 접히지 못한다. */
388
402
  .main-region {
403
+ display: block;
389
404
  height: auto;
390
405
  }
391
406
  .main {
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.33.1",
4
+ "version": "0.33.3",
5
5
  "keywords": [
6
6
  "iyulab",
7
7
  "web-framework",
@@ -275,7 +275,10 @@ Parts available for `styles` overrides on the root layout:
275
275
  ## Sizing
276
276
 
277
277
  `<u-sidebar-layout>` is a shell: `:host` is `height: 100%` with `overflow: hidden`, so **its
278
- height comes from the parent** — it never sizes itself. `app.load()` covers the default case: when
278
+ height comes from the parent** — it never sizes itself. It is also capped at `max-height: 100dvh`:
279
+ whatever the parent does, the shell is never taller than the viewport, so the route content always
280
+ scrolls inside `part="main"` and the sidebar (navigation and footer) stays on screen. A parent
281
+ shorter than the viewport still wins. `app.load()` covers the default case: when
279
282
  `root` is `document.body` it gives the body `margin: 0`, and on screen `width: 100vw; height: 100vh`.
280
283
  These come from a document stylesheet at zero specificity, not inline styles — any `body { … }`
281
284
  rule of your own wins.
@@ -283,7 +286,8 @@ rule of your own wins.
283
286
  ⚠ **A custom `root` receives no styling.** Hand it a container with no height of its own and
284
287
  `height: 100%` has nothing to resolve against: the shell renders at whatever its own chrome
285
288
  resolves to (measured: about 133px) instead of filling the screen — with no error and nothing in
286
- the console. Give that container a height — for screen only, so printing is not cut at one page:
289
+ the console. (With a long screen the shell grows to the viewport cap instead, so the
290
+ symptom only shows on short screens.) Give that container a height — for screen only, so printing is not cut at one page:
287
291
 
288
292
  ```css
289
293
  @media screen {