@ojiepermana/angular-theme 22.0.27 → 22.0.29

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/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # @ojiepermana/angular-theme
2
+
3
+ Theme layer for the `@ojiepermana/angular` design system: a runtime provider
4
+ (mode / season), design tokens, and the Tailwind v4 CSS that the components are
5
+ styled against.
6
+
7
+ ```bash
8
+ bun add @ojiepermana/angular-theme
9
+ # or: npm install @ojiepermana/angular-theme
10
+ ```
11
+
12
+ ## Entry points
13
+
14
+ | Import path | Contents |
15
+ | ---------------------------------------- | --------------------------------------------- |
16
+ | `@ojiepermana/angular-theme/styles` | `provideUiTheme`, `ThemeModeService`, … |
17
+ | `@ojiepermana/angular-theme/layout` | Layout shell building blocks |
18
+ | `@ojiepermana/angular-theme/page` | Page-level scaffolding |
19
+ | `@ojiepermana/angular-theme/theme.css` | Base tokens + component styles (CSS) |
20
+ | `@ojiepermana/angular-theme/styles/css/*`| Raw CSS assets (seasonal themes, Tailwind map)|
21
+
22
+ ## Tailwind v4 setup
23
+
24
+ The CSS is published with the package and addressable by name. In your global
25
+ stylesheet:
26
+
27
+ ```css
28
+ /* styles.css */
29
+ @import '@ojiepermana/angular-theme/theme.css'; /* base tokens + component styles */
30
+ @import 'tailwindcss';
31
+ @import '@ojiepermana/angular-theme/styles/css/seasonal/base/tailwind.css'; /* maps tokens → bg-primary, text-foreground, rounded-md, … */
32
+ ```
33
+
34
+ Requires Tailwind CSS `^4.3.0`.
35
+
36
+ ## Provider
37
+
38
+ ```ts
39
+ import { provideUiTheme } from '@ojiepermana/angular-theme/styles';
40
+
41
+ export const appConfig = {
42
+ providers: [provideUiTheme({ mode: 'light', season: 'base' })],
43
+ };
44
+ ```
45
+
46
+ - `mode` — bootstraps `ThemeModeService` and persists the default mode.
47
+ - `season` — bootstraps `ThemeSeasonService` and persists the default season.
48
+ - `seasonalCssUrl` — resolver to lazy-load a season's CSS at runtime instead of
49
+ bundling every season up front.
50
+
51
+ ### Seasonal themes
52
+
53
+ `theme.css` bundles only the **base** tokens/components (`index.css`). Seasonal
54
+ variants live under `styles/css/seasonal/<season>/package.css` and can be imported
55
+ manually, or loaded at runtime via the `seasonalCssUrl` option of `provideUiTheme`.
56
+
57
+ ### Material Symbols icons (opt-in)
58
+
59
+ `provideUiTheme()` makes **no external network request by default**. To preload the
60
+ Material Symbols font from Google Fonts:
61
+
62
+ ```ts
63
+ provideUiTheme({ icons: { materialSymbols: true } });
64
+ ```
65
+
66
+ Leave it off (the default) for privacy / offline / strict CSP, and self-host the
67
+ font in your own stylesheet if you need it.
@@ -360,5 +360,4 @@ const layoutLoadingInterceptor = (request, next) => {
360
360
  * Generated bundle index. Do not edit.
361
361
  */
362
362
 
363
- export { LAYOUT_LOADING_HIDE_DELAY_MS, LAYOUT_LOADING_INITIAL_PROGRESS, LAYOUT_LOADING_SKIP, LAYOUT_LOADING_TRICKLE_CEILING, LAYOUT_LOADING_TRICKLE_INTERVAL_MS, LayoutLoadingService, LayoutService, layoutLoadingInterceptor };
364
- //# sourceMappingURL=ojiepermana-angular-theme-layout-services.mjs.map
363
+ export { LAYOUT_LOADING_HIDE_DELAY_MS, LAYOUT_LOADING_INITIAL_PROGRESS, LAYOUT_LOADING_SKIP, LAYOUT_LOADING_TRICKLE_CEILING, LAYOUT_LOADING_TRICKLE_INTERVAL_MS, LayoutLoadingService, LayoutService, layoutLoadingInterceptor };
@@ -28,5 +28,4 @@ function isUiLayoutWidth(value) {
28
28
  * Generated bundle index. Do not edit.
29
29
  */
30
30
 
31
- export { LAYOUT_APPEARANCE_STORAGE_KEY, LAYOUT_DEFAULT_STYLE, LAYOUT_DEFAULT_SURFACE, LAYOUT_DEFAULT_TYPE, LAYOUT_DEFAULT_WIDTH, LAYOUT_STYLES, LAYOUT_STYLE_STORAGE_KEY, LAYOUT_SURFACES, LAYOUT_SURFACE_STORAGE_KEY, LAYOUT_TYPES, LAYOUT_TYPE_STORAGE_KEY, LAYOUT_WIDTHS, LAYOUT_WIDTH_STORAGE_KEY, isUiLayoutStyle, isUiLayoutSurface, isUiLayoutType, isUiLayoutWidth };
32
- //# sourceMappingURL=ojiepermana-angular-theme-layout-types.mjs.map
31
+ export { LAYOUT_APPEARANCE_STORAGE_KEY, LAYOUT_DEFAULT_STYLE, LAYOUT_DEFAULT_SURFACE, LAYOUT_DEFAULT_TYPE, LAYOUT_DEFAULT_WIDTH, LAYOUT_STYLES, LAYOUT_STYLE_STORAGE_KEY, LAYOUT_SURFACES, LAYOUT_SURFACE_STORAGE_KEY, LAYOUT_TYPES, LAYOUT_TYPE_STORAGE_KEY, LAYOUT_WIDTHS, LAYOUT_WIDTH_STORAGE_KEY, isUiLayoutStyle, isUiLayoutSurface, isUiLayoutType, isUiLayoutWidth };
@@ -570,5 +570,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
570
570
  * Generated bundle index. Do not edit.
571
571
  */
572
572
 
573
- export { LayoutComponent, LayoutContentComponent, LayoutEmptyComponent, LayoutFluidComponent, LayoutHorizontalComponent, LayoutLoadingComponent, LayoutNavigationComponent, LayoutVerticalComponent };
574
- //# sourceMappingURL=ojiepermana-angular-theme-layout.mjs.map
573
+ export { LayoutComponent, LayoutContentComponent, LayoutEmptyComponent, LayoutFluidComponent, LayoutHorizontalComponent, LayoutLoadingComponent, LayoutNavigationComponent, LayoutVerticalComponent };
@@ -506,5 +506,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
506
506
  * Generated bundle index. Do not edit.
507
507
  */
508
508
 
509
- export { PAGE_DEFAULT_HEIGHT, PAGE_DEFAULT_SCROLL, PAGE_DEFAULT_SIDE_MODE, PAGE_DEFAULT_SIDE_POSITION, PAGE_DEFAULT_SIDE_WIDTH, PAGE_DEFAULT_VARIANT, PAGE_HEIGHT_VALUES, PAGE_SCROLL_VALUES, PAGE_SIDE_MODES, PAGE_SIDE_POSITIONS, PAGE_VARIANTS, PageComponent, PageContentComponent, PageDashboardComponent, PageFooterComponent, PageHeaderComponent, PageSideComponent, PageSideToggleComponent, isUiPageHeight, isUiPageScroll, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant };
510
- //# sourceMappingURL=ojiepermana-angular-theme-page.mjs.map
509
+ export { PAGE_DEFAULT_HEIGHT, PAGE_DEFAULT_SCROLL, PAGE_DEFAULT_SIDE_MODE, PAGE_DEFAULT_SIDE_POSITION, PAGE_DEFAULT_SIDE_WIDTH, PAGE_DEFAULT_VARIANT, PAGE_HEIGHT_VALUES, PAGE_SCROLL_VALUES, PAGE_SIDE_MODES, PAGE_SIDE_POSITIONS, PAGE_VARIANTS, PageComponent, PageContentComponent, PageDashboardComponent, PageFooterComponent, PageHeaderComponent, PageSideComponent, PageSideToggleComponent, isUiPageHeight, isUiPageScroll, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant };
@@ -227,7 +227,11 @@ function provideUiTheme(options = {}) {
227
227
  useValue: options,
228
228
  },
229
229
  provideEnvironmentInitializer(() => {
230
- if (options.icons?.materialSymbols !== false) {
230
+ // Opt-in: the Material Symbols font is only fetched from Google Fonts when
231
+ // explicitly enabled, so the default install makes no external network
232
+ // request (privacy / offline / CSP friendly). Set `icons.materialSymbols: true`
233
+ // or self-host the font and import it yourself.
234
+ if (options.icons?.materialSymbols === true) {
231
235
  inject(MaterialSymbolsService).ensureLoaded();
232
236
  }
233
237
  inject(ThemeModeService);
@@ -240,5 +244,4 @@ function provideUiTheme(options = {}) {
240
244
  * Generated bundle index. Do not edit.
241
245
  */
242
246
 
243
- export { DEFAULT_THEME_MODE, DEFAULT_THEME_SEASON, RESOLVED_THEME_MODES, THEME_MODES, THEME_MODE_STORAGE_KEY, THEME_OPTIONS, THEME_SEASONS, THEME_SEASON_STORAGE_KEY, ThemeModeService, ThemeSeasonService, isResolvedThemeMode, isThemeMode, isThemeSeason, normalizeThemeMode, normalizeThemeSeason, provideUiTheme };
244
- //# sourceMappingURL=ojiepermana-angular-theme-styles.mjs.map
247
+ export { DEFAULT_THEME_MODE, DEFAULT_THEME_SEASON, RESOLVED_THEME_MODES, THEME_MODES, THEME_MODE_STORAGE_KEY, THEME_OPTIONS, THEME_SEASONS, THEME_SEASON_STORAGE_KEY, ThemeModeService, ThemeSeasonService, isResolvedThemeMode, isThemeMode, isThemeSeason, normalizeThemeMode, normalizeThemeSeason, provideUiTheme };
@@ -7,5 +7,4 @@
7
7
 
8
8
  /**
9
9
  * Generated bundle index. Do not edit.
10
- */
11
- //# sourceMappingURL=ojiepermana-angular-theme.mjs.map
10
+ */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ojiepermana/angular-theme",
3
- "version": "22.0.27",
3
+ "version": "22.0.29",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/edsis/angular.git"
@@ -13,21 +13,22 @@
13
13
  "@angular/common": ">=22.0.0",
14
14
  "@angular/core": ">=22.0.0",
15
15
  "@angular/router": ">=22.0.0",
16
- "@ojiepermana/angular-navigation": "^22.0.27",
17
- "@ojiepermana/angular-component": "^22.0.27",
16
+ "@ojiepermana/angular-navigation": "^22.0.29",
17
+ "@ojiepermana/angular-component": "^22.0.29",
18
18
  "rxjs": ">=7.8.0"
19
19
  },
20
20
  "dependencies": {
21
21
  "tslib": "^2.8.1"
22
22
  },
23
- "publishConfig": {
24
- "access": "public",
25
- "registry": "https://registry.npmjs.org/"
26
- },
27
- "sideEffects": false,
28
- "module": "fesm2022/ojiepermana-angular-theme.mjs",
29
- "typings": "types/ojiepermana-angular-theme.d.ts",
30
23
  "exports": {
24
+ "./theme.css": {
25
+ "style": "./styles/css/index.css",
26
+ "default": "./styles/css/index.css"
27
+ },
28
+ "./styles/css/*": {
29
+ "style": "./styles/css/*",
30
+ "default": "./styles/css/*"
31
+ },
31
32
  "./package.json": {
32
33
  "default": "./package.json"
33
34
  },
@@ -56,5 +57,12 @@
56
57
  "default": "./fesm2022/ojiepermana-angular-theme-styles.mjs"
57
58
  }
58
59
  },
60
+ "publishConfig": {
61
+ "access": "public",
62
+ "registry": "https://registry.npmjs.org/"
63
+ },
64
+ "sideEffects": false,
65
+ "module": "fesm2022/ojiepermana-angular-theme.mjs",
66
+ "typings": "types/ojiepermana-angular-theme.d.ts",
59
67
  "type": "module"
60
68
  }
package/styles/README.md CHANGED
@@ -23,6 +23,10 @@ export const appConfig = {
23
23
 
24
24
  ## Default Behavior
25
25
 
26
- - Material Symbols di-preload secara default saat `provideUiTheme()` dijalankan.
27
- - Untuk menonaktifkan preload global, set `icons.materialSymbols` ke `false`.
28
- - Komponen dari `@ojiepermana/angular-component/icon` tetap punya fallback lazy-load bila provider tema tidak dipakai.
26
+ - Material Symbols **tidak** di-preload secara default (opt-in). Tanpa konfigurasi,
27
+ `provideUiTheme()` tidak melakukan request jaringan eksternal apa pun — ramah privasi,
28
+ offline, dan CSP.
29
+ - Untuk mengaktifkan preload font dari Google Fonts, set `icons.materialSymbols` ke `true`,
30
+ atau self-host font Material Symbols dan `@import` sendiri di stylesheet Anda.
31
+ - Komponen dari `@ojiepermana/angular-component/icon` tetap punya fallback lazy-load bila
32
+ provider tema tidak dipakai / preload tidak diaktifkan.
@@ -4,9 +4,9 @@
4
4
  * Requires Tailwind CSS ^4.3.0.
5
5
  *
6
6
  * Usage (styles.css):
7
- * @import '@ojiepermana/angular-theme/styles/styles';
7
+ * @import '@ojiepermana/angular-theme/theme.css';
8
8
  * @import 'tailwindcss';
9
- * @import '@ojiepermana/angular-theme/styles/tailwind/theme.css';
9
+ * @import '@ojiepermana/angular-theme/styles/css/seasonal/base/tailwind.css';
10
10
  *
11
11
  * Maps the 3-layer HSL CSS variables onto Tailwind v4 design tokens so
12
12
  * utilities like `bg-primary`, `text-foreground`, `rounded-md`, and
@@ -4,9 +4,9 @@
4
4
  * Requires Tailwind CSS ^4.3.0.
5
5
  *
6
6
  * Usage (styles.css):
7
- * @import '@ojiepermana/angular-theme/styles/styles';
7
+ * @import '@ojiepermana/angular-theme/theme.css';
8
8
  * @import 'tailwindcss';
9
- * @import '@ojiepermana/angular-theme/styles/tailwind/theme.css';
9
+ * @import '@ojiepermana/angular-theme/styles/css/seasonal/imlek/tailwind.css';
10
10
  *
11
11
  * Maps the 3-layer HSL CSS variables onto Tailwind v4 design tokens so
12
12
  * utilities like `bg-primary`, `text-foreground`, `rounded-md`, and
@@ -18,6 +18,14 @@ declare function normalizeThemeMode(value: string | null | undefined): ThemeMode
18
18
  declare function normalizeThemeSeason(value: string | null | undefined): ThemeSeason;
19
19
 
20
20
  interface ThemeIconOptions {
21
+ /**
22
+ * Load the Material Symbols icon font from Google Fonts at startup.
23
+ *
24
+ * Default: `false` (opt-in). Left off, `provideUiTheme()` makes no external
25
+ * network request — better for privacy, offline, and strict CSP. Set to
26
+ * `true` to fetch `https://fonts.googleapis.com/css2`, or self-host the font
27
+ * and import it in your own stylesheet instead.
28
+ */
21
29
  readonly materialSymbols?: boolean;
22
30
  }
23
31
  interface ThemeOptions {
@@ -1 +0,0 @@
1
- {"version":3,"file":"ojiepermana-angular-theme-layout-services.mjs","sources":["../../../library/theme/layout/services/layout.service.ts","../../../library/theme/layout/services/layout-loading.service.ts","../../../library/theme/layout/services/layout-loading.interceptor.ts","../../../library/theme/layout/services/ojiepermana-angular-theme-layout-services.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { inject, PLATFORM_ID, Service, signal } from '@angular/core';\nimport {\n LAYOUT_APPEARANCE_STORAGE_KEY,\n isUiLayoutSurface,\n isUiLayoutStyle,\n isUiLayoutType,\n isUiLayoutWidth,\n LAYOUT_DEFAULT_SURFACE,\n LAYOUT_DEFAULT_STYLE,\n LAYOUT_DEFAULT_TYPE,\n LAYOUT_DEFAULT_WIDTH,\n LAYOUT_SURFACE_STORAGE_KEY,\n LAYOUT_STYLE_STORAGE_KEY,\n LAYOUT_TYPE_STORAGE_KEY,\n LAYOUT_WIDTH_STORAGE_KEY,\n type LayoutSurface,\n type LayoutStyle,\n type LayoutType,\n type LayoutWidth,\n} from '@ojiepermana/angular-theme/layout/types';\n\ninterface LayoutMutationOptions {\n persist?: boolean;\n}\n\n@Service()\nexport class LayoutService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly surfaceState = signal<LayoutSurface>(this.getStoredSurface());\n private readonly typeState = signal<LayoutType>(this.getStoredType());\n private readonly styleState = signal<LayoutStyle>(this.getStoredStyle());\n private readonly widthState = signal<LayoutWidth>(this.getStoredWidth());\n\n readonly surface = this.surfaceState.asReadonly();\n readonly type = this.typeState.asReadonly();\n readonly appearance = this.styleState.asReadonly();\n readonly width = this.widthState.asReadonly();\n\n registerDefaults(defaults: {\n surface?: LayoutSurface;\n appearance?: LayoutStyle;\n type?: LayoutType;\n width?: LayoutWidth;\n }): this {\n if (defaults.surface !== undefined) {\n this.registerSurface(defaults.surface);\n }\n\n if (defaults.appearance !== undefined) {\n this.registerAppearance(defaults.appearance);\n }\n\n if (defaults.type !== undefined) {\n this.registerType(defaults.type);\n }\n\n if (defaults.width !== undefined) {\n this.registerWidth(defaults.width);\n }\n\n return this;\n }\n\n registerSurface(surface: LayoutSurface): void {\n const storedSurface = this.readStorage(LAYOUT_SURFACE_STORAGE_KEY);\n\n if (isUiLayoutSurface(storedSurface)) {\n this.surfaceState.set(storedSurface);\n return;\n }\n\n this.setSurface(surface);\n }\n\n registerType(type: LayoutType): void {\n const storedType = this.readStorage(LAYOUT_TYPE_STORAGE_KEY);\n\n if (isUiLayoutType(storedType)) {\n this.typeState.set(storedType);\n return;\n }\n\n this.setType(type);\n }\n\n registerAppearance(appearance: LayoutStyle): void {\n this.setAppearance(this.getStoredAppearanceOrDefault(appearance));\n }\n\n registerWidth(width: LayoutWidth): void {\n const storedWidth = this.readStorage(LAYOUT_WIDTH_STORAGE_KEY);\n\n if (isUiLayoutWidth(storedWidth)) {\n this.widthState.set(storedWidth);\n return;\n }\n\n this.setWidth(width);\n }\n\n setSurface(surface: LayoutSurface, options: LayoutMutationOptions = {}): void {\n this.surfaceState.set(surface);\n\n if (options.persist === false) {\n return;\n }\n\n this.writeStorage(LAYOUT_SURFACE_STORAGE_KEY, surface);\n }\n\n setType(type: LayoutType, options: LayoutMutationOptions = {}): void {\n this.typeState.set(type);\n\n if (options.persist === false) {\n return;\n }\n\n this.writeStorage(LAYOUT_TYPE_STORAGE_KEY, type);\n }\n\n setAppearance(appearance: LayoutStyle, options: LayoutMutationOptions = {}): void {\n this.styleState.set(appearance);\n\n if (options.persist === false) {\n return;\n }\n\n this.writeStorage(LAYOUT_APPEARANCE_STORAGE_KEY, appearance);\n this.removeStorage(LAYOUT_STYLE_STORAGE_KEY);\n }\n\n setWidth(width: LayoutWidth, options: LayoutMutationOptions = {}): void {\n this.widthState.set(width);\n\n if (options.persist === false) {\n return;\n }\n\n this.writeStorage(LAYOUT_WIDTH_STORAGE_KEY, width);\n }\n\n getStoredSurface(): LayoutSurface {\n const value = this.readStorage(LAYOUT_SURFACE_STORAGE_KEY);\n return isUiLayoutSurface(value) ? value : LAYOUT_DEFAULT_SURFACE;\n }\n\n getStoredType(): LayoutType {\n const value = this.readStorage(LAYOUT_TYPE_STORAGE_KEY);\n return isUiLayoutType(value) ? value : LAYOUT_DEFAULT_TYPE;\n }\n\n getStoredAppearance(): LayoutStyle {\n const value = this.readStoredAppearance();\n return value ?? LAYOUT_DEFAULT_STYLE;\n }\n\n getStoredStyle(): LayoutStyle {\n return this.getStoredAppearance();\n }\n\n getStoredWidth(): LayoutWidth {\n const value = this.readStorage(LAYOUT_WIDTH_STORAGE_KEY);\n return isUiLayoutWidth(value) ? value : LAYOUT_DEFAULT_WIDTH;\n }\n\n private readStorage(key: string): string | null {\n const storage = this.getStorage();\n if (!storage) {\n return null;\n }\n\n try {\n return storage.getItem(key);\n } catch {\n return null;\n }\n }\n\n private removeStorage(key: string): void {\n const storage = this.getStorage();\n if (!storage) {\n return;\n }\n\n try {\n storage.removeItem(key);\n } catch {\n return;\n }\n }\n\n private writeStorage(key: string, value: string): void {\n const storage = this.getStorage();\n if (!storage) {\n return;\n }\n\n try {\n storage.setItem(key, value);\n } catch {\n return;\n }\n }\n\n private getStorage(): Storage | null {\n if (!isPlatformBrowser(this.platformId)) {\n return null;\n }\n\n try {\n return localStorage;\n } catch {\n return null;\n }\n }\n\n private readStoredAppearance(): LayoutStyle | null {\n const appearance = this.readStorage(LAYOUT_APPEARANCE_STORAGE_KEY);\n if (isUiLayoutStyle(appearance)) {\n return appearance;\n }\n\n const legacyStyle = this.readStorage(LAYOUT_STYLE_STORAGE_KEY);\n return isUiLayoutStyle(legacyStyle) ? legacyStyle : null;\n }\n\n private getStoredAppearanceOrDefault(fallback: LayoutStyle): LayoutStyle {\n return this.readStoredAppearance() ?? fallback;\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { computed, DestroyRef, inject, PLATFORM_ID, Service, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n NavigationSkipped,\n NavigationStart,\n Router,\n} from '@angular/router';\n\n/** Progres awal saat bar mulai tampil, supaya garis langsung terlihat bergerak. */\nexport const LAYOUT_LOADING_INITIAL_PROGRESS = 8;\n/** Batas atas progres trickle; sisanya menunggu seluruh pekerjaan selesai. */\nexport const LAYOUT_LOADING_TRICKLE_CEILING = 90;\n/** Interval kenaikan progres trickle selama masih ada pekerjaan tertunda. */\nexport const LAYOUT_LOADING_TRICKLE_INTERVAL_MS = 250;\n/** Jeda setelah progres 100% sebelum bar disembunyikan, agar transisi terbaca. */\nexport const LAYOUT_LOADING_HIDE_DELAY_MS = 200;\n\n/**\n * Pelacak loading global untuk garis progres di tepi atas browser.\n *\n * Otomatis aktif saat router memulai navigasi (membuka halaman) dan saat\n * request HTTP berjalan lewat `layoutLoadingInterceptor`. Sumber loading lain\n * (mis. pemuatan data manual) bisa ikut dilacak lewat pasangan\n * `start()`/`done()` yang dihitung secara ref-count.\n */\n@Service()\nexport class LayoutLoadingService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly router = inject(Router, { optional: true });\n\n private readonly pendingCount = signal(0);\n private readonly activeState = signal(false);\n private readonly progressState = signal(0);\n\n /** Bar sedang tampil (termasuk jeda singkat penyelesaian ke 100%). */\n readonly active = this.activeState.asReadonly();\n /** Progres garis 0–100. */\n readonly progress = this.progressState.asReadonly();\n /** Masih ada pekerjaan (navigasi/request/data) yang belum selesai. */\n readonly pending = computed(() => this.pendingCount() > 0);\n\n private readonly hostRegistry = signal<readonly number[]>([]);\n /**\n * Host `LayoutLoading` terdaftar paling awal yang menggambar bar. Instance\n * lain (mis. di dalam `Layout` saat app root juga memasang `LayoutLoading`)\n * menjadi inert supaya garis progres tidak dirender ganda.\n */\n readonly primaryHostId = computed(() => this.hostRegistry()[0] ?? null);\n\n private trickleTimer: ReturnType<typeof setInterval> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n private navigationPending = false;\n private nextHostId = 0;\n\n constructor() {\n this.observeRouterNavigation();\n inject(DestroyRef).onDestroy(() => {\n this.stopTrickle();\n this.cancelScheduledHide();\n });\n }\n\n /** Menandai satu pekerjaan dimulai; bar tampil saat pekerjaan pertama masuk. */\n start(): void {\n this.pendingCount.update((count) => count + 1);\n\n if (this.pendingCount() === 1) {\n this.show();\n }\n }\n\n /** Menandai satu pekerjaan selesai; bar dituntaskan saat hitungan kembali nol. */\n done(): void {\n if (this.pendingCount() === 0) {\n return;\n }\n\n this.pendingCount.update((count) => count - 1);\n\n if (this.pendingCount() === 0) {\n this.finish();\n }\n }\n\n /** Mendaftarkan satu host `LayoutLoading`; mengembalikan id untuk unregister. */\n registerHost(): number {\n const hostId = this.nextHostId++;\n this.hostRegistry.update((hosts) => [...hosts, hostId]);\n return hostId;\n }\n\n /** Melepas host; host terdaftar berikutnya otomatis menjadi primary. */\n unregisterHost(hostId: number): void {\n this.hostRegistry.update((hosts) => hosts.filter((registered) => registered !== hostId));\n }\n\n /** Memaksa nilai progres (0–100) selama bar aktif, mis. untuk upload besar. */\n setProgress(value: number): void {\n if (!this.activeState()) {\n return;\n }\n\n this.progressState.set(Math.min(100, Math.max(0, value)));\n }\n\n private observeRouterNavigation(): void {\n if (!this.router) {\n return;\n }\n\n this.router.events.pipe(takeUntilDestroyed()).subscribe((event) => {\n if (event instanceof NavigationStart) {\n if (!this.navigationPending) {\n this.navigationPending = true;\n this.start();\n }\n\n return;\n }\n\n const navigationSettled =\n event instanceof NavigationEnd ||\n event instanceof NavigationCancel ||\n event instanceof NavigationError ||\n event instanceof NavigationSkipped;\n\n if (navigationSettled && this.navigationPending) {\n this.navigationPending = false;\n this.done();\n }\n });\n }\n\n private show(): void {\n this.cancelScheduledHide();\n this.activeState.set(true);\n this.progressState.set(LAYOUT_LOADING_INITIAL_PROGRESS);\n this.startTrickle();\n }\n\n private finish(): void {\n this.stopTrickle();\n this.progressState.set(100);\n\n if (!this.isBrowser()) {\n this.hide();\n return;\n }\n\n this.hideTimer = setTimeout(() => {\n this.hideTimer = null;\n this.hide();\n }, LAYOUT_LOADING_HIDE_DELAY_MS);\n }\n\n private hide(): void {\n this.activeState.set(false);\n this.progressState.set(0);\n }\n\n private startTrickle(): void {\n if (!this.isBrowser() || this.trickleTimer !== null) {\n return;\n }\n\n this.trickleTimer = setInterval(() => {\n const current = this.progressState();\n const next = current + (LAYOUT_LOADING_TRICKLE_CEILING - current) * 0.15;\n this.progressState.set(Math.min(LAYOUT_LOADING_TRICKLE_CEILING, next));\n }, LAYOUT_LOADING_TRICKLE_INTERVAL_MS);\n }\n\n private stopTrickle(): void {\n if (this.trickleTimer !== null) {\n clearInterval(this.trickleTimer);\n this.trickleTimer = null;\n }\n }\n\n private cancelScheduledHide(): void {\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n private isBrowser(): boolean {\n return isPlatformBrowser(this.platformId);\n }\n}\n","import { HttpContextToken, type HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { finalize } from 'rxjs';\n\nimport { LayoutLoadingService } from './layout-loading.service';\n\n/**\n * Set `true` pada `HttpContext` request untuk mengecualikannya dari garis\n * progres, mis. polling/heartbeat yang tidak boleh memicu indikator loading.\n */\nexport const LAYOUT_LOADING_SKIP = new HttpContextToken<boolean>(() => false);\n\n/**\n * Interceptor yang menyalakan garis progres `LayoutLoading` selama request\n * HTTP berjalan. Daftarkan lewat `withInterceptors([...])` di aplikasi.\n */\nexport const layoutLoadingInterceptor: HttpInterceptorFn = (request, next) => {\n if (request.context.get(LAYOUT_LOADING_SKIP)) {\n return next(request);\n }\n\n const loading = inject(LayoutLoadingService);\n loading.start();\n\n return next(request).pipe(finalize(() => loading.done()));\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ojiepermana-angular-theme-layout-types.mjs","sources":["../../../library/theme/layout/types/layout.types.ts","../../../library/theme/layout/types/ojiepermana-angular-theme-layout-types.ts"],"sourcesContent":["import type { Signal } from '@angular/core';\n\nexport const LAYOUT_TYPES = ['vertical', 'horizontal', 'empty', 'fluid'] as const;\nexport const LAYOUT_SURFACES = ['flat', 'grid', 'honeycome', 'line-vertical', 'line-horizontal'] as const;\nexport const LAYOUT_STYLES = ['flat', 'border-rail'] as const;\nexport const LAYOUT_WIDTHS = ['full', 'wide', 'container', 'fluid'] as const;\n\nexport type LayoutType = (typeof LAYOUT_TYPES)[number];\nexport type LayoutSurface = (typeof LAYOUT_SURFACES)[number];\nexport type LayoutStyle = (typeof LAYOUT_STYLES)[number];\nexport type LayoutWidth = (typeof LAYOUT_WIDTHS)[number];\n\nexport const LAYOUT_DEFAULT_SURFACE: LayoutSurface = 'flat';\nexport const LAYOUT_DEFAULT_TYPE: LayoutType = 'vertical';\nexport const LAYOUT_DEFAULT_STYLE: LayoutStyle = 'flat';\nexport const LAYOUT_DEFAULT_WIDTH: LayoutWidth = 'full';\n\nexport const LAYOUT_SURFACE_STORAGE_KEY = 'layout-surface';\nexport const LAYOUT_APPEARANCE_STORAGE_KEY = 'layout-appearance';\nexport const LAYOUT_TYPE_STORAGE_KEY = 'layout-type';\nexport const LAYOUT_STYLE_STORAGE_KEY = 'layout-style';\nexport const LAYOUT_WIDTH_STORAGE_KEY = 'layout-width';\n\nexport interface LayoutContextValue {\n surface: Signal<LayoutSurface>;\n type: Signal<LayoutType>;\n appearance: Signal<LayoutStyle>;\n style: Signal<LayoutStyle>;\n width: Signal<LayoutWidth>;\n}\n\nexport function isUiLayoutSurface(value: string | null): value is LayoutSurface {\n return value !== null && (LAYOUT_SURFACES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutType(value: string | null): value is LayoutType {\n return value !== null && (LAYOUT_TYPES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutStyle(value: string | null): value is LayoutStyle {\n return value !== null && (LAYOUT_STYLES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutWidth(value: string | null): value is LayoutWidth {\n return value !== null && (LAYOUT_WIDTHS as readonly string[]).includes(value);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAEO,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;AAChE,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB;MAClF,aAAa,GAAG,CAAC,MAAM,EAAE,aAAa;AAC5C,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;AAO3D,MAAM,sBAAsB,GAAkB;AAC9C,MAAM,mBAAmB,GAAe;AACxC,MAAM,oBAAoB,GAAgB;AAC1C,MAAM,oBAAoB,GAAgB;AAE1C,MAAM,0BAA0B,GAAG;AACnC,MAAM,6BAA6B,GAAG;AACtC,MAAM,uBAAuB,GAAG;AAChC,MAAM,wBAAwB,GAAG;AACjC,MAAM,wBAAwB,GAAG;AAUlC,SAAU,iBAAiB,CAAC,KAAoB,EAAA;IACpD,OAAO,KAAK,KAAK,IAAI,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC;AACjF;AAEM,SAAU,cAAc,CAAC,KAAoB,EAAA;IACjD,OAAO,KAAK,KAAK,IAAI,IAAK,YAAkC,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC9E;AAEM,SAAU,eAAe,CAAC,KAAoB,EAAA;IAClD,OAAO,KAAK,KAAK,IAAI,IAAK,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC/E;AAEM,SAAU,eAAe,CAAC,KAAoB,EAAA;IAClD,OAAO,KAAK,KAAK,IAAI,IAAK,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC/E;;AC7CA;;AAEG;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ojiepermana-angular-theme-layout.mjs","sources":["../../../library/theme/layout/loading/layout-loading.component.ts","../../../library/theme/layout/layout.component.ts","../../../library/theme/layout/vertical/layout-vertical.component.ts","../../../library/theme/layout/horizontal/layout-horizontal.component.ts","../../../library/theme/layout/empty/layout-empty.component.ts","../../../library/theme/layout/fluid/layout-fluid.component.ts","../../../library/theme/layout/navigation/layout-navigation.component.ts","../../../library/theme/layout/content/layout-content.component.ts","../../../library/theme/layout/ojiepermana-angular-theme-layout.ts"],"sourcesContent":["import { Component, computed, DestroyRef, inject, input } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { LayoutLoadingService } from '@ojiepermana/angular-theme/layout/services';\n\n/**\n * Garis progres tipis di tepi atas browser yang bergerak dari kiri ke kanan.\n * Dirender otomatis oleh `Layout` dan dikendalikan `LayoutLoadingService`,\n * sehingga aktif sendiri saat navigasi halaman atau pemuatan data berjalan.\n *\n * Boleh juga dipasang langsung di root aplikasi agar bar sudah tampil sejak\n * navigasi awal; instance tambahan di dalam `Layout` otomatis inert sehingga\n * garis tidak pernah dirender ganda.\n */\n@Component({\n selector: 'LayoutLoading',\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-state]': 'state()',\n },\n template: `\n @if (isPrimary() && loading.active()) {\n <div\n role=\"progressbar\"\n data-layout-loading-track\n class=\"h-full w-full\"\n [attr.aria-label]=\"ariaLabel()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"roundedProgress()\">\n <div\n data-layout-loading-bar\n class=\"h-full rounded-r-full bg-primary transition-[width] duration-200 ease-out\"\n [style.width.%]=\"loading.progress()\"></div>\n </div>\n }\n `,\n})\nexport class LayoutLoadingComponent {\n protected readonly loading = inject(LayoutLoadingService);\n private readonly hostId = this.loading.registerHost();\n\n readonly class = input<string>('');\n readonly ariaLabel = input<string>('Memuat halaman');\n\n protected readonly isPrimary = computed(() => this.loading.primaryHostId() === this.hostId);\n protected readonly state = computed(() => {\n if (!this.isPrimary()) {\n return 'inert';\n }\n\n return this.loading.active() ? 'active' : 'idle';\n });\n protected readonly hostClasses = computed(() =>\n cn('pointer-events-none fixed inset-x-0 top-0 z-50 block h-0.5', this.class()),\n );\n protected readonly roundedProgress = computed(() => Math.round(this.loading.progress()));\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.loading.unregisterHost(this.hostId));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { LayoutService } from '@ojiepermana/angular-theme/layout/services';\nimport { LayoutLoadingComponent } from './loading/layout-loading.component';\nimport {\n LAYOUT_DEFAULT_STYLE,\n LAYOUT_DEFAULT_SURFACE,\n LAYOUT_DEFAULT_WIDTH,\n type LayoutStyle,\n type LayoutSurface,\n type LayoutWidth,\n} from '@ojiepermana/angular-theme/layout/types';\n\n@Component({\n selector: 'Layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LayoutLoadingComponent],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-surface]': 'resolvedSurface()',\n '[attr.data-layout-appearance]': 'resolvedAppearance()',\n '[attr.data-layout-style]': 'resolvedStyle()',\n '[attr.data-layout-width]': 'resolvedWidth()',\n '[attr.data-layout-type]': 'layout.type()',\n },\n template: `\n <LayoutLoading />\n\n <div data-layout-stage [class]=\"frameStageClasses()\">\n @if (isBorderRail()) {\n <div\n aria-hidden=\"true\"\n data-layout-rail\n class=\"pointer-events-none col-start-1 row-start-1 z-0 overflow-visible\">\n <div data-layout-rail-anchor [class]=\"railAnchorClasses()\">\n <div\n data-layout-rail-top-left-horizontal\n class=\"absolute top-0 right-full h-[1.5px] w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-top-left-vertical\n class=\"absolute bottom-full left-0 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n <div\n data-layout-rail-top-right-horizontal\n class=\"absolute top-0 left-full h-[1.5px] w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-top-right-vertical\n class=\"absolute bottom-full right-0 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n <div\n data-layout-rail-bottom-left-horizontal\n class=\"absolute bottom-0 right-full h-[1.5px] w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-bottom-left-vertical\n class=\"absolute top-full left-0 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n <div\n data-layout-rail-bottom-right-horizontal\n class=\"absolute bottom-0 left-full h-[1.5px] w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-bottom-right-vertical\n class=\"absolute top-full right-0 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n\n @if (showsInsetRails()) {\n <div data-layout-horizontal-top-rail class=\"absolute inset-x-0 top-12 h-[1.5px] bg-border\"></div>\n <div\n data-layout-horizontal-top-left-extension\n class=\"absolute top-12 right-full h-[1.5px] w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-horizontal-top-right-extension\n class=\"absolute top-12 left-full h-[1.5px] w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div data-layout-horizontal-bottom-rail class=\"absolute inset-x-0 bottom-12 h-[1.5px] bg-border\"></div>\n <div\n data-layout-horizontal-bottom-left-extension\n class=\"absolute bottom-12 right-full h-[1.5px] w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-horizontal-bottom-right-extension\n class=\"absolute bottom-12 left-full h-[1.5px] w-[calc((100vw-100%)/2)] bg-border\"></div>\n\n <div data-layout-vertical-left-rail class=\"absolute inset-y-0 -left-4 w-[1.5px] bg-border\"></div>\n <div\n data-layout-vertical-left-top-extension\n class=\"absolute bottom-full -left-4 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n <div\n data-layout-vertical-left-bottom-extension\n class=\"absolute top-full -left-4 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n <div data-layout-vertical-right-rail class=\"absolute inset-y-0 -right-4 w-[1.5px] bg-border\"></div>\n <div\n data-layout-vertical-right-top-extension\n class=\"absolute bottom-full -right-4 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n <div\n data-layout-vertical-right-bottom-extension\n class=\"absolute top-full -right-4 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n }\n </div>\n </div>\n }\n\n <div data-layout-frame [class]=\"frameLayerClasses()\">\n <div [class]=\"contentShellClasses()\">\n <ng-content />\n </div>\n </div>\n </div>\n `,\n})\nexport class LayoutComponent {\n protected readonly layout = inject(LayoutService);\n\n readonly surface = input<LayoutSurface | null>(null);\n readonly appearance = input<LayoutStyle | null>(null);\n readonly layoutStyleAttribute = input<LayoutStyle | null>(null, { alias: 'layout-style' });\n readonly width = input<LayoutWidth | null>(null);\n readonly class = input<string>('');\n\n protected readonly appearanceInput = computed(() => this.appearance() ?? this.layoutStyleAttribute());\n protected readonly resolvedSurface = computed(() => this.surface() ?? this.layout.surface());\n protected readonly resolvedAppearance = computed(() => this.appearanceInput() ?? this.layout.appearance());\n protected readonly resolvedStyle = computed(() => this.layout.appearance());\n protected readonly resolvedWidth = computed(() => this.width() ?? this.layout.width());\n protected readonly isBorderRail = computed(() => this.resolvedAppearance() === 'border-rail');\n protected readonly isFluidFrame = computed(() => this.resolvedWidth() === 'fluid' && this.layout.type() === 'fluid');\n protected readonly showsInsetRails = computed(() => {\n const layoutType = this.layout.type();\n return this.isBorderRail() && (layoutType === 'horizontal' || layoutType === 'vertical');\n });\n protected readonly frameStageClasses = computed(() =>\n cn('relative grid min-h-0 min-w-0 grid-cols-1 grid-rows-1', this.frameSizeClasses()),\n );\n protected readonly railAnchorClasses = computed(() => 'relative h-full min-h-0 w-full min-w-0');\n protected readonly contentShellClasses = computed(() =>\n cn(\n 'relative z-10 min-h-0 min-w-0',\n this.isFluidFrame() ? 'h-auto w-auto max-h-full max-w-full' : 'h-full w-full',\n this.isBorderRail() ? 'overflow-visible' : 'overflow-hidden',\n ),\n );\n\n protected readonly hostClasses = computed(() =>\n cn(\n 'relative isolate h-dvh w-full min-w-0 box-border overflow-hidden text-foreground',\n this.isFluidFrame() ? 'grid place-items-center' : 'block',\n this.surfaceClasses(),\n this.widthPaddingClasses(),\n this.class(),\n ),\n );\n\n protected readonly frameClasses = computed(() =>\n cn(\n 'relative min-h-0 min-w-0 border-border bg-background/55 backdrop-blur-xs',\n this.frameSizeClasses(),\n this.isBorderRail() ? 'overflow-visible border-[1.5px]' : 'overflow-hidden border',\n ),\n );\n protected readonly frameLayerClasses = computed(() => cn('col-start-1 row-start-1', this.frameClasses()));\n\n constructor() {\n effect(() => {\n const surface = this.surface();\n if (surface !== null) {\n this.layout.setSurface(surface, { persist: false });\n } else {\n this.layout.registerSurface(LAYOUT_DEFAULT_SURFACE);\n }\n\n const appearance = this.appearanceInput();\n if (appearance !== null) {\n this.layout.setAppearance(appearance, { persist: false });\n } else {\n this.layout.registerAppearance(LAYOUT_DEFAULT_STYLE);\n }\n\n const width = this.width();\n if (width !== null) {\n this.layout.setWidth(width, { persist: false });\n } else {\n this.layout.registerWidth(LAYOUT_DEFAULT_WIDTH);\n }\n });\n }\n\n private surfaceClasses(): string {\n switch (this.resolvedSurface()) {\n case 'grid':\n return '[--layout-grid-size:2rem] bg-background bg-[linear-gradient(hsl(var(--layout-grid-line)/var(--layout-grid-line-opacity))_1px,transparent_1px),linear-gradient(to_right,hsl(var(--layout-grid-line)/var(--layout-grid-line-opacity))_1px,transparent_1px)] bg-position-[center_center] bg-size-[var(--layout-grid-size)_var(--layout-grid-size)]';\n case 'honeycome':\n return 'bg-background bg-[radial-gradient(circle_at_0_0,hsl(var(--layout-grid-line)/var(--layout-grid-dot-opacity))_1px,transparent_1.5px)] bg-position-[center_center] bg-size-[1.25rem_1.25rem]';\n case 'line-vertical':\n return 'bg-background bg-[linear-gradient(to_right,hsl(var(--layout-grid-line)/var(--layout-grid-dot-opacity))_1px,transparent_1px)] bg-position-[center_center] bg-size-[2rem_2rem]';\n case 'line-horizontal':\n return 'bg-background bg-[linear-gradient(hsl(var(--layout-grid-line)/var(--layout-grid-dot-opacity))_1px,transparent_1px)] bg-position-[center_center] bg-size-[2rem_2rem]';\n default:\n return 'bg-background';\n }\n }\n\n private widthPaddingClasses(): string {\n switch (this.resolvedWidth()) {\n case 'wide':\n return 'p-4 lg:p-12';\n case 'container':\n return 'p-4 lg:px-0 lg:py-16';\n case 'fluid':\n return 'p-4 sm:p-6 lg:p-8';\n default:\n return 'p-4';\n }\n }\n\n private frameSizeClasses(): string {\n if (this.isFluidFrame()) {\n return 'h-auto w-auto max-h-full max-w-full';\n }\n\n return this.resolvedWidth() === 'container' ? 'h-full w-full lg:container lg:mx-auto' : 'h-full w-full';\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { LayoutService } from '@ojiepermana/angular-theme/layout/services';\n\n@Component({\n selector: 'LayoutVertical',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'vertical',\n },\n template: `<ng-content />`,\n})\nexport class LayoutVerticalComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() =>\n cn(\n 'grid h-full min-h-0 w-full min-w-0 grid-cols-[auto_minmax(0,1fr)]',\n this.layout.appearance() === 'border-rail' ? 'overflow-visible' : 'overflow-hidden',\n this.class(),\n ),\n );\n\n constructor() {\n this.layout.setType('vertical', { persist: false });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { LayoutService } from '@ojiepermana/angular-theme/layout/services';\n\n@Component({\n selector: 'LayoutHorizontal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'horizontal',\n },\n template: `<ng-content />`,\n})\nexport class LayoutHorizontalComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() =>\n cn('flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden', this.class()),\n );\n\n constructor() {\n this.layout.setType('horizontal', { persist: false });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { LayoutService } from '@ojiepermana/angular-theme/layout/services';\n\n@Component({\n selector: 'LayoutEmpty',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'empty',\n },\n template: `<ng-content />`,\n})\nexport class LayoutEmptyComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() => cn('h-full min-h-0 w-full min-w-0 overflow-hidden', this.class()));\n\n constructor() {\n this.layout.setType('empty', { persist: false });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { LayoutService } from '@ojiepermana/angular-theme/layout/services';\n\n@Component({\n selector: 'LayoutFluid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'fluid',\n },\n template: `<ng-content />`,\n})\nexport class LayoutFluidComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() =>\n cn(\n 'grid min-h-0 min-w-0 place-items-center overflow-auto',\n this.layout.width() === 'fluid' ? 'h-auto w-auto max-h-full max-w-full' : 'h-full w-full',\n this.class(),\n ),\n );\n\n constructor() {\n this.layout.setType('fluid', { persist: false });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, contentChild, inject, input } from '@angular/core';\nimport { NavigationContainerComponent } from '@ojiepermana/angular-navigation';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { LayoutService } from '@ojiepermana/angular-theme/layout/services';\n\n@Component({\n selector: 'LayoutNavigation',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n role: 'navigation',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.data-layout-type]': 'layout.type()',\n '[attr.data-layout-appearance]': 'layout.appearance()',\n '[attr.data-layout-style]': 'layout.appearance()',\n '[attr.data-layout-nav-rail-offset]': 'resolvedRailOffset()',\n },\n template: `\n @if (showsVerticalRail()) {\n <div\n aria-hidden=\"true\"\n data-layout-nav-rail\n class=\"pointer-events-none absolute inset-y-0 right-0 z-20 w-[1.5px] transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none\"\n [style.transform]=\"railTransform()\">\n <div data-layout-nav-rail-line class=\"absolute inset-y-0 right-0 w-[1.5px] bg-border\"></div>\n <div\n data-layout-nav-rail-top\n class=\"absolute bottom-full right-0 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n <div\n data-layout-nav-rail-bottom\n class=\"absolute top-full right-0 h-[calc((100dvh-100%)/2)] w-[1.5px] bg-border\"></div>\n </div>\n }\n\n <ng-content />\n `,\n})\nexport class LayoutNavigationComponent {\n protected readonly layout = inject(LayoutService);\n protected readonly projectedNav = contentChild(NavigationContainerComponent);\n\n readonly ariaLabel = input<string>('Layout navigation');\n readonly railOffset = input<string | null>(null);\n readonly class = input<string>('');\n protected readonly showsVerticalRail = computed(\n () => this.layout.type() === 'vertical' && this.layout.appearance() === 'border-rail',\n );\n protected readonly resolvedRailOffset = computed(\n () => this.railOffset() ?? this.projectedNav()?.previewRailOffset() ?? '0px',\n );\n protected readonly railTransform = computed(() => `translateX(${this.resolvedRailOffset()})`);\n\n protected readonly classes = computed(() => {\n const layoutType = this.layout.type();\n\n return cn(\n 'relative block min-h-0 min-w-0',\n layoutType === 'horizontal' && 'h-12 min-h-12 w-full shrink-0 overflow-visible',\n // overflow-visible: clipping diatur host <Navigation>; overlay nav (aside\n // drawer dockbar, preview rail) keluar dari kolom w-16 dan overflow-hidden\n // di sini ikut ter-scroll oleh focus scroll-into-view sehingga rail hilang.\n layoutType === 'vertical' && 'h-full w-max max-w-full shrink-0 overflow-visible',\n layoutType === 'empty' && 'hidden',\n this.class(),\n );\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { LayoutService } from '@ojiepermana/angular-theme/layout/services';\n\n@Component({\n selector: 'LayoutContent',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n '[attr.data-layout-type]': 'layout.type()',\n '[attr.data-layout-width]': 'layout.width()',\n },\n template: `<ng-content />`,\n})\nexport class LayoutContentComponent {\n protected readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() => {\n const layoutType = this.layout.type();\n\n return cn(\n 'block min-h-0 min-w-0 overflow-auto',\n layoutType === 'horizontal' && 'flex-1',\n layoutType === 'vertical' && 'h-full',\n layoutType === 'empty' && 'h-full w-full',\n this.layout.width() === 'container' && 'w-full lg:container lg:mx-auto',\n this.class(),\n );\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAIA;;;;;;;;AAQG;MAyBU,sBAAsB,CAAA;AACd,IAAA,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACxC,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;IAE5C,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;IACzB,SAAS,GAAG,KAAK,CAAS,gBAAgB;kFAAC;AAEjC,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,MAAM;kFAAC;AACxE,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACrB,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,GAAG,MAAM;IAClD,CAAC;8EAAC;AACiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,EAAE,CAAC,4DAA4D,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;oFAC/E;AACkB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;wFAAC;AAExF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9E;uGAtBW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAlBvB;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAxBlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,mBAAmB,EAAE,SAAS;AAC/B,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA;AACF,iBAAA;;;MCmEY,eAAe,CAAA;AACP,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAExC,OAAO,GAAG,KAAK,CAAuB,IAAI;gFAAC;IAC3C,UAAU,GAAG,KAAK,CAAqB,IAAI;mFAAC;IAC5C,oBAAoB,GAAG,KAAK,CAAqB,IAAI,4FAAI,KAAK,EAAE,cAAc,EAAA,CAAG;IACjF,KAAK,GAAG,KAAK,CAAqB,IAAI;8EAAC;IACvC,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;AAEf,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE;wFAAC;AAClF,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;wFAAC;AACzE,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;2FAAC;IACvF,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;sFAAC;AACxD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;sFAAC;IACnE,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,KAAK,aAAa;qFAAC;IAC1E,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO;qFAAC;AACjG,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACrC,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,UAAU,CAAC;IAC1F,CAAC;wFAAC;AACiB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAC9C,EAAE,CAAC,uDAAuD,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;0FACrF;AACkB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,wCAAwC;0FAAC;AAC5E,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAChD,EAAE,CACA,+BAA+B,EAC/B,IAAI,CAAC,YAAY,EAAE,GAAG,qCAAqC,GAAG,eAAe,EAC7E,IAAI,CAAC,YAAY,EAAE,GAAG,kBAAkB,GAAG,iBAAiB,CAC7D;4FACF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,EAAE,CACA,kFAAkF,EAClF,IAAI,CAAC,YAAY,EAAE,GAAG,yBAAyB,GAAG,OAAO,EACzD,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,mBAAmB,EAAE,EAC1B,IAAI,CAAC,KAAK,EAAE,CACb;oFACF;IAEkB,YAAY,GAAG,QAAQ,CAAC,MACzC,EAAE,CACA,0EAA0E,EAC1E,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,YAAY,EAAE,GAAG,iCAAiC,GAAG,wBAAwB,CACnF;qFACF;AACkB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,yBAAyB,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;0FAAC;AAEzG,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,IAAI,OAAO,KAAK,IAAI,EAAE;AACpB,gBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACrD;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,sBAAsB,CAAC;YACrD;AAEA,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC3D;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;YACtD;AAEA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACjD;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC;YACjD;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,cAAc,GAAA;AACpB,QAAA,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC5B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,iVAAiV;AAC1V,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,2LAA2L;AACpM,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,8KAA8K;AACvL,YAAA,KAAK,iBAAiB;AACpB,gBAAA,OAAO,qKAAqK;AAC9K,YAAA;AACE,gBAAA,OAAO,eAAe;;IAE5B;IAEQ,mBAAmB,GAAA;AACzB,QAAA,QAAQ,IAAI,CAAC,aAAa,EAAE;AAC1B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,sBAAsB;AAC/B,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,mBAAmB;AAC5B,YAAA;AACE,gBAAA,OAAO,KAAK;;IAElB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,OAAO,qCAAqC;QAC9C;AAEA,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,WAAW,GAAG,uCAAuC,GAAG,eAAe;IACzG;uGA9GW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9EhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4ET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EArFS,sBAAsB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAuFrB,eAAe,EAAA,UAAA,EAAA,CAAA;kBA1F3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,sBAAsB,CAAC;AACjC,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,qBAAqB,EAAE,mBAAmB;AAC1C,wBAAA,+BAA+B,EAAE,sBAAsB;AACvD,wBAAA,0BAA0B,EAAE,iBAAiB;AAC7C,wBAAA,0BAA0B,EAAE,iBAAiB;AAC7C,wBAAA,yBAAyB,EAAE,eAAe;AAC3C,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4ET,EAAA,CAAA;AACF,iBAAA;;;MCzFY,uBAAuB,CAAA;AACjB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAEtC,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CACA,mEAAmE,EACnE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,aAAa,GAAG,kBAAkB,GAAG,iBAAiB,EACnF,IAAI,CAAC,KAAK,EAAE,CACb;gFACF;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACrD;uGAfW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,8SAFxB,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEf,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBATnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;oBAC1B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,kBAAkB,EAAE,UAAU;AAC/B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;MCCY,yBAAyB,CAAA;AACnB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAEtC,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CAAC,6DAA6D,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gFAChF;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACvD;uGAXW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,kTAF1B,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEf,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBATrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;oBAC5B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,kBAAkB,EAAE,YAAY;AACjC,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;MCCY,oBAAoB,CAAA;AACd,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAEtC,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,+CAA+C,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gFAAC;AAE9G,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClD;uGATW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,wSAFrB,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEf,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAThC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;oBACvB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,kBAAkB,EAAE,OAAO;AAC5B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;MCCY,oBAAoB,CAAA;AACd,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAEtC,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CACA,uDAAuD,EACvD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,OAAO,GAAG,qCAAqC,GAAG,eAAe,EACzF,IAAI,CAAC,KAAK,EAAE,CACb;gFACF;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClD;uGAfW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,wSAFrB,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEf,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAThC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;oBACvB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,kBAAkB,EAAE,OAAO;AAC5B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;MCyBY,yBAAyB,CAAA;AACjB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAC9B,YAAY,GAAG,YAAY,CAAC,4BAA4B;qFAAC;IAEnE,SAAS,GAAG,KAAK,CAAS,mBAAmB;kFAAC;IAC9C,UAAU,GAAG,KAAK,CAAgB,IAAI;mFAAC;IACvC,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;IACf,iBAAiB,GAAG,QAAQ,CAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,aAAa;0FACtF;AACkB,IAAA,kBAAkB,GAAG,QAAQ,CAC9C,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,iBAAiB,EAAE,IAAI,KAAK;2FAC7E;IACkB,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAA,WAAA,EAAc,IAAI,CAAC,kBAAkB,EAAE,CAAA,CAAA,CAAG;sFAAC;AAE1E,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAErC,OAAO,EAAE,CACP,gCAAgC,EAChC,UAAU,KAAK,YAAY,IAAI,gDAAgD;;;;AAI/E,QAAA,UAAU,KAAK,UAAU,IAAI,mDAAmD,EAChF,UAAU,KAAK,OAAO,IAAI,QAAQ,EAClC,IAAI,CAAC,KAAK,EAAE,CACb;IACH,CAAC;gFAAC;uGA5BS,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,6BAAA,EAAA,qBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,kCAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAEW,4BAA4B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtBjE;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAhCrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;oBAC5B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,yBAAyB,EAAE,eAAe;AAC1C,wBAAA,+BAA+B,EAAE,qBAAqB;AACtD,wBAAA,0BAA0B,EAAE,qBAAqB;AACjD,wBAAA,oCAAoC,EAAE,sBAAsB;AAC7D,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA;AACF,iBAAA;iGAGgD,4BAA4B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCzBhE,sBAAsB,CAAA;AACd,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAExC,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAErC,QAAA,OAAO,EAAE,CACP,qCAAqC,EACrC,UAAU,KAAK,YAAY,IAAI,QAAQ,EACvC,UAAU,KAAK,UAAU,IAAI,QAAQ,EACrC,UAAU,KAAK,OAAO,IAAI,eAAe,EACzC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,WAAW,IAAI,gCAAgC,EACvE,IAAI,CAAC,KAAK,EAAE,CACb;IACH,CAAC;gFAAC;uGAhBS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,mVAFvB,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEf,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAVlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;oBACzB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,yBAAyB,EAAE,eAAe;AAC1C,wBAAA,0BAA0B,EAAE,gBAAgB;AAC7C,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;ACbD;;AAEG;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ojiepermana-angular-theme-page.mjs","sources":["../../../library/theme/page/page.types.ts","../../../library/theme/page/page-state.service.ts","../../../library/theme/page/page-side.component.ts","../../../library/theme/page/page.component.ts","../../../library/theme/page/page-side-toggle.component.ts","../../../library/theme/page/page-slots.component.ts","../../../library/theme/page/ojiepermana-angular-theme-page.ts"],"sourcesContent":["export const PAGE_VARIANTS = ['stacked', 'side'] as const;\nexport const PAGE_SIDE_POSITIONS = ['left', 'right'] as const;\nexport const PAGE_SIDE_MODES = ['sticky', 'drawer', 'overlay'] as const;\nexport const PAGE_SCROLL_VALUES = ['content', 'page'] as const;\nexport const PAGE_HEIGHT_VALUES = ['auto', 'fix'] as const;\n\nexport type PageVariant = (typeof PAGE_VARIANTS)[number];\nexport type PageSidePosition = (typeof PAGE_SIDE_POSITIONS)[number];\nexport type PageSideMode = (typeof PAGE_SIDE_MODES)[number];\nexport type PageScroll = (typeof PAGE_SCROLL_VALUES)[number];\nexport type PageHeight = (typeof PAGE_HEIGHT_VALUES)[number];\n\nexport const PAGE_DEFAULT_VARIANT: PageVariant = 'stacked';\nexport const PAGE_DEFAULT_SIDE_POSITION: PageSidePosition = 'left';\nexport const PAGE_DEFAULT_SIDE_MODE: PageSideMode = 'sticky';\nexport const PAGE_DEFAULT_SCROLL: PageScroll = 'content';\nexport const PAGE_DEFAULT_HEIGHT: PageHeight = 'auto';\nexport const PAGE_DEFAULT_SIDE_WIDTH = '16rem';\n\nexport function isUiPageVariant(value: string | null): value is PageVariant {\n return value !== null && (PAGE_VARIANTS as readonly string[]).includes(value);\n}\n\nexport function isUiPageSidePosition(value: string | null): value is PageSidePosition {\n return value !== null && (PAGE_SIDE_POSITIONS as readonly string[]).includes(value);\n}\n\nexport function isUiPageSideMode(value: string | null): value is PageSideMode {\n return value !== null && (PAGE_SIDE_MODES as readonly string[]).includes(value);\n}\n\nexport function isUiPageScroll(value: string | null): value is PageScroll {\n return value !== null && (PAGE_SCROLL_VALUES as readonly string[]).includes(value);\n}\n\nexport function isUiPageHeight(value: string | null): value is PageHeight {\n return value !== null && (PAGE_HEIGHT_VALUES as readonly string[]).includes(value);\n}\n","import { Injectable, computed, signal } from '@angular/core';\nimport {\n PAGE_DEFAULT_HEIGHT,\n PAGE_DEFAULT_SCROLL,\n PAGE_DEFAULT_SIDE_MODE,\n PAGE_DEFAULT_SIDE_POSITION,\n PAGE_DEFAULT_SIDE_WIDTH,\n PAGE_DEFAULT_VARIANT,\n type PageHeight,\n type PageScroll,\n type PageSideMode,\n type PageSidePosition,\n type PageVariant,\n} from './page.types';\n\n@Injectable()\nexport class PageStateService {\n private readonly variantState = signal<PageVariant>(PAGE_DEFAULT_VARIANT);\n private readonly heightState = signal<PageHeight>(PAGE_DEFAULT_HEIGHT);\n private readonly scrollState = signal<PageScroll>(PAGE_DEFAULT_SCROLL);\n private readonly positionState = signal<PageSidePosition>(PAGE_DEFAULT_SIDE_POSITION);\n private readonly sideModeState = signal<PageSideMode>(PAGE_DEFAULT_SIDE_MODE);\n private readonly internalSideOpenState = signal(false);\n private readonly controlledSideOpenState = signal<boolean | null>(null);\n private readonly sideWidthState = signal(PAGE_DEFAULT_SIDE_WIDTH);\n private readonly sideIdState = signal<string | null>(null);\n private readonly sideOpenRequestState = signal<boolean | null>(null);\n private readonly sideOpenRequestVersionState = signal(0);\n\n readonly variant = this.variantState.asReadonly();\n readonly height = this.heightState.asReadonly();\n readonly scroll = this.scrollState.asReadonly();\n readonly position = this.positionState.asReadonly();\n readonly sideMode = this.sideModeState.asReadonly();\n readonly sideWidth = this.sideWidthState.asReadonly();\n readonly sideId = this.sideIdState.asReadonly();\n readonly sideOpenRequest = this.sideOpenRequestState.asReadonly();\n readonly sideOpenRequestVersion = this.sideOpenRequestVersionState.asReadonly();\n readonly sideOpen = computed(() => this.controlledSideOpenState() ?? this.internalSideOpenState());\n readonly isSideInteractive = computed(() => this.sideMode() === 'drawer' || this.sideMode() === 'overlay');\n readonly isSideVisible = computed(() => this.sideMode() === 'sticky' || this.sideOpen());\n\n registerRoot(config: {\n variant: PageVariant;\n height: PageHeight;\n scroll: PageScroll;\n position: PageSidePosition;\n sideMode: PageSideMode;\n sideWidth: string;\n }): void {\n this.variantState.set(config.variant);\n this.heightState.set(config.height);\n this.scrollState.set(config.scroll);\n this.positionState.set(config.position);\n this.sideModeState.set(config.sideMode);\n this.sideWidthState.set(config.sideWidth);\n }\n\n registerSide(config: { mode: PageSideMode; position: PageSidePosition; width: string; id: string }): void {\n this.sideModeState.set(config.mode);\n this.positionState.set(config.position);\n this.sideWidthState.set(config.width);\n this.sideIdState.set(config.id);\n }\n\n setControlledSideOpen(open: boolean | null): void {\n this.controlledSideOpenState.set(open);\n\n if (open !== null) {\n this.internalSideOpenState.set(open);\n }\n }\n\n setSideOpen(open: boolean): void {\n this.internalSideOpenState.set(open);\n }\n\n openSide(): boolean {\n return this.requestSideOpenChange(true);\n }\n\n closeSide(): boolean {\n return this.requestSideOpenChange(false);\n }\n\n toggleSide(): boolean {\n return this.requestSideOpenChange(!this.sideOpen());\n }\n\n private requestSideOpenChange(open: boolean): boolean {\n if (this.controlledSideOpenState() === null) {\n this.internalSideOpenState.set(open);\n }\n\n this.sideOpenRequestState.set(open);\n this.sideOpenRequestVersionState.update((version) => version + 1);\n\n return open;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { PageStateService } from './page-state.service';\nimport { PAGE_DEFAULT_SCROLL, PAGE_DEFAULT_SIDE_WIDTH, type PageSideMode, type PageSidePosition } from './page.types';\n\nlet nextPageSideId = 0;\n\n@Component({\n selector: 'PageSide',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n '[attr.id]': 'resolvedId',\n '[attr.data-page-slot]': '\"side\"',\n '[attr.data-page-side-mode]': 'resolvedMode()',\n '[attr.data-page-side-open]': 'page.sideOpen()',\n '[attr.data-page-position]': 'resolvedPosition()',\n '[attr.aria-hidden]': 'ariaHidden()',\n '[style.--page-side-width]': 'resolvedWidth()',\n },\n template: `<ng-content />`,\n})\nexport class PageSideComponent {\n private readonly document = inject(DOCUMENT, { optional: true });\n protected readonly page = inject(PageStateService);\n protected readonly resolvedId = `page-side-${++nextPageSideId}`;\n\n readonly mode = input<PageSideMode>('sticky');\n readonly position = input<PageSidePosition | null>(null);\n readonly width = input<string | null>(null);\n readonly closeOnEsc = input(true);\n readonly class = input<string>('');\n\n protected readonly resolvedMode = computed(() => this.mode() ?? this.page.sideMode());\n protected readonly resolvedPosition = computed(() => this.position() ?? this.page.position());\n protected readonly resolvedWidth = computed(() => this.width() ?? this.page.sideWidth() ?? PAGE_DEFAULT_SIDE_WIDTH);\n protected readonly isSticky = computed(() => this.resolvedMode() === 'sticky');\n protected readonly isDrawer = computed(() => this.resolvedMode() === 'drawer');\n protected readonly isOverlay = computed(() => this.resolvedMode() === 'overlay');\n protected readonly resolvedScroll = computed(() => this.page.scroll() ?? PAGE_DEFAULT_SCROLL);\n protected readonly ariaHidden = computed(() => (!this.isSticky() && !this.page.sideOpen() ? 'true' : null));\n\n protected readonly classes = computed(() => {\n const position = this.resolvedPosition();\n const sideOpen = this.page.sideOpen();\n\n return cn(\n 'block min-h-0 border-border bg-background',\n this.resolvedScroll() === 'content' && 'h-full overflow-auto',\n this.resolvedScroll() === 'page' && 'overflow-visible',\n this.isSticky() && 'shrink-0 w-[var(--page-side-width)]',\n this.isSticky() && position === 'left' && 'order-1 border-r',\n this.isSticky() && position === 'right' && 'order-2 border-l',\n this.isDrawer() &&\n 'absolute inset-y-0 z-20 w-[var(--page-side-width)] border shadow-sm transition-transform duration-200 ease-out',\n this.isDrawer() && position === 'left' && (sideOpen ? 'left-0 translate-x-0' : 'left-0 -translate-x-full'),\n this.isDrawer() && position === 'right' && (sideOpen ? 'right-0 translate-x-0' : 'right-0 translate-x-full'),\n this.isOverlay() &&\n 'absolute inset-y-0 z-30 w-[var(--page-side-width)] border shadow-md transition-transform duration-200 ease-out',\n this.isOverlay() && position === 'left' && (sideOpen ? 'left-0 translate-x-0' : 'left-0 -translate-x-full'),\n this.isOverlay() && position === 'right' && (sideOpen ? 'right-0 translate-x-0' : 'right-0 translate-x-full'),\n this.class(),\n );\n });\n\n constructor() {\n effect(() => {\n this.page.registerSide({\n mode: this.resolvedMode(),\n position: this.resolvedPosition(),\n width: this.resolvedWidth(),\n id: this.resolvedId,\n });\n });\n\n effect((onCleanup) => {\n if (!this.closeOnEsc() || this.isSticky()) {\n return;\n }\n\n const defaultView = this.document?.defaultView;\n if (!defaultView) {\n return;\n }\n\n const handler = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') {\n return;\n }\n\n if (!untracked(() => this.page.sideOpen())) {\n return;\n }\n\n untracked(() => {\n this.page.closeSide();\n });\n };\n\n defaultView.addEventListener('keydown', handler);\n onCleanup(() => defaultView.removeEventListener('keydown', handler));\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { PageSideComponent } from './page-side.component';\nimport { PageStateService } from './page-state.service';\nimport {\n PAGE_DEFAULT_HEIGHT,\n PAGE_DEFAULT_SCROLL,\n PAGE_DEFAULT_SIDE_MODE,\n PAGE_DEFAULT_SIDE_POSITION,\n PAGE_DEFAULT_SIDE_WIDTH,\n PAGE_DEFAULT_VARIANT,\n type PageHeight,\n type PageScroll,\n type PageSideMode,\n type PageSidePosition,\n type PageVariant,\n} from './page.types';\n\n@Component({\n selector: 'Page',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [PageStateService],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-page-variant]': 'variant()',\n '[attr.data-page-height]': 'height()',\n '[attr.data-page-scroll]': 'scroll()',\n '[attr.data-page-position]': 'resolvedPosition()',\n '[attr.data-page-side-mode]': 'resolvedSideMode()',\n '[attr.data-page-side-open]': 'page.sideOpen()',\n '[style.--page-side-width]': 'sideWidth()',\n },\n template: `\n @if (showsOverlayBackdrop()) {\n <button\n type=\"button\"\n aria-label=\"Close page side\"\n data-page-overlay-backdrop\n class=\"absolute inset-0 z-20 bg-[hsl(var(--overlay-backdrop))]\"\n (click)=\"handleBackdropClick()\"></button>\n }\n\n <div [class]=\"shellClasses()\">\n <ng-content select=\"PageHeader\" />\n <ng-content select=\"PageSideToggle\" />\n\n <div [class]=\"bodyClasses()\">\n @if (variant() === 'side') {\n <ng-content select=\"PageSide\" />\n }\n\n <ng-content select=\"PageContent, PageDashboard\" />\n </div>\n\n <ng-content select=\"PageFooter\" />\n </div>\n `,\n})\nexport class PageComponent {\n protected readonly page = inject(PageStateService);\n protected readonly projectedSide = contentChild(PageSideComponent);\n\n readonly variant = input<PageVariant>(PAGE_DEFAULT_VARIANT);\n readonly height = input<PageHeight>(PAGE_DEFAULT_HEIGHT);\n readonly scroll = input<PageScroll>(PAGE_DEFAULT_SCROLL);\n readonly position = input<PageSidePosition>(PAGE_DEFAULT_SIDE_POSITION);\n readonly sideMode = input<PageSideMode>(PAGE_DEFAULT_SIDE_MODE);\n readonly sideOpen = input<boolean | null>(null);\n readonly sideWidth = input<string>(PAGE_DEFAULT_SIDE_WIDTH);\n readonly class = input<string>('');\n readonly sideOpenChange = output<boolean>();\n\n protected readonly resolvedPosition = computed(() => this.projectedSide()?.position() ?? this.position());\n protected readonly resolvedSideMode = computed(() => this.projectedSide()?.mode() ?? this.sideMode());\n protected readonly isLeftSide = computed(() => this.resolvedPosition() === 'left');\n protected readonly isRightSide = computed(() => this.resolvedPosition() === 'right');\n protected readonly showsOverlayBackdrop = computed(\n () => this.variant() === 'side' && this.resolvedSideMode() === 'overlay' && this.page.sideOpen(),\n );\n\n protected readonly hostClasses = computed(() =>\n cn('relative block h-full min-h-0 w-full min-w-0 overflow-hidden text-foreground', this.class()),\n );\n protected readonly shellClasses = computed(() =>\n cn(\n 'relative z-10 h-full min-h-0 w-full min-w-0',\n this.scroll() === 'content' && 'grid grid-rows-[auto_minmax(0,1fr)_auto]',\n this.scroll() === 'page' && 'overflow-auto',\n ),\n );\n protected readonly bodyClasses = computed(() => {\n if (this.variant() !== 'side') {\n return cn('relative min-w-0', this.scroll() === 'content' && 'min-h-0');\n }\n\n const sideMode = this.resolvedSideMode();\n const position = this.resolvedPosition();\n\n if (sideMode === 'sticky') {\n return cn(\n 'grid min-w-0',\n this.scroll() === 'content' && 'min-h-0',\n position === 'left'\n ? 'grid-cols-[var(--page-side-width)_minmax(0,1fr)]'\n : 'grid-cols-[minmax(0,1fr)_var(--page-side-width)]',\n );\n }\n\n return cn('relative min-w-0', this.scroll() === 'content' && 'min-h-0');\n });\n\n constructor() {\n effect(() => {\n this.page.registerRoot({\n variant: this.variant(),\n height: this.height(),\n scroll: this.scroll(),\n position: this.position(),\n sideMode: this.sideMode(),\n sideWidth: this.sideWidth(),\n });\n });\n\n effect(() => {\n this.page.setControlledSideOpen(this.sideOpen());\n });\n\n effect(() => {\n const requestVersion = this.page.sideOpenRequestVersion();\n if (requestVersion === 0) {\n return;\n }\n\n this.sideOpenChange.emit(this.page.sideOpenRequest() ?? false);\n });\n }\n\n protected handleBackdropClick(): void {\n this.page.closeSide();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { PageStateService } from './page-state.service';\n\n@Component({\n selector: 'PageSideToggle',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n template: `\n <button\n type=\"button\"\n [class]=\"buttonClasses()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-controls]=\"page.sideId()\"\n [attr.aria-expanded]=\"page.sideOpen()\"\n (click)=\"handleClick()\">\n <ng-content>\n <span aria-hidden=\"true\" class=\"text-lg leading-none\">☰</span>\n </ng-content>\n </button>\n `,\n})\nexport class PageSideToggleComponent {\n protected readonly page = inject(PageStateService);\n\n readonly ariaLabel = input<string>('Toggle page side');\n readonly class = input<string>('');\n readonly toggled = output<boolean>();\n\n protected readonly hostClasses = computed(() => cn('inline-flex shrink-0', this.class()));\n protected readonly buttonClasses = computed(() =>\n cn(\n 'inline-flex h-9 min-w-9 items-center justify-center rounded-md border border-border bg-background px-3 text-sm text-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n ),\n );\n\n protected handleClick(): void {\n this.toggled.emit(this.page.toggleSide());\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@ojiepermana/angular-component/utils';\nimport { PageStateService } from './page-state.service';\nimport { PAGE_DEFAULT_HEIGHT, PAGE_DEFAULT_SCROLL, type PageScroll } from './page.types';\n\nfunction buildPageBodyClasses(scroll: PageScroll, customClass: string): string {\n return cn(\n 'block min-w-0',\n scroll === 'content' && 'h-full min-h-0 overflow-auto',\n scroll === 'page' && 'overflow-visible',\n customClass,\n );\n}\n\n@Component({\n selector: 'PageHeader',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'header',\n },\n template: `<ng-content />`,\n})\nexport class PageHeaderComponent {\n private readonly page = inject(PageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedHeight = computed(() => this.page?.height() ?? PAGE_DEFAULT_HEIGHT);\n\n protected readonly classes = computed(() =>\n cn(\n 'block shrink-0 border-b border-border bg-background',\n this.class(),\n this.resolvedHeight() === 'fix' && 'h-12 overflow-hidden',\n ),\n );\n}\n\n@Component({\n selector: 'PageContent',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'content',\n },\n template: `<ng-content />`,\n})\nexport class PageContentComponent {\n private readonly page = inject(PageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedScroll = computed(() => this.page?.scroll() ?? PAGE_DEFAULT_SCROLL);\n\n protected readonly classes = computed(() => buildPageBodyClasses(this.resolvedScroll(), this.class()));\n}\n\n@Component({\n selector: 'PageDashboard',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'dashboard',\n },\n template: `<ng-content />`,\n})\nexport class PageDashboardComponent {\n private readonly page = inject(PageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedScroll = computed(() => this.page?.scroll() ?? PAGE_DEFAULT_SCROLL);\n\n protected readonly classes = computed(() => buildPageBodyClasses(this.resolvedScroll(), this.class()));\n}\n\n@Component({\n selector: 'PageFooter',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-page-slot': 'footer',\n },\n template: `<ng-content />`,\n})\nexport class PageFooterComponent {\n private readonly page = inject(PageStateService, { optional: true });\n\n readonly class = input<string>('');\n\n protected readonly resolvedHeight = computed(() => this.page?.height() ?? PAGE_DEFAULT_HEIGHT);\n\n protected readonly classes = computed(() =>\n cn(\n 'block shrink-0 border-t border-border bg-background',\n this.class(),\n this.resolvedHeight() === 'fix' && 'h-12 overflow-hidden',\n ),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ojiepermana-angular-theme-styles.mjs","sources":["../../../library/theme/styles/theme.config.ts","../../../library/theme/styles/theme.types.ts","../../../library/theme/styles/theme-mode.service.ts","../../../library/theme/styles/theme-season.service.ts","../../../library/theme/styles/theme.provider.ts","../../../library/theme/styles/ojiepermana-angular-theme-styles.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type { ThemeMode, ThemeSeason } from './theme.types';\n\nexport interface ThemeIconOptions {\n readonly materialSymbols?: boolean;\n}\n\nexport interface ThemeOptions {\n readonly mode?: ThemeMode;\n readonly season?: ThemeSeason;\n readonly icons?: ThemeIconOptions;\n /**\n * Resolves the stylesheet URL for a non-base season so it can be loaded\n * lazily at runtime instead of bundling every season's CSS up front.\n * Return `null` to skip loading for that season. When omitted, no runtime\n * loading happens — the app is expected to bundle season CSS itself.\n *\n * Contoh: `(season) => '/themes/seasonal/' + season + '/package.css'`\n */\n readonly seasonalCssUrl?: (season: ThemeSeason) => string | null;\n}\n\nexport const THEME_OPTIONS = new InjectionToken<Readonly<ThemeOptions>>('THEME_OPTIONS');\n","export const THEME_MODES = ['light', 'dark', 'system'] as const;\nexport const RESOLVED_THEME_MODES = ['light', 'dark'] as const;\nexport const THEME_SEASONS = ['base', 'imlek', 'ramadhan', 'ied', 'natal', 'new-year'] as const;\n\nexport type ThemeMode = (typeof THEME_MODES)[number];\nexport type ResolvedThemeMode = (typeof RESOLVED_THEME_MODES)[number];\nexport type ThemeSeason = (typeof THEME_SEASONS)[number];\n\nexport const DEFAULT_THEME_MODE: ThemeMode = 'system';\nexport const DEFAULT_THEME_SEASON: ThemeSeason = 'base';\n\nexport const THEME_MODE_STORAGE_KEY = 'theme-mode';\nexport const THEME_SEASON_STORAGE_KEY = 'theme-season';\n\nexport function isThemeMode(value: string | null | undefined): value is ThemeMode {\n return typeof value === 'string' && THEME_MODES.includes(value as ThemeMode);\n}\n\nexport function isResolvedThemeMode(value: string | null | undefined): value is ResolvedThemeMode {\n return typeof value === 'string' && RESOLVED_THEME_MODES.includes(value as ResolvedThemeMode);\n}\n\nexport function isThemeSeason(value: string | null | undefined): value is ThemeSeason {\n return typeof value === 'string' && THEME_SEASONS.includes(value as ThemeSeason);\n}\n\nexport function normalizeThemeMode(value: string | null | undefined): ThemeMode {\n return isThemeMode(value) ? value : DEFAULT_THEME_MODE;\n}\n\nexport function normalizeThemeSeason(value: string | null | undefined): ThemeSeason {\n return isThemeSeason(value) ? value : DEFAULT_THEME_SEASON;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Service, computed, effect, inject, signal } from '@angular/core';\nimport { THEME_OPTIONS } from './theme.config';\nimport {\n DEFAULT_THEME_MODE,\n THEME_MODE_STORAGE_KEY,\n type ResolvedThemeMode,\n type ThemeMode,\n normalizeThemeMode,\n} from './theme.types';\n\n@Service()\nexport class ThemeModeService {\n private readonly documentRef = inject(DOCUMENT, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n private readonly options = inject(THEME_OPTIONS, { optional: true });\n private readonly modeState = signal<ThemeMode>(DEFAULT_THEME_MODE);\n private readonly systemPrefersDark = signal(this.readSystemPreference());\n\n readonly mode = this.modeState.asReadonly();\n readonly resolvedMode = computed<ResolvedThemeMode>(() => {\n const mode = this.modeState();\n\n if (mode === 'system') {\n return this.systemPrefersDark() ? 'dark' : 'light';\n }\n\n return mode;\n });\n\n readonly isDark = computed(() => this.resolvedMode() === 'dark');\n\n constructor() {\n this.bindSystemPreferenceListener();\n this.ensureDefaults();\n\n effect(() => {\n const mode = this.modeState();\n const resolvedMode = this.resolvedMode();\n\n this.persistMode(mode);\n this.applyModeAttributes(resolvedMode);\n });\n }\n\n setMode(mode: ThemeMode): void {\n this.modeState.set(mode);\n }\n\n toggle(): void {\n this.setMode(this.isDark() ? 'light' : 'dark');\n }\n\n private ensureDefaults(): void {\n const defaultMode = normalizeThemeMode(this.options?.mode);\n const storedMode = this.readStorage(THEME_MODE_STORAGE_KEY) ?? defaultMode;\n\n this.modeState.set(normalizeThemeMode(storedMode));\n }\n\n private persistMode(mode: ThemeMode): void {\n this.writeStorage(THEME_MODE_STORAGE_KEY, mode);\n }\n\n private applyModeAttributes(mode: ResolvedThemeMode): void {\n const root = this.documentRef?.documentElement;\n\n if (!root) {\n return;\n }\n\n root.setAttribute('theme-mode', mode);\n root.dataset['mode'] = mode;\n }\n\n private readSystemPreference(): boolean {\n return this.mediaQueryList()?.matches ?? false;\n }\n\n private bindSystemPreferenceListener(): void {\n const mediaQueryList = this.mediaQueryList();\n\n if (!mediaQueryList) {\n return;\n }\n\n const onChange = (event: MediaQueryListEvent) => {\n this.systemPrefersDark.set(event.matches);\n };\n\n mediaQueryList.addEventListener('change', onChange);\n this.destroyRef.onDestroy(() => mediaQueryList.removeEventListener('change', onChange));\n }\n\n private mediaQueryList(): MediaQueryList | null {\n return this.documentRef?.defaultView?.matchMedia?.('(prefers-color-scheme: dark)') ?? null;\n }\n\n private storage(): Storage | null {\n try {\n return this.documentRef?.defaultView?.localStorage ?? null;\n } catch {\n return null;\n }\n }\n\n private readStorage(key: string): string | null {\n try {\n return this.storage()?.getItem(key) ?? null;\n } catch {\n return null;\n }\n }\n\n private writeStorage(key: string, value: string): void {\n try {\n this.storage()?.setItem(key, value);\n } catch {\n return;\n }\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Service, effect, inject, signal } from '@angular/core';\nimport { THEME_OPTIONS } from './theme.config';\nimport { DEFAULT_THEME_SEASON, THEME_SEASON_STORAGE_KEY, type ThemeSeason, normalizeThemeSeason } from './theme.types';\n\n@Service()\nexport class ThemeSeasonService {\n private readonly documentRef = inject(DOCUMENT, { optional: true });\n private readonly options = inject(THEME_OPTIONS, { optional: true });\n private readonly seasonState = signal<ThemeSeason>(DEFAULT_THEME_SEASON);\n\n readonly season = this.seasonState.asReadonly();\n\n constructor() {\n this.ensureDefaults();\n\n effect(() => {\n const season = this.seasonState();\n\n this.persistSeason(season);\n this.applySeasonAttribute(season);\n this.ensureSeasonStylesheet(season);\n });\n }\n\n setSeason(season: ThemeSeason): void {\n this.seasonState.set(season);\n }\n\n private ensureDefaults(): void {\n const defaultSeason = normalizeThemeSeason(this.options?.season);\n const storedSeason = this.readStorage(THEME_SEASON_STORAGE_KEY) ?? defaultSeason;\n\n this.seasonState.set(normalizeThemeSeason(storedSeason));\n }\n\n private persistSeason(season: ThemeSeason): void {\n this.writeStorage(THEME_SEASON_STORAGE_KEY, season);\n }\n\n private applySeasonAttribute(season: ThemeSeason): void {\n const root = this.documentRef?.documentElement;\n\n if (!root) {\n return;\n }\n\n root.setAttribute('theme-season', season);\n }\n\n /**\n * Lazily loads the active season's stylesheet via `<link>` when the app\n * configured `seasonalCssUrl`, so only base CSS ships in the main bundle.\n */\n private ensureSeasonStylesheet(season: ThemeSeason): void {\n const doc = this.documentRef;\n const resolveUrl = this.options?.seasonalCssUrl;\n\n if (!doc || !resolveUrl) {\n return;\n }\n\n const linkId = 'theme-season-styles';\n const existing = doc.getElementById(linkId) as HTMLLinkElement | null;\n const url = season === 'base' ? null : resolveUrl(season);\n\n if (!url) {\n existing?.remove();\n return;\n }\n\n if (existing) {\n if (existing.getAttribute('href') !== url) {\n existing.setAttribute('href', url);\n }\n return;\n }\n\n const link = doc.createElement('link');\n link.id = linkId;\n link.rel = 'stylesheet';\n link.href = url;\n doc.head.appendChild(link);\n }\n\n private storage(): Storage | null {\n try {\n return this.documentRef?.defaultView?.localStorage ?? null;\n } catch {\n return null;\n }\n }\n\n private readStorage(key: string): string | null {\n try {\n return this.storage()?.getItem(key) ?? null;\n } catch {\n return null;\n }\n }\n\n private writeStorage(key: string, value: string): void {\n try {\n this.storage()?.setItem(key, value);\n } catch {\n return;\n }\n }\n}\n","import {\n type EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { MaterialSymbolsService } from '@ojiepermana/angular-component/icon';\nimport { THEME_OPTIONS, type ThemeOptions } from './theme.config';\nimport { ThemeModeService } from './theme-mode.service';\nimport { ThemeSeasonService } from './theme-season.service';\n\nexport function provideUiTheme(options: ThemeOptions = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: THEME_OPTIONS,\n useValue: options,\n },\n provideEnvironmentInitializer(() => {\n if (options.icons?.materialSymbols !== false) {\n inject(MaterialSymbolsService).ensureLoaded();\n }\n\n inject(ThemeModeService);\n inject(ThemeSeasonService);\n }),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ojiepermana-angular-theme.mjs","sources":["../../../library/theme/public-api.ts","../../../library/theme/ojiepermana-angular-theme.ts"],"sourcesContent":["/*\n * Public API Surface of @ojiepermana/angular-theme\n *\n * Layout, page, dan styles diekspos lewat secondary entry point di dalam\n * library/theme.\n */\n\nexport {};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;;;;AAKG;;ACLH;;AAEG"}