@iyulab/modern-app 0.2.4 → 0.3.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 (33) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/App.d.ts +53 -0
  3. package/dist/App.js +28 -28
  4. package/dist/components/SidebarButton.d.ts +2 -3
  5. package/dist/components/SidebarButton.js +12 -14
  6. package/dist/components/SidebarButton.styles.js +14 -16
  7. package/dist/components/SidebarGroup.d.ts +5 -4
  8. package/dist/components/SidebarGroup.js +45 -46
  9. package/dist/components/SidebarGroup.styles.js +39 -44
  10. package/dist/components/SidebarLink.d.ts +2 -7
  11. package/dist/components/SidebarLink.js +29 -39
  12. package/dist/components/SidebarLink.styles.js +9 -9
  13. package/dist/components/SidebarSection.d.ts +4 -5
  14. package/dist/components/SidebarSection.js +18 -22
  15. package/dist/components/SidebarSection.styles.js +9 -14
  16. package/dist/index.d.ts +2 -3
  17. package/dist/internals/ScreenObserver.d.ts +43 -0
  18. package/dist/internals/ScreenObserver.js +37 -0
  19. package/dist/internals/{ExtendedBaseElement.d.ts → StyledElement.d.ts} +6 -4
  20. package/dist/internals/{ExtendedBaseElement.js → StyledElement.js} +13 -14
  21. package/dist/layouts/SidebarLayout.d.ts +27 -19
  22. package/dist/layouts/SidebarLayout.js +140 -108
  23. package/dist/layouts/SidebarLayout.styles.js +82 -42
  24. package/dist/layouts/SidebarLayout.types.d.ts +14 -12
  25. package/dist/types/AppConfigs.d.ts +11 -6
  26. package/package.json +8 -9
  27. package/dist/components/SidebarLogo.d.ts +0 -33
  28. package/dist/components/SidebarLogo.js +0 -60
  29. package/dist/components/SidebarLogo.styles.d.ts +0 -1
  30. package/dist/components/SidebarLogo.styles.js +0 -57
  31. package/dist/internals/observables.d.ts +0 -7
  32. package/dist/internals/observables.js +0 -5
  33. package/dist/types/AppTypes.d.ts +0 -4
@@ -1,18 +1,16 @@
1
1
  import { html as c } from "lit";
2
2
  import { property as e } from "lit/decorators.js";
3
3
  import { UIcon as l } from "@iyulab/components/dist/components/icon/UIcon.component.js";
4
- import { ExtendedBaseElement as h } from "../internals/ExtendedBaseElement.js";
4
+ import { StyledElement as m } from "../internals/StyledElement.js";
5
5
  import { styles as d } from "./SidebarLink.styles.js";
6
- var f = Object.defineProperty, n = (o, r, a, m) => {
7
- for (var t = void 0, s = o.length - 1, p; s >= 0; s--)
8
- (p = o[s]) && (t = p(r, a, t) || t);
9
- return t && f(r, a, t), t;
6
+ var h = Object.defineProperty, r = (p, n, s, y) => {
7
+ for (var t = void 0, i = p.length - 1, a; i >= 0; i--)
8
+ (a = p[i]) && (t = a(n, s, t) || t);
9
+ return t && h(n, s, t), t;
10
10
  };
11
- class i extends h {
11
+ class o extends m {
12
12
  constructor() {
13
- super(...arguments), this.selected = !1, this.compact = !1, this.handleRouteBegin = (r) => {
14
- this.pattern ||= this.href, this.pattern ? (this.pattern = typeof this.pattern == "string" ? new URLPattern(this.pattern, window.location.origin) : this.pattern, this.selected = this.pattern.test(r.context.path, window.location.origin)) : this.selected = !1;
15
- };
13
+ super(...arguments), this.selected = !1, this.compact = !1;
16
14
  }
17
15
  static {
18
16
  this.styles = [super.styles, d];
@@ -22,47 +20,39 @@ class i extends h {
22
20
  "u-icon": l
23
21
  };
24
22
  }
25
- connectedCallback() {
26
- super.connectedCallback(), window.addEventListener("route-begin", this.handleRouteBegin);
27
- }
28
- disconnectedCallback() {
29
- window.removeEventListener("route-begin", this.handleRouteBegin), super.disconnectedCallback();
30
- }
31
23
  render() {
32
24
  return c`
33
- <u-link part="base"
34
- .href=${this.href || "#"}
35
- ?compact=${this.compact}>
36
- <u-icon part="icon"
37
- ?hidden=${!this.icon}
38
- .name=${this.icon}
39
- ></u-icon>
40
- <span part="label"
41
- ?hidden=${this.compact}>
42
- ${this.label}
43
- </span>
25
+ <u-link .href=${this.href || "#"}>
26
+ <div class="container" part="base" ?compact=${this.compact}>
27
+ <u-icon part="icon" ?hidden=${!this.icon}
28
+ .name=${this.icon}
29
+ ></u-icon>
30
+ <span part="label" ?hidden=${this.compact}>
31
+ ${this.label}
32
+ </span>
33
+ </div>
44
34
  </u-link>
45
35
  `;
46
36
  }
47
37
  }
48
- n([
38
+ r([
49
39
  e({ type: Boolean, reflect: !0 })
50
- ], i.prototype, "selected");
51
- n([
40
+ ], o.prototype, "selected");
41
+ r([
52
42
  e({ type: Boolean })
53
- ], i.prototype, "compact");
54
- n([
43
+ ], o.prototype, "compact");
44
+ r([
55
45
  e({ type: String })
56
- ], i.prototype, "icon");
57
- n([
46
+ ], o.prototype, "icon");
47
+ r([
58
48
  e({ type: String })
59
- ], i.prototype, "label");
60
- n([
49
+ ], o.prototype, "label");
50
+ r([
61
51
  e({ type: String })
62
- ], i.prototype, "href");
63
- n([
52
+ ], o.prototype, "href");
53
+ r([
64
54
  e({ type: String })
65
- ], i.prototype, "pattern");
55
+ ], o.prototype, "pattern");
66
56
  export {
67
- i as SidebarLink
57
+ o as SidebarLink
68
58
  };
@@ -2,9 +2,9 @@ import { css as o } from "lit";
2
2
  const e = o`
3
3
  :host {
4
4
  display: block;
5
+ color: var(--u-neutral-800);
6
+ background-color: transparent;
5
7
  border-radius: 8px;
6
- color: var(--u-txt-color);
7
- text-decoration: none;
8
8
  transition: all 0.2s ease;
9
9
  cursor: pointer;
10
10
  }
@@ -23,33 +23,33 @@ const e = o`
23
23
  box-shadow: 0 2px 6px var(--u-shadow-color-normal);
24
24
  }
25
25
 
26
- u-link {
26
+ .container {
27
27
  display: flex;
28
28
  flex-direction: row;
29
- justify-content: flex-start;
30
29
  align-items: center;
30
+ justify-content: flex-start;
31
31
  gap: 12px;
32
32
  padding: 8px 12px;
33
33
  }
34
- u-link[compact] {
34
+ .container[compact] {
35
35
  justify-content: center;
36
+ gap: 0;
36
37
  padding: 8px;
37
38
  }
38
39
 
39
40
  u-icon {
41
+ flex-shrink: 0;
40
42
  color: inherit;
41
43
  font-size: 20px;
42
- flex-shrink: 0;
43
44
  }
44
45
 
45
46
  span {
46
47
  flex: 1;
47
- color: inherit;
48
48
  font-size: 14px;
49
- font-weight: 500;
50
49
  line-height: 20px;
51
- overflow: hidden;
50
+ font-weight: 500;
52
51
  white-space: nowrap;
52
+ overflow: hidden;
53
53
  text-overflow: ellipsis;
54
54
  }
55
55
  `;
@@ -1,11 +1,10 @@
1
1
  import { DirectiveResult } from 'lit/directive.js';
2
2
  import { BaseElement } from '@iyulab/components/dist/components/BaseElement.js';
3
- import { ExtendedBaseElement } from '../internals/ExtendedBaseElement.js';
3
+ import { StyledElement, StyleMap } from '../internals/StyledElement.js';
4
4
  import { SidebarLinkConfig } from './SidebarLink.js';
5
5
  import { SidebarGroupConfig } from './SidebarGroup.js';
6
- import { StyleMap } from '../types/AppTypes.js';
7
- type ElementParts = 'host' | 'container' | 'header' | 'title' | 'subtitle' | 'items';
8
- /** 섹션: 섹션 내에는 그룹 또는 링크들만 허용 */
6
+ type ElementParts = 'host' | 'header' | 'title' | 'subtitle' | 'items';
7
+ /** 섹션 내에는 그룹 또는 링크들만 허용 */
9
8
  export interface SidebarSectionConfig {
10
9
  type: 'section';
11
10
  title: string | DirectiveResult;
@@ -16,7 +15,7 @@ export interface SidebarSectionConfig {
16
15
  /**
17
16
  * SidebarSection 컴포넌트는 사이드바의 섹션 헤더를 표시합니다.
18
17
  */
19
- export declare class SidebarSection extends ExtendedBaseElement<ElementParts> {
18
+ export declare class SidebarSection extends StyledElement<ElementParts> {
20
19
  static styles: import('lit').CSSResultGroup[];
21
20
  static dependencies: Record<string, typeof BaseElement>;
22
21
  /** 콤팩트 모드 여부 */
@@ -1,39 +1,35 @@
1
1
  import { html as n } from "lit";
2
2
  import { property as i } from "lit/decorators.js";
3
- import { ExtendedBaseElement as d } from "../internals/ExtendedBaseElement.js";
4
- import { styles as c } from "./SidebarSection.styles.js";
5
- var m = Object.defineProperty, r = (e, a, o, h) => {
6
- for (var t = void 0, s = e.length - 1, l; s >= 0; s--)
7
- (l = e[s]) && (t = l(a, o, t) || t);
8
- return t && m(a, o, t), t;
3
+ import { StyledElement as d } from "../internals/StyledElement.js";
4
+ import { styles as m } from "./SidebarSection.styles.js";
5
+ var c = Object.defineProperty, r = (e, a, l, h) => {
6
+ for (var t = void 0, s = e.length - 1, o; s >= 0; s--)
7
+ (o = e[s]) && (t = o(a, l, t) || t);
8
+ return t && c(a, l, t), t;
9
9
  };
10
10
  class p extends d {
11
11
  constructor() {
12
12
  super(...arguments), this.compact = !1;
13
13
  }
14
14
  static {
15
- this.styles = [super.styles, c];
15
+ this.styles = [super.styles, m];
16
16
  }
17
17
  static {
18
18
  this.dependencies = {};
19
19
  }
20
20
  render() {
21
21
  return n`
22
- <div class="container" part="container">
23
- <div class="header" part="header"
24
- ?hidden=${this.compact}>
25
- <h3 class="title" part="title">
26
- ${this.mainTitle}
27
- </h3>
28
- <p class="subtitle" part="subtitle"
29
- ?hidden=${!this.subTitle}>
30
- ${this.subTitle}
31
- </p>
32
- </div>
33
-
34
- <div class="items" part="items">
35
- <slot></slot>
36
- </div>
22
+ <div class="header" part="header" ?hidden=${this.compact}>
23
+ <span class="title" part="title">
24
+ ${this.mainTitle}
25
+ </span>
26
+ <span class="subtitle" part="subtitle" ?hidden=${!this.subTitle}>
27
+ ${this.subTitle}
28
+ </span>
29
+ </div>
30
+
31
+ <div class="items" part="items">
32
+ <slot></slot>
37
33
  </div>
38
34
  `;
39
35
  }
@@ -1,44 +1,39 @@
1
1
  import { css as e } from "lit";
2
- const o = e`
2
+ const i = e`
3
3
  :host {
4
- display: block;
5
- margin: 8px 0;
6
- }
7
-
8
- .container {
9
4
  display: flex;
10
5
  flex-direction: column;
11
6
  gap: 8px;
7
+ margin: 8px 0;
12
8
  }
13
9
 
14
10
  .header {
15
11
  display: flex;
16
12
  flex-direction: column;
17
- gap: 2px;
18
13
  padding: 8px 12px 4px;
19
14
  }
20
15
 
21
16
  .title {
17
+ color: var(--u-neutral-700);
22
18
  font-size: 12px;
23
19
  font-weight: 700;
24
- color: var(--u-txt-color-weak);
25
- text-transform: uppercase;
26
20
  letter-spacing: 0.5px;
27
- margin: 0;
21
+ white-space: nowrap;
22
+ overflow: hidden;
23
+ text-overflow: ellipsis;
28
24
  }
29
25
 
30
26
  .subtitle {
27
+ color: var(--u-neutral-600);
31
28
  font-size: 11px;
32
- color: var(--u-txt-color-disabled);
33
- margin: 0;
29
+ font-weight: 300;
34
30
  }
35
31
 
36
32
  .items {
37
33
  display: flex;
38
34
  flex-direction: column;
39
- gap: 2px;
40
35
  }
41
36
  `;
42
37
  export {
43
- o as styles
38
+ i as styles
44
39
  };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { app } from './App.js';
2
- export type * from './types/AppConfigs.js';
3
- export type * from './types/AppOptions.js';
4
- export type * from './types/AppTypes.js';
2
+ export type * from './types/AppConfigs';
3
+ export type * from './types/AppOptions';
5
4
  export { app };
6
5
  export default app;
@@ -0,0 +1,43 @@
1
+ /** 화면 크기 타입 */
2
+ export type ScreenSize = 'small' | 'medium' | 'large';
3
+ /** 스크린 옵저버 설정 */
4
+ export interface ScreenObserverConfig {
5
+ /** 관찰할 엘리먼트 */
6
+ element: Element;
7
+ /** 브레이크포인트 설정 [small, medium] */
8
+ breakpoints: [number, number];
9
+ }
10
+ /**
11
+ * 화면 크기 변경을 감지하고 관리하는 옵저버 클래스
12
+ * root 엘리먼트의 크기를 기준으로 반응형 화면 크기를 추적합니다.
13
+ */
14
+ export declare class ScreenObserver {
15
+ /** ResizeObserver 인스턴스 */
16
+ private _observer;
17
+ /** 브레이크포인트 설정 [small, medium] */
18
+ private _breakpoints;
19
+ /** 현재 화면 크기 */
20
+ private _size;
21
+ /**
22
+ * ScreenObserver 생성자
23
+ * @param config - 스크린 옵저버 설정
24
+ */
25
+ constructor(config: ScreenObserverConfig);
26
+ destroy(): void;
27
+ /** 현재 화면 크기 반환 */
28
+ get(): ScreenSize;
29
+ /**
30
+ * 너비를 기준으로 화면 크기를 반환
31
+ * @param width - 엘리먼트의 너비
32
+ * @return 화면 크기
33
+ */
34
+ private calculate;
35
+ }
36
+ export type ScreenResizeEvent = CustomEvent<{
37
+ size: ScreenSize;
38
+ }>;
39
+ declare global {
40
+ interface WindowEventMap {
41
+ 'screen-resize': ScreenResizeEvent;
42
+ }
43
+ }
@@ -0,0 +1,37 @@
1
+ class c {
2
+ /**
3
+ * ScreenObserver 생성자
4
+ * @param config - 스크린 옵저버 설정
5
+ */
6
+ constructor(e) {
7
+ this._breakpoints = e.breakpoints, this._observer = new ResizeObserver((s) => {
8
+ const r = s[0], i = this.calculate(r.contentRect.width);
9
+ this._size !== i && (this._size = i, window.dispatchEvent(new CustomEvent("screen-resize", {
10
+ detail: { size: this._size }
11
+ })));
12
+ }), this._observer.observe(e.element);
13
+ const t = e.element.getBoundingClientRect();
14
+ this._size = this.calculate(t.width), window.dispatchEvent(new CustomEvent("screen-resize", {
15
+ detail: { size: this._size }
16
+ }));
17
+ }
18
+ destroy() {
19
+ this._observer && this._observer.disconnect();
20
+ }
21
+ /** 현재 화면 크기 반환 */
22
+ get() {
23
+ return this._size;
24
+ }
25
+ /**
26
+ * 너비를 기준으로 화면 크기를 반환
27
+ * @param width - 엘리먼트의 너비
28
+ * @return 화면 크기
29
+ */
30
+ calculate(e) {
31
+ const [t, s] = this._breakpoints;
32
+ return e < t ? "small" : e < s ? "medium" : "large";
33
+ }
34
+ }
35
+ export {
36
+ c as ScreenObserver
37
+ };
@@ -1,11 +1,13 @@
1
1
  import { PropertyValues } from 'lit';
2
2
  import { BaseElement } from '@iyulab/components/dist/components/BaseElement.js';
3
- import { StyleMap } from '../types/AppTypes';
3
+ /** 스타일 타입 */
4
+ export type StyleValue = Record<string, string> | Partial<CSSStyleDeclaration>;
5
+ /** 스타일 맵 타입 */
6
+ export type StyleMap<T extends string> = Partial<Record<T, StyleValue>>;
4
7
  /**
5
- * ExtendedBaseElement - BaseElement 확장한 클래스
6
- * - 부분별 스타일링 지원
8
+ * StyledBaseElement - BaseElement 확장으로 부분별 스타일링 기능 추가
7
9
  */
8
- export declare class ExtendedBaseElement<T extends string> extends BaseElement {
10
+ export declare class StyledElement<T extends string> extends BaseElement {
9
11
  static styles: import('lit').CSSResultGroup;
10
12
  static dependencies: Record<string, typeof BaseElement>;
11
13
  /** 부분별 스타일 구성 */
@@ -1,11 +1,11 @@
1
- import { property as c } from "lit/decorators.js";
2
- import { BaseElement as l } from "@iyulab/components/dist/components/BaseElement.js";
3
- var p = Object.defineProperty, f = (o, e, i, r) => {
4
- for (var t = void 0, s = o.length - 1, n; s >= 0; s--)
5
- (n = o[s]) && (t = n(e, i, t) || t);
1
+ import { property as l } from "lit/decorators.js";
2
+ import { BaseElement as c } from "@iyulab/components/dist/components/BaseElement.js";
3
+ var p = Object.defineProperty, y = (n, e, i, r) => {
4
+ for (var t = void 0, s = n.length - 1, o; s >= 0; s--)
5
+ (o = n[s]) && (t = o(e, i, t) || t);
6
6
  return t && p(e, i, t), t;
7
7
  };
8
- class y extends l {
8
+ class f extends c {
9
9
  static {
10
10
  this.styles = super.styles;
11
11
  }
@@ -13,13 +13,12 @@ class y extends l {
13
13
  this.dependencies = {};
14
14
  }
15
15
  updated(e) {
16
- super.updated?.(e), e.has("styles") && this.applyToParts(this.styles);
16
+ super.updated(e), e.has("styles") && this.styles && this.applyToParts(this.styles);
17
17
  }
18
18
  /**
19
19
  * 현재 스타일 구성을 각 파트에 적용, host 포함
20
20
  */
21
21
  applyToParts(e) {
22
- if (!e) return;
23
22
  const i = Object.entries(e);
24
23
  for (const [r, t] of i)
25
24
  if (t)
@@ -45,15 +44,15 @@ class y extends l {
45
44
  try {
46
45
  e.style[r] = s;
47
46
  } catch {
48
- const n = r.replace(/[A-Z]/g, (a) => "-" + a.toLowerCase());
49
- e.style.setProperty(n, s);
47
+ const o = r.replace(/[A-Z]/g, (a) => "-" + a.toLowerCase());
48
+ e.style.setProperty(o, s);
50
49
  }
51
50
  }
52
51
  }
53
52
  }
54
- f([
55
- c({ type: Object, attribute: !1 })
56
- ], y.prototype, "styles");
53
+ y([
54
+ l({ type: Object, attribute: !1 })
55
+ ], f.prototype, "styles");
57
56
  export {
58
- y as ExtendedBaseElement
57
+ f as StyledElement
59
58
  };
@@ -1,20 +1,21 @@
1
1
  import { nothing, PropertyValues } from 'lit';
2
+ import { RouteContext } from '@iyulab/router';
2
3
  import { BaseElement } from '@iyulab/components/dist/components/BaseElement.js';
3
- import { UIconButton } from '@iyulab/components/dist/components/icon-button/UIconButton.component.js';
4
+ import { UIcon } from '@iyulab/components/dist/components/icon/UIcon.component.js';
5
+ import { UButton } from '@iyulab/components/dist/components/button/UButton.component.js';
4
6
  import { UProgressBar } from '@iyulab/components/dist/components/progress-bar/UProgressBar.component.js';
5
- import { ExtendedBaseElement } from '../internals/ExtendedBaseElement';
6
- import { SidebarLogo } from '../components/SidebarLogo';
7
+ import { StyledElement } from '../internals/StyledElement.js';
7
8
  import { SidebarSection } from '../components/SidebarSection';
8
9
  import { SidebarGroup } from '../components/SidebarGroup';
9
10
  import { SidebarLink } from '../components/SidebarLink';
10
11
  import { SidebarButton } from '../components/SidebarButton';
11
12
  import { SidebarLayoutConfig, SidebarState, SidebarParts } from './SidebarLayout.types';
12
- /** 엘리먼트 타입 매핑 (for deveveloper experience) */
13
+ /** 엘리먼트 타입 매핑 (for devevelop experience) */
13
14
  declare global {
14
15
  interface HTMLElementTagNameMap {
15
- 'u-icon-button': UIconButton;
16
+ 'u-icon': UIcon;
17
+ 'u-button': UButton;
16
18
  'u-progress-bar': UProgressBar;
17
- 'u-sidebar-logo': SidebarLogo;
18
19
  'u-sidebar-section': SidebarSection;
19
20
  'u-sidebar-group': SidebarGroup;
20
21
  'u-sidebar-link': SidebarLink;
@@ -22,22 +23,26 @@ declare global {
22
23
  }
23
24
  }
24
25
  /**
25
- * SidebarLayout - 반응형 사이드바 레이아웃
26
- * - large: docked / slim
26
+ * 반응형 사이드바 레이아웃 컴포넌트
27
+ *
28
+ * 화면 크기에 따른 사이드바 모드 전환:
29
+ * - large: default / slim
27
30
  * - medium: slim / modal
28
- * - small: closed / modal
31
+ * - small: mobile / mobile-open
29
32
  *
30
- * - docked: 사이드바가 펼침 상태로 표시됨
33
+ * 사이드바 모드:
34
+ * - default: 사이드바가 펼침 상태로 표시됨
31
35
  * - slim: 아이콘만 표시되는 슬림 모드
32
36
  * - modal: 오버레이로 사이드바가 펼침 상태로 표시되는 모달 모드, 백드롭 클릭 시 닫힘
33
- * - closed: 사이드바가 왼쪽에 완전히 숨겨진 상태
37
+ * - mobile: 모바일에서 헤더만 표시되는 상태, 사이드바는 숨겨짐
38
+ * - mobile-open: 모바일에서 사이드바가 펼침 상태로 표시되는 모드
34
39
  */
35
- export declare class SidebarLayout extends ExtendedBaseElement<SidebarParts> {
40
+ export declare class SidebarLayout extends StyledElement<SidebarParts> {
36
41
  static styles: import('lit').CSSResultGroup[];
37
42
  static dependencies: Record<string, typeof BaseElement>;
38
- /** 반응형 상태 관리를 위한 MobX 반응 해제 함수들 */
39
- private disposers;
40
43
  progressBarEl: UProgressBar;
44
+ /** 현재 라우터 컨텍스트 */
45
+ context: RouteContext | null;
41
46
  /** 사이드바 상태 */
42
47
  state: SidebarState;
43
48
  /** 사이드바 레이아웃 설정 */
@@ -48,19 +53,22 @@ export declare class SidebarLayout extends ExtendedBaseElement<SidebarParts> {
48
53
  render(): import('lit-html').TemplateResult<1> | typeof nothing;
49
54
  /** 사이드바 아이템 렌더링 */
50
55
  private renderItem;
51
- /** 화면 크기 변경에 따른 사이드바 상태 업데이트 */
52
- private updateState;
56
+ /** 현재 경로와 패턴 매칭 여부 확인 */
57
+ private isMatchedLink;
58
+ /** 브랜드 로고 클릭 핸들러 */
59
+ private handleBrandLogoClick;
53
60
  /** 사이드바 토글 핸들러 */
54
- private toggleState;
61
+ private handleToggleButtonClick;
55
62
  /**
56
63
  * 모달 상태에서 사이드바 닫기
57
- * 백드롭 클릭 or 라우트 변경 시
58
64
  */
59
- private toggleStateIfModalState;
65
+ private handleBackdropClick;
60
66
  /** 라우트 변경 시작 핸들러 */
61
67
  private handleRouteBegin;
62
68
  /** 라우트 변경 진행 핸들러 */
63
69
  private handleRouteProgress;
64
70
  /** 라우트 변경 완료 핸들러 */
65
71
  private handleRouteDone;
72
+ /** 화면 크기 변경에 따른 사이드바 상태 업데이트 */
73
+ private handleScreenResize;
66
74
  }