@iyulab/modern-app 0.19.1 → 0.19.2

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,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.19.2] - 2026-09-13
4
+
5
+ ### Changed
6
+
7
+ - **The development-mode "shell has no sized ancestor" warning now goes through
8
+ `@iyulab/components`' shared `createDevWarner`** instead of an inline copy — same message, same
9
+ `[@iyulab/modern-app]` prefix, once per layout, compiled out of production builds. The
10
+ `@iyulab/components` peer floor moves to `>=1.40.2`, the version that exports the helper.
11
+ - **Docs: `RouteConfig` snippets now show `key` instead of the removed `force`** (`docs/routing.md`,
12
+ `docs/configuration.md`, the skill's `api.md`) — they were still describing the option
13
+ `@iyulab/router` deprecated in 0.12.0 and removed in 0.13.0, and did not yet mention its
14
+ replacement.
15
+
3
16
  ## [0.19.1] - 2026-09-13
4
17
 
5
18
  ### Added
@@ -56,7 +56,7 @@ var t = e`
56
56
  }
57
57
 
58
58
  /*
59
- * ★내비 항목은 «대상의 짧은 이름» = label 단이다(용도 배정 — DL-157-4).
59
+ * ★내비 항목은 «대상의 짧은 이름» = label 단이다(용도 배정).
60
60
  * ⚠행 높이는 바뀌지 않는다: 13 x 1.5 = 19.5px < 아이콘 20px 이라 행을 잡는 것은
61
61
  * 여전히 아이콘이다. 접힌 사이드바(아이콘만)와 펼친 사이드바의 행 높이가 같아야 한다.
62
62
  */
@@ -20,7 +20,7 @@ var t = e`
20
20
  WCAG AA(4.5:1)에 미달한다. 현행 두 값은 6.19:1 · 4.61:1 로 통과한다.
21
21
  ⇒ 역할 층에 AA 를 넘는 보조 텍스트 단이 생기면 그때 옮긴다. */
22
22
  /*
23
- * ★크기·굵기·자간은 스케일의 단으로 옮겼다(용도 배정 — DL-157-4). 위 주석은 **색**에
23
+ * ★크기·굵기·자간은 스케일의 단으로 옮겼다(용도 배정). 위 주석은 **색**에
24
24
  * 대한 것이고 그대로 유효하다: 두 색은 여전히 팔레트를 직접 읽는다.
25
25
  * ⚠ overline 에 대문자 변환을 붙이지 않는다 — 이 줄에 ellipsis 가 있어 잘림이 늘고,
26
26
  * 섹션 이름은 소비자가 쓴 글자다(CJK 에는 효과도 없다).
@@ -26,11 +26,13 @@ export declare class SidebarLayout extends StyledElement<SidebarParts> {
26
26
  protected willUpdate(changedProperties: PropertyValues): void;
27
27
  protected firstUpdated(changedProperties: PropertyValues): void;
28
28
  /**
29
- * 개발 모드 사용 안내(HD-61 ⒝): 이 셸은 `:host { height: 100% }` 로 부모를 채우는데, 부모(커스텀
29
+ * 개발 모드 사용 안내: 이 셸은 `:host { height: 100% }` 로 부모를 채우는데, 부모(커스텀
30
30
  * root)에 높이가 없으면 걸릴 곳이 없어 자기 크롬 높이(실측 약 133px)로 앉는다 — 오류도 경고도 없이
31
31
  * 라우트 콘텐츠 영역이 몇 줄짜리 띠가 된다. 첫 배치 뒤 한 번 재서 알린다.
32
32
  * 임계값은 규칙이라 손으로 쓴다 — 앱 셸이 200px 보다 낮은 것이 의도인 경우는 없다.
33
+ * 경고 자체는 components 의 공유 규약(네임스페이스 · DEV 한정 · 키당 한 번)을 쓴다.
33
34
  */
35
+ private readonly unsizedWarnKey;
34
36
  private warnIfUnsized;
35
37
  render(): typeof nothing | import('lit-html').TemplateResult<1>;
36
38
  /** 사이드바 아이템 렌더링 */
@@ -16,17 +16,20 @@ import "@iyulab/components/dist/components/icon/UIcon.js";
16
16
  import { unsafeHTML as p } from "lit/directives/unsafe-html.js";
17
17
  import { repeat as m } from "lit/directives/repeat.js";
18
18
  import { ifDefined as h } from "lit/directives/if-defined.js";
19
- import { UProgressBar as g } from "@iyulab/components/dist/components/progress-bar/UProgressBar.js";
19
+ import { createDevWarner as g } from "@iyulab/components/dist/utilities/devWarning.js";
20
+ import { UProgressBar as _ } from "@iyulab/components/dist/components/progress-bar/UProgressBar.js";
20
21
  //#region src/layouts/SidebarLayout.ts
21
- function _(e) {
22
+ g("@iyulab/modern-app");
23
+ var v = 0;
24
+ function y(e) {
22
25
  let t = e.tagName;
23
26
  if (t === "INPUT" || t === "TEXTAREA" || t === "SELECT" || e.isContentEditable) return !0;
24
27
  let n = e.getAttribute("role");
25
28
  return n === "textbox" || n === "searchbox" || n === "combobox" || n === "spinbutton";
26
29
  }
27
- var v = class extends i {
30
+ var b = class extends i {
28
31
  constructor(...t) {
29
- super(...t), this.state = "default", this.locale = "", this.context = null, this.isMatchedLink = (e) => !this.context || !e ? !1 : (e = typeof e == "string" ? new URLPattern(e, window.location.origin) : e, e.test(this.context.path, window.location.origin)), this.handleBrandLogoClick = (t) => () => {
32
+ super(...t), this.state = "default", this.locale = "", this.context = null, this.unsizedWarnKey = `unsized:${++v}`, this.isMatchedLink = (e) => !this.context || !e ? !1 : (e = typeof e == "string" ? new URLPattern(e, window.location.origin) : e, e.test(this.context.path, window.location.origin)), this.handleBrandLogoClick = (t) => () => {
30
33
  e.navigate(t ?? "");
31
34
  }, this.handleToggleButtonClick = () => {
32
35
  let t = e.screen ?? "large";
@@ -49,7 +52,7 @@ var v = class extends i {
49
52
  }, 300);
50
53
  }, this._handleMainKeydown = (e) => {
51
54
  let t = e.composedPath()[0];
52
- if (t instanceof HTMLElement && _(t)) return;
55
+ if (t instanceof HTMLElement && y(t)) return;
53
56
  let n = this.shadowRoot?.querySelector(".main");
54
57
  if (!n) return;
55
58
  let r = n.clientHeight;
@@ -249,6 +252,6 @@ var v = class extends i {
249
252
  r([u({
250
253
  type: String,
251
254
  reflect: !0
252
- }), n("design:type", Object)], v.prototype, "state", void 0), r([u({ type: Object }), n("design:type", Object)], v.prototype, "config", void 0), r([u({ type: String }), n("design:type", Object)], v.prototype, "locale", void 0), r([d("u-progress-bar"), n("design:type", g === void 0 ? Object : g)], v.prototype, "progressBarEl", void 0), r([f(), n("design:type", Object)], v.prototype, "context", void 0), v = r([l("u-sidebar-layout")], v);
255
+ }), n("design:type", Object)], b.prototype, "state", void 0), r([u({ type: Object }), n("design:type", Object)], b.prototype, "config", void 0), r([u({ type: String }), n("design:type", Object)], b.prototype, "locale", void 0), r([d("u-progress-bar"), n("design:type", _ === void 0 ? Object : _)], b.prototype, "progressBarEl", void 0), r([f(), n("design:type", Object)], b.prototype, "context", void 0), b = r([l("u-sidebar-layout")], b);
253
256
  //#endregion
254
- export { v as SidebarLayout };
257
+ export { b as SidebarLayout };
@@ -30,7 +30,7 @@ var t = e`
30
30
  }
31
31
 
32
32
  /*
33
- * ★단 배정은 «관측값 근사»가 아니라 «용도»로 한다(DL-157-4) — 이 자리는 앱의 제목이다.
33
+ * ★단 배정은 «관측값 근사»가 아니라 «용도»로 한다 — 이 자리는 앱의 제목이다.
34
34
  * 종전 18px 은 스케일에 없는 값이었고, 같은 판정을 이미 u-dialog·u-drawer 제목에
35
35
  * 내린 적이 있다(L2-3, 18px → subtitle).
36
36
  * ⚠줄 박스는 바뀌지 않는다: 16 x 1.5 = 24px = 종전 line-height. 헤더 높이 불변.
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.19.1",
4
+ "version": "0.19.2",
5
5
  "keywords": [
6
6
  "iyulab",
7
7
  "web-framework",
@@ -65,7 +65,7 @@
65
65
  "lit": "^3.3.3"
66
66
  },
67
67
  "peerDependencies": {
68
- "@iyulab/components": ">=1.27.0",
68
+ "@iyulab/components": ">=1.40.2",
69
69
  "@lit/react": ">=1.0.8",
70
70
  "react": ">=18.0.0"
71
71
  },
@@ -105,8 +105,8 @@ interface RouteConfig {
105
105
  /** Sets `document.title` when the route activates. */
106
106
  title?: string;
107
107
 
108
- /** Force a re-render even if the path did not change. */
109
- force?: boolean;
108
+ /** When to remount content is kept while `key(ctx)` is unchanged. Default `ctx => ctx.href` (leaf) / constant (has `children`). */
109
+ key?: (ctx: RouteContext) => string;
110
110
 
111
111
  /** Case-insensitive path matching. Defaults to `false`. */
112
112
  ignoreCase?: boolean;