@edsis/ui 21.3.7 → 21.3.8

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/page/README.md CHANGED
@@ -18,16 +18,96 @@ Primitive page shell untuk layout halaman dengan pendekatan nested component.
18
18
  - `stacked`
19
19
  - `side`
20
20
 
21
+ ## Scroll Modes
22
+
23
+ - `content` (default): hanya `ui-page-content` yang menjadi area scroll. Pada variant `side`, `ui-page-side` dan `ui-page-content` sama-sama stretch ke parent dan masing-masing punya scroll sendiri.
24
+ - `page`: seluruh isi `ui-page` menjadi area scroll. Header, content, footer, dan pada variant `side` juga `ui-page-side` akan mengikuti tinggi content induk tanpa scroll internal.
25
+
26
+ ## Height Modes
27
+
28
+ - `auto` (default): tinggi `ui-page-header` dan `ui-page-footer` mengikuti isi.
29
+ - `fix`: `ui-page-header` dan `ui-page-footer` dipaksa `h-12` dan `overflow-hidden`, sehingga isi yang melebihi tinggi tersebut akan terpotong.
30
+
31
+ ## Behavior Summary
32
+
33
+ | Variant | `scroll="content"` | `scroll="page"` |
34
+ | --------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
35
+ | `stacked` | `ui-page-content` stretch ke tinggi yang tersedia dan menjadi area scroll | seluruh `ui-page` scroll bersama; header, content, footer ikut satu kanvas |
36
+ | `side` | `ui-page-side` dan `ui-page-content` sama-sama stretch ke parent dan punya scroll sendiri | `ui-page-side` dan `ui-page-content` mengikuti tinggi content induk tanpa scroll internal |
37
+
38
+ ## Header And Footer Height
39
+
40
+ Saat memakai `height="fix"`, slot berikut tidak boleh melebihi tinggi tetap yang disediakan:
41
+
42
+ - `ui-page-header`: `h-12` dengan `overflow-hidden`
43
+ - `ui-page-footer`: `h-12` dengan `overflow-hidden`
44
+
21
45
  ## Side Modes
22
46
 
23
47
  - `sticky`
24
48
  - `drawer`
25
49
  - `overlay`
26
50
 
27
- ## Example
51
+ ## Examples
52
+
53
+ ### Stacked with content scroll
54
+
55
+ ```html
56
+ <ui-page variant="stacked">
57
+ <ui-page-header>
58
+ <h1>Executive summary</h1>
59
+ </ui-page-header>
60
+
61
+ <ui-page-content>
62
+ <p>Secara default, slot content yang menjadi area scroll.</p>
63
+ </ui-page-content>
64
+
65
+ <ui-page-footer>
66
+ <button type="button">Save</button>
67
+ </ui-page-footer>
68
+ </ui-page>
69
+ ```
70
+
71
+ ### Stacked with fixed header and footer height
28
72
 
29
73
  ```html
30
- <ui-page variant="side" position="left">
74
+ <ui-page variant="stacked" height="fix">
75
+ <ui-page-header>
76
+ <div class="h-20">Bagian ini akan terpotong ke tinggi h-12.</div>
77
+ </ui-page-header>
78
+
79
+ <ui-page-content>
80
+ <p>Content tetap mengikuti mode scroll yang aktif.</p>
81
+ </ui-page-content>
82
+
83
+ <ui-page-footer>
84
+ <div class="h-20">Footer juga tidak boleh melebihi h-12.</div>
85
+ </ui-page-footer>
86
+ </ui-page>
87
+ ```
88
+
89
+ ### Stacked with page scroll
90
+
91
+ ```html
92
+ <ui-page variant="stacked" scroll="page">
93
+ <ui-page-header>
94
+ <h1>Executive summary</h1>
95
+ </ui-page-header>
96
+
97
+ <ui-page-content>
98
+ <p>Semua area di dalam page ikut scroll bersama.</p>
99
+ </ui-page-content>
100
+
101
+ <ui-page-footer>
102
+ <button type="button">Save</button>
103
+ </ui-page-footer>
104
+ </ui-page>
105
+ ```
106
+
107
+ ### Side with content scroll
108
+
109
+ ```html
110
+ <ui-page variant="side" position="left" scroll="content">
31
111
  <ui-page-header>
32
112
  <ui-page-side-toggle ariaLabel="Toggle side">
33
113
  <span>Open filters</span>
@@ -35,12 +115,30 @@ Primitive page shell untuk layout halaman dengan pendekatan nested component.
35
115
  <h1>Page title</h1>
36
116
  </ui-page-header>
37
117
 
38
- <ui-page-side mode="overlay">
39
- <p>Filters</p>
118
+ <ui-page-side mode="sticky">
119
+ <p>Side rail scroll sendiri.</p>
120
+ </ui-page-side>
121
+
122
+ <ui-page-content>
123
+ <p>Main content juga scroll sendiri.</p>
124
+ </ui-page-content>
125
+ </ui-page>
126
+ ```
127
+
128
+ ### Side with page scroll
129
+
130
+ ```html
131
+ <ui-page variant="side" position="left" scroll="page">
132
+ <ui-page-header>
133
+ <h1>Executive detail</h1>
134
+ </ui-page-header>
135
+
136
+ <ui-page-side mode="sticky">
137
+ <p>Side mengikuti tinggi content induk.</p>
40
138
  </ui-page-side>
41
139
 
42
140
  <ui-page-content>
43
- <p>Main content</p>
141
+ <p>Root `ui-page` yang menjadi area scroll tunggal.</p>
44
142
  </ui-page-content>
45
143
  </ui-page>
46
144
  ```
@@ -114,6 +114,7 @@ declare class EditorContentComponent implements AfterViewInit, OnDestroy, Contro
114
114
  protected handleBlur(): void;
115
115
  protected handleKeydown(event: KeyboardEvent): void;
116
116
  private exec;
117
+ private highlightColor;
117
118
  private syncEmptyState;
118
119
  private shortcutCommand;
119
120
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditorContentComponent, never>;
@@ -3,19 +3,29 @@ import * as _angular_core from '@angular/core';
3
3
  declare const UI_PAGE_VARIANTS: readonly ["stacked", "side"];
4
4
  declare const UI_PAGE_SIDE_POSITIONS: readonly ["left", "right"];
5
5
  declare const UI_PAGE_SIDE_MODES: readonly ["sticky", "drawer", "overlay"];
6
+ declare const UI_PAGE_SCROLL_VALUES: readonly ["content", "page"];
7
+ declare const UI_PAGE_HEIGHT_VALUES: readonly ["auto", "fix"];
6
8
  type UiPageVariant = (typeof UI_PAGE_VARIANTS)[number];
7
9
  type UiPageSidePosition = (typeof UI_PAGE_SIDE_POSITIONS)[number];
8
10
  type UiPageSideMode = (typeof UI_PAGE_SIDE_MODES)[number];
11
+ type UiPageScroll = (typeof UI_PAGE_SCROLL_VALUES)[number];
12
+ type UiPageHeight = (typeof UI_PAGE_HEIGHT_VALUES)[number];
9
13
  declare const UI_PAGE_DEFAULT_VARIANT: UiPageVariant;
10
14
  declare const UI_PAGE_DEFAULT_SIDE_POSITION: UiPageSidePosition;
11
15
  declare const UI_PAGE_DEFAULT_SIDE_MODE: UiPageSideMode;
16
+ declare const UI_PAGE_DEFAULT_SCROLL: UiPageScroll;
17
+ declare const UI_PAGE_DEFAULT_HEIGHT: UiPageHeight;
12
18
  declare const UI_PAGE_DEFAULT_SIDE_WIDTH = "16rem";
13
19
  declare function isUiPageVariant(value: string | null): value is UiPageVariant;
14
20
  declare function isUiPageSidePosition(value: string | null): value is UiPageSidePosition;
15
21
  declare function isUiPageSideMode(value: string | null): value is UiPageSideMode;
22
+ declare function isUiPageScroll(value: string | null): value is UiPageScroll;
23
+ declare function isUiPageHeight(value: string | null): value is UiPageHeight;
16
24
 
17
25
  declare class UiPageStateService {
18
26
  private readonly variantState;
27
+ private readonly heightState;
28
+ private readonly scrollState;
19
29
  private readonly positionState;
20
30
  private readonly sideModeState;
21
31
  private readonly internalSideOpenState;
@@ -25,6 +35,8 @@ declare class UiPageStateService {
25
35
  private readonly sideOpenRequestState;
26
36
  private readonly sideOpenRequestVersionState;
27
37
  readonly variant: _angular_core.Signal<"stacked" | "side">;
38
+ readonly height: _angular_core.Signal<"auto" | "fix">;
39
+ readonly scroll: _angular_core.Signal<"content" | "page">;
28
40
  readonly position: _angular_core.Signal<"left" | "right">;
29
41
  readonly sideMode: _angular_core.Signal<"sticky" | "drawer" | "overlay">;
30
42
  readonly sideWidth: _angular_core.Signal<string>;
@@ -36,6 +48,8 @@ declare class UiPageStateService {
36
48
  readonly isSideVisible: _angular_core.Signal<boolean>;
37
49
  registerRoot(config: {
38
50
  variant: UiPageVariant;
51
+ height: UiPageHeight;
52
+ scroll: UiPageScroll;
39
53
  position: UiPageSidePosition;
40
54
  sideMode: UiPageSideMode;
41
55
  sideWidth: string;
@@ -71,6 +85,7 @@ declare class UiPageSideComponent {
71
85
  protected readonly isSticky: _angular_core.Signal<boolean>;
72
86
  protected readonly isDrawer: _angular_core.Signal<boolean>;
73
87
  protected readonly isOverlay: _angular_core.Signal<boolean>;
88
+ protected readonly resolvedScroll: _angular_core.Signal<"content" | "page">;
74
89
  protected readonly ariaHidden: _angular_core.Signal<"true" | null>;
75
90
  protected readonly classes: _angular_core.Signal<string>;
76
91
  constructor();
@@ -82,6 +97,8 @@ declare class UiPageComponent {
82
97
  protected readonly page: UiPageStateService;
83
98
  protected readonly projectedSide: _angular_core.Signal<UiPageSideComponent | undefined>;
84
99
  readonly variant: _angular_core.InputSignal<"stacked" | "side">;
100
+ readonly height: _angular_core.InputSignal<"auto" | "fix">;
101
+ readonly scroll: _angular_core.InputSignal<"content" | "page">;
85
102
  readonly position: _angular_core.InputSignal<"left" | "right">;
86
103
  readonly sideMode: _angular_core.InputSignal<"sticky" | "drawer" | "overlay">;
87
104
  readonly sideOpen: _angular_core.InputSignal<boolean | null>;
@@ -99,7 +116,7 @@ declare class UiPageComponent {
99
116
  constructor();
100
117
  protected handleBackdropClick(): void;
101
118
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiPageComponent, never>;
102
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiPageComponent, "ui-page", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "sideMode": { "alias": "sideMode"; "required": false; "isSignal": true; }; "sideOpen": { "alias": "sideOpen"; "required": false; "isSignal": true; }; "sideWidth": { "alias": "sideWidth"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "sideOpenChange": "sideOpenChange"; }, ["projectedSide"], ["ui-page-header", "ui-page-side-toggle", "ui-page-side", "ui-page-content", "ui-page-footer"], true, never>;
119
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiPageComponent, "ui-page", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "scroll": { "alias": "scroll"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "sideMode": { "alias": "sideMode"; "required": false; "isSignal": true; }; "sideOpen": { "alias": "sideOpen"; "required": false; "isSignal": true; }; "sideWidth": { "alias": "sideWidth"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "sideOpenChange": "sideOpenChange"; }, ["projectedSide"], ["ui-page-header", "ui-page-side-toggle", "ui-page-side", "ui-page-content", "ui-page-footer"], true, never>;
103
120
  }
104
121
 
105
122
  declare class UiPageSideToggleComponent {
@@ -115,23 +132,29 @@ declare class UiPageSideToggleComponent {
115
132
  }
116
133
 
117
134
  declare class UiPageHeaderComponent {
135
+ private readonly page;
118
136
  readonly class: _angular_core.InputSignal<string>;
137
+ protected readonly resolvedHeight: _angular_core.Signal<"auto" | "fix">;
119
138
  protected readonly classes: _angular_core.Signal<string>;
120
139
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiPageHeaderComponent, never>;
121
140
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiPageHeaderComponent, "ui-page-header", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
122
141
  }
123
142
  declare class UiPageContentComponent {
143
+ private readonly page;
124
144
  readonly class: _angular_core.InputSignal<string>;
145
+ protected readonly resolvedScroll: _angular_core.Signal<"content" | "page">;
125
146
  protected readonly classes: _angular_core.Signal<string>;
126
147
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiPageContentComponent, never>;
127
148
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiPageContentComponent, "ui-page-content", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
128
149
  }
129
150
  declare class UiPageFooterComponent {
151
+ private readonly page;
130
152
  readonly class: _angular_core.InputSignal<string>;
153
+ protected readonly resolvedHeight: _angular_core.Signal<"auto" | "fix">;
131
154
  protected readonly classes: _angular_core.Signal<string>;
132
155
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiPageFooterComponent, never>;
133
156
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiPageFooterComponent, "ui-page-footer", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
134
157
  }
135
158
 
136
- export { UI_PAGE_DEFAULT_SIDE_MODE, UI_PAGE_DEFAULT_SIDE_POSITION, UI_PAGE_DEFAULT_SIDE_WIDTH, UI_PAGE_DEFAULT_VARIANT, UI_PAGE_SIDE_MODES, UI_PAGE_SIDE_POSITIONS, UI_PAGE_VARIANTS, UiPageComponent, UiPageContentComponent, UiPageFooterComponent, UiPageHeaderComponent, UiPageSideComponent, UiPageSideToggleComponent, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant };
137
- export type { UiPageSideMode, UiPageSidePosition, UiPageVariant };
159
+ export { UI_PAGE_DEFAULT_HEIGHT, UI_PAGE_DEFAULT_SCROLL, UI_PAGE_DEFAULT_SIDE_MODE, UI_PAGE_DEFAULT_SIDE_POSITION, UI_PAGE_DEFAULT_SIDE_WIDTH, UI_PAGE_DEFAULT_VARIANT, UI_PAGE_HEIGHT_VALUES, UI_PAGE_SCROLL_VALUES, UI_PAGE_SIDE_MODES, UI_PAGE_SIDE_POSITIONS, UI_PAGE_VARIANTS, UiPageComponent, UiPageContentComponent, UiPageFooterComponent, UiPageHeaderComponent, UiPageSideComponent, UiPageSideToggleComponent, isUiPageHeight, isUiPageScroll, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant };
160
+ export type { UiPageHeight, UiPageScroll, UiPageSideMode, UiPageSidePosition, UiPageVariant };
@@ -4,9 +4,11 @@ import { InjectionToken, EnvironmentProviders } from '@angular/core';
4
4
  declare const THEME_MODES: readonly ["light", "dark", "system"];
5
5
  declare const RESOLVED_THEME_MODES: readonly ["light", "dark"];
6
6
  declare const THEME_SEASONS: readonly ["base", "imlek", "ramadhan", "ied", "natal", "new-year"];
7
+ type ThemeBrand = string;
7
8
  type ThemeMode = (typeof THEME_MODES)[number];
8
9
  type ResolvedThemeMode = (typeof RESOLVED_THEME_MODES)[number];
9
10
  type ThemeSeason = (typeof THEME_SEASONS)[number];
11
+ declare const DEFAULT_THEME_BRAND: ThemeBrand;
10
12
  declare const DEFAULT_THEME_MODE: ThemeMode;
11
13
  declare const DEFAULT_THEME_SEASON: ThemeSeason;
12
14
  declare const THEME_MODE_STORAGE_KEY = "theme-mode";
@@ -15,9 +17,11 @@ declare function isThemeMode(value: string | null | undefined): value is ThemeMo
15
17
  declare function isResolvedThemeMode(value: string | null | undefined): value is ResolvedThemeMode;
16
18
  declare function isThemeSeason(value: string | null | undefined): value is ThemeSeason;
17
19
  declare function normalizeThemeMode(value: string | null | undefined): ThemeMode;
20
+ declare function normalizeThemeBrand(value: string | null | undefined): ThemeBrand;
18
21
  declare function normalizeThemeSeason(value: string | null | undefined): ThemeSeason;
19
22
 
20
23
  interface UiThemeOptions {
24
+ readonly brand?: ThemeBrand;
21
25
  readonly mode?: ThemeMode;
22
26
  readonly season?: ThemeSeason;
23
27
  }
@@ -67,5 +71,5 @@ declare class ThemeSeasonService {
67
71
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ThemeSeasonService>;
68
72
  }
69
73
 
70
- export { DEFAULT_THEME_MODE, DEFAULT_THEME_SEASON, RESOLVED_THEME_MODES, THEME_MODES, THEME_MODE_STORAGE_KEY, THEME_SEASONS, THEME_SEASON_STORAGE_KEY, ThemeModeService, ThemeSeasonService, UI_THEME_OPTIONS, isResolvedThemeMode, isThemeMode, isThemeSeason, normalizeThemeMode, normalizeThemeSeason, provideUiTheme };
71
- export type { ResolvedThemeMode, ThemeMode, ThemeSeason, UiThemeOptions };
74
+ export { DEFAULT_THEME_BRAND, DEFAULT_THEME_MODE, DEFAULT_THEME_SEASON, RESOLVED_THEME_MODES, THEME_MODES, THEME_MODE_STORAGE_KEY, THEME_SEASONS, THEME_SEASON_STORAGE_KEY, ThemeModeService, ThemeSeasonService, UI_THEME_OPTIONS, isResolvedThemeMode, isThemeMode, isThemeSeason, normalizeThemeBrand, normalizeThemeMode, normalizeThemeSeason, provideUiTheme };
75
+ export type { ResolvedThemeMode, ThemeBrand, ThemeMode, ThemeSeason, UiThemeOptions };