@iyulab/modern-app 0.56.1 → 0.57.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/App.js +1 -2
  3. package/dist/_virtual/{_@oxc-project_runtime@0.154.0 → _@oxc-project_runtime@0.155.0}/helpers/esm/decorate.js +1 -2
  4. package/dist/_virtual/{_@oxc-project_runtime@0.154.0 → _@oxc-project_runtime@0.155.0}/helpers/esm/decorateMetadata.js +1 -2
  5. package/dist/components/ActionBar.js +3 -4
  6. package/dist/components/ActionBar.styles.js +1 -2
  7. package/dist/components/EmptyState.js +3 -4
  8. package/dist/components/EmptyState.styles.js +1 -2
  9. package/dist/components/GroupBox.js +3 -4
  10. package/dist/components/GroupBox.styles.js +1 -2
  11. package/dist/components/InfoField.d.ts +5 -0
  12. package/dist/components/InfoField.js +25 -19
  13. package/dist/components/InfoField.styles.js +20 -2
  14. package/dist/components/InfoSection.js +3 -4
  15. package/dist/components/InfoSection.styles.js +1 -2
  16. package/dist/components/MasterDetailLayout.js +3 -4
  17. package/dist/components/MasterDetailLayout.styles.js +1 -2
  18. package/dist/components/PageHeader.js +3 -4
  19. package/dist/components/PageHeader.styles.js +1 -2
  20. package/dist/components/SidebarButton.js +3 -4
  21. package/dist/components/SidebarButton.styles.js +1 -2
  22. package/dist/components/SidebarGroup.d.ts +9 -0
  23. package/dist/components/SidebarGroup.js +17 -14
  24. package/dist/components/SidebarGroup.styles.js +1 -2
  25. package/dist/components/SidebarLink.d.ts +6 -0
  26. package/dist/components/SidebarLink.js +16 -14
  27. package/dist/components/SidebarLink.styles.js +1 -2
  28. package/dist/components/SidebarSection.js +3 -4
  29. package/dist/components/SidebarSection.styles.js +1 -2
  30. package/dist/components/Timeline.js +2 -3
  31. package/dist/components/Timeline.styles.js +1 -2
  32. package/dist/components/TimelineItem.js +3 -4
  33. package/dist/components/TimelineItem.styles.js +1 -2
  34. package/dist/components/Wizard.js +3 -4
  35. package/dist/components/Wizard.styles.js +1 -2
  36. package/dist/defaultFallback.js +1 -2
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.js +1 -2
  39. package/dist/internals/ScreenObserver.js +1 -2
  40. package/dist/internals/StyledElement.js +3 -4
  41. package/dist/internals/locale.js +1 -2
  42. package/dist/internals/nav-icon.js +1 -2
  43. package/dist/internals/slotted.js +1 -2
  44. package/dist/layouts/SidebarLayout.d.ts +10 -0
  45. package/dist/layouts/SidebarLayout.js +27 -9
  46. package/dist/layouts/SidebarLayout.styles.js +31 -7
  47. package/dist/layouts/SidebarLayout.types.d.ts +16 -2
  48. package/dist/layouts/filterSidebarItems.js +1 -2
  49. package/dist/react.js +1 -2
  50. package/dist/translate.js +0 -1
  51. package/dist/unsaved.js +19 -9
  52. package/package.json +1 -1
  53. package/skills/modern-app/references/components/info-field.md +22 -0
  54. package/skills/modern-app/references/layout.md +5 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.57.0] - 2026-10-23
4
+
5
+ ### Added
6
+
7
+ - **Sidebar `subtitle`** — one line under the app title (what the app is), in the expanded sidebar header. It hides with
8
+ the title when the sidebar is slim; the mobile header keeps one line.
9
+ - **`u-info-field` `visual` slot** — a small picture at the end of the value line (a trend sparkline, a progress ring),
10
+ for KPI tiles. The field gives it a place and draws nothing itself; an empty slot takes no room.
11
+ - **Logo from a registered icon library** — `logo: { icon, lib }`, the same pair the menu items take. A string logo
12
+ could only be found at `u-icon`'s default path. `SidebarLogoIcon` is exported.
13
+
14
+ ### Changed
15
+
16
+ - **The sidebar group holding the current screen opens.** A group whose link matches the current address expands when
17
+ it becomes current and folds again when the current screen moves elsewhere — a group the user opened or folded by
18
+ hand stays as they left it. The group header now states its state with `aria-expanded`.
19
+ - Links inside a sidebar group draw no icon unless one is given. The default icon keeps a link visible when the sidebar
20
+ is slim, and inside a group the group's own icon does that.
21
+
22
+ ### Fixed
23
+
24
+ - The sidebar header is no taller than its content: the collapse button's icon is 20px, but the size was set on the
25
+ button, so its em-based height and padding grew with it (the header was 85px tall). The header's vertical padding is
26
+ also 12px instead of 16px, and the mobile header matches it.
27
+ - The open mobile panel starts below the mobile header. It used to start at the top of the screen and rely on its own
28
+ header, hidden under the mobile header, being the same height — when the two differed, the first menu item slid
29
+ under the mobile header, and the hidden header's toggle still took keyboard focus. The panel no longer draws that
30
+ duplicate header, and a popover opened inside the panel no longer flips up under the mobile header.
31
+
32
+ ## [0.56.2] - 2026-10-17
33
+
34
+ ### Fixed
35
+
36
+ - The unsaved-changes guard still asks when its dialog cannot load — a deployment replaced the hashed chunk while a tab
37
+ with an edited form stayed open, or the network is gone. The import failure reached the router as «the guard threw»,
38
+ so the screen stayed and every navigation was silently blocked; it now asks the same question with `window.confirm`
39
+ (and warns). The dialog module also loads when the first screen registers a check, not at the moment of asking.
40
+
3
41
  ## [0.56.1] - 2026-10-17
4
42
 
5
43
  ### Fixed
package/dist/App.js CHANGED
@@ -7,7 +7,7 @@ import { setDefaultBaseUrl as a } from "@iyulab/components/dist/utilities/icons.
7
7
  import { Theme as o } from "@iyulab/components/dist/utilities/Theme.js";
8
8
  import { Toast as s } from "@iyulab/components/dist/utilities/Toast.js";
9
9
  import { Locale as c } from "@iyulab/components/dist/utilities/Locale.js";
10
- //#region src/App.ts
10
+ // src/App.ts
11
11
  var l = "\n:where(body) { margin: 0; }\n@media screen {\n :where(body) { width: 100vw; height: 100vh; }\n}\n", u;
12
12
  function d() {
13
13
  if (!u) {
@@ -148,5 +148,4 @@ var f = class l {
148
148
  return e.appendChild(n), "updateComplete" in n && await n.updateComplete, n;
149
149
  }
150
150
  }.instance;
151
- //#endregion
152
151
  export { f as app };
@@ -1,9 +1,8 @@
1
- //#region \0@oxc-project+runtime@0.154.0/helpers/esm/decorate.js
1
+ // \0@oxc-project+runtime@0.155.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);
5
5
  else for (var s = e.length - 1; s >= 0; s--) (o = e[s]) && (a = (i < 3 ? o(a) : i > 3 ? o(t, n, a) : o(t, n)) || a);
6
6
  return i > 3 && a && Object.defineProperty(t, n, a), a;
7
7
  }
8
- //#endregion
9
8
  export { e as default };
@@ -1,6 +1,5 @@
1
- //#region \0@oxc-project+runtime@0.154.0/helpers/esm/decorateMetadata.js
1
+ // \0@oxc-project+runtime@0.155.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
  }
5
- //#endregion
6
5
  export { e as default };
@@ -1,11 +1,11 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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";
6
6
  import { html as a } from "lit";
7
7
  import { customElement as o, property as s, state as c } from "lit/decorators.js";
8
- //#region src/components/ActionBar.ts
8
+ // src/components/ActionBar.ts
9
9
  var l = class extends n {
10
10
  constructor(...e) {
11
11
  super(...e), this.sticky = !1, this.hasDanger = !1, this.hasSummary = !1;
@@ -33,5 +33,4 @@ t([s({
33
33
  type: Boolean,
34
34
  reflect: !0
35
35
  }), e("design:type", Object)], l.prototype, "sticky", void 0), t([c(), e("design:type", Object)], l.prototype, "hasDanger", void 0), t([c(), e("design:type", Object)], l.prototype, "hasSummary", void 0), l = t([o("u-action-bar")], l);
36
- //#endregion
37
36
  export { l as ActionBar };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/ActionBar.styles.ts
2
+ // src/components/ActionBar.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: flex;
@@ -71,5 +71,4 @@ var t = e`
71
71
  padding: var(--u-space-md, 12px) var(--action-bar-padding-inline, 0);
72
72
  }
73
73
  `;
74
- //#endregion
75
74
  export { t as styles };
@@ -1,12 +1,12 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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 { getLocaleStrings as i } from "../internals/locale.js";
6
6
  import { styles as a } from "./EmptyState.styles.js";
7
7
  import { html as o, nothing as s } from "lit";
8
8
  import { customElement as c, property as l, state as u } from "lit/decorators.js";
9
- //#region src/components/EmptyState.ts
9
+ // src/components/EmptyState.ts
10
10
  var d = class extends n {
11
11
  constructor(...e) {
12
12
  super(...e), this.variant = "no-data", this.title = "", this.description = "", this.locale = "", this.hasActions = !1;
@@ -68,5 +68,4 @@ t([l({
68
68
  type: String,
69
69
  reflect: !0
70
70
  }), e("design:type", Object)], d.prototype, "variant", void 0), t([l({ type: String }), e("design:type", Object)], d.prototype, "title", void 0), t([l({ type: String }), e("design:type", Object)], d.prototype, "description", void 0), t([l({ type: String }), e("design:type", Object)], d.prototype, "locale", void 0), t([u(), e("design:type", Object)], d.prototype, "hasActions", void 0), d = t([c("u-empty-state")], d);
71
- //#endregion
72
71
  export { d as EmptyState };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/EmptyState.styles.ts
2
+ // src/components/EmptyState.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: flex;
@@ -54,5 +54,4 @@ var t = e`
54
54
  display: none;
55
55
  }
56
56
  `;
57
- //#endregion
58
57
  export { t as styles };
@@ -1,12 +1,12 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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";
6
6
  import { html as a, nothing as o } from "lit";
7
7
  import { customElement as s, property as c, state as l } from "lit/decorators.js";
8
8
  import { html as u, literal as d } from "lit/static-html.js";
9
- //#region src/components/GroupBox.ts
9
+ // src/components/GroupBox.ts
10
10
  var f, p = {
11
11
  2: d`h2`,
12
12
  3: d`h3`,
@@ -52,5 +52,4 @@ t([c({ type: String }), e("design:type", Object)], m.prototype, "title", void 0)
52
52
  type: Number,
53
53
  reflect: !0
54
54
  }), e("design:type", Object)], m.prototype, "level", void 0), t([l(), e("design:type", Object)], m.prototype, "hasActions", void 0), m = f = t([s("u-group-box")], m);
55
- //#endregion
56
55
  export { m as GroupBox };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/GroupBox.styles.ts
2
+ // src/components/GroupBox.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: block;
@@ -123,5 +123,4 @@ var t = e`
123
123
  padding-top: var(--u-space-md, 12px);
124
124
  }
125
125
  `;
126
- //#endregion
127
126
  export { t as styles };
@@ -29,10 +29,13 @@ export declare function isBlank(v: unknown): boolean;
29
29
  *
30
30
  * @slot - 값(문자열 `value` 대신 — 슬롯이 이긴다)
31
31
  * @slot trend-icon - 추세 줄 앞의 상태 표시(예: 주의 아이콘). 추세 줄이 있을 때(`trend` · `trendLabel`) 그린다.
32
+ * @slot visual - 값과 같은 줄 끝의 작은 그림(추세 미니 차트 · 진행 고리 등). 값을 대신하지 않는다 — 장식이면 `aria-hidden="true"`,
33
+ * 그 자체로 정보면 자기 이름(`role="img"` + `aria-label`)을 준다. 비면 자리를 차지하지 않는다.
32
34
  * @csspart label - 라벨
33
35
  * @csspart value - 값
34
36
  * @csspart unit - 단위
35
37
  * @csspart trend - 추세 줄
38
+ * @csspart visual - `visual` 슬롯을 담는 상자
36
39
  * @csspart description - 값 아래 보조 줄(값이 비고 `blankReason` 이 있으면 그 사유)
37
40
  * @cssprop --info-field-xl-size - `size="xl"` 값의 글자 크기(기본 `--u-text-display-size`)
38
41
  */
@@ -137,6 +140,8 @@ export declare class InfoField extends StyledElement<ElementParts> {
137
140
  */
138
141
  private nameSlottedWidgets;
139
142
  protected updated(changed: PropertyValues): void;
143
+ /** `visual` 슬롯에 든 것이 있는가 — 비면 그 상자를 그리지 않는다(값 옆에 빈 간격을 남기지 않게). */
144
+ private hasVisual;
140
145
  private get hasSlotted();
141
146
  private formatValue;
142
147
  render(): import('lit-html').TemplateResult<1>;
@@ -1,20 +1,20 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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";
6
- import { customElement as a, property as o } from "lit/decorators.js";
7
- import { formatCurrency as s, formatDate as c, formatNumber as l } from "@iyulab/components/dist/utilities/format.js";
8
- //#region src/components/InfoField.ts
9
- function u(e) {
6
+ import { customElement as a, property as o, state as s } from "lit/decorators.js";
7
+ import { formatCurrency as c, formatDate as l, formatNumber as u } from "@iyulab/components/dist/utilities/format.js";
8
+ // src/components/InfoField.ts
9
+ function d(e) {
10
10
  return e === "up" ? "positive" : e === "down" ? "negative" : "neutral";
11
11
  }
12
- function d(e) {
12
+ function f(e) {
13
13
  return e == null || typeof e == "string" && e.trim() === "";
14
14
  }
15
- var f = class extends n {
15
+ var p = class extends n {
16
16
  constructor(...e) {
17
- super(...e), this.label = "", this.blank = "—", this.numeric = !1, this.size = "default", this.appearance = "plain", this.namedWidgets = /* @__PURE__ */ new WeakMap();
17
+ super(...e), this.label = "", this.blank = "—", this.numeric = !1, this.size = "default", this.appearance = "plain", this.namedWidgets = /* @__PURE__ */ new WeakMap(), this.hasVisual = !1;
18
18
  }
19
19
  static {
20
20
  this.styles = [super.styles, r];
@@ -36,13 +36,20 @@ var f = class extends n {
36
36
  return [...this.childNodes].some((e) => e.nodeType === Node.ELEMENT_NODE ? !e.hasAttribute("slot") : e.nodeType === Node.TEXT_NODE && (e.textContent ?? "").trim() !== "");
37
37
  }
38
38
  formatValue() {
39
- return this.format === "currency" ? this.currency ? s(Number(this.value), this.currency) : l(Number(this.value)) : this.format === "number" ? l(Number(this.value)) : this.format === "date" ? c(this.value) : String(this.value);
39
+ return this.format === "currency" ? this.currency ? c(Number(this.value), this.currency) : u(Number(this.value)) : this.format === "number" ? u(Number(this.value)) : this.format === "date" ? l(this.value) : String(this.value);
40
40
  }
41
41
  render() {
42
- let e = !this.hasSlotted && d(this.value), t = e && this.blankReason ? this.blankReason : void 0, n = this.numeric || this.format === "number" || this.format === "currency", r = this.trend !== void 0 || this.trendLabel !== void 0, a = this.tone ?? u(this.trend), o = this.trend === "up" ? "▲" : this.trend === "down" ? "▼" : "", s = !e && this.unit ? i`<span class="unit" part="unit">${this.unit}</span>` : "";
42
+ let e = !this.hasSlotted && f(this.value), t = e && this.blankReason ? this.blankReason : void 0, n = this.numeric || this.format === "number" || this.format === "currency", r = this.trend !== void 0 || this.trendLabel !== void 0, a = this.tone ?? d(this.trend), o = this.trend === "up" ? "▲" : this.trend === "down" ? "▼" : "", s = !e && this.unit ? i`<span class="unit" part="unit">${this.unit}</span>` : "";
43
43
  return i`
44
44
  <div class="label" part="label">${this.label}</div>
45
- <div class="value ${n ? "numeric" : ""} ${e ? "blank" : ""} ${t ? "reasoned" : ""} tone-${a}" part="value">${this.hasSlotted ? i`<slot @slotchange=${() => void this.nameSlottedWidgets()}></slot>` : e ? this.blank : this.formatValue()}${s}</div>
45
+ <div class="value-row">
46
+ <div class="value ${n ? "numeric" : ""} ${e ? "blank" : ""} ${t ? "reasoned" : ""} tone-${a}" part="value">${this.hasSlotted ? i`<slot @slotchange=${() => void this.nameSlottedWidgets()}></slot>` : e ? this.blank : this.formatValue()}${s}</div>
47
+ <div class="visual" part="visual" ?hidden=${!this.hasVisual}>
48
+ <slot name="visual" @slotchange=${(e) => {
49
+ this.hasVisual = e.target.assignedElements().length > 0;
50
+ }}></slot>
51
+ </div>
52
+ </div>
46
53
  ${r ? i`
47
54
  <div class="trend tone-${a}" part="trend">
48
55
  <slot name="trend-icon"></slot>${o ? i`<span aria-hidden="true">${o}</span> ` : ""}${this.trendLabel ?? ""}
@@ -52,18 +59,17 @@ var f = class extends n {
52
59
  `;
53
60
  }
54
61
  };
55
- t([o({ type: String }), e("design:type", Object)], f.prototype, "label", void 0), t([o({ type: String }), e("design:type", Object)], f.prototype, "value", void 0), t([o({ type: String }), e("design:type", Object)], f.prototype, "blank", void 0), t([o({ type: Boolean }), e("design:type", Object)], f.prototype, "numeric", void 0), t([o({ type: String }), e("design:type", Object)], f.prototype, "format", void 0), t([o({ type: String }), e("design:type", String)], f.prototype, "currency", void 0), t([o({ type: String }), e("design:type", String)], f.prototype, "unit", void 0), t([o({
62
+ t([o({ type: String }), e("design:type", Object)], p.prototype, "label", void 0), t([o({ type: String }), e("design:type", Object)], p.prototype, "value", void 0), t([o({ type: String }), e("design:type", Object)], p.prototype, "blank", void 0), t([o({ type: Boolean }), e("design:type", Object)], p.prototype, "numeric", void 0), t([o({ type: String }), e("design:type", Object)], p.prototype, "format", void 0), t([o({ type: String }), e("design:type", String)], p.prototype, "currency", void 0), t([o({ type: String }), e("design:type", String)], p.prototype, "unit", void 0), t([o({
56
63
  type: String,
57
64
  reflect: !0
58
- }), e("design:type", Object)], f.prototype, "size", void 0), t([o({ type: String }), e("design:type", Object)], f.prototype, "trend", void 0), t([o({ type: String }), e("design:type", String)], f.prototype, "trendLabel", void 0), t([o({
65
+ }), e("design:type", Object)], p.prototype, "size", void 0), t([o({ type: String }), e("design:type", Object)], p.prototype, "trend", void 0), t([o({ type: String }), e("design:type", String)], p.prototype, "trendLabel", void 0), t([o({
59
66
  type: String,
60
67
  reflect: !0
61
- }), e("design:type", Object)], f.prototype, "tone", void 0), t([o({
68
+ }), e("design:type", Object)], p.prototype, "tone", void 0), t([o({
62
69
  type: String,
63
70
  reflect: !0
64
- }), e("design:type", Object)], f.prototype, "appearance", void 0), t([o({
71
+ }), e("design:type", Object)], p.prototype, "appearance", void 0), t([o({
65
72
  type: String,
66
73
  attribute: "blank-reason"
67
- }), e("design:type", String)], f.prototype, "blankReason", void 0), t([o({ type: String }), e("design:type", String)], f.prototype, "description", void 0), f = t([a("u-info-field")], f);
68
- //#endregion
69
- export { f as InfoField, d as isBlank };
74
+ }), e("design:type", String)], p.prototype, "blankReason", void 0), t([o({ type: String }), e("design:type", String)], p.prototype, "description", void 0), t([s(), e("design:type", Object)], p.prototype, "hasVisual", void 0), p = t([a("u-info-field")], p);
75
+ export { p as InfoField, f as isBlank };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/InfoField.styles.ts
2
+ // src/components/InfoField.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: block;
@@ -14,7 +14,26 @@ var t = e`
14
14
  margin-bottom: var(--u-space-3xs, 2px);
15
15
  }
16
16
 
17
+
18
+ .value-row {
19
+ display: flex;
20
+ align-items: flex-end;
21
+ justify-content: space-between;
22
+ gap: var(--u-space-sm, 8px);
23
+ min-width: 0;
24
+ }
25
+ .visual {
26
+ flex: none;
27
+ display: flex;
28
+ align-items: flex-end;
29
+ }
30
+ .visual[hidden] {
31
+ display: none;
32
+ }
33
+
17
34
  .value {
35
+ flex: 1 1 auto;
36
+ min-width: 0;
18
37
  font-size: var(--u-text-body-size, 14px);
19
38
  font-weight: var(--u-text-label-weight, 600);
20
39
  line-height: var(--u-text-body-leading, 1.6);
@@ -156,5 +175,4 @@ var t = e`
156
175
  color: var(--u-txt-color-weak, #616161);
157
176
  }
158
177
  `;
159
- //#endregion
160
178
  export { t as styles };
@@ -1,10 +1,10 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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";
6
6
  import { customElement as a, property as o } from "lit/decorators.js";
7
- //#region src/components/InfoSection.ts
7
+ // src/components/InfoSection.ts
8
8
  var s = class extends n {
9
9
  constructor(...e) {
10
10
  super(...e), this.min = 160, this.layout = "grid";
@@ -22,5 +22,4 @@ t([o({ type: Number }), e("design:type", Object)], s.prototype, "min", void 0),
22
22
  type: String,
23
23
  reflect: !0
24
24
  }), e("design:type", Object)], s.prototype, "layout", void 0), s = t([a("u-info-section")], s);
25
- //#endregion
26
25
  export { s as InfoSection };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/InfoSection.styles.ts
2
+ // src/components/InfoSection.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: block;
@@ -32,5 +32,4 @@ var t = e`
32
32
  background: var(--u-bg-color, #FFFFFF);
33
33
  }
34
34
  `;
35
- //#endregion
36
35
  export { t as styles };
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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 { getLocaleStrings as i } from "../internals/locale.js";
@@ -8,7 +8,7 @@ import { html as o } from "lit";
8
8
  import { customElement as s, property as c, state as l } from "lit/decorators.js";
9
9
  import "@iyulab/components/dist/components/icon/UIcon.js";
10
10
  import "@iyulab/components/dist/components/button/UButton.js";
11
- //#region src/components/MasterDetailLayout.ts
11
+ // src/components/MasterDetailLayout.ts
12
12
  var u = class extends n {
13
13
  constructor(...e) {
14
14
  super(...e), this.masterSize = "22rem", this.overlayBreakpoint = 760, this.locale = "", this.hasDetail = !1, this.hasPlaceholder = !1, this.internals = typeof this.attachInternals == "function" ? this.attachInternals() : void 0, this.scroller = null, this.detailFrame = 0, this.scheduleDetailMax = () => {
@@ -81,5 +81,4 @@ function d(e) {
81
81
  if (/(auto|scroll|hidden|overlay)/.test(getComputedStyle(t).overflowY)) return t;
82
82
  }
83
83
  }
84
- //#endregion
85
84
  export { u as MasterDetailLayout };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/MasterDetailLayout.styles.ts
2
+ // src/components/MasterDetailLayout.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: flex;
@@ -165,5 +165,4 @@ var t = e`
165
165
  }
166
166
  }
167
167
  `;
168
- //#endregion
169
168
  export { t as styles };
@@ -1,12 +1,12 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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 { getLocaleStrings as i } from "../internals/locale.js";
6
6
  import { styles as a } from "./PageHeader.styles.js";
7
7
  import { html as o, nothing as s } from "lit";
8
8
  import { customElement as c, property as l, state as u } from "lit/decorators.js";
9
- //#region src/components/PageHeader.ts
9
+ // src/components/PageHeader.ts
10
10
  var d = class extends n {
11
11
  constructor(...e) {
12
12
  super(...e), this.title = "", this.backLabel = "", this.locale = "", this.hasEyebrow = !1, this.hasStatus = !1, this.hasActions = !1;
@@ -45,5 +45,4 @@ t([l({ type: String }), e("design:type", Object)], d.prototype, "title", void 0)
45
45
  type: String,
46
46
  attribute: "back-label"
47
47
  }), e("design:type", Object)], d.prototype, "backLabel", void 0), t([l({ type: String }), e("design:type", Object)], d.prototype, "locale", void 0), t([u(), e("design:type", Object)], d.prototype, "hasEyebrow", void 0), t([u(), e("design:type", Object)], d.prototype, "hasStatus", void 0), t([u(), e("design:type", Object)], d.prototype, "hasActions", void 0), d = t([c("u-page-header")], d);
48
- //#endregion
49
48
  export { d as PageHeader };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/PageHeader.styles.ts
2
+ // src/components/PageHeader.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: flex;
@@ -111,5 +111,4 @@ var t = e`
111
111
  display: none;
112
112
  }
113
113
  `;
114
- //#endregion
115
114
  export { t as styles };
@@ -1,5 +1,5 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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 @@ import { customElement as o, property as s } from "lit/decorators.js";
8
8
  import "@iyulab/components/dist/components/icon/UIcon.js";
9
9
  import { ifDefined as c } from "lit/directives/if-defined.js";
10
10
  import "@iyulab/components/dist/components/avatar/UAvatar.js";
11
- //#region src/components/SidebarButton.ts
11
+ // src/components/SidebarButton.ts
12
12
  var l = class extends n {
13
13
  constructor(...e) {
14
14
  super(...e), this.compact = !1, this.expanded = !1;
@@ -44,5 +44,4 @@ t([s({
44
44
  type: Boolean,
45
45
  reflect: !0
46
46
  }), e("design:type", Boolean)], l.prototype, "pressed", void 0), t([s({ type: String }), e("design:type", Object)], l.prototype, "label", void 0), t([s({ type: String }), e("design:type", String)], l.prototype, "haspopup", void 0), t([s({ type: Boolean }), e("design:type", Object)], l.prototype, "expanded", void 0), t([s({ type: Object }), e("design:type", Object)], l.prototype, "avatar", void 0), t([s({ type: String }), e("design:type", Object)], l.prototype, "description", void 0), l = t([o("u-sidebar-button")], l);
47
- //#endregion
48
47
  export { l as SidebarButton };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/SidebarButton.styles.ts
2
+ // src/components/SidebarButton.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: block;
@@ -105,5 +105,4 @@ var t = e`
105
105
  border: 0;
106
106
  }
107
107
  `;
108
- //#endregion
109
108
  export { t as styles };
@@ -1,3 +1,4 @@
1
+ import { PropertyValues } from 'lit';
1
2
  import { DirectiveResult } from 'lit/directive.js';
2
3
  import { StyledElement, StyleMap } from '../internals/StyledElement.js';
3
4
  import { SidebarLinkConfig } from './SidebarLink.js';
@@ -31,6 +32,14 @@ export declare class SidebarGroup extends StyledElement<ElementParts> {
31
32
  lib?: string;
32
33
  /** 네비게이션 아이템 데이터 */
33
34
  label?: string | DirectiveResult;
35
+ /** 현재 화면 때문에 스스로 펼친 상태인가 — 사용자가 머리를 누르면 그 뒤로는 사용자의 상태다. */
36
+ private openedForCurrent;
37
+ /**
38
+ * 현재 화면을 품은 묶음은 펼친다 — 접힌 채면 «지금 어디인가» 가 메뉴에 보이지 않는다.
39
+ * 그렇게 스스로 연 묶음은 현재 화면이 떠나면 다시 접는다(옮겨 다닐수록 메뉴가 길어지지 않게).
40
+ * 사용자가 연 묶음 · 사용자가 다시 접은 묶음은 건드리지 않는다.
41
+ */
42
+ protected willUpdate(changed: PropertyValues<this>): void;
34
43
  render(): import('lit-html').TemplateResult<1>;
35
44
  /** 버튼 클릭 핸들러 */
36
45
  private handleButtonClick;
@@ -1,27 +1,31 @@
1
- import e from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorateMetadata.js";
2
- import t from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/decorate.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.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";
6
6
  import { styles as a } from "./SidebarGroup.styles.js";
7
- import { html as o } from "lit";
8
- import { customElement as s, property as c } from "lit/decorators.js";
7
+ import { html as o, nothing as s } from "lit";
8
+ import { customElement as c, property as l } from "lit/decorators.js";
9
9
  import "@iyulab/components/dist/components/icon/UIcon.js";
10
- //#region src/components/SidebarGroup.ts
11
- var l = class extends n {
10
+ // src/components/SidebarGroup.ts
11
+ var u = class extends n {
12
12
  constructor(...e) {
13
- super(...e), this.compact = !1, this.selected = !1, this.collapsed = !0, this.handleButtonClick = (e) => {
14
- this.compact ? ((this.shadowRoot?.querySelector("slot")?.assignedElements({ flatten: !0 }).find((e) => e instanceof i))?.renderRoot.querySelector("u-link"))?.click() : this.collapsed = !this.collapsed;
13
+ super(...e), this.compact = !1, this.selected = !1, this.collapsed = !0, this.openedForCurrent = !1, this.handleButtonClick = (e) => {
14
+ this.compact ? ((this.shadowRoot?.querySelector("slot")?.assignedElements({ flatten: !0 }).find((e) => e instanceof i))?.renderRoot.querySelector("u-link"))?.click() : (this.collapsed = !this.collapsed, this.openedForCurrent = !1);
15
15
  };
16
16
  }
17
17
  static {
18
18
  this.styles = [super.styles, a];
19
19
  }
20
+ willUpdate(e) {
21
+ e.has("selected") && (this.selected && this.collapsed ? (this.collapsed = !1, this.openedForCurrent = !0) : !this.selected && this.openedForCurrent && (this.collapsed = !0, this.openedForCurrent = !1));
22
+ }
20
23
  render() {
21
24
  return o`
22
25
  <button part="header"
23
26
  ?compact=${this.compact}
24
27
  ?selected=${this.selected}
28
+ aria-expanded=${this.compact ? s : String(!this.collapsed)}
25
29
  @click=${this.handleButtonClick}>
26
30
  <!--
27
31
  ⚠ ?hidden 을 걸지 않는다. 접힌 상태에서는 라벨과 캐럿이 모두 숨으므로,
@@ -51,15 +55,14 @@ var l = class extends n {
51
55
  `;
52
56
  }
53
57
  };
54
- t([c({
58
+ t([l({
55
59
  type: Boolean,
56
60
  reflect: !0
57
- }), e("design:type", Boolean)], l.prototype, "compact", void 0), t([c({
61
+ }), e("design:type", Boolean)], u.prototype, "compact", void 0), t([l({
58
62
  type: Boolean,
59
63
  reflect: !0
60
- }), e("design:type", Boolean)], l.prototype, "selected", void 0), t([c({
64
+ }), e("design:type", Boolean)], u.prototype, "selected", void 0), t([l({
61
65
  type: Boolean,
62
66
  reflect: !0
63
- }), e("design:type", Boolean)], l.prototype, "collapsed", void 0), t([c({ type: String }), e("design:type", String)], l.prototype, "icon", void 0), t([c({ type: String }), e("design:type", String)], l.prototype, "lib", void 0), t([c({ type: String }), e("design:type", Object)], l.prototype, "label", void 0), l = t([s("u-sidebar-group")], l);
64
- //#endregion
65
- export { l as SidebarGroup };
67
+ }), e("design:type", Boolean)], u.prototype, "collapsed", void 0), t([l({ type: String }), e("design:type", String)], u.prototype, "icon", void 0), t([l({ type: String }), e("design:type", String)], u.prototype, "lib", void 0), t([l({ type: String }), e("design:type", Object)], u.prototype, "label", void 0), u = t([c("u-sidebar-group")], u);
68
+ export { u as SidebarGroup };
@@ -1,5 +1,5 @@
1
1
  import { css as e } from "lit";
2
- //#region src/components/SidebarGroup.styles.ts
2
+ // src/components/SidebarGroup.styles.ts
3
3
  var t = e`
4
4
  :host {
5
5
  display: flex;
@@ -113,5 +113,4 @@ var t = e`
113
113
  border: 0;
114
114
  }
115
115
  `;
116
- //#endregion
117
116
  export { t as styles };
@@ -65,6 +65,12 @@ export declare class SidebarLink extends StyledElement<ElementParts> {
65
65
  target?: '_self' | '_blank';
66
66
  /** 항목 끝의 건수 — 처리할 일이 있을 때만. `undefined`·빈 문자열이면 그리지 않는다. */
67
67
  count?: number | string;
68
+ /**
69
+ * 묶음(`u-sidebar-group`) 안의 링크인가. 기본 아이콘은 사이드바가 접혀 라벨이 숨을 때 항목이 빈 줄이 되지 않게 하는
70
+ * 것인데, 묶음 안 링크는 접히면 묶음 머리가 대신 남는다 — 그래서 아이콘을 주지 않은 묶음 안 링크에는 폴백을 그리지 않는다.
71
+ */
72
+ private nested;
73
+ connectedCallback(): void;
68
74
  render(): import('lit-html').TemplateResult<1>;
69
75
  }
70
76
  export {};